《小学生都能看懂的快速沃尔什变换从入门到升天教程》(FWT / FMT / FMI)(最最严谨清晰的证明!零基础也能得学会!)

整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


目录

  • 0x00 卷积
    • 0x01 多项式
    • 0x02 卷积的定义
    • 0x03 卷积的基本性质
    • 0x04 位运算卷积定义及其性质
  • 0x10 FWT(快速沃尔什变换)
    • 0x11 或( or \text{or} or)卷积
    • 0x12 与( and \text{and} and)卷积
    • 0x13 异或( xor \text{xor} xor)卷积
    • 0x14 模板
  • 0x20 FMT与FMI(快速莫比乌斯变换与快速莫比乌斯反演)
  • 0x30 竞赛例题选讲
    • A、(牛客练习赛41 F)简单数学题
    • B、(2018 ACM - ICPC shenyang I)Distance Between Sweethearts
    • C、(2019ACM - ICPC nanchang H)Another Sequence
    • D、(CROC 2016 - Final Round C)Binary Table
    • E、(HAOI2015)luogu P3175 按位或

前置知识: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 (fg)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++an1xn1

规定 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++an1xn1 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++bn1xn1

则可将多项式的系数表示简化为: f = ( a 0 , a 1 , a 2 ⋅ ⋅ ⋅ a n − 1 ) f=(a_0,a_1,a_2···a_{n-1}) f=(a0,a1,a2an1) g = ( b 0 , b 1 , b 2 ⋅ ⋅ ⋅ b n − 1 ) g=(b_0,b_1,b_2···b_{n-1}) g=(b0,b1,b2bn1)


定义多项式加减法 ⊕ , ⊖ \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=fg=(a0,a1,a2an1)(b0,b1,b2bn1)=(a0+b0,a1+b1,a2+b2an1+bn1)

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=fg=(a0,a1,a2an1)(b0,b1,b2bn1)=(a0b0,a1b1,a2b2an1bn1)

其中多项式加减的第 k k k 项系数:

( f ⊕ g ) k = a k f k + b k g k (f\oplus g)_k=a_kf_k+b_kg_k (fg)k=akfk+bkgk

( f ⊖ g ) k = a k f k − b k g k (f\ominus g)_k=a_kf_k-b_kg_k (fg)k=akfkbkgk


定义多项式对应系数相乘一定注意这里不是卷积 ⊗ \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,a2an1)×(b0,b1,b2bn1)=(a0×b0,a1×b1,a2×b2an1×bn1)

其中多项式对应系数相乘的第 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 (fg)k=akfk×bkgk


0x02 卷积的定义

对于一个序列,将其中元素一一映射到一个多项式函数的系数上, 这个多项式函数便叫做该序列的生成函数

形式化地讲,对于序列 f 0 , f 1 , ⋯   , f n − 1 f_0,f_1,\cdots,f_{n-1} f0,f1,,fn1 f ( x ) = ∑ k = 0 n − 1 f k x k f(x)=\displaystyle\sum_{k=0}^{n-1}f_kx^k f(x)=k=0n1fkxk 为其生成函数。

卷积即为生成函数的乘积在对应序列的变换上的的抽象,“卷”即为其作用效果,“积”即为其本质。

对于序列 f , g f,g f,g ,其卷积序列 f ⊗ g f\otimes g fg 满足 ( 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 (fg)k=i=0kfi×gki=i,ji+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 fg=k=0n(i,ji+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 (fg)k=i+jk(modn)fi×gj n n n 为序列长度。

0x03 卷积的基本性质

这里的卷积均为序列的卷积,因此证明时我们使用数学归纳法,即证明第 k k k 项成立,则整个序列均成立。由于多项式实际上就是序列的生成函数,所以性质同样成立。

  • f ⊗ g = g ⊗ f f\otimes g=g\otimes f fg=gf(交换律)

    我们使用定义 ( f ⊗ g ) k = ∑ i + j = k f i × g j (f\otimes g)_k=\displaystyle\sum_{i+j=k}f_i\times g_j (fg)k=i+j=kfi×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) (fg)h=f(gh) (结合律)
    证明:
    [ 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(gh)]n=i=0nfni×(gh)i=i=0nfnij=0igjhij=i=0nj=0ifnigjhij=i+j+k=nfigjhk

交换顺序后反向推导即可得证。

  • ( f ⊕ g ) ⊗ h = ( f ⊗ h ) ⊕ ( g ⊗ h ) (f\oplus g)\otimes h=(f\otimes h)\oplus(g\otimes h) (fg)h=(fh)(gh) (分配律)
    其中 ( f ⊕ g ) k = a f k + b g k (f\oplus g)_k=af_k+bg_k (fg)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} [(fg)h]k=i=0k(fg)ihki=i=0k(afi+bgi)hki=i=0k(afihki+bgihki)=ai=0kfihki+bi=0kgihki=a(fh)k+b(gh)k=[(fh)(gh)]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,,f2n1},g={ g0,g1,,g2n1}
