4 数论
\({\Large 约定}\):
- 用集合符号表示位运算符号,用 $ \oplus $ 表示异或,特别的,$ i \in S$ 表示二进制数 \(S\) 的第 \(i\) 位为 \(1\)
- 用 \(V\) 表示值域,\(\sum\) 表示字符集,\(\omega\) 表示
bitset的常数 \((\omega = 64)\)- 除去用 \(()/[]\) 表示开闭区间外,\([]\) 仅表示艾弗森约定,\(\{\}\) 仅表示集合,括号嵌套全用 \(()\)
- 字符串或序列角标为区间表示对应区间的子串
\(\textcolor{white}{\mathrm{pw:hellORwold}}\)
数论好难数论好难数论好难。
P4718 【模板】Pollard-Rho
\(\textcolor{purple}{\mathrm{省选/NOI−}}\) tag 数学 素数判断
Pollard-Rho 模板题。
检验是否是质数可以用 Miller–Rabin。
费马小定理:若 \(p\) 为素数,\(a\not\equiv 0\pmod p\),则 \(a^{p-1}\equiv 1\pmod p\)。
二次探测定理:若 \(p\) 是奇素数,则 \(x^2\equiv 1\pmod p\) 的解只有 \(x\equiv 1\pmod p\) 与 \(x\equiv p-1\pmod p\),即 \(1\) 在模 \(p\) 意义下不存在非
平凡平方根。若找到了一个在 \([2,p-2]\) 中的 \(x\) 满足 \(x^2\equiv 1\pmod p\),则可得 \((x+1)(x-1)\equiv 0\pmod p\)。由于 \(x\) 在 \([2,p-2]\) 中,因此 \((x+1),(x-1)\) 均非 \(0\) 且 \(<p\),因此两者一定有一个不与 \(p\) 互素,\(p\) 一定不是素数。
有了这两个定理就可以实现 Miller-Rabin 了。
流程:
- \(p\) 是偶数或 \(1\) 直接判断。
- \(p\) 为大于 \(1\) 的奇数时,选取一个在区间 \([2,p)\) 之间的随机数 \(a\)(也可以是一些确定的数比如 \(30\) 以内的质数)。
- 将 \(p-1\) 分解为 \(2^t\times r\) 的形式,若 \(a^r\equiv -1/0/1\),则可以跳出这轮判断。(\(a^r\equiv -1/1\) 说明 \(a^r\) 是 \(1\) 在模 \(p\) 意义下的平凡平方根,\(a^r\equiv 0\) 说明 \(a\) 是 \(p\) 的正整数次幂(?),如果 \(a\) 不是素数也会被后面的判断掉。)然后计算 \(a^{2^k\times r}(0\leq k\leq t)\)(在 \(a^r\) 的基础上不断平方即可)。若在平方过程中发现一个不为 \(1\) 或 \(p−1\) 的数的平方为 \(1\),则根据二次探测定理直接判断 \(p\) 不是素数。假如说计算到 \(a^{2^k\times t}\) 时还不为 \(1\),那么就说明 \(p\) 不是素数。
- 若多次回到步骤 \(2\) 后还没有判断 \(p\) 不是素数,则认为 \(p\) 是素数。
接下来要找出最大的质因数。
设要求的是 \(n\) 的最大质因数,我们可以找到 \(n\) 的一个非平凡因子 \(x\),并让 \(x\) 和 \(\frac n x\) 继续递归下去直到变成质数,然后选出最大的质数即可,显然质因数的个数是不超过 \(\log n\) 的。要找到 \(n\) 的一个非平凡因子可以用 Pollard-Rho。
每次随机一个数,看看这个数是否是 \(n\) 的因数,这样期望的时间复杂度是 \(\mathcal{O(n)}\) 的,显然是可以改进的。
因为我们只要找到一个非平凡因子,显然可以改进成随机一个数之后让这个数与 \(n\) 求 gcd。如果结果不为 \(1\) 说明这是 \(n\) 的一个因数,最差期望时间复杂度是 \(\mathcal{O(\sqrt n\log n)}\)。
生日悖论:如果我们不断在某个范围内生成随机整数,很快便会生成到重复的数,期望大约在根号级别。精确地说,对于一个 \([1,N]\) 内整数的理想随机数生成器,生成序列中第一个重复数字前期望有 \(\sqrt \frac{\pi N}{2}\) 个数。
如果我们不断在 \([1,n-1]\) 间生成随机数,那么期望在生成大约 \(n^{\frac 1 4}\) 个数后,可以出现两个在模 \(p\) 下相同的数(\([1,n-1]\) 间的随机数模 \(p\) 大大致是 \([0,p-1]\) 间的随机数)。在这里 \(p\mid n\)。设 \(x<y\),那么有 \(p\mid y-x\),\(\gcd(y-x,n)=p>1\),那么我们就找到了一个非平凡因子。
Pollard 使用一种特别的伪随机数生成器来生成 \([0,N-1]\) 间的伪随机数序列:设序列第一个数为 \(x\),\(f(x):= (x^2+c)\mod N\),则 \(x,f(x),f((x)),f(f(f(x))),...\) 为一个随机数序列。
这个伪随机数生成器生成的数具有一个性质。如果 \(|i-j|\equiv 0\pmod p\),那么一定有 \(|f(i)-f(j)|=|i^2-j^2|=|i-j|\times |i+j|\equiv 0\pmod p\)。由此可得,只要环上距离为 \(d\) 的两个数满足条件,那么所有距离为 \(d\) 的数都满足条件。在 Floyd 判环的过程中,维护两个指针 \(l\) 和 \(r\),其中 \(r\) 移动的步数是 \(l\) 的两倍,让 \(|r-l|\) 与 \(n\) 求 gcd。每次移动都相当于在检查一个新的距离 \(d\),这样就不需要进行两两比较了。这样复杂度是 \(\mathcal{O(n^{\frac 1 4}\log N)}\) 的。当然要特判一下 \(n=4\) 的情况。
我们发现求 gcd 的 \(\log N\) 很烦,所以我们可以隔一定距离,先把一些数乘起来之后再与 \(n\) 求 \(\gcd\)。如果积在乘的过程中等于 \(0\),那么后面都是 \(0\) 了,可以直接退出。复杂度是 \(\mathcal{O(n^{\frac 1 4})}\) 的。
\(\mathcal{O(n^{\frac 1 4}\log n)}\):submission
\(\mathcal{O(n^{\frac{1}{4}})}\):submission
2026.01.09

浙公网安备 33010602011771号