import java.math.BigInteger; import java.util.Random; import java.util.Scanner; public class Main { // 没有用到的快速幂 /*public static BigInteger multi(BigInteger a, BigInteger b,BigInteger p){ BigInteger temp=BigInteger.valueOf(0); while (b.equals(BigInteger.valueOf(0))!=true){ if (b.mod(BigInteger.valueOf(2)).equals(BigInteger.valueOf(1))==true){ temp=temp.add(a); temp=temp.mod(p); } a=a.multiply(BigInteger.valueOf(2)); a=a.mod(p); b=b.divide(BigInteger.valueOf(2)); } return temp; } public static BigInteger qpow(BigInteger a, BigInteger b,BigInteger p){ BigInteger temp=BigInteger.valueOf(1); while (b.equals(BigInteger.valueOf(0))!=true){ if (b.mod(BigInteger.valueOf(2)).equals(BigInteger.valueOf(1))==true){ temp=multi(temp,a,p); } b=b.divide(BigInteger.valueOf(2)); a=multi(a,a,p); } return temp; }*/ public static boolean miller_rabin(BigInteger n){ if (n.equals(BigInteger.valueOf(0))==true||n.equals(BigInteger.valueOf(1))==true) return false; if (n.equals(BigInteger.valueOf(2))==true) return true; int s=10; BigInteger k=n.subtract(BigInteger.valueOf(1)); int t=0; //k.mod(BigInteger.valueOf(2)).equals(BigInteger.valueOf(1))!=true 取模判1 while (k.getLowestSetBit()!=0){ t++; k=k.divide(BigInteger.valueOf(2)); } Random ran = new Random(); while (s-->0){ BigInteger a=new BigInteger(100,ran).mod( n.subtract(BigInteger.valueOf(2))).add(BigInteger.valueOf(2) ); BigInteger[] x= new BigInteger[105]; x[0]=a.modPow(k,n); //x[0]=qpow(a,k,n); for (int i=1;i<=t;i++){ x[i]=x[i-1].modPow(BigInteger.valueOf(2),n); //x[i]=multi(x[i-1],x[i-1],n); if (x[i].equals(BigInteger.valueOf(1))==true&&x[i-1].equals(BigInteger.valueOf(1))!=true&&x[i-1].equals(n.subtract(BigInteger.valueOf(1)))!=true) return false; } if (x[t].equals(BigInteger.valueOf(1))!=true) return false; } return true; } public static void main(String[] args) { Scanner cin= new Scanner(System.in); while (cin.hasNextBigInteger()){ BigInteger n; n=cin.nextBigInteger(); if (miller_rabin(n)==true) System.out.println("Yes"); else System.out.println("No"); } cin.close(); } }
AC代码
import java.math.BigInteger; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); while(cin.hasNextBigInteger()){ BigInteger n; n = cin.nextBigInteger(); if (n.isProbablePrime(1)) System.out.println("Yes"); else System.out.println("No"); } } }这里有 miller_rabin素数检测 c的实现 https://blog.csdn.net/qq_41021816/article/details/80053766