集合幂级数
Definition
约定\(U=\{1,\cdots,n\}\)为全集。
设\(F\)为一个域/交换环,则称\(f:2^U\mapsto F\)为\(F\)上的一个集合幂级数。
我们可以把\(f\)写成\(f=\sum\limits_{S\in2^U}f_Sx^S\)。
集合并卷积
定义\(h=fg\)的\(h\)为满足\(h_S=\sum\limits_{L\cup R=S}g_Lh_R\)。
FMT
注意性质\([L\cup R\subseteq S]=[L\subseteq S][R\subseteq S]\)。
定义\(f\)的Mobiüs变换为\(\hat f\)为满足\(\hat f_S=\sum\limits_{T\subseteq S}f_T\)的集合幂级数。
同时定义\(f\)为\(\hat f\)的Mobiüs反演。由子集反演可得\(f_S=\sum\limits_{T\subseteq S}(-1)^{|S|-|T|}\hat f_S\)。
可以得到\(\hat h_S=\hat f_S\hat g_S\)。
此时问题变成了如何快速求一个集合幂级数的Mobiüs变换和Mobiüs反演。
先看Mobiüs变换,考虑递推。
设\(\hat f_S^{(i)}=\sum\limits_{T\subseteq S}[(S\setminus T)\subseteq\{1,\cdots,i\}]f_T\)。
显然\(\hat f_S^{(0)}=f_S\)。
对于所有\(i\notin S\)的\(S\),\(\hat f_S^{(i)}=\hat f_S^{(i-1)},\hat f_{S\cup\{i\}}^{(i)}=\hat f_{S\cup\{i\}}^{(i-1)}+\hat f_S^{(i-1)}\)。
而对于Mobiüs反演,只需将\(f_{S\cup\{i\}}^{(i)}=\hat f_{S\cup\{i\}}^{(i-1)}+\hat f_S^{(i-1)}\)改为\(f_{S\cup\{i\}}^{(i)}=\hat f_{S\cup\{i\}}^{(i-1)}-\hat f_S^{(i-1)}\)即可。
时间复杂度为\(O(2^nn)\)。
集合交卷积
定义\(h=fg\)的\(h\)为满足\(h_S=\sum\limits_{L\cap R=S}g_Lh_R\)。
FMT
注意性质\([S\subseteq L\cap R]=[S\subseteq L][S\subseteq R]\)。
定义\(f\)的Mobiüs变换为\(\hat f\)为满足\(\hat f_S=\sum\limits_{S\subseteq T}f_T\)的集合幂级数。
同时定义\(f\)为\(\hat f\)的Mobiüs反演。由子集反演可得\(f_S=\sum\limits_{S\subseteq T}(-1)^{|S|-|T|}\hat f_S\)。
可以得到\(\hat h_S=\hat f_S\hat g_S\)。
此时问题变成了如何快速求一个集合幂级数的Mobiüs变换和Mobiüs反演。
先看Mobiüs变换,考虑递推。
设\(\hat f_S^{(i)}=\sum\limits_{S\subseteq T}[(T\setminus S)\subseteq\{1,\cdots,i\}]f_T\)。
显然\(\hat f_S^{(0)}=f_S\)。
对于所有\(i\in S\)的\(S\),\(\hat f_S^{(i)}=\hat f_S^{(i-1)},\hat f_{S\setminus\{i\}}^{(i)}=\hat f_{S\setminus\{i\}}^{(i-1)}+\hat f_S^{(i-1)}\)。
而对于Mobiüs反演,只需将\(f_{S\setminus\{i\}}^{(i)}=\hat f_{S\setminus\{i\}}^{(i-1)}+\hat f_S^{(i-1)}\)改为\(f_{S\setminus\{i\}}^{(i)}=\hat f_{S\setminus\{i\}}^{(i-1)}-\hat f_S^{(i-1)}\)即可。
时间复杂度为\(O(2^nn)\)。
集合对称差卷积
定义\(h=fg\)的\(h\)为满足\(h_S=\sum\limits_{L\Delta R=S}g_Lh_R\)。
FWT
考虑到Hadamard矩阵的性质。
定义\(f\)的Walsh变换为\(\hat f\)为满足\(\hat f_S=\sum\limits_{T\subseteq U}(-1)^{|S\cap T|}f_T\)的集合幂级数。
同时定义\(f\)为\(\hat f\)的Walsh逆变换。易知\(f_S=\frac1{2^n}\sum\limits_{T\subseteq U}(-1)^{|S\cap T|}\hat f_T\)。
可以得到\(\hat h_S=\hat f_S\hat g_S\)。
此时问题变成了如何快速求一个集合幂级数的Walsh变换和Walsh逆变换。
时间复杂度为\(O(2^nn)\)。
先看Walsh变换,考虑递推。
设\(\hat f_S^{(i)}=\sum\limits_{T\subseteq U}[(S\Delta T)\subseteq\{1,\cdots,i\}]f_T\)。
显然\(\hat f_S^{(0)}=f_S\)。
对于所有\(i\notin S\)的\(S\),\(\hat f_S^{(i)}=\hat f_S^{(i-1)}+\hat f_{S\cup\{i\}}^{(i-1)},\hat f_{S\cup\{i\}}^{(i)}=\hat f_S^{(i-1)}-\hat f_{S\cup\{i\}}^{(i-1)}\)。
而对于Walsh逆变换,只需做完之后每项乘以\(\frac1{2^n}\)即可。
因此如果\(2^{-1}\notin F\),那么就无法使用FWT。
集合子集卷积
定义\(h=fg\)的\(h\)为满足\(h_S=\sum\limits_{L\cup R=S\wedge L\cap R=\varnothing}g_Lh_R\)。
FST
注意性质\([L\cup R=S][L\cap R=\varnothing]=[L\cup R=S][|L|+|R|=|S|]\)。
定义\(f\)的集合占位幂级数\(\mathbf f\)为满足\(\forall i\ne|S|,\mathbf f_{i,S}=0,\mathbf f_{|S|,S}=f_S\)。
定义\(\hat f\)为\(f\)的集合并卷积意义下的Mobiüs变换。
可以得到\(\hat{\mathbf h}_{k,S}=\sum\limits_{i+j=k}\hat{\mathbf g}_{j,S}\hat{\mathbf h}_{k,S}\)。
我们可以用集合并卷积FMT+暴力乘法卷积来做到\(O(2^nn^2)\)的时间复杂度。
高进制与高维
\(a\)进制\(b\)维:\(b\)个取值范围为\([0,a)\)的下标。
我们可以将一个\(a\)进制\(b\)维下的点看做是一个\(a\)进制\(b\)位的数。
FMT
FMT的本质就是前缀和。
对每一维做一遍在这维意义上的前缀和即可,时间复杂度为\(O(a^bb)\)。
FWT
FWT的本质就是DFT,或者说单位根反演。
正变换矩阵第\(i\)行\(j\)列的项为\(\omega_a^{ij}(i,j\in[0,a^b))\)。
逆变换矩阵第\(i\)行\(j\)列的项为\(-\frac1a\omega_a^{ij}(i,j\in[0,a^b))\)。
类似于FFT,时间复杂度为\(O(a^bab)\)。