K 进制 FWT

· · 算法·理论

K 进制 FWT

引入

问题:给定长度为 k^n 的序列 A_i,B_i,求

C_i=\sum_{j \oplus k=i} A_j B_k

其中 \oplus 是任意一种 k 进制按位运算。

通用解法

我们希望定义变换

\hat{F}(i)=\sum_{j=0}^{k^n-1} w(i,j) F(j)

使得

\forall 0\le i<k^n:\hat{C}(i)=\hat{A}(i)\hat{B}(i)

展开后即

\begin{aligned} &\sum_{j=0}^{k^n-1} \sum_{k=0}^{k^n-1}w(i,j\oplus k)A(j)B(k)\\ =&\sum_{j=0}^{k^n-1} w(i,j) C(j)\\ =&\sum_{j=0}^{k^n-1} w(i,j)A(j)\sum_{k=0}^{k^n-1} w(i,k)B(k)\\ =&\sum_{j=0}^{k^n-1} \sum_{k=0}^{k^n-1}w(i,j)w(i,k)A(j)B(k) \end{aligned}

也就是只需要满足 w(i,j)w(i,k)=w(i,j\oplus k) 就可以满足上述条件。

对于一种 \oplus,我们需要构造合适的 w,使得可以给定 F 快速计算 \hat{F},同时需要给定 \hat{F} 快速计算 F。一般地,我们选择的 w 都要满足如下条件:

W=\begin{bmatrix} w{(0,0)} & \cdots & w{(0,k^n-1)} \\ \vdots & \ddots & \vdots \\ w{(k^n-1,0)} & \cdots & w{(k^n-1,k^n-1)} \end{bmatrix}

下文中设其逆矩阵为:

W'=\begin{bmatrix} w'{(0,0)} & \cdots & w'{(0,k^n-1)} \\ \vdots & \ddots & \vdots \\ w'{(k^n-1,0)} & \cdots & w'{(k^n-1,k^n-1)} \end{bmatrix} w(i,j)=\prod_{t=0}^{n-1} w(i_t,j_t)

可以证明其逆 w' 也满足类似的性质:

w'(i,j)=\prod_{t=0}^{n-1} w'(i_t,j_t)

证明:

现有

\forall i,j: \sum_{k} w(i,k)w'(k,j)=[i=j]

\begin{aligned} &\sum_{k}\left(\prod_t w(i_t,k_t)\right)\left(\prod_t w'(k_t,j_t)\right) \\=&\sum_{k} \prod_t w(i_t,k_t)w'(k_t,j_t) \\=& \prod_t \sum_{k_t} w(i_t,k_t)w'(k_t,j_t) \\=& \prod_t [i_t=j_t] \\=& [i=j] \end{aligned}

得证。

快速进行变换及逆变换

对长为 k^n 的序列 A 求其变换 \hat{A}。根据定义和上述 w 的性质,有:

\begin{aligned} \hat{A}(i)&=\sum_{t=0}^{k-1}\sum_{j=0}^{k^{n-1}-1} w(i,j)w(i,tk^{n-1})A(j+tk^{n-1}) \\&=\sum_{t=0}^{k-1}w(i,tk^{n-1})\sum_{j=0}^{k^{n-1}-1} w(i\mod k^{n-1},j)A(j+tk^{n-1}) \end{aligned}

可以发现后面是一个子问题,即为对 A 序列的 [j+tk^{n-1},j+(t+1)k^{n-1}) 部分作变换。可以递归求解。时间复杂度为 T(n)=kT(n-1)+O(k^n),得 T(n)=O(n k^n)

对长为 k^n 的序列 \hat{A} 求其逆变换 A

A 看作一个列向量

\begin{bmatrix} A(0)\\ \vdots\\ A(k^n-1) \end{bmatrix}

则有

\hat{A}=W \times A

于是

W' \times \hat{A} = W' \times W \times A=A

所以使用 w' 进行正变换时的分治算法即可。

综上所述,对 A,B 分别求得其变换后的 \hat{A},\hat{B},并求出 \hat{C}=\hat{A}\cdot\hat{B},最后求 \hat{C} 的逆变换得到 C 即可解决本文的引入问题。时间复杂度为 O(n k^n)

特例

注:下述的 i,j 均满足 0\le i,j<k。其它情况的 w,w' 都要按位计算后作积。

\oplus 为按位取 max

构造 w(i,j)=[i\ge j]。此时有

w'(i,j)=\begin{cases} 1, \quad&i=j\\ -1, \quad&i=j+1\\ 0, \quad&i\ne j \land i\ne j+1 \end{cases}

\oplus 为按位取 min

构造 w(i,j)=[i\le j]。此时有

w'(i,j)=\begin{cases} 1, \quad&i=j\\ -1, \quad&i=j-1\\ 0, \quad&i\ne j \land i\ne j-1 \end{cases}

\oplus 为不进位加法

构造 w(i,j)=\omega^{ij}(其中 \omegak 次单位根)。此时有 w'(i,j)=\dfrac{\omega^{-ij}}{k}