集合幂级数

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)\)

posted @ 2020-01-01 22:48  Shiina_Mashiro  阅读(1137)  评论(0编辑  收藏  举报