FWT

FWT

本文全部大部分参考自yyb的博客

概述

FWT(快速沃尔什变换)用于解决类似B

[A_n = sum_{n = iotimes j} B_i cdot C_j ]

其中(otimes)表示二元位运算的问题。

类似FFT,我们先将数组经过FWT变换然后对应位置一一相乘,再IFWT即可。

约定

(C = A imes 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) ]

证明(数学归纳法):

[egin{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(Aoplus B) = F(A) imes F(B) ]

证明(数学归纳法):

[egin{aligned} F(Aoplus B) & = (F(Aoplus 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) imes F(B_0) + F(A_1) imes F(B_1) + F(A_0) imes F(B_1) + F(A_1) imes F(B_0), \ & qquad F(A_0) imes F(B_0) + F(A_1) times F(B_1) - F(A_0) imes F(B_1) - F(A_1) imes F(B_0)) \ & = (F(A_0+A_1) imes F(B_0+B_1), F(A_0-A_1) imes F(B_0-B_1)) \ & = ((F(A))_0 imes (F(B))_0, (F(A))_1 imes (F(B))_1) \ & = F(A) imes 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