【学习笔记】FWT
主要是之前 FWT 就没学明白过,而且之前的博也咕了,所以补一篇。
FWT 主要用来计算一类位运算卷积的问题。假如我们有一个二元位运算 \(\oplus\),那么我们可以计算出:
类似于 FFT 的思想,我们考虑构造一种线性变换 \(FWT\),使得 \(FWT(a) \cdot FWT(b) = FWT(c)\)(点积)。
考虑找出 \(FWT\) 这个变换的转移系数(即矩阵表示)。我们设 \(FWT(a) = aF\),其中 \(a\) 为横向量,\(F\) 为变换矩阵,那么就有 \(FWT(a)_ i=\sum_{j=0}^{n-1} a_j F_{j, i}\)。
首先,我们知道 \(FWT(a)_i \cdot FWT(b)_i = FWT(c)_i\)。
并且有:
由此我们发现 \(F_{j, i} F_{k, i} = F_{j \oplus k, i}\)。
而位运算有一个重要的性质:每一位的运算是相互独立的。那么我们可以设 \(c(i, j)\) 表示单独一位 \(i\) 对 \(j\) 的贡献,那么我们就可以设 \(F_{i, j}\) 等于 \(i, j\) 上的每一位的转移系数的乘积的和。
也就是说,我们想要 \(c(j, i) c(k, i) = c(j \oplus k, i)\)。
那么,我们只需要根据这个位运算的计算值,列出若干形如 \(c_j c_k = c_{j \oplus k}\) 的方程,求出若干组解,组成一个矩阵即可。
同时,为了存在逆运算,我们必须保证矩阵可逆。
与卷积:
那么 \(F = \begin{bmatrix}1 & 1\\ 0 & 1\end{bmatrix}, F^{-1} = \begin{bmatrix}1 & -1\\ 0 & 1\end{bmatrix}\)。这个运算实际上代表着高维前缀和。
或卷积:
那么 \(F = \begin{bmatrix}1 & 0\\ 1 & 1\end{bmatrix}, F^{-1} = \begin{bmatrix}1 & 0\\ -1 & 1\end{bmatrix}\)。这个运算实际上代表着高维后缀和。
异或卷积:
那么 \(F = \begin{bmatrix}1 & 1\\ 1 & -1\end{bmatrix}, F^{-1} = \begin{bmatrix}\frac{1}{2} & \frac{1}{2}\\ \frac{1}{2} & -\frac{1}{2}\end{bmatrix}\)。
可以拓展到高维。
例如:ARC132F Takahashi The Strongest
\(4\) 进制数,构造位运算 \(a \oplus b = \begin{cases}a & a=b\\3 &a\ne b\end{cases}\)。
那么就能构造出转移矩阵 \(\begin{bmatrix}1 & 0 & 0 & 1\\0 & 1 & 0 & 1\\0 & 0 & 1 & 1\\0 & 0 & 0 & 1\end{bmatrix}\),其逆矩阵 \(\begin{bmatrix}1 & 0 & 0 & -1\\0 & 1 & 0 & -1\\0 & 0 & 1 & -1\\0 & 0 & 0 & 1\end{bmatrix}\)
每一位的运算还可以不一样,模拟赛考过,不知道有没有原题,反正同样是可以 FWT 求出的。
更多内容:位运算卷积(FWT) & 集合幂级数
我不会了。