素数判定
【题目描述】
输入一个数P(P <= 263-1),询问是否为素数。
【输入描述】
输入一个正整数P。
【输出描述】
如果P为素数,则输出“Yes”,否则输出“No”。
【样例输入】
2
【样例输出】
Yes
源代码: #include<cstdio> #define LL long long LL n,Prime[10]={2,3,5,7,11,13,17,19,23,29}; LL Mod(LL S,LL X) //慢速模。 { LL Num=0; while (S) { if (S&1) Num=(Num+X)%n; X=(X+X)%n; S>>=1; } return Num; } LL Count(LL S,LL X) //快速幂。 { LL Num=1; while (S) { if (S&1) Num=Mod(Num,X); X=Mod(X,X); S>>=1; } return Num; } bool Check() //Fermat小定理检验质数。 { if (n==2) return true; else if (n<2||!(n&1)) //特判。 return false; for (int a=0;a<10;a++) //多次检验。 { if (n==Prime[a]) //再特判。 return true; if (Count(n-1,Prime[a])!=1) return false; } return true; } int main() { scanf("%lld",&n); if (Check()) printf("Yes"); else printf("No"); return 0; } /* 伪素数: 对于正整数n,若有与n互质的正整数a满足a^(n-1) ≡ 1(mod n),则n为a的伪素数。 伪素数满足费马小定理,几乎肯定为质数。 */