我们已知可以用 FFT 求加法卷积 C i = ∑ j + k = i A j ⋅ B k C_i=\sum_{j+k=i}A_j\cdot B_k C i  = ∑ j + k = i  A j  ⋅ B k   。
但形如 C i = ∑ j ⨁ k = i A j ⋅ B k C_i=\sum_{j\bigoplus k=i}A_j\cdot B_k C i  = ∑ j ⨁ k = i  A j  ⋅ B k    (其中 ⨁ \bigoplus ⨁   为一个位运算符) 这样的位运算卷积,FFT 便束手无策。于是就要用到 「快速莫比乌斯变换」 FMT / 「快速沃尔什变换」 FWT 。
 
快速莫比乌斯变换(FMT) 
与运算 
C i = ∑ i = j & k A j ⋅ B k C_i=\sum_{i=j\&k} A_j\cdot B_k
 C i  = i = j & k ∑  A j  ⋅ B k  
定义变换:
F M T ( A ) i = ∑ j & i = i A j \mathrm{FMT}(A)_i=\sum_{j\&i=i} A_j\\
 FMT ( A ) i  = j & i = i ∑  A j  
这里可以把 i , j i,j i , j   看作集合(二进制下为一表示该位有,为零表该位无),F M T ( A ) i \mathrm{FMT}(A)_i FMT ( A ) i    就表示 i i i   的所有超集的和。或者把每位看作数组中的一维,那么就类似于高维前缀和。
我们需要证明这个变换满足 F M T ( C ) = F M T ( A ) ⋅ F M T ( B ) \mathrm{FMT}(C)=\mathrm{FMT}(A)\cdot \mathrm{FMT}(B) FMT ( C ) = FMT ( A ) ⋅ FMT ( B )   :
( F M T ( A ) ⋅ F M T ( B ) ) i = ( ∑ j & i = i A j ) ( ∑ k & i = i B k ) 根据定义 = ∑ j & i = i ∑ k & i = i A j B k 和式性质 = ∑ ( k & j ) & i = i A j B k { j & i = i k & i = i → ( k & j ) & i = i \begin{aligned}
&\left(\mathrm{FMT}(A)\cdot \mathrm{FMT}(B) \right)_i  \\[1.5ex]
=&\left(\sum_{j\&i=i}A_j \right)\left(\sum_{k\&i=i}B_k \right) &\text{根据定义}\\[2ex]
=&\sum_{j\&i=i}\sum_{k\&i=i} A_jB_k & \text{和式性质}\\[1.5ex]
=&\sum_{(k\&j)\&i=i} A_jB_k&\text{$
\left\{
\begin{matrix}
j\&i=i\\
k\&i=i
\end{matrix}
\right.
\to (k\&j)\&i=i
$}
\end{aligned}
 = = =  ( FMT ( A ) ⋅ FMT ( B ) ) i   j & i = i ∑  A j   ( k & i = i ∑  B k  ) j & i = i ∑  k & i = i ∑  A j  B k  ( k & j ) & i = i ∑  A j  B k   根据定义 和式性质 { j & i = i k & i = i  → ( k & j ) & i = i  
根据定义可证:
F M T ( C ) i = ∑ p & i = i C p ,    C p = ∑ p = j & k A j ⋅ B k    ⟹    F M T ( C ) i = ∑ ( j & k ) & i = i A j ⋅ B k    ⟹    F M T ( C ) = F M T ( A ) ⋅ F M T ( B ) \begin{aligned}
&\mathrm{FMT}(C)_i=\sum_{p\&i=i} C_p,\; C_p=\sum_{p=j\&k} A_j\cdot B_k\\
\implies&\mathrm{FMT}(C)_i=\sum_{(j\&k)\&i=i}A_j\cdot B_k\\
\implies&\mathrm{FMT}(C)=\mathrm{FMT}(A)\cdot \mathrm{FMT}(B)
\end{aligned}
 ⟹ ⟹  FMT ( C ) i  = p & i = i ∑  C p  , C p  = p = j & k ∑  A j  ⋅ B k  FMT ( C ) i  = ( j & k ) & i = i ∑  A j  ⋅ B k  FMT ( C ) = FMT ( A ) ⋅ FMT ( B )  
考虑如何快速实现变换:
A → F M T ( A ) A\to \mathrm{FMT}(A) A → FMT ( A )    ,deg  A = 2 n \deg A=2^n deg  A = 2 n 
分治:A A A   拆成前 2 n − 1 2^{n-1} 2 n − 1   项记 A 0 A_0 A 0    ,和后 2 n − 1 2^{n-1} 2 n − 1   项记 A 1 A_1 A 1     。(前者下标在二进制下最高位都为 0 0 0   ,后者都为 1 1 1   )
  F M T ( A ) = m e r g e ( F M T ( A 0 ) + F M T ( A 1 ) , F M T ( A 1 ) )   \fbox{
$\mathrm{FMT}(A)=\mathrm{merge} \big(\mathrm{FMT}(A_0)+\mathrm{FMT}(A_1),\mathrm{FMT}(A_1)\big)$
}
   FMT ( A ) = merge ( FMT ( A 0  ) + FMT ( A 1  ) , FMT ( A 1  ) )    
+ + +   表示对应位相加,m e r g e \mathrm{merge} merge   表示把两个序列“拼起来”,具体的:
F M T ( A ) i = { F M T ( A 0 ) i + F M T ( A 1 ) i if  i < 2 n − 1   F M T ( A 1 ) i − 2 n − 1 if  i ≥ 2 n − 1   \mathrm{FMT}(A)_i=\begin{cases}
\mathrm{FMT}(A_0)_i + \mathrm{FMT}(A_1)_i & \text{if  $i \lt2^{n-1}$ }\\
\mathrm{FMT}(A_1)_{i-2^{n-1}}  & \text{if  $i \ge 2^{n-1}$ }
\end{cases}
 FMT ( A ) i  = { FMT ( A 0  ) i  + FMT ( A 1  ) i  FMT ( A 1  ) i − 2 n − 1   if  i < 2 n − 1   if  i ≥ 2 n − 1    
F M T ( A ) = A if  n = 0 \mathrm{FMT}(A)=A \quad \text{if $n=0$}
 FMT ( A ) = A if  n = 0 
F M T ( A ) → A \mathrm{FMT}(A)\to A FMT ( A ) → A   ,记变换为 I F M T ( A ) \mathrm{IFMT}(A) IFMT ( A )   ,和上边差不多,就是反过来:
  I F M T ( A ) = m e r g e ( I F M T ( A 0 ) − I F M T ( A 1 ) , I F M T ( A 1 ) )   \fbox{
$\mathrm{IFMT}(A)=\mathrm{merge}\big(\mathrm{IFMT}(A_0)-\mathrm{IFMT}(A_1),\mathrm{IFMT}(A_1)\big)$
}
   IFMT ( A ) = merge ( IFMT ( A 0  ) − IFMT ( A 1  ) , IFMT ( A 1  ) )    
具体的:
I F M T ( A ) i = { I F M T ( A 0 ) i − I F M T ( A 1 ) i if  i < 2 n − 1   F M T ( A 1 ) i − 2 n − 1 if  i ≥ 2 n − 1   \mathrm{IFMT}(A)_i=\begin{cases}
\mathrm{IFMT}(A_0)_i-\mathrm{IFMT}(A_1)_i & \text{if  $i \lt2^{n-1}$ }\\
\mathrm{FMT}(A_1)_{i-2^{n-1}}  & \text{if  $i \ge 2^{n-1}$ }
\end{cases}
 IFMT ( A ) i  = { IFMT ( A 0  ) i  − IFMT ( A 1  ) i  FMT ( A 1  ) i − 2 n − 1   if  i < 2 n − 1   if  i ≥ 2 n − 1    
I F M T ( A ) = A if  n = 0 \mathrm{IFMT}(A)=A \quad \text{if $n=0$}
 IFMT ( A ) = A if  n = 0 
复杂度都是 O ( n log  n ) O(n\log n) O ( n log  n )   的。
CODE 
1 2 3 4 5 6 inline  void  FMT_AND (ll f[],int  n,int  fg)   {     for (re int  h=2 ,k=1 ;h<=n;h<<=1 ,k<<=1 )         for (re int  i=0 ;i<n;i+=h)             for (re int  j=0 ;j<k;++j)                 f[i+j]=MOD (f[i+j]+f[i+j+k]*fg+mod); } 
 
 
或运算 
C i = ∑ i = j ∣ k A j ⋅ B k C_i=\sum_{i=j|k} A_j\cdot B_k
 C i  = i = j ∣ k ∑  A j  ⋅ B k  
定义变换:
F M T ( A ) i = ∑ j ∣ i = i A j \mathrm{FMT}(A)_i=\sum_{j|i=i} A_j\\
 FMT ( A ) i  = j ∣ i = i ∑  A j  
证明略(和与运算差不多),这里直接给出变换的快速实现:
  F M T ( A ) = m e r g e ( F M T ( A 0 ) , F M T ( A 0 ) + F M T ( A 1 ) )   \fbox{
$\mathrm{FMT}(A)=\mathrm{merge} \big(\mathrm{FMT}(A_0),\mathrm{FMT}(A_0)+\mathrm{FMT}(A_1)\big)$
}
   FMT ( A ) = merge ( FMT ( A 0  ) , FMT ( A 0  ) + FMT ( A 1  ) )    
  I F M T ( A ) = m e r g e ( I F M T ( A 0 ) , I F M T ( A 1 ) − I F M T ( A 0 ) )   \fbox{
$\mathrm{IFMT}(A)=\mathrm{merge}\big(\mathrm{IFMT}(A_0),\mathrm{IFMT}(A_1)-\mathrm{IFMT}(A_0)\big)$
}
   IFMT ( A ) = merge ( IFMT ( A 0  ) , IFMT ( A 1  ) − IFMT ( A 0  ) )    
CODE 
1 2 3 4 5 6 inline  void  FMT_OR (ll f[],int  n,int  fg)   {     for (re int  h=2 ,k=1 ;h<=n;h<<=1 ,k<<=1 )         for (re int  i=0 ;i<n;i+=h)             for (re int  j=0 ;j<k;++j)                 f[i+j+k]=MOD (f[i+j+k]+f[i+j]*fg+mod); } 
 
快速沃尔什变换(FWT) 
与前者不一样了,这个要稍微麻烦一些。
异或运算 
C i = ∑ i = j ⊕ k A j ⋅ B k C_i=\sum_{i=j\oplus k} A_j\cdot B_k
 C i  = i = j ⊕ k ∑  A j  ⋅ B k  
这里的 ⊕ \oplus ⊕   表异或 (xor  \operatorname{xor} xor  ) 。
我们定义 a ∘ b = p o p c o u n t ( a & b )   m o d   2 a\circ b=\mathrm{popcount}(a\& b)\bmod 2 a ∘ b = popcount ( a & b ) mod 2   ,p o p c o u n t ( x ) \mathrm{popcount}(x) popcount ( x )   表示 x x x   二进制下一的个数。
先证明一个性质 ( i ∘ j ) ⊕ ( i ∘ k ) = i ∘ ( j ⊕ k ) (i\circ j)\oplus (i\circ k)=i\circ(j \oplus k) ( i ∘ j ) ⊕ ( i ∘ k ) = i ∘ ( j ⊕ k )   ,[^1]
( i ∘ j ) ⊕ ( i ∘ k ) = i ∘ ( j ⊕ k )    ⟺    p o p c o u n t ( i & j ) ⊕ p o p c o u n t ( i & k ) ≡ p o p c o u n t ( i & ( j ⊕ k ) ) ( m o d 2 )    ⟺    p o p c o u n t ( i & j ) + p o p c o u n t ( i & k ) ≡ p o p c o u n t ( i & ( j ⊕ k ) ) ( m o d 2 ) \begin{aligned}
&(i\circ j)\oplus (i\circ k)=i\circ(j \oplus k)\\
\iff& \mathrm{popcount}(i\& j)\oplus \mathrm{popcount}(i\& k)\equiv\mathrm{popcount}\big(i\& (j\oplus k)\big) \pmod{2}\\
\iff& \mathrm{popcount}(i\& j)+ \mathrm{popcount}(i\& k)\equiv\mathrm{popcount}\big(i\& (j\oplus k)\big) \pmod{2}\\
\end{aligned}
 ⟺ ⟺  ( i ∘ j ) ⊕ ( i ∘ k ) = i ∘ ( j ⊕ k ) popcount ( i & j ) ⊕ popcount ( i & k ) ≡ popcount ( i & ( j ⊕ k ) ) ( mod 2 ) popcount ( i & j ) + popcount ( i & k ) ≡ popcount ( i & ( j ⊕ k ) ) ( mod 2 )  
设 x = i & j , y = i & k , z = i & ( j ⊕ k ) x=i\&j,y=i\&k,z=i\&(j\oplus k) x = i & j , y = i & k , z = i & ( j ⊕ k )   ,考虑二进制下任意一位 ,该位上:
x y z explain check 1 1 0 j , k  这位必然都为一,异或为零 1 + 1 ≡ 0 ( m o d 2 ) 1 0 1 j , k  这位必然不同,异或为一 1 + 0 ≡ 1 ( m o d 2 ) 0 1 1 j , k  这位必然不同,异或为一 0 + 1 ≡ 1 ( m o d 2 ) 0 0 0 i  这位为零显然成立,为一时  j , k  这位都为零也成立 0 + 0 ≡ 0 ( m o d 2 ) \begin{array}{c|c}
x &  y & z & \text{explain} &\text{check}\\
\hline
1 & 1 & 0 & \text{$j,k$ 这位必然都为一,异或为零} & 1+1\equiv 0\pmod {2}\\
1 & 0 & 1 & \text{$j,k$ 这位必然不同,异或为一} & 1+0\equiv 1\pmod {2}\\
0 & 1 & 1 & \text{$j,k$ 这位必然不同,异或为一} & 0+1\equiv 1\pmod {2}\\
0 & 0 & 0 & \text{$i$ 这位为零显然成立,为一时 $j,k$ 这位都为零也成立} & 0+0\equiv 0\pmod {2}\\
\end{array}
 x 1 1 0 0  y 1 0 1 0  z 0 1 1 0  explain j , k   这位必然都为一,异或为零 j , k   这位必然不同,异或为一 j , k   这位必然不同,异或为一 i   这位为零显然成立,为一时   j , k   这位都为零也成立  check 1 + 1 ≡ 0 ( mod 2 ) 1 + 0 ≡ 1 ( mod 2 ) 0 + 1 ≡ 1 ( mod 2 ) 0 + 0 ≡ 0 ( mod 2 )   
证毕。
设计变换
F W T ( A ) i = ∑ i ∘ j = 0 a j − ∑ i ∘ j = 1 a j \mathrm{FWT}(A)_i =\sum _{i\circ j=0} a_j-\sum _{i\circ j=1} a_j
 FWT ( A ) i  = i ∘ j = 0 ∑  a j  − i ∘ j = 1 ∑  a j  
十分优美对吧…… 同样的,要证明 F W T ( C ) = F W T ( A ) ⋅ F W T ( B ) \mathrm{FWT}(C)=\mathrm{FWT}(A)\cdot \mathrm{FWT}(B) FWT ( C ) = FWT ( A ) ⋅ FWT ( B ) 
( F W T ( A ) ⋅ F W T ( B ) ) i = ( ∑ i ∘ j = 0 A j − ∑ i ∘ j = 1 A j ) ( ∑ i ∘ k = 0 B k − ∑ i ∘ k = 1 B k ) = ( ∑ i ∘ j = 0 A j ) ( ∑ i ∘ k = 0 B k ) − ( ∑ i ∘ j = 1 A j ) ( ∑ i ∘ k = 0 B k ) − ( ∑ i ∘ j = 0 A j ) ( ∑ i ∘ k = 1 B k ) + ( ∑ i ∘ j = 1 A j ) ( ∑ i ∘ k = 1 B k ) = ∑ i ∘ ( j ⊕ k ) = 0 A j B k − ∑ i ∘ ( j ⊕ k ) = 1 A j B k =    F W T ( C ) i \begin{aligned}
&\big(\mathrm{FWT}(A)\cdot \mathrm{FWT}(B) \big)_i\\[1.5ex]
=& \left(\sum _{i\circ j=0} A_j-\sum _{i\circ j=1} A_j\right) \left(\sum _{i\circ k=0} B_k-\sum _{i\circ k=1} B_k\right) \\[2ex]
=& \left( \sum _{i\circ j=0}A_j \right) \left(\sum _{i\circ k=0} B_k\right)
-\left(\sum _{i\circ j=1} A_j\right)\left(\sum _{i\circ k=0} B_k\right)\\[2ex]
&\quad -\left(\sum _{i\circ j=0}A_j\right)\left(\sum _{i\circ k=1} B_k\right)
+\left(\sum _{i\circ j=1} A_j\right)\left(\sum _{i\circ k=1} B_k\right)\\[2ex]
=&\sum_{i\circ (j\oplus k)=0} A_jB_k -\sum_{i\circ (j\oplus k) =1} A_jB_k\\[2ex]
=& \;\mathrm{FWT}(C)_i
\end{aligned}
 = = = =  ( FWT ( A ) ⋅ FWT ( B ) ) i  ( i ∘ j = 0 ∑  A j  − i ∘ j = 1 ∑  A j  ) ( i ∘ k = 0 ∑  B k  − i ∘ k = 1 ∑  B k  ) ( i ∘ j = 0 ∑  A j  ) ( i ∘ k = 0 ∑  B k  ) − ( i ∘ j = 1 ∑  A j  ) ( i ∘ k = 0 ∑  B k  ) − ( i ∘ j = 0 ∑  A j  ) ( i ∘ k = 1 ∑  B k  ) + ( i ∘ j = 1 ∑  A j  ) ( i ∘ k = 1 ∑  B k  ) i ∘ ( j ⊕ k ) = 0 ∑  A j  B k  − i ∘ ( j ⊕ k ) = 1 ∑  A j  B k  FWT ( C ) i   
考虑快速变换:
  F W T ( A ) = m e r g e ( F W T ( A 0 ) + F W T ( A 1 ) , F W T ( A 0 ) − F W T ( A 1 ) )   \fbox{
$\mathrm{FWT}(A)=\mathrm{merge}\Big(\mathrm{FWT}(A_0)+\mathrm{FWT}(A_1),\mathrm{FWT}(A_0)-\mathrm{FWT}(A_1)\Big)$
}
   FWT ( A ) = merge ( FWT ( A 0  ) + FWT ( A 1  ) , FWT ( A 0  ) − FWT ( A 1  ) )    
证明:A 0 , A 1 A_0,A_1 A 0  , A 1    都是不考虑二进制下当前最高位的(也就是看作 0 0 0  ) ,现在考虑算上这位的变化。 
对于前一半的数,最高位为 0 & 0 = 0 , 0 & 1 = 0 0\&0=0,0\&1=0 0&0 = 0 , 0&1 = 0   不变。 
对于后一半的数,最高位为 1 & 0 = 0 , 1 & 1 = 1 1\&0=0,1\&1=1 1&0 = 0 , 1&1 = 1   ,∘ \circ ∘   运算结果改变,故后者要变号 。
逆变换就反一下:
  I F W T ( A ) = m e r g e ( 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 )   \fbox{
$\mathrm{IFWT}(A)=\mathrm{merge}\Bigg(\frac{\mathrm{IFWT}(A_0)+\mathrm{IFWT}(A_1)}{2},\frac{\mathrm{IFWT}(A_0)-\mathrm{IFWT}(A_1)}{2}\Bigg)$
}
   IFWT ( A ) = merge ( 2 IFWT ( A 0  ) + IFWT ( A 1  )  , 2 IFWT ( A 0  ) − IFWT ( A 1  )  )    
CODE 
1 2 3 4 5 6 7 8 9 inline  void  FWT_XOR (ll f[],int  n,int  fg)   {     ll t;     for (re int  h=2 ,k=1 ;h<=n;h<<=1 ,k<<=1 )         for (re int  i=0 ;i<n;i+=h)             for (re int  j=0 ;j<k;++j)                 t=f[i+j+k],f[i+j+k]=MOD (f[i+j]-t+mod),f[i+j]=MOD (f[i+j]+t),                 f[i+j]=MOD (f[i+j]*fg),f[i+j+k]=MOD (f[i+j+k]*fg); } 
 
 
同或运算 
C i = ∑ i = j ⊙ k A j ⋅ B k C_i=\sum_{i=j\odot k} A_j\cdot B_k
 C i  = i = j ⊙ k ∑  A j  ⋅ B k  
与异或类似,这里只给出结论。
定义 a ∘ b = p o p c o u n t ( a ∣ b )   m o d   2 a\circ b=\mathrm{popcount}(a\mid b)\bmod 2 a ∘ b = popcount ( a ∣ b ) mod 2 
F W T ( A ) i = ∑ i ∘ j = 0 a j − ∑ i ∘ j = 1 a j \mathrm{FWT}(A)_i =\sum _{i\circ j=0} a_j-\sum _{i\circ j=1} a_j
 FWT ( A ) i  = i ∘ j = 0 ∑  a j  − i ∘ j = 1 ∑  a j  
  F W T ( A ) = m e r g e ( F W T ( A 1 ) − F W T ( A 0 ) , F W T ( A 1 ) + F W T ( A 0 ) )   \fbox{
$\mathrm{FWT}(A)=\mathrm{merge}\Big(\mathrm{FWT}(A_1)-\mathrm{FWT}(A_0),\mathrm{FWT}(A_1)+\mathrm{FWT}(A_0)\Big)$
}
   FWT ( A ) = merge ( FWT ( A 1  ) − FWT ( A 0  ) , FWT ( A 1  ) + FWT ( A 0  ) )    
  I F W T ( A ) = m e r g e ( I F W T ( A 1 ) − I F W T ( A 0 ) 2 , I F W T ( A 1 ) + I F W T ( A 0 ) 2 )   \fbox{
$\mathrm{IFWT}(A)=\mathrm{merge}\Bigg(\frac{\mathrm{IFWT}(A_1)-\mathrm{IFWT}(A_0)}{2},\frac{\mathrm{IFWT}(A_1)+\mathrm{IFWT}(A_0)}{2}\Bigg)$
}
   IFWT ( A ) = merge ( 2 IFWT ( A 1  ) − IFWT ( A 0  )  , 2 IFWT ( A 1  ) + IFWT ( A 0  )  )    
Reference