Miller-Rabin 素数测试

Miller-Rabin 是一个基于小费马定理的随机算法。

先来介绍一下费小马定理:

费马小定理
\(p\)为质数,则有当\(1\leqslant a \leqslant p-1\)时有\(a^{p-1} \equiv 1(mod p)\)
可能是素数

然后介绍一下素数二次测试

如果\(p\)是素数
\(x^2 \equiv 1(Mod p)\)的解一定是\(x = 1\)\(x = p-1\)

然后就可以愉快的写算法啦~~~
擦,发现拷了个错的程序,误人子弟啊
还好留个个心眼测试了。。。。。

又找了一个靠谱的:

ll mul(ll a,ll b,ll p)
{
    ll tmp=(a*b-(ll)((long double)a/p*b+1e-8)*p);
    return tmp<0?tmp+p:tmp;
}
ll pow(ll a,ll b,ll p)
{
    ll ans=1;a%=p;
    for(ll i=b;i;i>>=1,a=mul(a,a,p))
        if(i&1)ans=mul(ans,a,p);
    return ans;
}
bool check(ll a,ll n,ll r,ll s)
{
    ll ans=pow(a,r,n),p=ans;
    for(int i=1;i<=s;i++)
    {
        ans=mul(ans,ans,n);
        if(ans==1&&p!=1&&p!=n-1)return 1;
        p=ans;
    }
    if(ans!=1)return 1;
    return 0;
}
bool MR(ll n)
{
    if(n<=1)return 0;
    if(n==2)return 1;
    if(n%2==0)return 0;
    ll r=n-1,s=0;
    while(r%2==0)r/=2,s++;
    for(int i=0;i<10;i++)
        if(check(rand()%(n-1)+1,n,r,s))
            return 0;
    return 1;
}

至于他为何要那样子算\(a^{n} \equiv 1(mod n)\) 似乎速度更快,确实也更快,

posted @ 2017-04-29 18:54  rsqppp  阅读(146)  评论(0)    收藏  举报