这玩意最近经常出现额……
FFT解决的问题是[C_{k}=sum_{i+j=k}A_i cdot B_j]
其中(A)、(B)、(C)是三个列向量。
而FWHT是将(sum)下面的(+)号换成位运算符时采用的方法。
做法与FFT相似,先将类似的系数表达式转换为点值表达式,点积之后再转换回来。
将系数表达式转换为点值表达式的函数叫(tf),反向的叫(utf)。
(A_0)表示(A)的前半部分(二进制位最高位为0),(A_1)表示(A)的后半部分(二进制位最高位为1),转换方法为:
[tf_{xor}(A)=(tf_{xor}(A_0+A_1),tf_{xor}(A_0-A_1))][utf_{xor}(A)=(utf_{xor}(frac{A_0+A_1}{2}),utf_{xor}(frac{A_0-A_1}{2}))]
[tf_{and}(A)=(tf_{and}(A_0+A_1),tf_{and}(A_1))][utf_{and}(A)=(utf_{and}(A_0-A_1),utf_{and}(A_1))]
[tf_{or}(A)=(tf_{or}(A_0),tf_{or}(A_1+A_0))][utf_{or}(A)=(utf_{or}(A_0),utf_{or}(A_1-A_0))]
还有一点就是,先递归再转换还是先转换再递归是对结果没有影响的,所以可以把(tf)与(utf)写成一个函数。
P.S. http://picks.logdown.com/posts/179290-fast-walsh-hadamard-transform