Miller-Rabbin随机性素数测试算法

 1 //****************************************************************
 2 // Miller_Rabin 算法进行素数测试
 3 //速度快,而且可以判断 <2^63的数
 4 //****************************************************************
 5 const int S=20;//随机算法判定次数,S越大,判错概率越小
 6 
 7 
 8 LL mult_mod(LL a,LL b,LL mod) //(a*b)%c a,b,c<2^63
 9 {
10     a%=mod;
11     b%=mod;
12     LL ans=0;
13     while(b)
14     {
15         if(b&1)
16         {
17             ans=ans+a;
18             if(ans>=mod)
19             ans=ans-mod;
20         }
21         a=a<<1;
22         if(a>=mod) a=a-mod;
23         b=b>>1;
24     }
25     return ans;
26 }
27 
28 LL pow_mod(LL a,LL b,LL mod) // a^b%mod
29 {
30     LL ans=1;
31     a=a%mod;
32     while(b)
33     {
34         if(b&1)
35         {
36             ans=mult_mod(ans,a,mod);
37         }
38         a=mult_mod(a,a,mod);
39         b=b>>1;
40     }
41     return ans;
42 }
43 
44 //以a为基,n-1=x*2^t      a^(n-1)=1(mod n)  验证n是不是合数
45 //一定是合数返回true,不一定返回false
46 
47 bool check(LL a,LL n,LL x,LL t)
48 {
49     LL ret=pow_mod(a,x,n);
50     LL last=ret;
51     for(int i=1;i<=t;i++)
52     {
53         ret=mult_mod(ret,ret,n);
54         if(ret==1 && last!=1 && last!=n-1) return true;//合数
55         last=ret;
56     }
57     if(ret!=1) return true;
58     else return false;
59 }
60 
61 // Miller_Rabin()算法素数判定
62 //是素数返回true.(可能是伪素数,但概率极小)
63 //合数返回false;
64 
65 bool Miller_Rabin(long long n)
66 {
67     if(n<2)return false;
68     if(n==2) return true;
69     if( (n&1)==0) return false;//偶数
70     LL x=n-1;
71     LL t=0;
72     while( (x&1)==0 ) { x>>=1;t++;}
73     for(int i=0;i<S;i++)
74     {
75         LL a=rand()%(n-1)+1;//rand()需要stdlib.h头文件
76         if(check(a,n,x,t))
77         return false;//合数
78     }
79     return true;
80 }

 

posted @ 2013-10-01 14:31  芷水  阅读(383)  评论(0编辑  收藏  举报