[科技] 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) = ...

然后

\[\begin{aligned} \hat{A}_i &= \sum_{j=0}^{n-1} c(i,j) A_j \\ &= \sum_{j=0}^{n/2 - 1} c(i,j) A_j + \sum_{j=n / 2}^{n - 1} c(i,j)A_j \\ &= c(i_1,0)\sum_{j=0}^{n/2-1} c(i_0,j_0) A_j + c(i_2, 1)\sum_{j=n/2}^{n-1} c(i_0,j_0) A_j \end{aligned}\]

后面形式类似,就是一种分治结构了。

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\}\)

那么由几个方程可以得到他们的转移系数。

关于舍去解的问题,我们需要保证转移矩阵是可逆的,就是说不是奇异矩阵。那么需要保证任意一行,任意一列不能完全相同。

FWT 线性性的用法

Part 7 子集卷积

\[C[k] \sum_{i 并 j = k, i 交 j = 0}A[i]B[j] \]

其实多限制了一个交集不能为空。

那么就是 \(|i| + |j| = |i 并 j|\)

这里是大小意味 popcount。

于是考虑做一个二维卷积,一开始在 \(A_0[ctz[i]][i]\) 处存储原来的 \(A[i]\)

第二维分别卷完可以,再进行一个 \(O(n^2 2^n)\) 的对于第一维的暴力卷积,然后依次 IFWT 回去即可。

基础 FWT 练习题

优化 dp 的练习题

Part 8 集合幂级数

咕咕咕

Part 9 k 进制 FWT

咕咕咕

posted @ 2023-03-09 21:24  Lates  阅读(34)  评论(0)    收藏  举报