[科技] FWT 和集合幂级数
Part 0
给自己复习用的,主要参考了 command_block 博客。
Part 1 基本定义
多项式乘法是加法卷积。
考虑一种位运算卷积 \(C[k] = \sum_{i ? j} A[i] B[j]\)。
考虑使用 FWT 变换。\(A \to \hat{A}\)
希望 \(\hat{A}_i \cdot \hat{B}_i= \hat{C}_i\)
然后再 IFWT 回去。
Part 2 简单的推导
希望 FWT 是个线性变换,这样会给予许多性质。
设 \(\hat{A}_i = \sum_{j=0}^{n - 1} c(i, j) \cdot A_i\)
那么由点积得 \(\sum_{k=0}^{n-1}c(i,k) A_k \sum_{j=0}^{n-1}c(i,j) B_j = \sum_{k=0}^{n-1}\sum_{j=0}^{n-1}c(i,k)c(i,j)A_k B_j = \sum_{l=0}^{n - 1}c(i, l)C_l\)
由卷积定义,\(C_k = \sum_{i?j = k} A_i B_j\)
对 C 求和 \(\sum_{k=0}^{n-1} C_k c(i, k)= \sum_{k=0}^{n-1} c(i, k)\sum_{i?j = k}A_i \cdot B_j = \sum_{k=0}^{n-1} \sum_{j=0}^{n-1} A_k B_j c(i,j?k)\)
于是 \(c(i,j?k) = c(i,j) c(j, k)\)
Part 3 计算这个系数能优化复杂度?
需要找性质,由于位运算可以拆位,把数字拆成若干个二的幂。
那么整体的 c,就是相当于各位的 c 之积。注意 c(i,j) 都需要拆位。
e.g. c(3,5) = ...
然后
后面形式类似,就是一种分治结构了。
Part 5 IFWT ?
其实你可以发现对于一组 \(c(0,0), c(0,1), c(1,0), c(1,1)\) 的真值表,可以写成一个矩阵乘法的形式,而这一切都是线性变换。我们可以通过逆矩阵的形式完成 IFWT。
Part 6 01 向量时的三种位运算
- 以 or 卷积为例。
\(c(0,0)c(0,0)=c(0,0)\)
由此以及其他四柿可得 \(c(i,j) \in\{0,1\}\)
那么由几个方程可以得到他们的转移系数。
关于舍去解的问题,我们需要保证转移矩阵是可逆的,就是说不是奇异矩阵。那么需要保证任意一行,任意一列不能完全相同。
Part 7 子集卷积
其实多限制了一个交集不能为空。
那么就是 \(|i| + |j| = |i 并 j|\)
这里是大小意味 popcount。
于是考虑做一个二维卷积,一开始在 \(A_0[ctz[i]][i]\) 处存储原来的 \(A[i]\)。
第二维分别卷完可以,再进行一个 \(O(n^2 2^n)\) 的对于第一维的暴力卷积,然后依次 IFWT 回去即可。
Part 8 集合幂级数
咕咕咕
Part 9 k 进制 FWT
咕咕咕