快速沃尔什变化(FWT)介绍
能看到这篇博客的人,一定知道FWT是干什么的。(什么?你不知道?)
没事,这里有picks讲FWT的一篇博客。先点进去看一看。
如果你看懂了,那么恭喜你。如果你跟我一样看不懂,那么请继续往下看。
这里的A和B都是什么呢?其实它们是一个多维的向量(如果你不知道向量是什么,就把它当成数组),下标从0开始。
其中,
A=<a0,a1,...,a2k−1>
B=<b0,b1,...,b2k−1>
C=A@B
这里我们定义
A±B=<a0±b0,a1±b1,...,a2k−1±b2k−1> 即对应位相加(减)
A∗B=<a0∗b0,a1∗b1,...,a2k−1∗b2k−1> 即对应位相乘
A@B (实在找不到靠谱的符号了。。)为A和B做卷积之后得到的结果,也是一个和原来大小一样的向量。
注意到FWT做的是二进制上的位运算,所以一定要把A和B补到2的整次幂次(即不足的地方填上0)。
我们要构造一个变换 tf ,使得 tf(A)∗tf(B)=tf(C) 。这个变换的对象是一个大小为 2k 的向量,变换出来的结果也是一个大小为 2k 的向量。
就以异或举例。picks告诉我们
tf(A)=(tf(A0)+tf(A1),tf(A0)−tf(A1))
其中A0=<a0,a1,...,