可以定义位运算卷积 ( 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 (fg)k=ij=kfi×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} fxorg=gxor (交换律)
    由于 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) (fxorg)xorh=fxor(gxorh) (结合律)
    证明: 根据定义,有 ( 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} (fxorg)k=ixorj=kfi×gj=i=02n1fi×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} [fxor(gxorh)]m=i=02n1fmxori×(gxorh)i=i=02n1fmxorij=02n1gjhixorj=i=02n1j=02n1fmxorigjhixorj=ixorjxork=mfigjhk

交换顺序后反向推导即可得证。
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) (fg)xorh=(fxorh)(gxorh) (分配律)
    证明同加法卷积, 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 fg 满足对于 f ⊗ g f\otimes g fg 的第 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 (fg)k=i=0kfi×gki=i,ji+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 fg=k=0n(i,ji+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 (fg)k=ij=kfi×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) (n1) 次多项式 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=0n1aixi 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=0n1bixi 的系数数列 { 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=0n1ai×ω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=0n1diωnki ,通过逆离散傅里叶变换(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| ) 按位或运算符, |1110 **

或卷积: ( 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 (forg)k=ij=kfi×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=ij=kaibj

显然有 i ∣ k = k , j ∣ k = k → ( i ∣ j ) ∣ k = k i|k = k, j|k=k \to (i|j)|k=k ik=k,jk=k(ij)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]=ik=kai
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)=ik=kaijk=kbj=ik=k, jk=kaibj=(ij)k=kaibj=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} 2k1 次项, A 1 A_1 A1 代表 A A A 的后半部分即后 2 k − 1 2^{k-1} 2k1 次项,也就是下标的最高位分别为 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,a2ax1),(b0,b1,b2by1))=(a0,a1,a2ax1,b0,b1,b2by1)
可以理解为系数直接连起来。

考虑证明:

首先 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 ji 的最高位不可能为 0 0 01 | 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 ji=i,那么在 i i i 加上最高位 1 1 1 之后, j ∣ i = i j|i=i ji=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(AB)=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(AB)=======FWT((AB)0,(AB)1)FWT(A0B0,A0B1+A1B0+A1B1)(FWT(A0B0),FWT(A0B0+A0B1+A1B0+A1B1))(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 ik=k,jk=k(ij)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)=i0=0ai,i1=1ai,i2=2aii(n1)=(n1)ai×i0=0bi,i1=1bi,i2=2bii(n1)=(n1)bi=i0=0ai×j0=0bj,i1=1ai×j1=1bj,i2=2ai×j2=2bji(n1)=(n1)ai×j(n1)=(n1)bj=ij0=0ai×bj,ij1=1ai×bj,ij2=2ai×bjij(n1)=(n1)ai×bj=k0=0ij=kai×bj,k1=1ij=kai×bj,k2=2ij=kai×bjk(n1)=(n1)ij=kai×bj=FWT(AB)


至此,我们得到了与 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)1FWT(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=kai
以及 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=0ai,i&1=1ai,i&2=2aii&(n1)=(n1)ai×i&0=0bi,i&1=1bi,i&2=2bii&(n1)=(n1)bi=(i&0=0ai)×j&0=0bj,(i&1=1ai)×j&1=1bj,(i&2=2ai)×j&2=2bji&(n1)=(n1)ai×j&(n1)=(n1)bj=i&j&0=0ai×bj,i&j&1=1ai×bj,i&j&2=2ai×bji&j&(n1)=(n1)ai×bj=k&0=0i&j=kaibj,k&1=1i&j=kai×bj,k&2=2i&j=kai×bjk&(n1)=(n1)i&j=kai×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)0FWT(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)0mod2Ajd(k&i)1mod2Ak
则可得到递推式:
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} 2k1 项下标 [ 0 , 2 k − 1 ] [0,2^{k-1}] [0,2k1] 的最高位都为 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(AB)=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(AB) =FWT((AB)0,(AB)1)=FWT(A0B0+A1B1,A0B1+A1B0)=(FWT(A0B0+A1B1+A0B1+A1B0),FWT(A0B0+A1B1A0B1A1B0))=((FWT(A0)+FWT(A1))×(FWT(B0)+FWT(B1)),(FWT(A0)FWT(A1))×(FWT(B0)FWT(B1)))=(FWT(A0+A1),FWT(A0A1))×(FWT(B0+B1),FWT(B0B1))=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 ) = (

你可能感兴趣的:(算法全家桶!!!,多项式,-,FWT,/,FMT,/,FMI)