首页 > 代码库 > Miller-rabin判素数

Miller-rabin判素数

用Miller-rabin判素数之前,先要知道一个叫费马小定理的东西。

费马小定理:如果p是质数,那么任意和p互质的数的p-1次方对p取模都等于一。

即:任意gcd(a,p)==1,那么a^(p-1)≡1(mod p)

既然我们用费马小定理又得到了一个新的质数的性质,那么我们就可以用这个性质来判定素数。

为了判定p是不是质数,我们随机检验一些a检验a^(p-1)mod p是否为1

但是这样判定一个素数并不是百分百正确的,有一些数不是素数,但依据费马小定理还是会判定成素数。

例如:p=561=3*11*17,无论如何取a,都满足费马小定理的素数性质。

于是我们就需要利用二次探测的思想:
p是质数,则x^2≡1(mod p)仅有两个解,x1=1,x2=p-1(很显然,(p-1)^2=p^2-2p+1),我们这样计算a^(p-1):

  1.我们令p-1=2^s * t(因为p是质数,p-1一定是偶数,偶数一定可以表示成2^s * t)

  2.然后我们来分解2^s * t,设x0=a^t,xi=x(i-1)^2,最后我们可以得到xs=a^(p-1)(等比数列)

  3.如果|xi|!=1,且x(i+1)=1,那么p显然不是质数(因为该方程只有两个解,如果)。

上面介绍了算法原理,下面是算法流程:

  1.按照上面的方法计算a^(p-1)(如果p不是质数,那么此时有可能直接返回)

  2.检查a^(p-1)≡1(mod p)

  3.当a是2~p-1的随机数时,如果p返回是合数,那他就是一定合数,如果返回是质数,则有一半的机会是质数

Miller-rabin判素数