FWT
FWT
本文全部大部分参考自yyb的博客
概述
FWT(快速沃尔什变换)用于解决类似B
\[A_n = \sum_{n = i\otimes j} B_i \cdot C_j
\]
其中\(\otimes\)表示二元位运算的问题。
类似FFT,我们先将数组经过FWT变换然后对应位置一一相乘,再IFWT即可。
约定
\(C = A \times B \Leftrightarrow C_n = A_n \cdot B_n\)
\(C = A+B \Leftrightarrow C_n = A_n+B_n\)
\(C = A \otimes B \Leftrightarrow C_n = \sum_{i \otimes j = n} A_i \cdot B_j\)
\(A_x\)表示数组\(A\)中下标最高位为\(x\)的位置组成的新数组。
\((A, B)\)表示将A与B拼接组成新数组。
\(F(A)\)表示对A数组进行FWT变换。
\(IF(A)\)表示对A数组进行IFWT变换。
内容
\[F_{|}(A) = (F_|(A_0), F_|(A_0)+F_|(A_1)) \\
F_\&(A) = (F_\&(A_0)+F_\&(A_1), F_\&(A_1)) \\
F_\oplus(A) = (F_\oplus(A_0)+F_\oplus(A_1), F_\oplus(A_0)-F_\oplus(A_1))
\]
这里直接介绍\(\otimes = \oplus\)的情况。
性质1:
\[F(A+B) = F(A)+F(B)
\]
证明(数学归纳法):
\[\begin{aligned}
F(A+B)
& = (F(A+B)_0+F(A+B)_1, F(A+B)_0-F(A+B)_1) \\
& = (F(A_0)+F(B_0)+F(A_1)+F(B_1), F(A_0)+F(B_0)-F(A_1)-F(B_1)) \\
& = (F(A_0+A_1)+F(B_0+B_1), F(A_0-A_1)+F(B_0-B_1)) \\
& = ((F(A))_0 + (F(B))_0, (F(A))_1+(F(B))_1)
& = F(A)+F(B)
\end{aligned}
\]
性质2:
\[F(A\oplus B) = F(A) \times F(B)
\]
证明(数学归纳法):
\[\begin{aligned}
F(A\oplus B)
& = (F(A\oplus B)_0+F(A \oplus B)_1, F(A \oplus B)_0 - F(A \oplus B)_1) \\
& = (F(A_0 \oplus B_0 + A_1 \oplus B_1 + A_0 \oplus B_1 + A_1 \oplus B_0), \\
& \qquad F(A_0 \oplus B_0 + A_1 \oplus B_0 - A_0 \oplus B_1 - A_1 \oplus B_0)) \\
& = (F(A_0)\times F(B_0) + F(A_1) \times F(B_1) + F(A_0)\times F(B_1) + F(A_1) \times F(B_0), \\
& \qquad F(A_0)\times F(B_0) + F(A_1) \ times F(B_1) - F(A_0) \times F(B_1) - F(A_1) \times F(B_0)) \\
& = (F(A_0+A_1) \times F(B_0+B_1), F(A_0-A_1) \times F(B_0-B_1)) \\
& = ((F(A))_0 \times (F(B))_0, (F(A))_1 \times (F(B))_1) \\
& = F(A) \times F(B)
\end{aligned}
\]
其余同理。
那么我们就可以愉快地计算了。
最后的问题是怎么得到原数组:逆过来就可以了。
\[IF_|(A) = (IF(A_0), IF(A_1)-IF(A_0)) \\
IF_\&(A) = (IF(A_0)-IF(A_1), IF(A_1)) \\
IF_\oplus(A) = (\frac{(IF(A_0)+IF(A_1)}{2}, \frac{IF(A_0)-IF(A_1)}{2})
\]