poly

二刷。写一点不那么宝宝的内容。

FFT

我们希望快速计算加乘卷积。FFT 是一种变换,使得卷积能转化成点值乘积,从而线性计算。大多数变换通常都是这个思路。

卷积在多项式中的意义,就是多项式乘法。
然后 FFT 在多项式中的意义就是,求出 \(\omega_n^0, \omega_n^1, \dots,\omega_n^{n-1}\) 处的点值。逆变换就是反过来。

  • 为什么选择单位根?

这个问题。讲道理单从变换的角度,选择任意 \(n\) 个“线性无关”的点值显然都是可行的。但是你不会算多项式多点求值,你也不会快速插值。寄。
单位根具有良好的周期性,以及良好的分治结构

关于证明,假设我们取出了 \(x^0\sim x^{n-1}\) 这些点值。

\[\begin{aligned} FFT(A)_i \times FFT(B)_i&=(\sum_{j=0}^{n-1}A_jx_i^j)(\sum_{j=0}^{n-1}B_jx_i^j)\\ &=\sum_{t=0}^{2n-2}\sum_{j+k=t}A_jB_k \cdot x_i^j\cdot x_i^k\\ &=\sum_{t=0}^{2n-2}C_tx_i^t\\ &=FFT(C)_i \end{aligned} \]

达到了点乘的效果。然后从这里也可以窥见,如果我们取 \(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 回来就可以。

B 进制卷积

看看 \(A_i\) 是怎么贡献到 \(FWT(A)_i\) 的。
\(FWT(A)_i=\sum_{j=0}c(i, j)A_j\)

然后我们为了方便,不妨设 \(c\) 按位独立,即 \(c(i, j)=\prod c(i_k, j_k)\)

然后 \(FWT(A)_i \times FWT(B)_i=FWT(A*B)_i\) 要求了 \(c(i,j)\times c(i,k)=c(i,j\oplus k)\)。这里 \(\oplus\) 是某种运算。

然后考虑我有了一个这样的 \(c\),而且这个 \(c\) 可逆。(可逆,也只要求 \([0, B)\) 的下标可逆就可以了,不难推得整个 \(c\) 都可逆,而且整个的逆可以由 \([0, B)\) 部分的逆按位乘法得到)

注意枚举最高位,

\[FWTA_i=\sum_{j}^{B^n-1}c(i,j)A_j=\sum_{j=0}^{B^{n-1}-1}\sum_{p=0}^{B-1}c(i_0, j)c(i_1,p)A_{j+p\times B^{n-1}} \]

这个就是 FWT 合并的过程,看成我分治了下面几层,现在要把 \(B\) 段拼接的结果合并。

然后合并之后,再对位作用上一个 \(c\)。(具体地,是将列向量左乘)

时间复杂度里面 \(B^2\) 独立,外面分治每层都是 \(B^n\)。总复杂度 \(O(nB^n\times B^2)\)


然后某些题定义了一个特殊的位运算,比如说多校某个题,六进制不进位乘法。

你直接搜,搜出来若干个使得 \(b_j\times b_k=b_{j\oplus k}\) 的行向量(值域 \((-B, B)\) 里就行),然后手动取出若干个线性无关的放在一起,就是一个合法的 \(c\)

但是你搜 \(B\) 进制加法发现搜不出来几个。然后你就不会了。你取单位根不就是一个循环卷积的形式了。然后模数如果不是 \(998244353\) 就不会了。

posted @ 2026-01-18 22:42  Water_M  阅读(17)  评论(0)    收藏  举报