判斷一個大數(小於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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章