【学习笔记】Miller-Rabin 算法
费马小定理
当 \(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})\) 内所有素数。
参考资料
-
OI Wiki