Miller Rabbin 和 Pollard-rho 学习笔记

Miller Rabbin 和 Pollard-rho 学习笔记

Miller Rabbin

用于素性检验。

费马小定理

\[a^{p - 1} \equiv 1\pmod p, (a, p) = 1 \]

如果 \(p\) 是质数,则有

\[\forall a < p, a^{p - 1}\equiv 1\pmod p \]

所以如果

\[\exists a < p, a^{p - 1}\not\equiv 1\pmod p \]

那么 \(p\) 不是质数,但是这样不是充分的,不满足这个检验的数被称为 卡迈尔数(Carmichael number),比如 \(561\)

二次探测定理

\(x^2\equiv 1\pmod p\) 的解是 \(x = 1\)\(x = p - 1\),平方差公式可证。

Miller Rabbin

考虑改进费马素性检验,如果 \(p\) 是奇数,那么 \(p - 1\) 是偶数,所以如果 \(p' = \dfrac {p - 1}2\),那么 \((a^{p'})^2\equiv 1\pmod p\) 的解就是 \(a^{p'} \equiv 1\)\(a^{p'} \equiv p - 1\),如果是前者,那么递归下去。

所以我们设 \(p - 1 = r \times 2^t\),检验 \(a^r\equiv 1\)\(a^{r\times 2^k}\equiv p - 1, k < t\),如果有一个满足条件,就说明 \(p\) 通过了检验。

实践发现,取 \(2\sim 37\) 的所有质数作为底数检验在值域 \(\le 2^{78}\) 时始终正确。

Pollard rho

用于在期望 \(O(n^{1/4})\) 的时间内找到一个 \(n\) 的因数。

  1. 根据生日悖论,期望需要 \(O(n^{1/2})\)\([1, n]\) 的数字会出现相同数。

  2. 如果 \(n\) 是合数,\(n\) 的最小质因子 \(\le n^{1/2}\)

  3. 如果存在 \(a, b\)\(a\equiv b\pmod p\),那么 \(|a - b|\)\(p\) 的倍数。

结合 1 和 2,可以知道,如果随机 \(n^{1/4}\) 个数,期望存在一对 \(a\equiv b\pmod p\),其中 \(p\) 是最小质因子,那么 \(\gcd(|a - b|, n)\) 就是 \(n\) 的一个因数,但是怎么找到这一对数仍没有好的办法。

Pollard 构造了一个数列 \(x_0 = x, x_i = x_{i - 1}^2+c\),如果 \(x, c\) 均匀随机,那么根据生日悖论,这个数列在 \(\bmod n\) 意义下会在 \(O(\sqrt n)\) 项后出现相同的项,并进入循环,并且这个数列精妙之处在于如果 \(x_i\equiv x_j\pmod p\),那么 \(x_{i + 1}-x_{j + 1}\equiv (x_i^2+c) - (x_j^2+c)\equiv (x_i+x_j)(x_i-x_j)\equiv 0\pmod p\),这就导致我们只需要找到一对下标之差为 \(|j - i|\) 的数对就等价于检验了所有下标之差为 \(|j - i|\) 的数对。

不过仍有可能我们无法只通过一个随机数列确定因数,这时候就需要多随机几次,不过如何判断我们已经进入一个环,而无法继续通过这个数列确定因数了呢?

考虑维护一对指针 \(a, b\),其中 \(b = 2a\),设环的大小为 \(T\),前面尾巴部分长度为 \(l\),如果 \(l < T\),那么在 \(a = T\) 的时候我们可以立刻判断出 \(x_b = x_a\) 从而发现我们进入了环而跳出这次检验,否则 \(a\) 最多在 \(l + T\) 的时候就会得到 \(x_a = x_b\),随机数列的尾巴和环长度期望 \(O(\sqrt n)\),不过这一部分的复杂度并不重要。

在维护指针的时候,每一次都要检验 \((|a - b|, n) > 1\),如果满足就找到了因数,期望进行 \(O(\sqrt p) = O(n^{1/4})\) 次检验。

这里虽然我们不知道 \(p\) 具体是多少,但是我们知道它对应的数列 \(x\bmod p\) 一定是形如 ρ 的,可以理解为我们在不知道 \(p\) 的情况下对其数列进行了素性检验。

posted @ 2025-08-27 21:30  MoyouSayuki  阅读(13)  评论(0)    收藏  举报
:name :name