0%

Miller Rabin 与 Pollar-Rho

Miller Rabin 质数判定

费马小定理

众所周知

\(p\) 是质数, 对于任意 \(a\),有 \[a^{p - 1} \equiv 1 \pmod{p}\]

二次剩余

\(p\) 是质数,对于 \(x \in (0, p)\),关于 \(x\) 的方程 \(x^2 \equiv 1 \pmod{p}\) 的解为 \(x = 1 \ or \ p\)

两个逆定理同样成立。

下面开始正题

对于任意 \(a\),令 \(p - 1 = 2^qm, m = 2n + 1, n \in \mathbb{N}\): - 根据费马小定理,如果 \(a^{p - 1} \not\equiv 1 \pmod{p}\),那么 \(p\) 不是质数; - 根据二次剩余,如果 \(a^{p} \equiv 1 \pmod{p}\)\(a^{p - 1} \equiv 1 \pmod{p}\),那 \(p\) 不是质数。

那么我们不断选择 \(a\) 进行检验。

如果 \(p\) 是质数,那么通过以上两个测试的概率为 \(1\);如果 \(p\) 不是质数,那么通过以上两个测试的概率为 \(\frac{1}{4}\)

只要取足够多个 \(a\),那么就能将错误率降低到可以接受的范围内。

如果是 int 范围那么 \(10\) 次左右可以保证正确,如果是 long long 那么 \(20\) 次。

或者还有一种方法直接令 \(a\) 为前 \(10 \sim 20\) 个质数,至少 long long 范围内没有什么问题。

Pollar-Rho 分解质因数

名字来源可能是因为长得像 \(\rho\)

网上的大部分资料都没怎么看懂,上来就是式子。

那我先放一张图。

pollar-rho.png

好了讲完了 我是看了这张图突然明白的qwq

考虑在什么情况下能找到 \(p\) 的一个拆分。

这谁想的出来嘛

给出一个伪随机序列生成方式

\[a_i \equiv a_{i - 1}^2 + b \pmod{p}\]

这个数列的每一项都由前一项决定,且值域为 \([0, p)\),那么数列 \(a\) 必然有循环节,也就是上面那个环。

我们把 \(p\) 换成 \(q\),再生成一遍这个序列,又得到一个循环节。

设两次的循环节长度分别为 \(m\)\(n\),如果 \(m \not = n\),那么说明我们找到了两个数 \(m, n\) 使得 \(\gcd(m - n, p) \not = 1 \ or \ p\)

至于具体实现:

算出第一个序列,找到循环节长度 \(m\);找到一个 \(q\), 算出第二个序列,找到循环节长度 \(n\)。 然后分三类: - \(\gcd = 1 \ or \ p\):再找 \(q\); - \(\gcd \not = 1 \ or \ p\):找到一个因子 \(\gcd\)

于是我们完成了一次拆分。

下面来分析复杂度。

根据生日悖论,可得在第一个序列中出现相同数的期望长度为 \(\sqrt p\),在第二个序列中出现相同数的期望长度为 \(\sqrt q\)

那么只要枚举 \(\sqrt q\) 个数就可以找到一种拆分。

如果令 \(q\)\(p\) 的最小因子,那么期望只要枚举 \(p^{\frac{1}{4}}\) 次。