Miller Rabbin (判断大素数)
费马小定理:
a为整数,n是素数,且a,n互质,则有a^(n-1)≡1(mod n) ,即:a^(n-1)模n得1。
快速判定一个数是否为素数的方法:
如果存在一个整数a,使得a^(n-1)≡1(mod n) ,则称n为基于a的伪素数,当有多个满足关系的a时,则n为素数的概率趋向于1。所以取多个a测试一下即可。
模板代码如下:
1 # include<iostream> 2 # include<cstdio> 3 # include<cstring> 4 # include<cstdlib> 5 # include<algorithm> 6 using namespace std; 7 # define ll long long 8 ll mypow(ll a,ll b,ll m) 9 { 10 if(b==0) 11 return 1; 12 if(b==1) 13 return a%m; 14 ll temp=mypow(a,b/2,m); 15 temp*=temp; 16 temp%=m; 17 if(b&1) 18 temp*=a; 19 temp%=m; 20 return temp; 21 } 22 bool Miller_Rabbin(ll x) 23 { 24 if(x==2) 25 return true; ///2要直接判断 26 for(int i=1;i<=50;++i){ 27 ll a=rand()%(x-2)+2; 28 if(mypow(a,x-1,x)!=1) 29 return false; 30 } 31 return true; 32 } 33 int main() 34 { 35 ll n; 36 while(scanf("%lld",&n)!=EOF) 37 { 38 if(Miller_Rabbin(n)) 39 cout<<"Yes"<<endl; 40 else 41 cout<<"No"<<endl; 42 } 43 return 0; 44 }