FWT 异或卷积扩展
异或卷积主要解决以下问题:
给定长度为 $2^n$ 的序列 $A,B$,求序列 $C=A*B$,其中卷积的定义为:
$$
C_k=\sum\limits_{i\oplus j} A_iB_j
$$
我们实际上是渴望用类似 $FFT$ 的做法,现将上面的多项式通过变换改成点值,然后就可以用 $O(n)$ 的时间内计算乘法。即我们需要一个变换 $FWT$ 满足:
$$
FWT(A)*FWT(B)=FWT(C)
$$
我们把上面的式子称为异或卷积的 定义式。
同时,我们规定 $FWT$ 应该是线性变换,也就是说,我们考虑构造一个矩阵 $g$,满足:
$$
FWT(A)i=\sum\limits{j=0}^{2^n-1} g_{i,j}A_j
$$
如何构造?我们把上面的式子代入我们的定义式,可以得到:
$$
\begin{aligned}
\sum\limits_{i=0}^{2^n-1}\sum\limits_{j=0}^{2^n-1}g_{k,i}g_{k,j}A_iB_j&=
\sum\limits_{i=0}^{2^n-1}g_{k,i}C_i\
&=\sum\limits_{i=0}^{2^n-1}g_{k,i}\sum\limits_{j=0}^{2^n-1}A_{i\oplus j}B_j\&=\sum\limits_{i=0}^{2^n-1}\sum\limits_{j=0}^{2^n-1}g_{k,i\oplus j}A_iB_j\
\end{aligned}
$$
对比左右式子,我们可以只需要让 $g$ 满足 $g_{k,i}g_{k,j}=g_{k,i\oplus j}$ 即可。
同时考虑到异或对于二进制位下的每一位都是独立的,所以我们只需要考虑同一位的 $4$ 种情况。
因为我们还要做逆变换,所以需要保证这个矩阵一定是满秩的,也就是说其有逆矩阵。那么我们可以轻易构造出一个矩阵:
$$
\begin{pmatrix}
1&1\
1&-1
\end{pmatrix}
$$
而这个矩阵的逆为:
$$
\begin{pmatrix}
\frac{1}{2}&\frac{1}{2}\
\frac{1}{2}&-\frac{1}{2}
\end{pmatrix}
$$
而我们在具体实现中可以从小到大对于每个二进制位做一个这样的变换。
通过以上两个矩阵我们可以构造出各自的 $g$ 矩阵出来,以第一个矩阵为例子,我们设这个矩阵为 $A$,那么 $4\times 4$ 的矩阵可以构造为:
$$
\begin{pmatrix}
A&A\
A&-A
\end{pmatrix}
$$
容易发现这仍然是满足性质的。(任取第二列同一行的两个数就可以简单证明)。
并且无论扩展多上次,用第一个矩阵扩展出来的,它的逆矩阵一定是用第二个矩阵扩展出来的,这个可以用归纳简单证明。
- 定理 $1$:$FWT$ 的每一项满足:
$$
FWT(A)i=\sum\limits{j=0}^{2^n-1}(-1)^{|i&j|}A_j
$$
其中 $|a|$ 表示 $a$ 的二进制表示下 $1$ 的个数。
证明:根据我们构造出来的 $g$ 矩阵可以归纳证明只有当 $|i&j|$ 为奇数时才是 $-1$。所以上面的式子显然成立。
注意我们构造的 $FWT$ 是线性变换,所以我们有 $FWT(A+B)=FWT(A)+FWT(B)$。
FWT 或卷积并卷积的扩展
首先是通项公式:
$$
\begin{aligned}
FWT_{or}(A)i=\sum\limits{j|i=i}A_j\
FWT_{and}(A)i=\sum\limits{j&i=i} A_j
\end{aligned}
$$
所以:
- 做或卷积相当于做高维前缀和,而做或卷积的逆相当于做高维前缀差分。
- 做并卷积相当于做高维后缀和,而做并卷积的逆相当于做高维后缀差分。
证明很好证明,只需要从或卷积和并卷积的定义入手即可。
同时,这也证明了 FWT 和 FMT 本质上来说是一个东西。而且 FWT 能做的更多。
K 进制 FWT
所谓 $K$ 进制 $FWT$ 就是把 $\oplus$ 换成 $\bmod K$ 下的加法,也就是 $K$ 进制不进位加法。我们下面用 $\oplus_k$ 来替代。
所以相当于我们是要求解:
$$
c_k=\sum\limits_{i\oplus_k j}a_ib_j
$$
我们同样利用 $g_{i,j}$ 来进行变换,通过进行和上面类似的推导,我们可以得到 $g$ 需要满足 $g_{x,i}g_{x,j}=g_{x,i\oplus_k j}$,通过人类智慧的构造,我们可以构造出一下矩阵:
$$
f=
\begin{pmatrix}
1&1&1&1&\cdots&1\
1&\omega_{k}^1&\omega_k^2&\omega_k^3&\cdots&\omega_k^{k-1}\
1&\omega_{k}^{2}&\omega_k^{4}&\omega_k^6&\cdots&\omega_k^{(k-1)2}\
\vdots&\vdots&\vdots&\vdots&\ddots&\vdots\
1&\omega_k^{k-1}&\omega_k^{2(k-1)}&\omega_k^{3(k-1)}&\cdots&\omega_{k}^{(k-1)(k-1)}
\end{pmatrix}
$$
而这个矩阵的逆矩阵应该为:
$$
f^{-1}=\frac{1}{k}
\begin{pmatrix}
1&1&1&1&\cdots&1\
1&\omega_{k}^{-1}&\omega_k^{-2}&\omega_k^{-3}&\cdots&\omega_k^{-(k-1)}\
1&\omega_{k}^{-2}&\omega_k^{-4}&\omega_k^{-6}&\cdots&\omega_k^{-(k-1)2}\
\vdots&\vdots&\vdots&\vdots&\ddots&\vdots\
1&\omega_k^{-(k-1)}&\omega_k^{-2(k-1)}&\omega_k^{-3(k-1)}&\cdots&\omega_{k}^{-(k-1)(k-1)}
\end{pmatrix}
$$
证明只需要把两个矩阵相乘即可,这样时间复杂度应该为:
$T(n)=kT(\frac{n}{k})+nk=O(nk\log_kn)$