您的位置:首页 > 其它

miller rabin 随机素数判定法模版

2016-07-04 17:49 351 查看
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>

using namespace std;
const int p[8]={3,5,7,11,13,17,19,23};//8个判定素数
int power_mod(int a,int b,int n)//快速幂
{
int i=0,ans=1;
while ((1<<i)<=b)
{
if (b&(1<<i)) ans=ans*a%n;
a=a*a%n;
i++;
}
return ans;
}
bool pan(int p,int n,int m,int k)
{
int pre=power_mod(p,m,n);//根据费马小定理
if (pre==1) return false;//如果a^n-1==1(mod n),那么它是一个素数,当然有伪素数,所以多判几遍
while (k--)
{
int next=pre*pre%n;//<span style="font-family: Arial; font-size: 16px; line-height: 21px;">而k次测试的基于费马小定理的一个推论:x^2 % n = 1当n为素数时x的解只有两个,即1和n-1。</span>
if (next==1&&pre!=1&&pre!=n-1) return true;
pre=next;
}
return (pre!=1);//根据上面所述,如果pre不等于1,那么这个数是合数
}
bool MR(int n)
{
if (n==2) return true;
if (n<2||!(n&1)) return false;

int k=0,m=n-1;
while (!(m&1)) m>>=1,k++;

for (int i=0;i<8;i++)
{
if (p[i]==n) return true;
if (pan(p[i],n,m,k)) return false;
}
return true;
}
int main()
{
int n;
scanf("%d",&n);
if (MR(n)) printf("Yes");else printf("No");
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: