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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM