整理的算法模板合集: 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
我们知道对于一个普通的多项式可以表示为系数表示: 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
对于一个序列,将其中元素一一映射到一个多项式函数的系数上, 这个多项式函数便叫做该序列的生成函数。
形式化地讲,对于序列 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 为序列长度。
这里的卷积均为序列的卷积,因此证明时我们使用数学归纳法,即证明第 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 ] 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
一般的卷积满足 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 ⊗ 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 没有对应的逆运算,因此证明相对复杂,这里不给出证明。
复习完上述基本概念以后,我们进入今天的正题,快速沃尔什变换(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 ,所以我们分开讨论。
**或( 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;
}
同理,我们可以得到与卷积的定义式:
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;
}
异或卷积与或卷积、与卷积稍有不同。
我们定义函数 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 ) = (