Miller-Rabbin素数测试判定素数

介绍一种素数判定的方法:

Miller-Rabbin素数测试

时间复杂度可以达到O(slogn)级别,s是测试次数,一般取在30次左右便已足够,因此这是一个logn级别的算法

首先根据费马小定理,当p是素数时有:

/(a^{p-1}\equiv1(\mod p)/)

/(a^{p-1}\mod p =1/)

那么如果有此式成立,是否p一定为质数?答案是否定的。但是,我们可以多测试几次,即随机选取a值进行测试,提高准确率。测试次数越大,正确率越高。(当然也就越慢)

测试次数一般选在30左右。

那么我们就可以用快速幂求出/(a^{p-1}\mod p/)的值,判断其是否为1即可。

上代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;

ll num;

ll qpow(ll a,ll b,ll mod)
{
    ll res=1;
    while(b)
    {
        if(b&1)res=(res%mod*a)%mod;
        a=(a%mod)*a%mod;
        b>>=1;
    }
    return res;
}

bool MRT(ll x)
{
    if(x==2)return true;
    if(x==1)return false;
    for(int i=1;i<=30;i++)
    {
        ll base=rand()%(x-2)+2;
        if(qpow(base,x-1,x)!=1)return false;
    }
    return true;
}

int main()
{
    scanf("%lld",&num);
    if(MRT(num))printf("Prime\n");
    else printf("Not Prime\n");
    return 0;
}

 

posted @ 2019-05-09 14:42  Black_Gzombie  阅读(510)  评论(0编辑  收藏  举报