我们已知可以用 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\\
F M T ( A ) i = j & i = i ∑ A j
这里可以把 i , j i,j i , j 看作集合(二进制下为一表示该位有,为零表该位无),F M T ( A ) i \mathrm{FMT}(A)_i F M T ( 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) F M T ( C ) = F M T ( A ) ⋅ F M T ( 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}
= = = ( 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
根据定义可证:
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}
⟹ ⟹ 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 )
考虑如何快速实现变换:
A → F M T ( A ) A\to \mathrm{FMT}(A) A → F M T ( 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)$
}
F M T ( A ) = m e r g e ( F M T ( A 0 ) + F M T ( A 1 ) , F M T ( A 1 ) )
+ + + 表示对应位相加,m e r g e \mathrm{merge} m e r g e 表示把两个序列“拼起来”,具体的:
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}
F M T ( A ) i = { F M T ( A 0 ) i + F M T ( A 1 ) i F M T ( 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$}
F M T ( A ) = A if n = 0
F M T ( A ) → A \mathrm{FMT}(A)\to A F M T ( A ) → A ,记变换为 I F M T ( A ) \mathrm{IFMT}(A) I F M T ( 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)$
}
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 ) )
具体的:
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}
I F M T ( A ) i = { I F M T ( A 0 ) i − I F M T ( A 1 ) i F M T ( 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$}
I F M T ( 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\\
F M T ( 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)$
}
F M T ( A ) = m e r g e ( F M T ( A 0 ) , F M T ( A 0 ) + F M T ( 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)$
}
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 ) )
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} x o r ) 。
我们定义 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 = p o p c o u n t ( a & b ) m o d 2 ,p o p c o u n t ( x ) \mathrm{popcount}(x) p o p c o u n t ( 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 ) 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 )
设 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 ( m o d 2 ) 1 + 0 ≡ 1 ( m o d 2 ) 0 + 1 ≡ 1 ( m o d 2 ) 0 + 0 ≡ 0 ( m o d 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
F W T ( 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) F W T ( C ) = F W T ( A ) ⋅ F W T ( 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}
= = = = ( 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
考虑快速变换:
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)$
}
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 ) )
证明: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)$
}
I F W T ( A ) = m e r g e ( 2 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 ) )
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 = p o p c o u n t ( a ∣ b ) m o d 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
F W T ( 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)$
}
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 ) )
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)$
}
I F W T ( A ) = m e r g e ( 2 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 ) )
Reference