多项式因子分解 II: 有理数域情况
(本节参考 Pierre Lairez 的课件.)
在 这篇 中, 我们讨论了多项式在有限域上的因子分解. 今天我们来看如何扩展到有理数和多元情况.
本文比较粗犷, 主要目的是阐明核心想法并得到多项式复杂度, 不考虑优化多项式的指数. 比如对于一个 \(n\) 次多项式 \(f\), 如果系数都表为不超过 \(A\) 的整数, 那么多项式时间算法是说 \((n \log A)^{O(1)}\) 的时间复杂度.
首先让我们对问题做一个非常基本的转换. 我们把 \(\mathbb Q[x]\) 上的规约到 \(\mathbb Z[x]\) 中的首一多项式上. 道理是这样: 首先将多项式通分成整系数多项式, 然后设首项系数是 \(m\), 那么 \(x^{n - 1} f(x/m)\) 的因式分解就能给出原式的分解. 而且 \(x^{n-1} f(x/m)\) 本身是首一整系数多项式.
上面这个规约可能会把系数变得很大, 但是系数的位数仍然是 \((n\log A)^{O(1)}\) 的, 所以是一个多项式级别规约.
根据 Gauss 引理我们熟知, 这样的 \(f(x)\) 在 \(\mathbb Q[x]\) 的因子分解, 因子也可以都写成首一整系数多项式的形式.
一个直接的想法
一个非常直接的想法是: 选定一个足够大的素数 \(p\), 然后将 \(f(x)\) 在 \(\mathbb Z_p[x]\) 上进行因子分解, 再通过 \(\bmod p\) 的结果还原出 \(\mathbb Z[x]\) 上的因子.
这是一个支持该想法的正面结果.
Landau–Mignotte 界: 对于首一多项式 \(f, g\) 且 \(g \mid n\), 有估计
\[\| g\|_\infty \leq \|g\|_2 \leq 2^{\deg g} \|f \|_2. \]
我们这里不证明它, 但这个定理告诉了我们取多大的 \(p\) 足够: 若 \(f\) 可约, 那么取 \(p\) 充分大, 我们一定可以找到 \(f \bmod p\) 的某个因子, 将系数提升到 \([-p/2, p/2]\) 区间内, 该因子就是 \(f\) 的因子.
那么, 我们已经知道了在 \(\bmod p\) 上多项式因子分解是简单的, 我们可不可以直接用素因子来试呢? 并不能, 因为一个 \(f\) 的不可约因子, 在 \(\bmod p\) 之后可能会继续分裂成几个.
一个可能会让人想要尝试的方法是, 把几个不可约因子的乘起来, 然后检查是不是真的是 \(f\) 的因子. 遗憾的是, 有一个负面结果说明这是徒劳的: Swinnerton-Dyer 多项式 是一个 \(2^n\) 次多项式, 但它对任意 \(p\) 取模都会分裂成一堆二次多项式的乘积! 这意味着, 我们必须要检查非常大的子集, 这是不现实的!
格基约化
格问题, 简而言之, 就是用一组基的方式给出 \(\mathbb Z^n\) 的一个加法子群 \(\Lambda\). 一个基本的问题是最近向量 (Shortest Vector Problem, SVP) 问题, 说的是找出 \(\ell_2\)-距离给定向量最近的格点. 一般而言, 这个问题是 NP 难的.
但是, 这个问题的近似问题却非常自然. 比如说我们通过某种方式算出来某个代数数 \(\alpha\) 的数值解, 我们知道它应该满足一个 \(n\) 次最小多项式, 想知道它的系数. 那么我们就是要求 \(a_0,\dots,a_n\) 使得
显然这是一个超定方程, 为了让它变得合理, 我们需要增加约束, 也就是让 \(a_i\) 都尽量小. 如果考虑
其中, \(A_i \approx \lfloor\alpha^i M\rfloor\) 是 \(\alpha^i\) 的近似, \(M\) 是一个足够大的整数. 那么关于向量 \(A_n e_1\) 的 CVP 就是最小化
由于我们可以把 \(\alpha\) 计算出很高精度的近似, 这意味着如果稍微让 \(a_i\) 偏离真实的解, 这意味着稍微差一点的解本质上应该是和最优解相同的, 也即一定是 \((a_i)\) 的倍数.
幸运的是, 这个问题是可以在多项式时间内解决的!
Lenstra–Lenstra–Lovász 格基约化. 给定一个基 \(\Lambda\), 设 \(L_B\) 是 \(\| \cdot \|_2 \leq B\) 的个点张成的格, 那么: 如果 \(L_B = L_{2^n B}\), 那么存在多项式时间算法可以 \(L_B\) 的一个基.
这能很容易地解决上述的 SVP 问题.
注意这个 \(2^n\) 因子不能很有效地减小, 但是对于很多应用而言, 因为可以把需要的数多算 \(n^{O(1)}\) 位精度, 所以这个因子是可以接受的.
神奇的是, 他们一开始提出这个算法的时候就是为了解决多项式因子分解问题, 而之后大家才发现这个算法非常深刻, 适用于很多问题, 并且成为了格算法的基础...
用 LLL 解决问题
现在假设我们选取了一个充分大的素数 \(p\), 将 \(f(x)\) 在 \(\bmod p\) 后的多项式分解成 \(g_1,\dots,g_r\).
对于 \(f\) 一个真实的因子 \(g\), 显然存在集合 \(S\subset [r]\) 使得
这是一个乘积问题. 为了把它转化成格问题, 我们希望把乘法转换成加法, 直观上看就是取对数 \(\log g_i\). 当然这样是一个抽象的想法, 具体的实现方式是对数导数 \(g_i' / g_i\).
具体来说, 考虑如下张成的 \(r + n\) 维的格:
其中 \(f \cdot g_i / g_i\) 是 \(\bmod p\) 意义下做带余除法得到的多项式系数.
我们接下来再加上所有用来 \(\bmod p\) 的生成元:
其中这个 \(D\) 是一个待定的数, 用来让因子次数变得重要.
我们接下来忽略技术细节, 大概解释一下为什么在合适的 \(D, p\) 的选取之下能够满足 LLL 算法的要求.
首先, 我们大概希望 LLL 算法中所说的 \(L_B\) 刚好是 \(f\) 的每个实际因子 \(h\) 以及其因子向量 \(\bm n\) 所给出的
\((D \cdot \bm n, f h'/h)\) 这些向量 (以及 \(\bmod p\) 的生成元) 所生成的格. 这个时候前面的因子系数对范数的贡献大概就是 \(\| \bm n\|D\), 不大. 而 \(fh'/h\) 本来就是 \(\mathbb Z[x]\) 上的. 在 \(p\) 充分大的时候和 \(\bmod p\) 无关的数, 此时它也是可以被控制的.
而反过来, 对于任何一个在 \(L_{2^n B}\) 中的向量呢? 我们希望证明这个向量必然是 \(f\) 真正的因子的一个组合.
注意我们总可以通过预处理使得 \(f\) 是没有平方因子的, 而 \(f\) 的无平方因子性完全由判别式 \(\Delta(f)\) 决定. 所以 \(p\) 充分大的时候, \(g_i\) 也必然互不相同. 也就是说, \(f\) 所有实际的素因子必然构成了 \(g_i\) 的一个划分. 我们希望证明 \(L_{2^n B}\) 中的向量对应的 \(\bm n\) 部分在 \(i, j\) 在同一个划分里有 \(n_i = n_j\).
现在让我们不妨看最简单的一个情况: \(f\) 是一个不可约多项式, 那么我们就要证明 \(n_i\neq n_j\) 是情况是不存在的. 对于这么一个 \(\bm n\), 我们不妨首先将 \(\bm n\) 减去整个解 \(n_1 \cdot f\), 也就是说变成 \(n_1 = 0\), 但某个 \(n_i\neq 0\) 的情况. 显然这个过程还没有让向量的模长变大太多. 现在回顾定义, \(h = \sum n_i f \cdot g_i' / g_i\) 由于没有一项除过 \(g_1\), 应该有 \(g_1\) 是 \(h\) 的因式, 进而有结式 \(\operatorname{res}(f, h) \bmod p = 0\).
但是另一方面, \(f, h\) 的系数都是有绝对控制的 (准确来说 \(h\) 取决于 \(D\) 的选取, 但增长速度是远低于 \(p\) 的), 所以 \(p\) 充分大的时候前面的等式不可能成立!
把上面的论述稍作调整, 就可以证明一般的因子分解情况也是正确的.
因此, LLL 算法能够帮我们找出 \(g_i\) 的正确划分, 进而得到 \(f\) 的在 \(\mathbb Z[x]\) 中的因子分解.

浙公网安备 33010602011771号