判断一个数p是否为素数(p首先得为大于等于2的正整数才有可能为素数),首先判奇偶,若为偶数只有2为素数,若为奇数(这里可以考虑去掉 3甚至5的倍数),则先求出d。对于每一个底a,让d不断乘以2直到为(p-1)/2,在此过程中(包括原本的d与d=(p-1)/2时的情况),设t为a的d次方模p的余数。
(1)当t=-1时跳出,声明p有可能为素数;
(2)当t=1时,若d为奇数,跳出声明p有可能为素数,否则跳出声明p必为合数;
(3)当d=(p-1)/2时跳出,声明p必为合数。
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
LL a;
LL pow_mod(LL a,LL b,LL m)
{
LL r=1;
while(b)
{
if(b&1)r=(r*a)%m;
a=(a*a)%m;
b>>=1;
}
return r;
}
bool M_R(LL a,LL num)
{
LL d=num-1;
while((d&1)==0)d=(d>>1);
LL p=pow_mod(a,d,num);
if(p==1 || p==num-1) return true;
else
{
LL t=(num-1)/2;
while(d!=t)
{
d=(d<<1);
if(pow_mod(a,d,num)==num-1)
return true;
}
return false;
}
}
bool check(LL p)
{
if(p==2||p==3||p==5||p==7||p==11)return true;
if((p&1)==0 || p%3==0 || p<2)return false;
if(M_R(2,p)&&M_R(3,p)&&M_R(5,p)&&M_R(7,p)&&M_R(11,p))
return true;
else return false;
}
int main()
{
cin>>a;
if(check(a))cout<<"Yes";
else cout<<"No";
return 0;
}
/*
Wenn n < 1.373.653, ist es ausreichend a = 2 und 3 zu testen,
wenn n < 9.080.191, ist es ausreichend a = 31 und 73 zu testen,
wenn n < 4.759.123.141, ist es ausreichend a = 2, 7, und 61 zu testen,
wenn n < 2.152.302.898.747, ist es ausreichend a = 2, 3, 5, 7, und 11 zu testen,
wenn n < 3.474.749.660.383, ist es ausreichend a = 2, 3, 5, 7, 11, und 13 zu testen,
wenn n < 341.550.071.728.321, ist es ausreichend a = 2, 3, 5, 7, 11, 13, und 17 zu testen.
*/