概念
类似多项式卷积,把下标相加换成下标做位运算,同样可以在 O ( n l o g n ) O(nlogn) O(nlogn)的效率内求出。
思想
或和与比较简单,重点考虑异或。
对于异或卷积,构造 F W T ( A ) [ i ] = ∑ j = 0 2 n − 1 ( − 1 ) b i t c o u n t ( i a n d j ) FWT(A)[i]=\sum_{j=0}^{2^n-1}{(-1)^{bitcount(i and j)}} FWT(A)[i]=∑j=02n−1(−1)bitcount(iandj)。
如果已知 A A A,我们可以用递归的方式计算 F W T ( A ) : F W T ( A ) = ( F W T ( A 0 ) + F W T ( A 1 ) , F W T ( A 0 ) − F W T ( A 1 ) ) FWT(A):FWT(A)=(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1)) FWT(A):FWT(A)=(FWT(A0)+FWT(A1),FWT(A0)−FWT(A1)),其中 A 0 A_0 A0和 A 1 A_1 A1分别表示 A A A的前 2 n − 1 2^{n-1} 2n−1位和后 2 n − 1 2^{n-1} 2n−1位,效率 O ( n l o g n ) O(nlogn) O(nlogn)。
可以利用上面式子,用归纳法证明 F W T ( A x o r B ) = F W T ( A ) × F W T ( B ) FWT(A xor B)=FWT(A) \times FWT(B) FWT(AxorB)=FWT(A)×FWT(B)。
于是我们只需要对 A , B A,B A,B分别做 F W T FWT FWT,把对应位置相乘,即可得到 F W T ( A x o r B ) FWT(A xor B) FWT(AxorB),剩下的问题是如何把它变为原来的 ( A x o r B ) (A xor B) (AxorB)。
还是考虑递归,把上面的式子逆过来得到
I
F
W
T
(
A
)
=
(
(
I
F
W
T
(
A
0
)
+
I
F
W
T
(
A
1
)
)
/
2
,
(
I
F
W
T
(
A
0
)
−
I
F
W
T
(
A
1
)
)
/
2
)
IFWT(A)=((IFWT(A_0)+IFWT(A_1))/2,(IFWT(A_0)-IFWT(A_1))/2)
IFWT(A)=((IFWT(A0)+IFWT(A1))/2,(IFWT(A0)−IFWT(A1))/2)
同样可以在
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)时间内算出。