下面的模板是 kn + i,, k == 30的版本
bool isPrime(ll n){
if(n==2||n==3||n==5)return 1;
if(n%2==0||n%3==0||n%5==0||n==1)return 0;
ll c=7,a[8]={4,2,4,2,4,6,2,6};
while(c*c<=n)for(auto i:a){if(n%c==0)return 0;c+=i;}
return 1;
}
如果 [公式] 极大,可以使用素数测试算法,素数测试算法可以通过控制迭代次数来间接控制正确率,常用的有下面的Miller-Rabin方法
ll Rand(){
static ll x=(srand((int)time(0)),rand());
x+=1000003;
if(x>1000000007)x-=1000000007;
return x;
}
bool Witness(ll a,ll n){
ll t=0,u=n-1;
while(!(u&1))u>>=1,t++;
ll x=fpow(a,u,n),y;
while(t--){
y=x*x%n;
if(y==1 && x!=1 && x!=n-1)return true;
x=y;
}
return x!=1;
}
bool MillerRabin(ll n,ll s){
if(n==2||n==3||n==5)return 1;
if(n%2==0||n%3==0||n%5==0||n==1)return 0;
while(s--){
if(Witness(Rand()%(n-1)+1,n))return false;
}
return true;
}
当然, Rand() 怎么写可以自由发挥,这会影响其性能