poly
二刷。写一点不那么宝宝的内容。
FFT
我们希望快速计算加乘卷积。FFT 是一种变换,使得卷积能转化成点值乘积,从而线性计算。大多数变换通常都是这个思路。
卷积在多项式中的意义,就是多项式乘法。
然后 FFT 在多项式中的意义就是,求出 \(\omega_n^0, \omega_n^1, \dots,\omega_n^{n-1}\) 处的点值。逆变换就是反过来。
- 为什么选择单位根?
这个问题。讲道理单从变换的角度,选择任意 \(n\) 个“线性无关”的点值显然都是可行的。但是你不会算多项式多点求值,你也不会快速插值。寄。
单位根具有良好的周期性,以及良好的分治结构。
关于证明,假设我们取出了 \(x^0\sim x^{n-1}\) 这些点值。
达到了点乘的效果。然后从这里也可以窥见,如果我们取 \(x_i\) 为 \(\omega_n^i\) 的话,由单位根的周期性,\(\omega_n^i \times \omega_n^j = \omega_n^{i+j\bmod n}\)。FFT 对应的卷积,实际上是循环卷积。只不过我们为了得到正常模样的卷积,在高位补 0,补满到 \(2\) 的幂次。
FWT
少项式乘法
有 \(n\) 个多项式,第 \(i\) 个多项式为 \(A_ix^{B_i}+C_i\)。求她们的异或卷积。
那显然不能挨个 FWT,复杂度炸了。
那么考虑直接求出整体的 FWT 值。
首先对相同 \(B_i\) 的多项式合并。然后写成 \(2^m\) 个 \(A_i,C_i\) 的形式。
对于我最终要求的 FWT 后的乘积多项式 \(G\),有 \(G_j=\prod_i(B_i+A_i\times(-1)^{|i\cap j|})\)。直接分治就好啦。
具体地,我要在每一层分治中,维护 \(A+B\times(-1)^{???}\) 的乘积,和 \(A-B\times (-1)^{???}\) 的乘积。合并也是简单的。
最后 IFWT 回来就可以。

浙公网安备 33010602011771号