FWT学习笔记

定义多项式运算 \(⊕\) 使得 $A ⊕ B= C $ 有 \(C_k=\sum_{i⊕j=k} A_i B_j\)

其中 \(⊕\) 按位独立,也就是说设 \(X=\sum x_k2^k~(x_k\in\{0,1\})~,Y=\sum y_k2^k~(y_k\in\{0,1\})~\) 则有 \(X ⊕ Y=\sum (x_k⊕y_k) \times 2^k\)

现在我们要快速求出 \(C\) ,怎么办呢?

定义一种应用于多项式运算 \(⊕\) 的变化使得 \(A \to A'\) 并有“如果 \(A⊕B=C\) 成立,就有 \(A'_i⊕B'_i=C'_i\) 成立”的性质,而且这种变换应为线性变换。我们对得到的 \(C'\) 做逆变换就可以得到 \(C\) 了。

我们设定一个贡献系数 \(c(i,j)\) 使得 \(A'_i=\sum c(j,i)\times A_j\)

我们尝试求出这个贡献系数,直接把 \(A'_i=\sum c(i,j)\times A_j\) 带入到 \(A'_k⊕B'_k=C'_k\) 里面可以得到下面的式子:

\[\sum_{i=0}^{n-1} c(i,k)\times C_i=\sum_{i=0}^{n-1}c(i,k)A_i \times \sum_{j=0}^{n-1} c(j,k)B_j \]

和这个:

\[\sum_{i=0}^{n-1} c(i,k)\times C_i=\sum_{i=0}^{n-1} c(i,k)\times\sum_{p⊕q=i} A_p B_q \]

所以就有:

\[\sum_{i=0}^{n-1} c(i,k)\times\sum_{p⊕q=i} A_p B_q=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1} c(i,k)c(j,k)\times A_i B_j \\\sum_{p=0}^{n-1}\sum_{q=0}^{n-1} c(p⊕q,k) \times A_p B_q=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1} c(i,k)c(j,k)\times A_i B_j \\ \to \sum_{i=0}^{n-1}\sum_{j=0}^{n-1} c(i⊕j,k) \times A_i B_j=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1} c(i,k)c(j,k)\times A_i B_j \\ \to c(i⊕j,k)=c(i,k)\times c(j,k) \]

而且只要 \(c(i,j)\) 满足这个性质就可以实现这个变换。

我们不妨规定 \(i=\sum i_k2^k~(i_k\in\{0,1\})~,j=\sum j_k2^k~(y_j\in\{0,1\})\)\(c(i,j)=\prod c(i_k,j_k)\) ,这样我们一定可以得到 \(c(i⊕j,k)=c(i,k)\times c(j,k)\)了。

我们要把这个性质用于优化求 \(A'\) 的过程,我们先回到这个式子:

\[A'_i=\sum_{j=0}^{n-1} c(j,i)\times A_j \]

分讨最高位情况:

\[A'_i=c(0,i_0)\sum_{j=0}^{ \frac n 2- 1} c(j,i)\times A_j~+~c(1,i_0)\sum_{j=\frac n 2}^{n-1} c(j,i)\times A_j \]

那么我们可以 \(O(m)\) 合并两个长度为 \(m\) 的变换结果,类似FFT的过程,我们就有:

\[A'_i=c(0,0) A'_{i,0}~+~c(1,0)A'_{i,1} \\A'_{i+\frac n2}=c(0,1) A'_{i,0}~+~c(1,1)A'_{i,1} \]

每次递归做,时间复杂度 \(O(n\log n)\)

逆变换我们就把 \(c(i,j)~~(i,j\in\{0,1\})\) 做一下矩阵求逆,然后再使用 \(c'\) 做一次变换即可。

posted @ 2026-01-15 16:59  Sgt_Dante  阅读(5)  评论(0)    收藏  举报