一些多项式问题的 $\mathsf{AC^0}$ 电路
这是对 Robert Andrews 和 Avi Wigderson 最近的一篇预印本, Constant-Depth Arithmetic Circuits for Linear Algebra Problems 的解读.
这里的电路指的是代数电路, 代数意义的 \(\mathsf{AC^0}\) 就是多项式大小的常数层电路, 每个门都是乘法或加法, 同时可以有任意多个输入. 大家有时候也写成 \(\sum \prod \sum \cdots\) 这种形式.
代数电路相比于布尔电路而言, 由于额外有个对于计算的多项式的次数的限制, 导致本身有很强的并行化的能力, 对于代数问题我们有所谓的 "\(\mathsf{P} = \mathsf{NC^2}\)", 这是对于布尔电路而言我们不相信的.
这意味着代数问题的 \(\mathsf{AC^0}\) 可能也比布尔问题的 \(\mathsf{AC^0}\) 更强. 布尔问题的 \(\mathsf{AC^0}\) 的局限性在比较早的时候就已经被证明了, 比如 parity 和 majority 都不在 \(\mathsf{AC^0}\) 里.
直到几年前, 我们才确实知道代数问题的 \(\mathsf{AC^0}\) 的局限性, 比如它算不了行列式.
这篇文章的主要结果是, 他们证明了一些多项式有关的代数问题依然在电路深度的意义上是简单的: 他们可以用 \(\mathsf{AC^0}\) 电路来计算. 所用的手段其实是相对古老的, 可以很容易讲清楚.
第一个问题: 给 \(n\) 个数 \(x_1,\dots,x_n\), 计算所有的初等对称多项式 \(e_i(x)\).
这个问题无非是计算
的系数. 所以我们可以做如下事情:
选定 \(n+1\) 个取值 \(T_1,\dots,T_{n+1}\), 计算
然后对它们做 Lagrange 插值.
这个乘积是一个显然的 \(\prod \sum\) 电路, Lagrange 插值也是一个简单的线性变换, 也即 \(\sum \prod\) 电路. 所以初等对称多项式可以用 \(\sum \prod \sum\) 电路计算.
一个比较 tricky 的事情是, 如何做多项式除法 \(P / Q\) 呢?我们首先考虑翻转系数, 这样就只用求形式幂级数 \(P / Q\) 的前 \(n-m\) 项了.
接下来有两种思路:
-
多项式乘法显然是有 \(\sum \prod\) 电路的, 所以我们可以直接考虑 \(Q^{-1}\) 怎么算. 对此我们可以直接考虑形式幂级数复合, \(f(g)\) 怎么算, 由于这个天生是 \(n^2\) 次多项式, 我们先对 \(g\) 多点求值, 然后我们再将给定的点值一个个在 \(f\) 中求值. 最后做 Lagrange 插值.
-
我们先分别各自算 \(\log P, \log Q\), 然后做减法, 最后再做指数. 因为多项式复合是 \(\mathsf{AC^0}\) 的, 所以这个过程也是 \(\mathsf{AC^0}\) 的.
这二者看起来没有本质区别, 但是接下来, 我们可以考虑另一个问题: 计算结式. 设 \(P = \prod(T-x_i)\), \(Q = \prod(T-y_i)\), 结式是
虽然 \(x_i, y_j\) 可能要在域 \(\mathbb F\) 的代数闭包上才能找到, 但我们知道结式的结果永远是在原来的域 \(\mathbb F\) 上的.
现在考虑 resultant 怎么做, 我们考虑扩展成多项式
如果计算出常数项, 那么就是结果. 翻转过来, 我们可以考虑
而幂和 \(p_i(x), p_i(y)\) 是用 \(\log \prod(1 - x_i T)\) 和 \(\log \prod(1 - y_i T)\) 可以计算的, 所以我们可以得到 resultant 也是在 \(\mathsf{AC^0}\) 里的.
我们接下来也要反复用到初等多项式 \(e_i\) 和幂和 \(p_i\) 的转化.
进一步的, 我们还可以计算两个多项式的 \(\gcd\). 但这里有一定微妙的问题, 显然一个固定的代数电路是不知道 \(\gcd\) 的次数的, 所以我们需要考虑一族电路. 我们将会看到一个巧妙的解决方法:
如果 \(n, m\) 次多项式 \(P,Q\), 先把它们写成
现在在考虑多项式
现在假设 \(P, Q\) 都 没有重根. 我们有:
如果 \(x_i\) 等于某个 \(y_j\), 那么 \(H(x_i, S) = 0\), 否则 \(H(x_i, S) = Q(x_i) (S - x_i) \neq 0\).
假设 \(P, Q\) 的 \(\gcd\) 次数是 \(d\), 说明恰有 \(n-d\) 个 \(x_i\) 满足 \(H(x_i, S) \neq 0\). 也就是说,
虽然 \(Q(x_i)\) 不能直接求, 但是 \(e_{\ell} \left\{ Q(x_i) \right\}\) 可以从 \(p_\ell \left\{ Q(x_i) \right\}\) 求得, 而 \(p_\ell \left\{ Q(x_i) \right\}\) 可以对 \(p_\ell(x)\) 多点求值得到.
算出了 \(P/\gcd(P, Q)\), 再做一次多项式除法就得到了 \(\gcd(P, Q)\).
有一个微妙的事情是中间有一个真的除法. 这个除法可以被 Strassen 的一个定理避免: 如果有两个多项式 \(f_1, f_2\) 是用 \(\mathsf{AC^0}\) 电路计算的, 而且 \(f_1\) 是 \(f_2\) 的倍数, 那么 \(f_1 / f_2\) 也是 \(\mathsf{AC^0}\) 的.
因此, 在预知 \(P, Q\) 的 \(\gcd\) 次数的情况下, 我们可以用 \(\mathsf{AC^0}\) 电路计算 \(\gcd(P, Q)\).
刚刚只处理了没有重根的情况, 论文中更加细致地处理了有重根的情况, 以及一些更多的问题. 但无论如何, 核心思想都是基于初等对称多项式和幂和的转化.
我个人比较关心的问题: 幂和和初等对称多项式的转化需要用到 \(\log\) 和 \(\exp\), 他们严重依赖计算的域是特征为 \(0\) 的, 有什么办法避免这个要求呢?