位运算卷积-FWT
问题
给出两个幂级数 \(f,g\) ,求
\[h=\sum _i\sum _jx^{i\oplus j}f_ig_j
\]
其中 \(\oplus\) 是可拆分的位运算。
算法
由于位运算具有独立性,可以一位位地考虑。
设 \(f=(f_0,f_1)\) ,即最高位为 0 的部分和最高位为 1 的部分。我们希望把这个卷积转化为点积来做。即
\[T\begin{bmatrix}f_0 \\f_1 \end{bmatrix}\cdot T\begin{bmatrix}g_0 \\g_1 \end{bmatrix}=T\begin{bmatrix}h_0 \\h_1 \end{bmatrix}
\]
按照 \(f,g,h\) 的对应关系,对比系数容易得到 \(T\) 。
那么我们就可以先对 \(f,g\) 递归进行上述变换,然后再点积起来,逆变换回去,这样就能得到我们需要的 \(h\) 。显然逆变换可以直接用矩阵 \(T^{-1}\) 做同样的操作。
复杂度为 \(O(nk^2\log n)\) ,\(k\) 为位状态数。
拓展
上面的过程只用到了位运算的可拆分性,所以可以尝试拓展一下。例如更高进制的位运算卷积,可以用完全一样的方法来做。做之前只要定义好位的运算即可。例如 [清华集训2016]石家庄的工人阶级队伍比较坚强 中的三进制卷积,类比二进制异或,定义三进制不进位加法,构造出输赢的异或关系即可。