Fast Walsh-Hadamard Transform
这玩意最近经常出现额……
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