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 }

 

posted @ 2015-08-03 14:12  20143605  阅读(2912)  评论(0编辑  收藏  举报