【学习笔记】Miller-Rabin 算法

发布时间 2023-10-24 19:39:30作者: SoyTony

费马小定理

\(p\) 为质数时,若 \(\gcd(a,p)=1\),则 \(a^{p-1}\equiv 1\pmod p\)

但逆命题是错的,例如 \(p=561\) 这类卡迈克尔数,满足任何 \(\gcd(a,p)=1\) 都有 \(a^{p-1}\equiv 1\pmod p\)。所以用费马小定理判断质数是不行的。

二次探测定理

\(p\) 为奇质数时,\(x^2\equiv 1\pmod p\) 的解只有 \(x\equiv\pm 1\pmod p\)

证明考虑移项得到 \((x+1)(x-1)\equiv 0\pmod p\),即 \(p\mid (x+1)(x-1)\),由于 \(p\) 为质数,那么不会出现 \(x+1\)\(x-1\) 共同贡献出 \(p\) 这个因子。

Miller-Rabin 算法

将上面两个定理结合起来,取一质数为底数 \(a\),特判 \(a^{p-1}\not\equiv 1\pmod p\) 的情况,之后不断执行如下操作:

  • \(p-1\) 为奇数,返回值为真。

  • \(p-1\) 为偶数

    • \(a^{\frac{p-1}{2}}\not\equiv\pm 1\pmod m\),返回值为假。

    • \(a^{\frac{p-1}{2}}\equiv -1\pmod m\),返回值为真。

    • \(a^{\frac{p-1}{2}}\equiv 1\pmod m\)\(p\leftarrow \frac{p-1}{2}+1\),继续执行。

时间复杂度为 \(O(k\log^2 p)\),其中 \(k\) 为选取的底数个数。

选取前 \(12\) 个素数,可以测出 \([1,2^{64})\) 内所有素数。

参考资料