Miller-Rabbin素数测试判定素数
介绍一种素数判定的方法:
Miller-Rabbin素数测试
时间复杂度可以达到O(slogn)级别,s是测试次数,一般取在30次左右便已足够,因此这是一个logn级别的算法
首先根据费马小定理,当p是素数时有:
/(a^{p-1}\equiv1(\mod p)/)
即
/(a^{p-1}\mod p =1/)
那么如果有此式成立,是否p一定为质数?答案是否定的。但是,我们可以多测试几次,即随机选取a值进行测试,提高准确率。测试次数越大,正确率越高。(当然也就越慢)
测试次数一般选在30左右。
那么我们就可以用快速幂求出/(a^{p-1}\mod p/)的值,判断其是否为1即可。
上代码:
#include <bits/stdc++.h> #define ll long long using namespace std; ll num; 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 MRT(ll x) { if(x==2)return true; if(x==1)return false; for(int i=1;i<=30;i++) { ll base=rand()%(x-2)+2; if(qpow(base,x-1,x)!=1)return false; } return true; } int main() { scanf("%lld",&num); if(MRT(num))printf("Prime\n"); else printf("Not Prime\n"); return 0; }