[算法]Miller Robbin素数判定
Miller Robbin素数判定一、实现原理我们以前都是怎么判断素数的呢: inline int is_prime(int n){ if(n==1) return 0; for(int i=2;i<=sqrt(n);i++){ if(n%i==0) return 0; } return 1; } 现在,我们希望更快的判断一个数是否为素数。
我们把像341这样的数称作伪素数。实际上,伪素数有无穷多组。 二、模板模板题:AT807 素数、コンテスト、素数 #include<bits/stdc++.h> #define int long long using namespace std; inline int qpow(int a,int b,int mod){//快速幂 int res=1; while(b){ if(b&1) res=(res%mod*a)%mod; b>>=1; a=(a%mod)*a%mod; } return res; } inline int miller_robbin(int num){//核心代码 for(int i=1;i<=30;i++){ int base=rand()%(num-1)+1; if(qpow(base,num-1,num)!=1) return 0; } return 1; } signed main(){ int num; scanf("%d",&num); if(num==1){ printf("NO"); return 0; } miller_robbin(num)?printf("YESn"):printf("NOn"); return 0; } 附赠一道水题:(主要是练习素数判定) #include<bits/stdc++.h> #define ll long long using namespace std; ll qpow(ll a,ll b,ll mod){ ll res=1; while(b){ if(b&1)res=(res%mod*a)%mod; a=(a%mod)*a%mod; b>>=1; } return res; } bool query_prime(ll x) { if(x==2)return true; if(x==1)return false; for(int i=1;i<=30;i++){ ll base=rand()%(x-1)+1; if(qpow(base,x-1,x)!=1)return false; } return true; } int main() { srand(time(NULL)); ll num; scanf("%lld",&num); if(query_prime(num)||(num%2!=0&&num%3!=0&&num%5!=0&&num!=1))printf("Primen"); else printf("Not Primen"); return 0; } 三、小结使用Miller Robbin素数判定,我们可以将复杂度降低至(O(logn))级别(常数级可以被忽略)。这样比原来的方法会快很多。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |