对于位运算卷积
其中 可以是 OR、AND 或 XOR。我们希望构造一个线性变换 ,使卷积在变换后变成逐点乘法:
于是可以按照下面的流程计算卷积:
- 分别对 做 FWT;
- 将变换后的数组逐点相乘;
- 对结果做逆 FWT,还原出 。
下面分别推导 OR、AND 和 XOR 卷积对应的变换。
OR 卷积
1. 推导矩阵需要满足的条件
OR 卷积定义为
设线性变换
其中矩阵 的第 行、第 列为 ,则
代入 的定义:
因此,左边多项式中 的系数为
另一方面,
右边多项式中 的系数为
为了使
对任意数组 恒成立,对应项的系数必须相等。因此矩阵需要满足
2. 求一位二进制下的变换矩阵
先只考虑一位二进制,即数组长度为 ,下标只有 。设
对于任意一行 :
当 时,
即
在通常使用的数域或模质数域中,解为 或 。
如果 ,那么对任意 都有
这一整行都会变成零,矩阵不可能可逆。因此必须取
当 时,
即
所以 或 。
因此每一行只能是 或 。为了使矩阵可逆,取这两个不同的行:
3. 从一位推广到多位
由于不同二进制位之间互相独立,$n$ 位变换矩阵就是 的 次张量积:
提取最高位,有
将长度为 的数组按照最高位分成前后两半:
于是
因此每一级的蝶形操作为
设数组长度为 ,递归式为
4. OR 逆变换
一位矩阵的逆为
又因为张量积的逆等于各矩阵逆的张量积,所以
对应的逆蝶形操作为
递归实现:
非递归实现:
AND 卷积
AND 卷积定义为
完全同理,矩阵需要满足
1. 一位变换矩阵
AND 的单位元是 。对于非零的一行,必须有 ;而 可以取 或 。因此两种不同的行是
取它们组成可逆矩阵:
2. 推广到多位
于是
因此 AND 变换的蝶形操作为
3. AND 逆变换
因此逆蝶形操作为
实现:
XOR 卷积
XOR 卷积定义为
矩阵需要满足
1. 一位变换矩阵
当 时,
为了避免整行退化为零,取
当 时,
所以
由于 ,有
取两种不同的行组成矩阵:
2. 推广到多位
于是
因此 XOR 变换的蝶形操作为
3. XOR 逆变换
一位矩阵的逆为
因此逆蝶形操作为
每一层都除以 ,总共经过 层,所以整个逆变换等价于最后统一乘上 。
如果在模意义下计算,需要保证 存在乘法逆元;例如模数为奇质数时,可以预处理
实现:
总结
设当前处理的一对数为 :
| 卷积 | 正变换 | 逆变换 |
|---|---|---|
| OR | ||
| AND | ||
| XOR |
三种 FWT 的时间复杂度均为
使用矩阵和张量积构造 FWT