FWT

时间:2021-08-11
本文章向大家介绍FWT,主要包括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}) \]

原文地址:https://www.cnblogs.com/BunnyLutts/p/15128895.html