FWT学习笔记
定义多项式运算 \(⊕\) 使得 $A ⊕ B= C $ 有 \(C_k=\sum_{i⊕j=k} A_i B_j\)。
其中 \(⊕\) 按位独立,也就是说设 \(X=\sum x_k2^k~(x_k\in\{0,1\})~,Y=\sum y_k2^k~(y_k\in\{0,1\})~\) 则有 \(X ⊕ Y=\sum (x_k⊕y_k) \times 2^k\) 。
现在我们要快速求出 \(C\) ,怎么办呢?
定义一种应用于多项式运算 \(⊕\) 的变化使得 \(A \to A'\) 并有“如果 \(A⊕B=C\) 成立,就有 \(A'_i⊕B'_i=C'_i\) 成立”的性质,而且这种变换应为线性变换。我们对得到的 \(C'\) 做逆变换就可以得到 \(C\) 了。
我们设定一个贡献系数 \(c(i,j)\) 使得 \(A'_i=\sum c(j,i)\times A_j\)。
我们尝试求出这个贡献系数,直接把 \(A'_i=\sum c(i,j)\times A_j\) 带入到 \(A'_k⊕B'_k=C'_k\) 里面可以得到下面的式子:
和这个:
所以就有:
而且只要 \(c(i,j)\) 满足这个性质就可以实现这个变换。
我们不妨规定 \(i=\sum i_k2^k~(i_k\in\{0,1\})~,j=\sum j_k2^k~(y_j\in\{0,1\})\) , \(c(i,j)=\prod c(i_k,j_k)\) ,这样我们一定可以得到 \(c(i⊕j,k)=c(i,k)\times c(j,k)\)了。
我们要把这个性质用于优化求 \(A'\) 的过程,我们先回到这个式子:
分讨最高位情况:
那么我们可以 \(O(m)\) 合并两个长度为 \(m\) 的变换结果,类似FFT的过程,我们就有:
每次递归做,时间复杂度 \(O(n\log n)\)。
逆变换我们就把 \(c(i,j)~~(i,j\in\{0,1\})\) 做一下矩阵求逆,然后再使用 \(c'\) 做一次变换即可。

浙公网安备 33010602011771号