首先,
&,∣ 卷积可以在 这里 找到
今天来说一说
⨂ 卷积
问题:求
hk=∑i⨂j=kfj∗gk,其中
⨂ 为不进位加法,在二进制中说的就是异或
首先我们有一个结论:
2n1T∑(−1)∣S∩T∣=[S=∅]
证明:当
S=∅ 时,每一项的贡献都是
1
当
S=∅ 时,对于一个
a∈S
考虑
(−1)∣S∩(T⊗a)∣=(−1)(∣S∩T)⊗a=−(−1)∣S∩T∣
所以有一一对应关系,于是上述式子为 0
考虑原式子
hk=i∑j∑[i⊗j⊗k=∅]fi∗gj
hk=2n1i∑j∑T∑(−1)∣(i⊗j⊗k)∩T∣fi∗gj
注意到这里是可以拆出来的
hk=2n1i∑j∑T∑(−1)∣i∩T∣(−1)∣j∩T∣(−1)∣k∩T∣fi∗gj
hk=2n1T∑(−1)∣k∩T∣i∑(−1)∣i∩T∣fij∑(−1)∣j∩T∣gj
我们令
f^S=∑T(−1)∣S∩T∣fT,g 同理,那么有
hk=2n1T∑(−1)∣k∩T∣f^T∗g^T
注意到如果有
h^k=T∑(−1)∣k∩T∣hT
那么就有
hk=2n1T∑(−1)∣k∩T∣h^T
直接代入就可以证明
于是就有结论:
h^T=f^T∗g^T
可以快速实现 “点值” 的乘法
于是现在的问题就是快速求
f^k=T∑(−1)∣k∩T∣fT
我们按位从低到高来处理
令
f(i) 为考虑到第
i 位的时候的结果,那么容易得到
fS(i)=fS(i−1)+fS∪{i}(i−1)
fS∪{i}(i)=fS(i−1)−fS∪{i}(i−1)
于是可以在
O(n∗2n) 的时间内实现
FWT 的另一种理解方式:
对于求
hk=∑i⨂j=kfj∗gk,其中
⨂ 为不进位加法,是可以扩展到
k 进制的
我们考虑构造一个矩阵
A,满足
(f∗A)∗(g∗A)=(h∗A)
其中括号里面是向量乘矩阵,外面是向量的点乘
这样一来我们只需要对
f,g 进行变化,再乘上逆矩阵就可以了
不放令
x=(x0x1...xm)k,令
x′ 为
x 的最高位,
x′′为
x 去掉最高位后剩下的
那么我们可以构造另一个矩阵
B,
s.t.Ax,y=∏Bxi,yi
考虑如果知道
B 如何求得
f∗A
(f∗A)[x]=i=0∑n−1fiAx,i
=p=0∑k−1Bx′,pi′=p∑fi∗Ax′′,i′′
后面一坨可以继续分治求下去
于是
B 需要满足的性质,有
i∑fiBx,ij∑gjBx,j=k∑hkBx,k
如果有
fi∗gj∗(i⊗j=k)=hk,那么有
Bx,iBx,j=Bx,k(i⊗j=k)
即
Bx,iBx,j=Bx,k(K∣i+j−k)
B=111...11wK1wK2...wKK−11wK2wK4...wK2∗(K−1)...............
跟
fft 的矩阵一样, 大概可以把
FWT 看做对每一位做了一遍循环卷积
二进制的时候:
B=111−1
这符合我们之前的推论
子集卷积
hk=i∑j∑[i∩j=∅][i∪j=k]fi∗gj
为了满足第一个限制,我们可以设置
n 个数组
第
i 个数组只有下标的
popcnt=i 的地方才有值
然后我们为满足第二个限制对每一个做一遍
FMT,两两相乘,累加到对应的
popcnt 数组中最后
IFMT 回去,复杂度
O(n2∗2n)