MillerRabin 快速的素数概率判定法

来源:互联网 发布:mysql sum group by 编辑:程序博客网 时间:2024/05/16 08:59

MillerRabin 快速的素数概率判定法

1.作用:快速判断单个数是否为质数

2.原理:

介绍费马小定理:对于每一个素数p,都有ap11(modp)
但是不是对于每一个有ab11(modb)的b都是素数
如果存在b满足上述规则,那么b有3/4的几率为素数

MillerRabin通过多次随机生成b并使用以上方法进行判断,能把错误的几率降到1/4k,其中k为判断次数
分母指数级扩大让概率随k的增大迅速趋近于0。当k达到10时判断错误的几率已经降到百万分之一,k达到20时几乎不会出错。
黑科技的力量啊 = =

typedef long long LL;namespace millerrabin{    inline LL advpow(LL a,LL b,LL c){        LL ret=1;        while(b){            if(b&1)ret*=a,ret%=c;            a*=a;            a%=c;            b>>=1;        }        return ret;    }    int random(const int&mod){        srand(rand()*rand()*rand());        return rand()%mod;    }    bool jdPrime(const int&num,const int&eps){        if(num<=3)return true;        int cnt=0;        while(cnt<=eps){            int a=random(num)+2;            if(num%a==0)continue;            if(advpow(a,num-1,num)%num!=1)return false;            cnt++;        }        return true;    }}
2 0