判断一个大数(小于2的63次方)是否是素数

LL mul(LL x,LL y,LL mod)
{
    return (x*y-(long long)(x/(long double)mod*y+1e-3)*mod+mod)%mod;
}
LL pow_mod(LL a,LL n, LL mod)
{
    LL ret=1;
    while(n)
    {
        if(n&1) ret=mul(ret,a,mod);
        a=mul(a,a,mod);
        n>>=1;
    }
    return ret;
}

bool isprime(LL n)
{
    if(n < 2) return 0;
    if(n!=2 && n%2==0) return 0;
    LL a[]={2, 3, 5,233,331};
    LL s=n-1;
    while(!(s&1)) s>>=1;
    for(int i = 0; i <= 4; i++)
    {
        if(n==a[i]) return 1;
        LL t=s,m=pow_mod(a[i],s,n);
        while(t!=n-1 && m!=1 && m!=n-1)
        {
            m=mul(m,m,n);
            t<<=1;
        }
        if(m!=n-1 && !(t&1)) return 0;
    }
    return 1;
}
发布了38 篇原创文章 · 获赞 12 · 访问量 3933

猜你喜欢

转载自blog.csdn.net/int_lyy/article/details/100016409
今日推荐