素数判定

【题目描述】

输入一个数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的伪素数。
        伪素数满足费马小定理,几乎肯定为质数。
*/
原文地址:https://www.cnblogs.com/Ackermann/p/5952803.html