整理的算法模板合集: ACM模板
实际上是一个全新的精炼模板整合计划
前置知识:FFT
开始的开始,我们先来复习一下卷积的相关概念(注:0x00 卷积的部分内容(0x02、0x03、0x04)摘自 @wangrx,他写的太好了 %%%,略作修改完善,侵删)之后本文中所有的符号也都参照他的形式书写。以及本文中所有的多项式的系数 n n n 均为 2 2 2 的整数幂的形式(学过 FFT 的都懂hhh不然就没法分治了)
自认为本文是最为清晰完整的 FWT 讲解博客,含有全套完整清晰的证明,相信小学生都能看懂 ~
前排规定本文所用符号:
多项式 / 序列卷积: ⊗ \otimes ⊗
多项式 / 序列对应系数相乘 / 普通的乘法: × \times ×
多项式 / 序列第 k k k 项系数: ( f ) k (f)_k (f)k , ( f ⊗ g ) k (f\otimes g)_k (f⊗g)k , ( A ) [ i ] (A)[i] (A)[i]
多项式 / 序列加法: ⊕ \oplus ⊕
多项式 / 序列减法: ⊖ \ominus ⊖
多项式 / 序列
or
\text {or}
or 卷积( |
,或):
⊗
or
\otimes_{\text{or}}
⊗or
多项式 / 序列
and
\text {and}
and 卷积( &
,或):
⊗
and
\otimes_{\text{and}}
⊗and
多项式 / 序列
xor
\text {xor}
xor 卷积( ^
,或):
⊗
xor
\otimes_{\text{xor}}
⊗xor
0x00 卷积
0x01 多项式
我们知道对于一个普通的多项式可以表示为系数表示: f ( x ) = a 0 x 0 + a 1 x 1 + ⋅ ⋅ ⋅ + a n − 1 x n − 1 f(x)=a_0x^0+a_1x^1+···+a_{n-1}x^{n-1} f(x)=a0x0+a1x1+⋅⋅⋅+an−1xn−1
规定 f = a 0 x 0 + a 1 x 1 + ⋅ ⋅ ⋅ + a n − 1 x n − 1 f=a_0x^0+a_1x^1+···+a_{n-1}x^{n-1} f=a0x0+a1x1+⋅⋅⋅+an−1xn−1, g = b 0 x 0 + b 1 x 1 + ⋅ ⋅ ⋅ + b n − 1 x n − 1 g=b_0x^0+b_1x^1+···+b_{n-1}x^{n-1} g=b0x0+b1x1+⋅⋅⋅+bn−1xn−1
则可将多项式的系数表示简化为: f = ( a 0 , a 1 , a 2 ⋅ ⋅ ⋅ a n − 1 ) f=(a_0,a_1,a_2···a_{n-1}) f=(a0,a1,a2⋅⋅⋅an−1), g = ( b 0 , b 1 , b 2 ⋅ ⋅ ⋅ b n − 1 ) g=(b_0,b_1,b_2···b_{n-1}) g=(b0,b1,b2⋅⋅⋅bn−1)
定义多项式加减法:
⊕
,
⊖
\oplus,\ominus
⊕,⊖
H
=
f
⊕
g
=
(
a
0
,
a
1
,
a
2
⋅
⋅
⋅
a
n
−
1
)
⊕
(
b
0
,
b
1
,
b
2
⋅
⋅
⋅
b
n
−
1
)
=
(
a
0
+
b
0
,
a
1
+
b
1
,
a
2
+
b
2
⋅
⋅
⋅
a
n
−
1
+
b
n
−
1
)
\begin{aligned} H&=f\oplus g\\& =(a_0,a_1,a_2⋅⋅⋅a_{n−1})\oplus (b_0,b_1,b_2⋅⋅⋅b_{n−1})\\&=(a_0+b_0,a_1+b_1,a_2+b_2⋅⋅⋅a_{n−1}+b_{n−1}) \end{aligned}
H=f⊕g=(a0,a1,a2⋅⋅⋅an−1)⊕(b0,b1,b2⋅⋅⋅bn−1)=(a0+b0,a1+b1,a2+b2⋅⋅⋅an−1+bn−1)
H = f ⊖ g = ( a 0 , a 1 , a 2 ⋅ ⋅ ⋅ a n − 1 ) ⊕ ( b 0 , b 1 , b 2 ⋅ ⋅ ⋅ b n − 1 ) = ( a 0 − b 0 , a 1 − b 1 , a 2 − b 2 ⋅ ⋅ ⋅ a n − 1 − b n − 1 ) \begin{aligned} H&=f\ominus g\\& =(a_0,a_1,a_2⋅⋅⋅a_{n−1})\oplus (b_0,b_1,b_2⋅⋅⋅b_{n−1})\\&=(a_0-b_0,a_1-b_1,a_2-b_2⋅⋅⋅a_{n−1}-b_{n−1}) \end{aligned} H=f⊖g=(a0,a1,a2⋅⋅⋅an−1)⊕(b0,b1,b2⋅⋅⋅bn−1)=(a0−b0,a1−b1,a2−b2⋅⋅⋅an−1−bn−1)
其中多项式加减的第 k k k 项系数:
( f ⊕ g ) k = a k f k + b k g k (f\oplus g)_k=a_kf_k+b_kg_k (f⊕g)k=akfk+bkgk
( f ⊖ g ) k = a k f k − b k g k (f\ominus g)_k=a_kf_k-b_kg_k (f⊖g)k=akfk−bkgk
定义多项式对应系数相乘 (一定注意这里不是卷积
⊗
\otimes
⊗)
H
=
f
×
g
=
(
a
0
,
a
1
,
a
2
⋅
⋅
⋅
a
n
−
1
)
×
(
b
0
,
b
1
,
b
2
⋅
⋅
⋅
b
n
−
1
)
=
(
a
0
×
b
0
,
a
1
×
b
1
,
a
2
×
b
2
⋅
⋅
⋅
a
n
−
1
×
b
n
−
1
)
\begin{aligned} H&=f\times g\\& =(a_0,a_1,a_2⋅⋅⋅a_{n−1})\times (b_0,b_1,b_2⋅⋅⋅b_{n−1})\\&=(a_0\times b_0,a_1\times b_1,a_2\times b_2⋅⋅⋅a_{n−1}\times b_{n−1}) \end{aligned}
H=f×g=(a0,a1,a2⋅⋅⋅an−1)×(b0,b1,b2⋅⋅⋅bn−1)=(a0×b0,a1×b1,a2×b2⋅⋅⋅an−1×bn−1)
其中多项式对应系数相乘的第 k k k 项系数:
( f ⊗ g ) k = a k f k × b k g k (f\otimes g)_k=a_kf_k\times b_kg_k (f⊗g)k=akfk×bkgk
0x02 卷积的定义
对于一个序列,将其中元素一一映射到一个多项式函数的系数上, 这个多项式函数便叫做该序列的生成函数。
形式化地讲,对于序列 f 0 , f 1 , ⋯ , f n − 1 f_0,f_1,\cdots,f_{n-1} f0,f1,⋯,fn−1 , f ( x ) = ∑ k = 0 n − 1 f k x k f(x)=\displaystyle\sum_{k=0}^{n-1}f_kx^k f(x)=k=0∑n−1fkxk 为其生成函数。
卷积即为生成函数的乘积在对应序列的变换上的的抽象,“卷”即为其作用效果,“积”即为其本质。
对于序列 f , g f,g f,g ,其卷积序列 f ⊗ g f\otimes g f⊗g 满足 ( f ⊗ g ) k = ∑ i = 0 k f i × g k − i = ∑ i , j i + j = k f i × g j (f\otimes g)_k=\displaystyle\sum\limits_{i=0}^kf_i\times g_{k-i}=\sum\limits_{i,j}^{i+j=k}f_i\times g_j (f⊗g)k=i=0∑kfi×gk−i=i,j∑i+j=kfi×gj
对于多项式 f , g f,g f,g,其多项式的卷积为: f ⊗ g = ∑ k = 0 n ( ∑ i , j i + j = k a i × b j ) x k f\otimes g=\sum\limits_{k=0}^{n}(\sum\limits_{i,j}^{i+j=k}a_i\times b_j)x^k f⊗g=k=0∑n(i,j∑i+j=kai×bj)xk
而我们所熟知的 FFT 计算的是循环卷积,也即 ( f ⊗ g ) k = ∑ i + j ≡ k ( m o d n ) f i × g j (f\otimes g)_k=\displaystyle\sum_{i+j\equiv k\pmod n}f_i\times g_j (f⊗g)k=i+j≡k(modn)∑fi×gj , n n n 为序列长度。
0x03 卷积的基本性质
这里的卷积均为序列的卷积,因此证明时我们使用数学归纳法,即证明第 k k k 项成立,则整个序列均成立。由于多项式实际上就是序列的生成函数,所以性质同样成立。
-
f ⊗ g = g ⊗ f f\otimes g=g\otimes f f⊗g=g⊗f(交换律)
我们使用定义 ( f ⊗ g ) k = ∑ i + j = k f i × g j (f\otimes g)_k=\displaystyle\sum_{i+j=k}f_i\times g_j (f⊗g)k=i+j=k∑fi×gj ,以及乘法交换律 a × b = b × a a\times b=b\times a a×b=b×a 即可证明,因为 i + j = k i+j=k i+j=k 的 i i i 和 j j j 是一一对应的。
-
( f ⊗ g ) ⊗ h = f ⊗ ( g ⊗ h ) (f\otimes g)\otimes h=f\otimes(g \otimes h) (f⊗g)⊗h=f⊗(g⊗h) (结合律)
证明:
[ f ⊗ ( g ⊗ h ) ] n = ∑ i = 0 n f n − i × ( g ⊗ h ) i = ∑ i = 0 n f n − i ∑ j = 0 i g j h i − j = ∑ i = 0 n ∑ j = 0 i f n − i g j h i − j = ∑ i + j + k = n f i g j h k \begin{aligned} {[f\otimes(g\otimes h)]_n} & =\displaystyle\sum_{i=0}^nf_{n-i}\times(g\otimes h)_i & \\& =\sum_{i=0}^nf_{n-i}\sum_{j=0}^ig_jh_{i-j}\\& =\sum_{i=0}^n\sum_{j=0}^if_{n-i}g_jh_{i-j}\\& =\sum_{i+j+k=n}f_ig_jh_k\end{aligned} [f⊗(g⊗h)]n=i=0∑nfn−i×(g⊗h)i=i=0∑nfn−ij=0∑igjhi−j=i=0∑nj=0∑ifn−igjhi−j=i+j+k=n∑figjhk
交换顺序后反向推导即可得证。
-
(
f
⊕
g
)
⊗
h
=
(
f
⊗
h
)
⊕
(
g
⊗
h
)
(f\oplus g)\otimes h=(f\otimes h)\oplus(g\otimes h)
(f⊕g)⊗h=(f⊗h)⊕(g⊗h) (分配律)
其中 ( f ⊕ g ) k = a f k + b g k (f\oplus g)_k=af_k+bg_k (f⊕g)k=afk+bgk ,即序列 f , g f,g f,g 的加法, a , b a,b a,b 为常数。
证明:
[
(
f
⊕
g
)
⊗
h
]
k
=
∑
i
=
0
k
(
f
⊕
g
)
i
h
k
−
i
=
∑
i
=
0
k
(
a
f
i
+
b
g
i
)
h
k
−
i
=
∑
i
=
0
k
(
a
f
i
h
k
−
i
+
b
g
i
h
k
−
i
)
=
a
∑
i
=
0
k
f
i
h
k
−
i
+
b
∑
i
=
0
k
g
i
h
k
−
i
=
a
(
f
⊗
h
)
k
+
b
(
g
⊗
h
)
k
=
[
(
f
⊗
h
)
⊕
(
g
⊗
h
)
]
k
\begin{aligned} {[(f\oplus g)\otimes h]_k} &=\displaystyle\sum_{i=0}^k(f\oplus g)_ih_{k-i}\\ & =\sum_{i=0}^k (af_i+bg_i)h_{k-i} \\ &=\sum_{i=0}^k(af_ih_{k-i}+bg_ih_{k-i})\\ &=a\sum_{i=0}^kf_ih_{k-i}+b\sum_{i=0}^kg_ih_{k-i}\\&=a(f\otimes h)_k+b(g\otimes h)_k=[(f\otimes h)\oplus(g\otimes h)]_k \end{aligned}
[(f⊕g)⊗h]k=i=0∑k(f⊕g)ihk−i=i=0∑k(afi+bgi)hk−i=i=0∑k(afihk−i+bgihk−i)=ai=0∑kfihk−i+bi=0∑kgihk−i=a(f⊗h)k+b(g⊗h)k=[(f⊗h)⊕(g⊗h)]k
0x04 位运算卷积定义及其性质
一般的卷积满足 i + j = k i+j=k i+j=k ,又称为加法卷积。
类似的,对于序列
f
=
{
f
0
,
f
1
,
⋯
,
f
2
n
−
1
}
,
g
=
{
g
0
,
g
1
,
⋯
,
g
2
n
−
1
}
f=\{f_0,f_1,\cdots,f_{2^n-1}\},g=\{g_0,g_1,\cdots,g_{2^n-1}\}
f={f0,f1,⋯,f2n−1},g={g0,g1,⋯,g2n−1} ,
可以定义位运算卷积
(
f
⊗
⊙
g
)
k
=
∑
i
⊙
j
=
k
f
i
×
g
j
\displaystyle(f\otimes_\odot g)_k=\sum_{i\odot j=k}f_i\times g_j
(f⊗⊙g)k=i⊙j=k∑fi×gj ,其中
⊙
=
and
,
or
,
xor
\odot=\text{and},\text{or},\text{xor}
⊙=and,or,xor 。
还有
max
\max
max 卷积,这里不再拓展, 读者自行查找相关资料,现在着重讨论
⊗
xor
\otimes_\text{xor}
⊗xor
-
f
⊗
xor
g
=
g
⊗
xor
\displaystyle f\otimes_\text{xor} g=g\otimes_\text{xor}
f⊗xorg=g⊗xor (交换律)
由于 a xor b = b xor a\operatorname{xor}b=b\operatorname{xor} axorb=bxor ,根据定义显然成立。
and , or a n d , o r \operatorname{and},\operatorname{or}and,or and,orand,or 同样满足此性质,原因同上。 -
(
f
⊗
xor
g
)
⊗
xor
h
=
f
⊗
xor
(
g
⊗
xor
h
)
(f\otimes_\text{xor} g)\otimes_\text{xor} h=f\otimes_\text{xor}(g \otimes_\text{xor} h)
(f⊗xorg)⊗xorh=f⊗xor(g⊗xorh) (结合律)
证明: 根据定义,有 ( f ⊗ xor g ) k = ∑ i xor j = k f i × g j = ∑ i = 0 2 n − 1 f i × g k xor i (f\otimes_\text{xor} g)_k=\displaystyle\sum_{i\operatorname{xor}j=k}f_i\times g_j=\sum\limits_{i=0}^{2^n-1}f_i\times g_{k\operatorname{xor}i} (f⊗xorg)k=ixorj=k∑fi×gj=i=0∑2n−1fi×gkxori ,则
[ f ⊗ xor ( g ⊗ xor h ) ] m = ∑ i = 0 2 n − 1 f m xor i × ( g ⊗ xor h ) i = ∑ i = 0 2 n − 1 f m xor i ∑ j = 0 2 n − 1 g j h i xor j = ∑ i = 0 2 n − 1 ∑ j = 0 2 n − 1 f m xor i g j h i xor j = ∑ i xor j xor k = m f i g j h k \begin{aligned} {[f\otimes_\text{xor}(g\otimes_\text{xor}h)]_m} & =\sum_{i=0}^{2^n-1}f_{m\operatorname{xor}i}\times(g\otimes_\text{xor}h)_i \\&=\sum_{i=0}^{2^n-1}f_{m\operatorname{xor}i}\sum_{j=0}^{2^n-1}g_jh_{i\operatorname{xor}j}\\&=\sum_{i=0}^{2^n-1}\sum_{j=0}^{2^n-1}f_{m\operatorname{xor}i}g_jh_{i\operatorname{xor}j}\\& =\sum_{i\operatorname{xor}j\operatorname{xor}k=m}f_ig_jh_k\end{aligned} [f⊗xor(g⊗xorh)]m=i=0∑2n−1fmxori×(g⊗xorh)i=i=0∑2n−1fmxorij=0∑2n−1gjhixorj=i=0∑2n−1j=0∑2n−1fmxorigjhixorj=ixorjxork=m∑figjhk
交换顺序后反向推导即可得证。
or
,
and
\operatorname{or},\operatorname{and}
or,and 没有对应的逆运算,因此证明相对复杂,这里不给出证明。
-
(
f
⊕
g
)
⊗
xor
h
=
(
f
⊗
xor
h
)
⊕
(
g
⊗
xor
h
)
(f\oplus g)\otimes_\text{xor} h=(f\otimes_\text{xor} h)\oplus(g\otimes_\text{xor} h)
(f⊕g)⊗xorh=(f⊗xorh)⊕(g⊗xorh) (分配律)
证明同加法卷积, and , or \operatorname{and},\operatorname{or} and,or 同理。
0x10 FWT(快速沃尔什变换)
复习完上述基本概念以后,我们进入今天的正题,快速沃尔什变换(FWT)。
我们知道 FFT 是用来在 O ( n l o g n ) \mathcal O(nlogn) O(nlogn) 的时间复杂度下利用分治求解普通序列 / 多项式的卷积:
对于序列 f , g f,g f,g ,其卷积序列 f ⊗ g f\otimes g f⊗g 满足对于 f ⊗ g f\otimes g f⊗g 的第 k k k 项: ( f ⊗ g ) k = ∑ i = 0 k f i × g k − i = ∑ i , j i + j = k f i × g j (f\otimes g)_k=\displaystyle\sum\limits_{i=0}^kf_i\times g_{k-i}=\sum\limits_{i,j}^{i+j=k}f_i\times g_j (f⊗g)k=i=0∑kfi×gk−i=i,j∑i+j=kfi×gj
对于多项式 f , g f,g f,g,其多项式的卷积为: f ⊗ g = ∑ k = 0 n ( ∑ i , j i + j = k a i × b j ) x k \displaystyle f\otimes g=\sum\limits_{k=0}^{n}(\sum\limits_{i,j}^{i+j=k}a_i\times b_j)x^k f⊗g=k=0∑n(i,j∑i+j=kai×bj)xk
上面定义了位运算卷积: ( f ⊗ ⊙ g ) k = ∑ i ⊙ j = k f i × g j \displaystyle(f\otimes_\odot g)_k=\sum_{i\odot j=k}f_i\times g_j (f⊗⊙g)k=i⊙j=k∑fi×gj ,其中 ⊙ = and , or , xor \odot=\text{and},\text{or},\text{xor} ⊙=and,or,xor ,并讲解了一系列相关性质,那么我们如何求得位运算卷积呢?我们模仿 FFT 给出一种类似的求解算法:快速沃尔什变换(FWT)。
严格来讲,FWT 仅为 xor \text {xor} xor 卷积,FMT 为 and \text{and} and、 or \text{or} or 卷积,这里放到一块统称为 FWT。(QWQ)
我们将两个 ( n − 1 ) (n - 1) (n−1) 次多项式 A ( x ) = ∑ i = 0 n − 1 a i x i \displaystyle A(x)~=~\sum\limits_{i = 0}^{n - 1} a_i x^i A(x) = i=0∑n−1aixi , B ( x ) = ∑ i = 0 n − 1 b i x i \displaystyle B(x)~=~\sum\limits_{i = 0}^{n - 1} b_i x^i B(x) = i=0∑n−1bixi 的系数数列 { a i } \{a_i\} {ai},对其进行离散傅里叶变换(DFT)得到的两个点值表示 { A d i } \{Ad_i\} {Adi}, { B d i } \{Bd_i\} {Bdi},其中 A d k = ∑ i = 0 n − 1 a i × ω n i k \displaystyle Ad_k~=~\sum\limits_{i = 0}^{n - 1} a_i \times \omega_n^{ik} Adk = i=0∑n−1ai×ωnik,我们使用 FFT 在 O ( n l o g n ) \mathcal O(nlogn) O(nlogn) 的时间复杂度下完成这一操作。
之后在 O ( n ) \mathcal O(n) O(n) 的时间复杂度下完成两个点值表示的多项式的乘积 C i = A d i × B d i C_i=Ad_i\times Bd_i Ci=Adi×Bdi。
最后利用结论 a k = 1 n ∑ i = 0 n − 1 d i ω n − k i \displaystyle a_k~=~\frac{1}{n} \sum_{i = 0}^{n - 1} d_i \omega_n^{-ki} ak = n1i=0∑n−1diωn−ki ,通过逆离散傅里叶变换(IDFT)还原系数数列 { c i } \{c_i\} {ci} 得到答案,同样使用 FFT 在 O ( n l o g n ) \mathcal O(nlogn) O(nlogn) 的时间复杂度下完成这一操作。
我们借鉴多项式乘法即普通卷积的实现 FFT 得出类似的思路 FWT:
我们先求出多项式的另一种多项式表示 F W T ( A ) FWT(A) FWT(A) , O ( n ) \mathcal O(n) O(n) 将对应的位置乘起来,最后复原即可。
即答案 F W T ( C ) = F W T ( A ) × F W T ( B ) \displaystyle FWT(C)=FWT(A)\times FWT(B) FWT(C)=FWT(A)×FWT(B)(其中 × \times × 是 多项式 / 序列 对应位置相乘)
看上去思路没有什么问题。我们考虑证明。
由于位运算卷积分为三种 ⊙ = and , or , xor \odot=\text{and},\text{or},\text{xor} ⊙=and,or,xor ,所以我们分开讨论。
0x11 或( or \text{or} or)卷积
**或( or \text{or} or ,
|
) 按位或运算符,|
有1
为1
无1
为0
**
或卷积: ( f ⊗ or g ) k = ∑ i ∣ j = k f i × g j \displaystyle(f\otimes_{\text{or}} g)_k=\sum_{i| j=k}f_i\times g_j (f⊗org)k=i∣j=k∑fi×gj
对于序列 A , B , C A,B,C A,B,C, A = { a 0 , a 1 ⋯ , a n } A=\{a_0,a_1\cdots,a_{n}\} A={a0,a1⋯,an}, B = { b 0 , b 1 , ⋯ , b n } B=\{b_0,b_1,\cdots,b_n\} B={b0,b1,⋯,bn}, C = { c 0 , c 1 , ⋯ c n } C=\{c_0,c_1,\cdots c_n\} C={c0,c1,⋯cn} ,我们令 C C C 为或卷积的结果。
我们想要求的式子为 F W T ( C ) = F W T ( A ) × F W T ( B ) FWT(C)=FWT(A)\times FWT(B) FWT(C)=FWT(A)×FWT(B) ,即: c k = ∑ i ∣ j = k a i b j \displaystyle c_{k}=\sum_{i \mid j=k} a_{i} b_{j} ck=i∣j=k∑aibj
显然有 i ∣ k = k , j ∣ k = k → ( i ∣ j ) ∣ k = k i|k = k, j|k=k \to (i|j)|k=k i∣k=k,j∣k=k→(i∣j)∣k=k 。
因此我们构造快速沃尔什变换
F
W
T
FWT
FWT :
F
W
T
(
A
)
[
k
]
=
∑
i
∣
k
=
k
a
i
\displaystyle FWT(A)[k]=\sum_{i|k=k}a_i
FWT(A)[k]=i∣k=k∑ai
F
W
T
(
A
)
×
F
W
T
(
B
)
=
(
∑
i
∣
k
=
k
a
i
)
(
∑
j
∣
k
=
k
b
j
)
=
∑
i
∣
k
=
k
,
j
∣
k
=
k
a
i
b
j
=
∑
(
i
∣
j
)
∣
k
=
k
a
i
b
j
=
F
W
T
(
C
)
\begin{aligned}FWT(A) \times FWT(B) &=\left(\sum_{i \mid k=k} a_{i}\right)\left(\sum_{j \mid k=k} b_{j}\right) \\&=\sum_{i|k=k,\ j| k=k} a_{i} b_{j} \\&=\sum_{(i \mid j) \mid k=k} a_{i} b_{j} \\&=FWT(C)\end{aligned}
FWT(A)×FWT(B)=⎝⎛i∣k=k∑ai⎠⎞⎝⎛j∣k=k∑bj⎠⎞=i∣k=k, j∣k=k∑aibj=(i∣j)∣k=k∑aibj=FWT(C)
性质11.1: F W T ( A ± B ) = F W T ( A ) ± F W T ( B ) FWT(A\pm B)=FWT(A)\pm FWT(B) FWT(A±B)=FWT(A)±FWT(B)
根据 F W T FWT FWT 变换的定义我们可以将其看作是一个 A A A 序列的线性组合,故其加减法满足分配律。
由此我们可以得到 FWT 的递推式:
性质11.2:
F
W
T
(
A
)
=
{
(
F
W
T
(
A
0
)
,
F
W
T
(
A
0
)
+
F
W
T
(
A
1
)
)
n
>
1
A
n
=
0
FWT(A)=\begin{cases}(FWT(A_0),FWT(A_0)+FWT(A_1))& n>1\\\ A & n=0\end{cases}
FWT(A)={(FWT(A0),FWT(A0)+FWT(A1)) An>1n=0
其中定义
A
A
A 为
2
k
2^k
2k 多项式,
A
0
A_0
A0 代表
A
A
A 的系数序列的前半部分即前
2
k
−
1
2^{k-1}
2k−1 次项,
A
1
A_1
A1 代表
A
A
A 的后半部分即后
2
k
−
1
2^{k-1}
2k−1 次项,也就是下标的最高位分别为
0
0
0 和
1
1
1 的两部分。
式中的括号运算定义为: A = ( B , C ) A=(B,C) A=(B,C) 。
表示
B
B
B 这个多项式后面接上
C
C
C 等于
A
A
A,展开后为:
(
A
,
B
)
=
(
(
a
0
,
a
1
,
a
2
⋯
a
x
−
1
)
,
(
b
0
,
b
1
,
b
2
⋯
b
y
−
1
)
)
=
(
a
0
,
a
1
,
a
2
⋯
a
x
−
1
,
b
0
,
b
1
,
b
2
⋯
b
y
−
1
)
\begin{aligned}(A, B) &=\left(\left(a_{0}, a_{1}, a_{2} \cdots a_{x-1}\right),\left(b_{0}, b_{1}, b_{2} \cdots b_{y-1}\right)\right) \\&=\left(a_{0}, a_{1}, a_{2} \cdots a_{x-1}, b_{0}, b_{1}, b_{2} \cdots b_{y-1}\right)\end{aligned}
(A,B)=((a0,a1,a2⋯ax−1),(b0,b1,b2⋯by−1))=(a0,a1,a2⋯ax−1,b0,b1,b2⋯by−1)
可以理解为系数直接连起来。
考虑证明:
首先 n = 0 n=0 n=0 时显然成立。
我们知道 A 0 , A 1 A_0,A_1 A0,A1 实际上为下标的最高位分别为 0 0 0 和 1 1 1 的两部分,且除了最高位不同以外,其余的所有位,对于每一个下标 A 1 A_1 A1 都有一个 A 0 A_0 A0 与之相对应(仅最高位一个是 1 1 1 ,一个是 0 0 0)。
根据 FWT 的定义,合并之后左半部分下标的最高位仍然是 0 0 0,右半部分下标的最高位仍然是 1 1 1
首先对于左半部分:
由于
F
W
T
(
A
1
)
FWT(A_1)
FWT(A1) 的最高位一定为
1
1
1,而此时
j
∣
i
j|i
j∣i 的最高位不可能为
0
0
0(1 | 0 = 1
),所以右半部分在合并之后对于左半部分是没有贡献的,故
F
W
T
(
A
)
0
=
F
W
T
(
A
0
)
FWT(A)_0=FWT(A_0)
FWT(A)0=FWT(A0)。
而对于右半部分,如果左半部分的数满足 j ∣ i = i j|i=i j∣i=i,那么在 i i i 加上最高位 1 1 1 之后, j ∣ i = i j|i=i j∣i=i 仍然成立。而此时右半部分的原来的 F W T ( A 1 ) FWT(A_1) FWT(A1) 本来就对右半部分的数有贡献,故 F W T ( A ) 1 = F W T ( A 0 ) + F W T ( A 1 ) FWT(A)_1=FWT(A_0)+FWT(A_1) FWT(A)1=FWT(A0)+FWT(A1)
故我们将这两部分使用括号运算合并即可得到: F W T ( A ) = ( F W T ( A 0 ) , F W T ( A 0 ) + F W T ( A 1 ) ) FWT(A)=(FWT(A_0),FWT(A_0)+FWT(A_1)) FWT(A)=(FWT(A0),FWT(A0)+FWT(A1))
故 性质11.2 得证。
性质11.3: F W T ( A ∣ B ) = F W T ( A ) × F W T ( B ) FWT(A|B)=FWT(A)\times FWT(B) FWT(A∣B)=FWT(A)×FWT(B)
(注,这里的 × \times × 指对应系数相乘,见前排符号规定)
我们可以利用上面的 性质11.1 以及 性质11.2,使用数学归纳法证明:
F W T ( A ∣ B ) = F W T ( ( A ∣ B ) 0 , ( A ∣ B ) 1 ) = F W T ( A 0 ∣ B 0 , A 0 ∣ B 1 + A 1 ∣ B 0 + A 1 ∣ B 1 ) = ( F W T ( A 0 ∣ B 0 ) , F W T ( A 0 ∣ B 0 + A 0 ∣ B 1 + A 1 ∣ B 0 + A 1 ∣ B 1 ) ) = ( F W T ( A 0 ) × F W T ( B 0 ) , F W T ( A 0 ) × F W T ( B 0 ) + F W T ( A 0 ) × F W T ( B 1 ) + F W T ( A 1 ) × F W T ( B 0 ) + F W T ( A 1 ) × F W T ( B 1 ) ) = ( F W T ( A 0 ) × F W T ( B 0 ) , ( F W T ( A 0 ) + F W T ( A 1 ) ) × ( F W T ( B 0 ) + F W T ( B 1 ) ) ) = ( F W T ( A 0 ) , F W T ( A 0 + A 1 ) ) × ( F W T ( B 0 ) , F W T ( B 0 + B 1 ) ) = F W T ( A ) × F W T ( B ) \begin{aligned} FWT(A|B)=&FWT((A|B)_0,(A|B)_1)\\ =&FWT(A_0|B_0,A_0|B_1+A_1|B_0+A_1|B_1)\\ =&(FWT(A_0|B_0),FWT(A_0|B_0+A_0|B_1+A_1|B_0+A_1|B_1))\\ =&(FWT(A_0)\times FWT(B_0)\\&,FWT(A_0)\times FWT(B_0)+FWT(A_0)\times FWT(B_1)+FWT(A_1)\times FWT(B_0)+FWT(A_1)\times FWT(B_1))\\ =&(FWT(A_0)\times FWT(B_0),(FWT(A_0)+FWT(A_1))\times (FWT(B_0)+FWT(B_1)))\\ =&(FWT(A_0),FWT(A_0+A_1))\times (FWT(B_0),FWT(B_0+B_1))\\ =&FWT(A)\times FWT(B) \end{aligned} FWT(A∣B)=======FWT((A∣B)0,(A∣B)1)FWT(A0∣B0,A0∣B1+A1∣B0+A1∣B1)(FWT(A0∣B0),FWT(A0∣B0+A0∣B1+A1∣B0+A1∣B1))(FWT(A0)×FWT(B0),FWT(A0)×FWT(B0)+FWT(A0)×FWT(B1)+FWT(A1)×FWT(B0)+FWT(A1)×FWT(B1))(FWT(A0)×FWT(B0),(FWT(A0)+FWT(A1))×(FWT(B0)+FWT(B1)))(FWT(A0),FWT(A0+A1))×(FWT(B0),FWT(B0+B1))FWT(A)×FWT(B)
当然我们也可以使用定义将其展开来证明,这样看上去会会更加的清晰一些。
其中若 i ∣ k = k , j ∣ k = k → ( i ∣ j ) ∣ k = k i|k=k,j|k=k\to (i|j)|k=k i∣k=k,j∣k=k→(i∣j)∣k=k。
F W T ( A ) × F W T ( B ) = ( ∑ i ∣ 0 = 0 a i , ∑ i ∣ 1 = 1 a i , ∑ i ∣ 2 = 2 a i ⋯ ∑ i ∣ ( n − 1 ) = ( n − 1 ) a i ) × ( ∑ i ∣ 0 = 0 b i , ∑ i ∣ 1 = 1 b i , ∑ i ∣ 2 = 2 b i ⋯ ∑ i ∣ ( n − 1 ) = ( n − 1 ) b i ) = ( ( ∑ i ∣ 0 = 0 a i ) × ( ∑ j ∣ 0 = 0 b j ) , ( ∑ i ∣ 1 = 1 a i ) × ( ∑ j ∣ 1 = 1 b j ) , ( ∑ i ∣ 2 = 2 a i ) × ( ∑ j ∣ 2 = 2 b j ) ⋯ ( ∑ i ∣ ( n − 1 ) = ( n − 1 ) a i ) × ( ∑ j ∣ ( n − 1 ) = ( n − 1 ) b j ) ) = ( ∑ i ∣ j ∣ 0 = 0 a i × b j , ∑ i ∣ j ∣ 1 = 1 a i × b j , ∑ i ∣ j ∣ 2 = 2 a i × b j ⋯ ∑ i ∣ j ∣ ( n − 1 ) = ( n − 1 ) a i × b j ) = ( ∑ k ∣ 0 = 0 ∑ i ∣ j = k a i × b j , ∑ k ∣ 1 = 1 ∑ i ∣ j = k a i × b j , ∑ k ∣ 2 = 2 ∑ i ∣ j = k a i × b j ⋯ ∑ k ∣ ( n − 1 ) = ( n − 1 ) ∑ i ∣ j = k a i × b j ) = F W T ( A ∣ B ) \begin{aligned}FWT(A) \times F W T(B) &=\left(\sum_{i \mid 0=0} a_{i}, \sum_{i \mid 1=1} a_{i}, \sum_{i \mid 2=2} a_{i} \cdots \sum_{i \mid(n-1)=(n-1)} a_{i}\right) \times \left(\sum_{i \mid 0=0} b_{i}, \sum_{i \mid 1=1} b_{i}, \sum_{i \mid 2=2} b_{i} \cdots \sum_{i \mid(n-1)=(n-1)} b_{i}\right) \\&=\left(\left(\sum_{i \mid 0=0} a_{i}\right) \times \left(\sum_{j \mid 0=0} b_{j}\right),\left(\sum_{i \mid 1=1} a_{i}\right) \times \left(\sum_{j \mid 1=1} b_{j}\right),\left(\sum_{i \mid 2=2} a_{i}\right) \times \left(\sum_{j \mid 2=2} b_{j}\right) \cdots\left(\sum_{i \mid(n-1)=(n-1)} a_{i}\right) \times \left(\sum_{j \mid(n-1)=(n-1)} b_{j}\right)\right) \\&=\left(\sum_{i|j| 0=0} a_{i} \times b_{j}, \sum_{i|j| 1=1} a_{i}\times b_{j}, \sum_{i|j| 2=2} a_{i} \times b_{j} \cdots \sum_{i|j|(n-1)=(n-1)} a_{i} \times b_{j}\right) \\&=\left(\sum_{k \mid 0=0} \sum_{i \mid j=k} a_{i} \times b_{j}, \sum_{k \mid 1=1} \sum_{i \mid j=k} a_{i} \times b_{j}, \sum_{k \mid 2=2} \sum_{i \mid j=k} a_{i} \times b_{j} \cdots \sum_{k \mid(n-1)=(n-1)} \sum_{i \mid j=k} a_{i} \times b_{j}\right) \\&=F W T(A \mid B)\end{aligned} FWT(A)×FWT(B)=⎝⎛i∣0=0∑ai,i∣1=1∑ai,i∣2=2∑ai⋯i∣(n−1)=(n−1)∑ai⎠⎞×⎝⎛i∣0=0∑bi,i∣1=1∑bi,i∣2=2∑bi⋯i∣(n−1)=(n−1)∑bi⎠⎞=⎝⎛⎝⎛i∣0=0∑ai⎠⎞×⎝⎛j∣0=0∑bj⎠⎞,⎝⎛i∣1=1∑ai⎠⎞×⎝⎛j∣1=1∑bj⎠⎞,⎝⎛i∣2=2∑ai⎠⎞×⎝⎛j∣2=2∑bj⎠⎞⋯⎝⎛i∣(n−1)=(n−1)∑ai⎠⎞×⎝⎛j∣(n−1)=(n−1)∑bj⎠⎞⎠⎞=⎝⎛i∣j∣0=0∑ai×bj,i∣j∣1=1∑ai×bj,i∣j∣2=2∑ai×bj⋯i∣j∣(n−1)=(n−1)∑ai×bj⎠⎞=⎝⎛k∣0=0∑i∣j=k∑ai×bj,k∣1=1∑i∣j=k∑ai×bj,k∣2=2∑i∣j=k∑ai×bj⋯k∣(n−1)=(n−1)∑i∣j=k∑ai×bj⎠⎞=FWT(A∣B)
至此,我们得到了与 FFT 类似的 FWT 的所有定义与性质。
根据 FFT 的流程,我们需要定义 IFWT,即逆沃尔什变换。
我们定义 I F W T ( F W T ( A ) ) = A IFWT(FWT(A))=A IFWT(FWT(A))=A。
则:
I
F
W
T
(
A
)
=
{
(
I
F
W
T
(
A
0
)
,
I
F
W
T
(
A
1
)
−
I
F
W
T
(
A
0
)
)
n
>
1
A
n
=
0
IFWT(A)=\begin{cases}(IFWT(A_0),IFWT(A_1)-IFWT(A_0))&n>1\\\ A&n=0\end{cases}
IFWT(A)={(IFWT(A0),IFWT(A1)−IFWT(A0)) An>1n=0
考虑证明:
根据 性质11.1
∵
F
W
T
(
A
)
0
=
F
W
T
(
A
0
)
∴
A
0
=
IFWT
(
F
W
T
(
A
0
)
)
=
IFWT
(
F
W
T
(
A
)
0
)
∵
F
W
T
(
A
)
1
=
F
W
T
(
A
0
)
+
F
W
T
(
A
1
)
∴
A
1
=
I
F
W
T
(
F
W
T
(
A
1
)
)
=
I
F
W
T
(
F
W
T
(
A
)
1
−
F
W
T
(
A
)
0
)
∴
I
F
W
T
(
A
)
=
I
F
W
T
(
(
A
0
,
A
1
)
)
=
(
I
F
W
T
(
A
0
)
,
I
F
W
T
(
A
1
)
−
I
F
W
T
(
A
0
)
)
\begin{aligned}&\\&\because F W T(A)_{0}=F W T\left(A_{0}\right)\\&\therefore A_{0}=\operatorname{IFWT}\left(F W T\left(A_{0}\right)\right)=\operatorname{IFWT}\left(F W T(A)_{0}\right)\\&\because F W T(A)_{1}=F W T\left(A_{0}\right)+F W T\left(A_{1}\right)\\&\therefore A_{1}=I FW T\left(F W T\left(A_{1}\right)\right)=I FW T\left(F W T(A)_{1}-F W T(A)_{0}\right)\\& \therefore IFWT(A)=IFWT((A_0, A_1))=(IFWT(A_0),IFWT(A_1)-IFWT(A_0))\end{aligned}
∵FWT(A)0=FWT(A0)∴A0=IFWT(FWT(A0))=IFWT(FWT(A)0)∵FWT(A)1=FWT(A0)+FWT(A1)∴A1=IFWT(FWT(A1))=IFWT(FWT(A)1−FWT(A)0)∴IFWT(A)=IFWT((A0,A1))=(IFWT(A0),IFWT(A1)−IFWT(A0))
其实看起来非常的形象,因为 IFWT 是 FWT 的逆运算,所以公式逆过来,
+
+
+ 变成
−
-
− 就行了。
显然FWT与IFWT运算基本相同,实现的时候写成一个函数即可:
inline void OR(int *f, int x = 1) {
for (int o = 2, k = 1; o <= n; o <<= 1, k <<= 1)
for (int i = 0; i < n; i += o)
for (int j = 0; j < k; ++ j)
f[i + j + k] += f[i + j] * x;
}
0x12 与( and \text{and} and)卷积
同理,我们可以得到与卷积的定义式:
F
W
T
(
A
)
[
k
]
=
∑
i
&
k
=
k
a
i
FWT(A)[k]=\sum_{i\&k=k}a_i
FWT(A)[k]=i&k=k∑ai
以及 FWT 的递推式:
F
W
T
(
A
)
=
{
(
F
W
T
(
A
0
)
+
F
W
T
(
A
1
)
,
F
W
T
(
A
1
)
)
n
>
1
A
n
=
0
FWT(A)=\begin{cases}(FWT(A_0)+FWT(A_1),FWT(A_1))&n>1\\\ A &n=0\end{cases}
FWT(A)={(FWT(A0)+FWT(A1),FWT(A1)) An>1n=0
证明同或卷积,序列 A A A 的右半部分任意一个下标 & \& & 左半部分即首位为 0 0 0 的数,得到的结果一定在 A A A 的左半部分,故 A 1 A_1 A1 对 左半部分有贡献,且一定对自己所在的右半部分有贡献。
性质12.1: F W T ( A & B ) = F W T ( A ) × F W T ( B ) FWT(A\&B)=FWT(A)\times FWT(B) FWT(A&B)=FWT(A)×FWT(B)
证明:
我们仍然利用性质11.1,使用数学归纳法证明
F
W
T
(
A
&
B
)
=
F
W
T
(
(
A
&
B
)
0
,
(
A
&
B
)
1
)
=
F
W
T
(
A
0
&
B
0
+
A
0
&
B
1
+
A
1
&
B
0
,
A
1
&
B
1
)
=
(
F
W
T
(
A
0
&
B
0
+
A
0
&
B
1
+
A
1
&
B
0
+
A
1
&
B
1
)
,
F
W
T
(
A
1
&
B
1
)
)
=
(
(
F
W
T
(
A
0
)
+
F
W
T
(
A
1
)
)
×
(
F
W
T
(
B
0
)
+
F
W
T
(
B
1
)
)
,
F
W
T
(
A
1
)
×
F
W
T
(
B
1
)
)
=
(
F
W
T
(
A
0
)
+
F
W
T
(
A
1
)
,
F
W
T
(
A
1
)
)
×
(
F
W
T
(
B
0
)
+
F
W
T
(
B
1
)
,
F
W
T
(
B
1
)
)
=
F
W
T
(
A
)
×
F
W
T
(
B
)
\begin{aligned} FWT(A\&B)&=FWT((A\&B)_0,(A\&B)_1)\\ &=FWT(A_0\&B_0+A_0\&B_1+A_1\&B_0,A_1\&B_1)\\ &=(FWT(A_0\&B_0+A_0\&B_1+A_1\&B_0+A_1\&B_1),FWT(A_1\&B_1))\\ &=((FWT(A_0)+FWT(A_1))\times (FWT(B_0)+FWT(B_1)),FWT(A_1)\times FWT(B_1))\\ &=(FWT(A_0)+FWT(A_1),FWT(A_1))\times (FWT(B_0)+FWT(B_1),FWT(B_1))\\ &=FWT(A)\times FWT(B) \end{aligned}
FWT(A&B)=FWT((A&B)0,(A&B)1)=FWT(A0&B0+A0&B1+A1&B0,A1&B1)=(FWT(A0&B0+A0&B1+A1&B0+A1&B1),FWT(A1&B1))=((FWT(A0)+FWT(A1))×(FWT(B0)+FWT(B1)),FWT(A1)×FWT(B1))=(FWT(A0)+FWT(A1),FWT(A1))×(FWT(B0)+FWT(B1),FWT(B1))=FWT(A)×FWT(B)
或是继续展开证明:
F W T ( A ) × F W T ( B ) = ( ∑ i & 0 = 0 a i , ∑ i & 1 = 1 a i , ∑ i & 2 = 2 a i ⋯ ∑ i & ( n − 1 ) = ( n − 1 ) a i ) × ( ∑ i & 0 = 0 b i , ∑ i & 1 = 1 b i , ∑ i & 2 = 2 b i ⋯ ∑ i & ( n − 1 ) = ( n − 1 ) b i ) = ( ( ∑ i & 0 = 0 a i ) × ( ∑ j & 0 = 0 b j ) , ( ∑ i & 1 = 1 a i ) × ( ∑ j & 1 = 1 b j ) , ( ∑ i & 2 = 2 a i ) × ( ∑ j & 2 = 2 b j ) ⋯ ( ∑ i & ( n − 1 ) = ( n − 1 ) a i ) × ( ∑ j & ( n − 1 ) = ( n − 1 ) b j ) ) = ( ∑ i & j & 0 = 0 a i × b j , ∑ i & j & 1 = 1 a i × b j , ∑ i & j & 2 = 2 a i × b j ⋯ ∑ i & j & ( n − 1 ) = ( n − 1 ) a i × b j ) = ( ∑ k & 0 = 0 ∑ i & j = k a i ∗ b j , ∑ k & 1 = 1 ∑ i & j = k a i × b j , ∑ k & 2 = 2 ∑ i & j = k a i × b j ⋯ ∑ k & ( n − 1 ) = ( n − 1 ) ∑ i & j = k a i × b j ) = F W T ( A & B ) \begin{aligned}F W T(A) \times F W T(B)&=\left(\sum_{i \& 0=0} a_{i}, \sum_{i \& 1=1} a_{i}, \sum_{i \& 2=2} a_{i} \cdots \sum_{i \&(n-1)=(n-1)} a_{i}\right) \times \left(\sum_{i \& 0=0} b_{i}, \sum_{i \& 1=1} b_{i}, \sum_{i \& 2=2} b_{i} \cdots \sum_{i \&(n-1)=(n-1)} b_{i}\right)\\&=\left(\left(\sum_{i \& 0=0} a_{i}\right) \times \left(\sum_{j \& 0=0} b_{j}\right),\left(\sum_{i \& 1=1} a_{i}\right) \times \left(\sum_{j \& 1=1} b_{j}\right),\left(\sum_{i \& 2=2} a_{i}\right) \times \left(\sum_{j \& 2=2} b_{j}\right) \cdots\left(\sum_{i \&(n-1)=(n-1)} a_{i}\right) \times \left(\sum_{j \&(n-1)=(n-1)} b_{j}\right)\right)\\&=\left(\sum_{i \& j \& 0=0} a_{i} \times b_{j}, \sum_{i \& j \& 1=1} a_{i} \times b_{j}, \sum_{i \& j \& 2=2} a_{i} \times b_{j} \cdots \sum_{i \& j \&(n-1)=(n-1)} a_{i} \times b_{j}\right)\\&=\left(\sum_{k \& 0=0} \sum_{i \& j=k} a_{i} * b_{j}, \sum_{k \& 1=1} \sum_{i \& j=k} a_{i} \times b_{j}, \sum_{k \& 2=2} \sum_{i \& j=k} a_{i} \times b_{j} \cdots \sum_{k \&(n-1)=(n-1)} \sum_{i \& j=k} a_{i} \times b_{j}\right)\\&=F W T(A \& B)\end{aligned} FWT(A)×FWT(B)=⎝⎛i&0=0∑ai,i&1=1∑ai,i&2=2∑ai⋯i&(n−1)=(n−1)∑ai⎠⎞×⎝⎛i&0=0∑bi,i&1=1∑bi,i&2=2∑bi⋯i&(n−1)=(n−1)∑bi⎠⎞=⎝⎛(i&0=0∑ai)×⎝⎛j&0=0∑bj⎠⎞,(i&1=1∑ai)×⎝⎛j&1=1∑bj⎠⎞,(i&2=2∑ai)×⎝⎛j&2=2∑bj⎠⎞⋯⎝⎛i&(n−1)=(n−1)∑ai⎠⎞×⎝⎛j&(n−1)=(n−1)∑bj⎠⎞⎠⎞=⎝⎛i&j&0=0∑ai×bj,i&j&1=1∑ai×bj,i&j&2=2∑ai×bj⋯i&j&(n−1)=(n−1)∑ai×bj⎠⎞=⎝⎛k&0=0∑i&j=k∑ai∗bj,k&1=1∑i&j=k∑ai×bj,k&2=2∑i&j=k∑ai×bj⋯k&(n−1)=(n−1)∑i&j=k∑ai×bj⎠⎞=FWT(A&B)
我们定义逆沃尔什变换 I F W T ( F W T ( A ) ) = A IFWT(FWT(A))=A IFWT(FWT(A))=A。
则:
I
F
W
T
(
A
)
=
{
(
I
F
W
T
(
A
0
)
−
I
F
W
T
(
A
1
)
,
I
F
W
T
(
A
1
)
)
n
>
1
A
n
=
0
IFWT(A)=\begin{cases}(IFWT(A_0)-IFWT(A_1),IFWT(A_1))&n>1\\\ A&n=0\end{cases}
IFWT(A)={(IFWT(A0)−IFWT(A1),IFWT(A1)) An>1n=0
考虑证明:
n = 0 n=0 n=0 时正确性显然。
根据 性质11.1
F
W
T
(
A
)
0
=
F
W
T
(
A
0
)
+
F
W
T
(
A
1
)
∴
A
0
=
I
D
F
T
(
F
W
T
(
A
0
)
)
=
I
D
F
T
(
F
W
T
(
A
)
0
−
F
W
T
(
A
)
1
)
=
I
F
W
T
(
A
0
)
−
I
F
W
T
(
A
1
)
∵
F
W
T
(
A
)
1
=
F
W
T
(
A
1
)
∴
A
1
=
I
D
F
T
(
F
W
T
(
A
1
)
)
=
I
D
F
T
(
F
W
T
(
A
)
1
)
∴
I
F
W
T
(
A
)
=
I
F
W
T
(
(
A
0
,
A
1
)
)
=
(
I
F
W
T
(
A
0
)
−
I
F
W
T
(
A
1
)
,
I
F
W
T
(
A
1
)
)
\begin{aligned}& F W T(A)_{0}=F W T\left(A_{0}\right)+F W T\left(A_{1}\right)\\&\therefore A_{0}=I D F T\left(F W T\left(A_{0}\right)\right)=I D F T\left(F W T(A)_{0}-F W T(A)_{1}\right)=IFWT(A_0)-IFWT(A_1)\\&\because F W T(A)_{1}=F W T\left(A_{1}\right)\\&\therefore A_{1}=I D F T\left(F W T\left(A_{1}\right)\right)=I D F T\left(F W T(A)_{1}\right)\\& \therefore IFWT(A)=IFWT((A_0, A_1))=(IFWT(A_0)-IFWT(A_1),IFWT(A_1))\end{aligned}
FWT(A)0=FWT(A0)+FWT(A1)∴A0=IDFT(FWT(A0))=IDFT(FWT(A)0−FWT(A)1)=IFWT(A0)−IFWT(A1)∵FWT(A)1=FWT(A1)∴A1=IDFT(FWT(A1))=IDFT(FWT(A)1)∴IFWT(A)=IFWT((A0,A1))=(IFWT(A0)−IFWT(A1),IFWT(A1))
同或卷积,我们同样可以得到一份代码:
inline void AND(int *f, int x = 1) {
for (int o = 2, k = 1; o <= n; o <<= 1, k <<= 1)
for (int i = 0; i < n; i += o)
for (int j = 0; j < k; ++ j)
f[i+j] += f[i+j+k] * x;
}
0x13 异或( xor \text{xor} xor)卷积
异或卷积与或卷积、与卷积稍有不同。
我们定义函数 d ( x ) d(x) d(x) 表示 x x x 在二进制下 1 1 1 的数量
定义 FWT 变换为:
F
W
T
(
A
)
[
i
]
=
∑
d
(
j
&
i
)
≡
0
m
o
d
2
A
j
−
∑
d
(
k
&
i
)
≡
1
m
o
d
2
A
k
FWT(A)[i]=\sum_{d(j\&i)\equiv0\mod 2}A_j-\sum_{d(k\&i)\equiv1\mod 2}A_k
FWT(A)[i]=d(j&i)≡0mod2∑Aj−d(k&i)≡1mod2∑Ak
则可得到递推式:
F
W
T
(
A
)
=
{
(
F
W
T
(
A
0
)
+
F
W
T
(
A
1
)
,
F
W
T
(
A
0
)
−
F
W
T
(
A
1
)
)
n
>
0
A
n
=
0
FWT(A)=\begin{cases}(FWT(A_0)+FWT(A_1),FWT(A_0)-FWT(A_1))&n>0\\\ A&n=0\end{cases}
FWT(A)={(FWT(A0)+FWT(A1),FWT(A0)−FWT(A1)) An>0n=0
考虑证明:
首先左半部分的公式为: F W T ( A 0 ) + F W T ( A 1 ) FWT(A_0)+FWT(A_1) FWT(A0)+FWT(A1)
因为 A 0 A_0 A0 即前 2 k − 1 2^{k-1} 2k−1 项下标 [ 0 , 2 k − 1 ] [0,2^{k-1}] [0,2k−1] 的最高位都为 0 0 0,故 A 0 A_0 A0 的下标与 A 0 A_0 A0 “与” 运算之后最高位不变,仍然是 0 0 0 ,所以要加上 A 0 A_0 A0 的贡献 F W T ( A 0 ) FWT(A_0) FWT(A0), A 1 A_1 A1 的下标在与 A 0 A_0 A0 “与”运算之后,最高位 1 and 0 = 0 1\ \text{and}\ 0=0 1 and 0=0 ,故后半部分也会对前半部分有贡献。
右半部分的公式为: F W T ( A 0 ) − F W T ( A 1 ) FWT(A_0)−FWT(A_1) FWT(A0)−FWT(A1)
同理 A 0 A_0 A0 的下标和 A 1 A_1 A1 “与” 运算之后最高位保持不变。而 A 1 A_1 A1 的下标的最高位多了一个 1 1 1,“与” 上一个最高位为 1 1 1 的数之后奇偶性就变了,所以要取反 。
性质13.1: F W T ( A ⊕ B ) = F W T ( A ) × F W T ( B ) FWT(A\oplus B)=FWT(A)\times FWT(B) FWT(A⊕B)=FWT(A)×FWT(B)
该性质在这里同样成立。
证明:
F
W
T
(
A
⊕
B
)
=
F
W
T
(
(
A
⊕
B
)
0
,
(
A
⊕
B
)
1
)
=
F
W
T
(
A
0
⊕
B
0
+
A
1
⊕
B
1
,
A
0
⊕
B
1
+
A
1
⊕
B
0
)
=
(
F
W
T
(
A
0
⊕
B
0
+
A
1
⊕
B
1
+
A
0
⊕
B
1
+
A
1
⊕
B
0
)
,
F
W
T
(
A
0
⊕
B
0
+
A
1
⊕
B
1
−
A
0
⊕
B
1
−
A
1
⊕
B
0
)
)
=
(
(
F
W
T
(
A
0
)
+
F
W
T
(
A
1
)
)
×
(
F
W
T
(
B
0
)
+
F
W
T
(
B
1
)
)
,
(
F
W
T
(
A
0
)
−
F
W
T
(
A
1
)
)
×
(
F
W
T
(
B
0
)
−
F
W
T
(
B
1
)
)
)
=
(
F
W
T
(
A
0
+
A
1
)
,
F
W
T
(
A
0
−
A
1
)
)
×
(
F
W
T
(
B
0
+
B
1
)
,
F
W
T
(
B
0
−
B
1
)
)
=
F
W
T
(
A
)
×
F
W
T
(
B
)
\begin{aligned} FWT(A\oplus B)&=FWT((A\oplus B)_0,(A\oplus B)_1)\\ &=FWT(A_0\oplus B_0+A_1\oplus B_1,A_0\oplus B_1+A_1\oplus B_0)\\\ &=(FWT(A_0\oplus B_0+A_1\oplus B_1+A_0\oplus B_1+A_1\oplus B_0),\\ &FWT(A_0\oplus B_0+A_1\oplus B_1-A_0\oplus B_1-A_1\oplus B_0))\\ &=((FWT(A_0)+FWT(A_1))\times (FWT(B_0)+FWT(B_1)),\\ &(FWT(A_0)-FWT(A_1))\times (FWT(B_0)-FWT(B_1)))\\ &=(FWT(A_0+A_1),FWT(A_0-A_1))\times (FWT(B_0+B_1),FWT(B_0-B_1))\\ &=FWT(A)\times FWT(B) \end{aligned}
FWT(A⊕B) =FWT((A⊕B)0,(A⊕B)1)=FWT(A0⊕B0+A1⊕B1,A0⊕B1+A1⊕B0)=(FWT(A0⊕B0+A1⊕B1+A0⊕B1+A1⊕B0),FWT(A0⊕B0+A1⊕B1−A0⊕B1−A1⊕B0))=((FWT(A0)+FWT(A1))×(FWT(B0)+FWT(B1)),(FWT(A0)−FWT(A1))×(FWT(B0)−FWT(B1)))=(FWT(A0+A1),FWT(A0−A1))×(FWT(B0+B1),FWT(B0−B1))=FWT(A)×FWT(B)
同样可以展开来证明:
F
W
T
(
A
×
B
)
=
(
∑
(
−
1
)
p
c
(
i
&
0
)
a
i
,
∑
(
−
1
)
p
c
(
i
&
1
)
a
i
⋯
∑
(
−
1
)
p
c
(
i
&
(
n
−
1
)
)
a
i
)
×
(
∑
(
−
1
)
p
c
(
i
&
0
)
b
i
,
∑
(
−
1
)
p
c
(
i
&
1
)
b
i
⋯
∑
p
(
−
1
)
p
c
(
i
&
(
n
−
1
)
)
b
i
)
=
(
(
∑
(
−
1
)
p
c
(
i
&
0
)
a
i
)
×
(
(
∑
(
−
1
)
p
c
(
j
&
0
)
b
j
)
)
,
(
∑
(
−
1
)
p
c
(
i
&
1
)
a
i
)
×
(
∑
(
−
1
)
p
c
(
j
&
1
)
b
j
)
⋯
(
∑
(
−
1
)
p
c
(
i
&
(
n
−
1
)
a
i
)
×
(
∑
(
−
1
)
p
c
(
j
&
(
n
−
1
)
)
b
j
)
)
=
(
∑
(
−
1
)
p
c
(
i
⊕
j
&
0
)
a
i
×
b
j
,
(
∑
(
−
1
)
p
c
(
i
⊕
j
&
1
)
a
i
×
b
j
⋯
(
∑
(
−
1
)
p
c
(
i
⊕
j
&
(
n
−
1
)
)
a
i
×
b
j
)
=
(
∑
(
−
1
)
p
c
(
k
&
0
)
∑
i
⊕
j
=
k
a
i
×
b
j
,
∑
(
−
1
)
p
c
(
k
&
1
)
∑
i
⊕
j
=
k
a
i
×
b
j
⋯
∑
(
−
1
)
p
c
(
k
&
(
n
−
1
)
)
∑
i
⊕
j
=
k
a
i
×
b
j
)
=
F
W
T
(
A
⊕
B
)
\begin{aligned}FWT(A\times B)&=\left(\sum(-1)^{p c(i \& 0)} a_{i}, \sum(-1)^{p c(i \& 1)} a_{i} \cdots \sum(-1)^{p c(i \&(n-1))} a_{i}\right) \times \left(\sum(-1)^{p c(i \& 0)} b_{i}, \sum(-1)^{p c(i \& 1)} b_{i} \cdots \sum_{ }^{p}\left.(-1)^{p c(i \&(n-1))} b_{i}\right)\right.\\&=\left(\left(\sum(-1)^{p c(i \& 0)} a_{i}\right) \times \left(\left(\sum(-1)^{p c(j \& 0)} b_{j}\right)\right),\left(\sum(-1)^{p c(i \& 1)} a_{i}\right) \times \left(\sum(-1)^{p c(j \& 1)} b_{j}\right) \cdots\left(\sum(-1)^{p c(i \&(n-1)}a_{i}\right)\right.\left.\left.\right. \times\left(\sum(-1)^{p c(j \&(n-1))} b_{j}\right)\right)\\&=\left(\sum(-1)^{p c(i \oplus j \& 0)} a_{i} \times b_{j},\left(\sum(-1)^{p c(i \oplus j \& 1)} a_{i} \times b_{j} \cdots\left(\sum(-1)^{p c(i \oplus j \&(n-1))} a_{i} \times b_{j}\right)\right.\right.\\&=\left(\sum(-1)^{p c(k \& 0)} \sum_{i \oplus j=k} a_{i} \times b_{j}, \sum(-1)^{p c(k \& 1)} \sum_{i \oplus j=k} a_{i} \times b_{j} \cdots \sum(-1)^{p c(k \&(n-1))} \sum_{i \oplus j=k} a_{i} \times b_{j}\right)\\&=F W T(A \oplus B)\end{aligned}
FWT(A×B)=(∑(−1)pc(i&0)ai,∑(−1)pc(i&1)ai⋯∑(−1)pc(i&(n−1))ai)×(∑(−1)pc(i&0)bi,∑(−1)pc(i&1)bi⋯∑p(−1)pc(i&(n−1))bi)=((∑(−1)pc(i&0)ai)×((∑(−1)pc(j&0)bj)),(∑(−1)pc(i&1)ai)×(∑(−1)pc(j&1)bj)⋯(∑(−1)pc(i&(n−1)ai)×(∑(−1)pc(j&(n−1))bj))=(∑(−1)pc(i⊕j&0)ai×bj,(∑(−1)pc(i⊕j&1)ai×bj⋯(∑(−1)