Miller-Rabin测试素数模板

ll qpow(ll a,ll b,ll M) //快速幂
{
    ll ans =1;
    while(b)
    {
        if(b&1)
            ans*=a;ans%=M;
        a*=a;a%=M;b>>=1;
    }
    return ans;
}
bool MillerRabinTest(ll x,ll n)//选取x为底,判定n是否可能为素数
{
    ll y=n-1;
    while(!(y&1))y>>=1; //略去n-1(=d*2^s)右端连续的0,将其调整为d
    x=qpow(x,y,n);//x=x^d mod n
    while(y<n-1&&x!=1&&x!=n-1) //将x反复平方,直到模数值出现n-1或1为止
        x=(x*x)%n,y<<=(ll)1;
    return x==n-1 || y&1==1 ;//若x为n-1或y为奇数,则n可能为素数,否则一定不是
}
bool isprime32(ll n)//判断32位以内的整数n是否为素数
{
    if(n==2||n==7||n==61)return 1;//若n为【2,7,61】中的元素,则n为素数
    if(n==1||(n&1)==0) return 0;//若n是1或是非2偶数,则n为合数
    return MillerRabinTest(2,n)&&MillerRabinTest(7,n)&&MillerRabinTest(61,n);//若n通过以2,7,61为基准的Miller-Rabin测试,则n一定是素数;否则为合数
}

猜你喜欢

转载自blog.csdn.net/dilly__dally/article/details/81044159