Miller-Rabin算法的理论基础
如果n是一个奇素数,将n−1表示成2sr的形式(r是奇数),a是和n互素的任何整数,那么ar≡1(mod n) 或者对某个j(0≤j≤s−1,j∈Z)等式a2jr≡−1(mod n)成立。
素数判定思路
1.如果ad≠1(mod n),以及(n=1+2sd)是素数,则值序列:
admod n,a2dmod n ,a4dmod n,a8dmod n ……,,a2sdmod n 将以1结束,而且在头一个1的前边的值僵尸n−1(当p是素数时,对于y2≡1(mod p)) 仅有的解是y=±1,因为(y+1)(y−1)必须为p的倍数。
2.如果该序列中出现了n−1, 则该序列的下一个值一定是1,(因为(n−1)2=n2−2n+1≡1(mod n))
步骤
1. 将n−1分解成2sd的形式。
2. 将(3−10)行循环k次。(出错概率为(14)k)
3. ~在[2,n−2]的范围中独立&随机地选择一个正整数a。
4. ~计算该序列的第一个值x=admod n
5. ~如果该序列的第一个值是1或n−1,符合上述条件,n可能为素数,转到第3行进行下一次循环。
6. ~循环执行7−9行,顺序遍历该序列的剩下的(s−1)个值
7. ~~计算该序列的下一个值:x=ximod n
8. ~~如果这个值是1,但前边的值不是n−1,不符上述条件,n肯定为合数,算法结束。
9. ~~如果这个值是n−1,因此下一个值一定是1,符合上述条件,n可能为素数,转到第3行进行下一次循环。
10. ~发现该序列不是以1结束,不符上述条件,因此n肯定为合数,算法结束。
11. 已经对k个独立&随机的a值进行了检验,因此判断n非常有可能为素数。