3种素数判断方法
#include<bits/stdc++.h> using namespace std; //试除法 bool is_prime(int n){ if(n<2)return false; int temp=sqrt(n); for(int i=2;i<=temp;i++){ if(n%i==0)return false; } return true; } /* 6倍法(试除法优化) 质数分布规律:>=5 的质数一定和 6 的倍数相邻 证明:令x≥1,将大于等于5的自然数表示如下:6x-1 6x 6x+1 6x+2 6x+3 6x+4 6x+5 其中,6|6x 2|(6x+2) 3|(6x+3) 2|(6x+4) 它们一定不是质数 但在6的倍数相邻两侧并不一定就是质数 */ bool is_prime2(int n){ if(n<=1)return false; if(n==2||n==3)return true; if(n%6!=1&&n&6!=5)return false; int temp=sqrt(n); for(int i=5;i<=temp;i+=6) if(n%i==0||n%(i+2)==0)return false; return true; } //MR素性探测(非确定) typedef long long ll; ll n,a; ll prime[]={3,5,7,11,13,37,79,97}; ll quick_mul(ll a,ll b,ll p){ ll res=a*b-(ll)((long double)a/p*b+0.5)*p; return res<0?res+p:res; } ll quick_pow(ll a,ll b,ll p){ ll res=1; for(;b;b>>=1,a=quick_mul(a,a,p)) if(b&1)res=quick_mul(res,a,p); return res; } bool is_prime3(ll n){ if(n<2)return false; if(n==2)return true; if(!(n&1))return false; ll m=n-1,k=0; while(!(m&1)){ m>>=1; k++; } for(int i=0;i<8;i++){ ll a=prime[i]; if(a==n)return true; ll x=quick_pow(a,m,n),y; for(int j=1;j<=k;j++){ y=quick_mul(x,x,n); if(y==1&&x!=1&&x!=n-1)return false; x=y; } if(y!=1)return false; } return true; } int main(){ return 0; }