FWT
简介
-
大概是解决形如要求 \(c_i=\sum_{j\bigoplus k=i} A_jB_k\)
-
这个符号可以是 或,与,异或
-
整个的流程和 FFT 很像,先正变换成 \(FWT(A),FWT(B)\) ,然后将两者相乘,最后再逆变换
-
具体的证明和定义和一些繁杂的过程这里就不说了,直接上结论
-
因为我们是形如 FFT 的分治运算,所以也是有规律才能分治
-
这里直接给出这个规律
所有的正变化时, \(FWT(A)=A , [n=0]\) ,默认长度为 \(2^n\),\(A_0\) 为序列 \(A\) 的左半部分 ,\(A_1\) 为右半部分,\((A,B)\) 表示将两个序列接起来
或运算
\[FWT(A)=(FWT(A_0),type*FWT(A_0)+FWT(A_1))
\]
- 正变化的时候 \(type=1\),否则为 \(-1\)
- 正变化 \(FWT(A)[i]=\sum_{j|i}A_j\)
与运算
\[FWT(A)=(FWT(A_0)+type*FWT(A_1),FWT(A_1))
\]
-
正变化时 \(type=1\) ,否则为 \(-1\)
-
正变化 \(FWT(A)[i]=\sum_{i|j}A_j\)
异或运算
\[FWT(A)=(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1))
\]
- 正变化
- 正变化 \(FWT(A)[i]=\sum_{j=0}^{2^n-1}(-1)^{c(i\&j)} A[j]\)
- \(c(x)\) 表示 \(x\) 二进制下 \(1\) 的个数
\[FWT(A)=(\frac{FWT(A_0)+FWT(A_1)}{2},\frac{FWT(A_0)-FWT(A_1)}{2})
\]
- 逆变化