请务必点开每一个隐藏栏.
第零个大问题
英文标点是为了与下标
0 混淆, 也是数学写作的通用习惯. 这不会在排版观感上对阅读造成障碍, 因此求管理员通过.
本篇题解, 介绍数域分解.
二次筛
小问题. 713 是一个质数吗?
不是, 它等于
23⋅31. 注意力好的同学可以注意到
713=729−16=272−52=(27−4)(27+4).
这该如何推广?
当
N 有一个
N 左右的因子时, 可以判断:
(⌈N⌉+K)2−N是否是完全平方. 例如
⌈713⌉=27, 这就使得可以在
1 次尝试内得到结果.
但是这个方法不一定好用, 当
N 没有
N 附近的因子可能还没有试除法来的好用.
我们发现, 上述过程只利用了
A2−B2=N, 而没有利用
A2−B2=cN 的情形, 也就是
A2≡B2(modN) 的非平凡解, 这样
gcd(A−B,N) 会是
N 的一个非平凡因子.
A2−B2=N 的平凡解占比多吗?
事实上, 这个方程的非平凡因子并不少, 如果
N 不形如
pr, 即有两个相异素数
P,Q 整除
N, 则可以构造出
A≡B(modP),A≡−B(modQ);A≡−B(modP),A≡B(modQ).这两个非平凡解, 相比于对应的平凡解, 个数是相等的. 而形如
P3Q4 的
N 的非平凡解只会更多. 因此
A2≡B2(modN) 有至少一半是非平凡解.
所以, 我们能导出什么样的算法?
然后我们考虑如下过程: 从
⌈N⌉ 开始, 计算
M 个值:
FK=(⌈N⌉+K)2−N (K=0,1,…,M−1).如果能找到一个非空子集
S⊂{0,1,…,M−1} 使得
k∈S∏Fk 是平方数,那么我们就能找到
A2≡B2(modN), 进而找到
N 的一个非平凡因子. 这其实相当于异或线性基问题: 如果我们能把
FK 全部分解成
FK=p∏pνp(Fk),则
νp(Fk)mod2 (∀p) 对应于一个
F2-空间上的向量, 进而只需判断这些向量是否线性相关.
实例验证 N=989
用实例验证: 考虑
N=989, 则
⌈N⌉=32, 则
F1=100=22⋅52作为
F2-向量等于
0. 因此
102≡332(modN)⟹23∣N.
但是最坏的情况下我们可能要很多个
FK 才能找到线性相关的解法, 然后每个都试除就给出了比试除法还劣的复杂度. 但这种方法仍然有意义, 因为我们可以考虑限制
FK 以把极慢的试除法淘汰掉.
我们发现所有素因子都小于一个阈值
Pmax 的数记好分解, 因为只需要试除
logPmaxPmax 次就好, 甚至可以用 Erathothenes 筛获得更快的做法.
第一个大问题:
怎么判断那些
FK 的满足其素因子全部小于
Pmax?
能否从 Eratosthenes 筛获得启发?
为什么 Eratosthenes 筛很快? 因为
p 的倍数很有规律, 你可以直接一行循环模拟. 那么对于
FK 呢? 这相当于解
X2−N=pA, 也就是
X2≡N(modp). 这是一个典型的二次剩余问题.
现在考虑这样的方法: 把
FK 一列列开, 并复制一个副本
FKc. 现在对于每一个
pr<Pmax, 将位置
S={K:pr∣FK} 中的数
K 对应的
FKc 除以
p. 这样, 只需要解决
FK≡N(modpr) 何时成立. Cipolla 算法求出一个
modp 意义下的解, 并 Hensel 提升即可.
实例验证 N=87 463
假设
Pmax=30, 经过上面的筛选过程, 我们得到
F−30=−17 238=(−1)⋅2⋅3⋅132⋅17,F−17=−10 179=(−1)⋅3⋅13⋅29,F1=153=3⋅17,F4=1 938=2⋅3⋅17⋅19,F12=6 786=2⋅32⋅13⋅29,F21=12 393=36⋅17.用线性基算法可以发现
F−30F−17F1F12 是一个平方数, 得到
A2≡B2(modN) 的非平凡解:
A=265⋅278⋅296⋅307≡34757(modN),B=(2652−N)(2782−N)(2962−N)(3072−N)≡28052(modN).进而导出
149∣N.
时间复杂度分析
期望时间为
∣{D:1≤D≤N,D 的素因子全都 <Pmax}∣π(Pmax)loglogPmaxN.我们把分母记作
ψ(N,Pmax). 假定
Pmax=N1/2u, 则
π(Pmax)loglogPmax≈Pmax,
ψ(N,Pmax)N≈uu (这分别是素数定理稍微保守一点的估计和 K. Dickman 的数论成果), 进而我们只需最小化
N1/2uuu, 易得
u∼loglogNlogN,此时复杂度为:
T(N)∼exp((1+o(1))⋅logNloglogN).
多个二次多项式的优化
我们可以多选取一些
(ax+b)2−N 在
x≈0 处的取值, 这样会更容易找到
u2≡v2.