【学习笔记】FWT

主要是之前 FWT 就没学明白过,而且之前的博也咕了,所以补一篇。

FWT 主要用来计算一类位运算卷积的问题。假如我们有一个二元位运算 \(\oplus\),那么我们可以计算出:

\[c_k = \sum_{i \oplus j = k} a_i b_j \]

类似于 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\)

\[\begin{aligned} FWT(a)_ i \cdot FWT(b)_ i &= FWT(c)_ i\\ \sum_{j=0}^{n-1} a_j F_{j, i} \sum_{k=0}^{n-1} b_k F_{k, i} &= \sum_{p=0}^{n-1} c_p F_{p, i}\\ \sum_{j=0}^{n-1} \sum_{k=0}^{n-1} a_j b_k F_{j, i} F_{k, i} &= \sum_{p=0}^{n-1} c_p F_{p, i}\\ \end{aligned} \]

并且有:

\[\begin{aligned} c_p &= \sum_{x \oplus y = p} a_x b_y\\ \sum_{p=0}^{n - 1} F_{p, i} c_p &= \sum_{p=0}^{n - 1} F_{p, i} \sum_{x \oplus y = p} a_x b_y\\ \sum_{j=0}^{n-1} \sum_{k=0}^{n-1} a_j b_k F_{j, i} F_{k, i} &= \sum_{p=0}^{n - 1} F_{p, i} \sum_{x \oplus y = p} a_x b_y\\ \sum_{j=0}^{n-1} \sum_{k=0}^{n-1} a_j b_k F_{j, i} F_{k, i} &= \sum_{x=0}^{n - 1} \sum_{y=0}^{n - 1} a_x b_y F_{x \oplus y, i}\\ \end{aligned} \]

由此我们发现 \(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}\) 的方程,求出若干组解,组成一个矩阵即可。

同时,为了存在逆运算,我们必须保证矩阵可逆。

与卷积:

\[c_i c_i = c_i \Rightarrow c_i \in \{0, 1\} \]

\[c_0c_1 = c_0 \Rightarrow c_1 = 1 \text{ or } c_0 = 0 \]

\[[c_0, c_1] = [0, 1] \text{ or } [1, 1] \]

那么 \(F = \begin{bmatrix}1 & 1\\ 0 & 1\end{bmatrix}, F^{-1} = \begin{bmatrix}1 & -1\\ 0 & 1\end{bmatrix}\)。这个运算实际上代表着高维前缀和。

或卷积:

\[c_i c_i = c_i \Rightarrow c_i \in \{0, 1\} \]

\[c_0c_1 = c_1 \Rightarrow c_0 = 1 \text{ or } c_1 = 0 \]

\[[c_0, c_1] = [1, 1] \text{ or } [1, 0] \]

那么 \(F = \begin{bmatrix}1 & 0\\ 1 & 1\end{bmatrix}, F^{-1} = \begin{bmatrix}1 & 0\\ -1 & 1\end{bmatrix}\)。这个运算实际上代表着高维后缀和。

异或卷积:

\[c_0 c_0 = c_0 \Rightarrow c_0 \in \{0, 1\} \]

\[c_0c_1 = c_1 \Rightarrow c_0 = 1 \text{ or } c_1 = 0 \]

\[c_1c_1 = c_0 \Rightarrow c_1 \in \{\pm 1\}, c_0 = 1 \]

\[[c_0, c_1] = [1, 1] \text{ or } [1, -1] \]

那么 \(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}\)

\[c_i c_i = c_i \Rightarrow c_i \in \{0, 1\} \]

\[c_0 c_1 = c_0 c_2 = c_1 c_2 = c_3 \]

\[[c_0, c_1, c_2, c_3] = [1, 0, 0, 0] \text{ or }[0, 1, 0, 0] \text{ or }[0, 0, 1, 0] \text{ or }[1, 1, 1, 1] \]

那么就能构造出转移矩阵 \(\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) & 集合幂级数

我不会了。

posted @ 2023-03-16 17:06  APJifengc  阅读(87)  评论(0编辑  收藏  举报