步骤
①先写快速幂取模函数
②MR算法开始
(1)传入两个参数一个是底数一个是n也就是幂数,如果n是一个合数那么可以判定,这个数一定不是素数
(2)然后开始寻找一个奇数的n去计算,如果最后满足a^d%n=1那么这个可能就是一个素数,然后再判断k=n-1(目前数学不好不明所以)
(3)MR结束
③编写check函数,传入一个参数。首先排除一些情况
(1)是2 3 7 61(int范围内完全可以判断的底数)如果是的话return true;
(2)是偶数,1,3的倍数或5的倍数或7的倍数所有条件并起来如果满足一个那么return false
④开始进行MR的判断,一般int范围内判断2,3,7,61即可
⑤编写主函数然后输出即可
#include <bits/stdc++.h>
using namespace std;
int qpow(int a,int b,int c)
{
long long ans=1;
long long base=a;
while(b)
{
if(b&1)
ans=ans*base%c;
base=base*base%c;
b>>=1;
}
return ans;
}
bool MR(int a,int n)
{
int r=0,d=n-1;
if(!(n%a))
return false;
while(!(d&1))
{
d>>=1;
r++;
}
long long k=qpow(a,d,n);
if(k==1) return true;
for(int i=0;i<r;i++,k=k*k%n)
if(k==n-1)
return true;
return false;
}
bool check(int n)
{
if(n==2||n==3||n==7||n==61)
return true;
if(!(n&1)||!(n%3)||!(n%5)||n==1)
return false;
if(MR(2,n)&&MR(7,n)&&MR(61,n)&&MR(3,n))
return true;
return false;
}
main()
{
int k;
while(cin>>k)
check(k)?cout<<"Y
":cout<<"N
";
}