51nod 1106 质数检测——Mr判素数

时间:2021-05-25 10:44:20

质数检测一般都是根号n的写法 当然Mr判素数的方法可以实现log的复杂度2333

Mr判素数的话 我们根据费马小定理只要P是素数 那么另一个素数x 满足 x^P-1≡1(mod P)

同时 x^2%P==1 的解只有 x==1||x==P-1 可以利用这第二个式子做二次探测

利用 2 3 5 7 11 13 17 这七个素数可以保证int内正确性QAQ

当然记得判断2 3 5 7 11 13 17  因为费马小定理成立的条件是 x和P 互质

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int T,n;
int num[]={,,,,,,};
LL pmod(LL a,LL b,LL c){
LL ans=;
while(b){
if(b&) ans=ans*a%c;
b>>=; a=a*a%c;
}
return ans;
}
bool calc(LL x,LL P){
LL ly=P-,yy,last;
while(ly%==) ly/=;
last=yy=pmod(x,ly,P);
while(ly!=P-){
yy=yy*yy%P;
if(yy==&&last!=&&last!=P-) return ;
ly*=; last=yy;
}
return yy==;
}
bool pd(LL n){
if(n==||n==||n==||n==||n==||n==||n==) return ;
for(int i=;i<;i++)if(!calc(num[i],n)) return ;
return ;
}
int main(){
T=read();
while(T--){
n=read();
if(pd(n)) printf("Yes\n");
else printf("No\n");
}
return ;
}