這玩意最近常常出現額……函數
FFT解決的問題是\[C_{k}=\sum_{i+j=k}A_i \cdot B_j\]post
其中\(A\)、\(B\)、\(C\)是三個列向量。orm
而FWHT是將\(\sum\)下面的\(+\)號換成位運算符時採用的方法。遞歸
作法與FFT類似,先將相似的係數表達式轉換爲點值表達式,點積以後再轉換回來。get
將係數表達式轉換爲點值表達式的函數叫\(tf\),反向的叫\(utf\)。ast
\(A_0\)表示\(A\)的前半部分(二進制位最高位爲0),\(A_1\)表示\(A\)的後半部分(二進制位最高位爲1),轉換方法爲:form
\[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}))\]transform
\[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