miller rabin

miller rabin

前置

朴素素性检验

试到 , 如果可以被整除,则为合数;否则为素数

Fermat小定理

为素数,则

Fermat素性检验

中选取几个数,利用Fermat小定理快速幂计算,如果结果不为1,则一定不是素数,否则大概率是素数。

Carmichael Number

也称 Fermat 伪素数,即满足 的合数,如

二次探测定理

为奇素数,则的解为

miller rabin

在满足 可能为合数,那么通过二次探测定理,可以将 除以 , 进一步判断其是否满足开根后结果为 , 来判断其是否为素数。

, 则 为偶数

先判断 是否成立,如果不成立则为合数。

然后将 , 如果 不等于 , 则为合数

直到 为奇数或 , 如果 不成立则为合数,否则大概率为素数

code:

1
2
3
4
5
6
7
8
9
10
11
int miller_rabin(int a,int p){
int d=p-1;
if(kp(a,d,p)!=1) return 0;
while(d){
int cur=kp(a,d,p);
if(cur!=1 && cur!=p-1) return 0;
if((d&1) || cur==p-1) return 1;
d>>=1;
}
return 1;
}

其中 表示求

如果是素数,最终的 序列应该为

单次检验复杂度为 , 次测验为

  • 注:这里的复杂度 其实并不准确,没有考虑大数乘法,事实上大数乘法需要用到FFT加速才能达到比较好的效果

对于 以内数选取 为底数,可以确定性判素

对于 以内,选取前 个素数

miller rabin 的出错率

定理1

如果 是有限群 的一个真子群,那么

此为Lagrange定理的一个推论(如果 是有限群 的一个真子群,那么 的约数)

证明略

定理2

如果 是奇合数,则 为合数的证据数目至少为

这里证据指满足

证明:

我们要证明非证据一定是 的成员 ( 的整数)

因为非证据 满足 , 这说明 这个方程有解

根据裴蜀定理, 方程才有解,则

这说明 的成员

进一步,我们要说明所有非证据包含在 的一个真子群

因为 ,

由定理1,我们有

即非证据数目最多为 , 则证据数目最少为

具体是可以找出这样的真子群 的,参见算法导论

结论

miller rabin 算法的出错率由测验次数 决定,概率最大为

证明:

对于要验证的数 , 它是合数的证据至少为 , 所以验出他是合数的概率最少为

由于进行了 轮,所以全部不能验出他是合数的概率最大为 , 即一次都没能发现他是合数

Lucas sequence

另一种素数测验法,与miller rabin结合后为Baillie-PSW Test,是非常强大的Probable prime test

ECPP

椭圆曲线