【学习笔记】集合幂级数

280 篇文章 1 订阅

省流:集合幂就是 R [ x 1 , x 2 , … , x n ] / ( x   1 2 , x 2   2 , … , x n   2 ) R[x_1,x_2,\dots,x_n]/(x_{\thinspace 1}^2,x_2^{\thinspace 2},\dots,x_n^{\thinspace 2}) R[x1,x2,,xn]/(x12,x22,,xn2) 的结果,所有变换都是插值。

零、前言

可以先看一看吕凯风《集合幂级数的性质与应用及其快速算法》尽管这个链接是多数人都无法访问的

你以为它很抽象?你有没有想过,其实我们还可以定义矩阵幂,即 f i , j x i , j f_{i,j}x^{i,j} fi,jxi,j 满足 x i , j ⋅ x j , k = x i , k x^{i,j}\cdot x^{j,k}=x^{i,k} xi,jxj,k=xi,k 这种东西?只要牢牢地记住,所谓 形式 级数就是,这一切都只是为了形式化罢了。就像生成函数从不考虑收敛域——形式幂级数的本质不过是系数的序列 ⟨ a 0 , a 1 , … , a n , …   ⟩ \langle a_0,a_1,\dots,a_n,\dots\rangle a0,a1,,an, 罢了。

壹、定义

0.记号

设全集为有限集 U = { 1 , 2 , 3 , … , n } \Bbb U=\{1,2,3,\dots,n\} U={1,2,3,,n} 。设 F F F 是某个域。

1.集合幂级数

对于任意 c ∈ F ,    S ⫅ U c\in F,\;S\subseteqq\Bbb U cF,SU,用 c x S cx^{S} cxS 表示第 S S S 项系数为 c c c,其余各项系数均为 0 0 0集合幂级数。这里的 x S x^S xS 无非是个占位符,表示把 c c c 放在 S S S 这个位置。

那么,一般的集合幂级数可写成
f = ∑ S ⫅ U f S x S f=\sum_{S\subseteqq\Bbb U}f_Sx^{S} f=SUfSxS

2.加法与减法

f , g f,g f,g 均为集合幂级数,那么二者的和 h = f + g h=f{+}g h=f+g 是满足如下条件的集合幂级数:
h S = f S + g S h_S=f_S+g_S hS=fS+gS

减法则为逆运算。容易看出,集合幂级数构成了加法阿贝尔群。

3.乘法

记乘法为 h = f ⋅ g h=f\cdot g h=fg,显然我们希望 乘法对加法有分配律。那么,我们定义 ( f a x a ) ⋅ ( g b x b ) = ( f a g b ) x a ⋆ b (f_ax^{a})\cdot(g_bx^{b})=(f_ag_b)x^{a\star b} (faxa)(gbxb)=(fagb)xab,然后根据分配律直接定义项数更长的乘法。

自然,我们希望 ⋆ \star 是某种集合运算。如果它满足:

  • 交换律。即 L ⋆ R = R ⋆ L L\star R=R\star L LR=RL
  • 结合律。即 ( L ⋆ M ) ⋆ R = L ⋆ ( M ⋆ R ) (L\star M)\star R=L\star (M\star R) (LM)R=L(MR)

那么,集合幂级数就会满足 交换律、结合律虽然绝大多数集合运算都满足

然而,这不足以让乘法是良定义的。我们需要

  • 单位元为空集,即 S ⋆ ∅ = S S\star\varnothing=S S=S

否则就有一个尴尬的处境是,下面这个看上去很合理的式子
c x S = c x ∅ ⋅ x S = c ⋅ x S cx^{S}=cx^{\varnothing}\cdot x^{S}=c\cdot x^{S} cxS=cxxS=cxS

不成立。那么 常数将不再是集合幂级数,这是令人恼怒的!

在单位元为空集时,容易发现,现在集合幂级数构成交换环,并且整个域 F F F 都是它的子环。

贰、莫比乌斯变换

适用于乘法定义为集合并,即 c L x L ⋅ c R x R = ( c L c R ) x L ∪ R c_Lx^L\cdot c_Rx^R=(c_Lc_R)x^{L\cup R} cLxLcRxR=(cLcR)xLR 的情况。

1.定义

集合幂级数 f f f 的莫比乌斯变换为 f ^ \hat{f} f^,反过来, f ^ \hat f f^ 的莫比乌斯反演为 f f f 。其定义为
f S ^ = ∑ T ⫅ S f T \hat{f_S}=\sum_{T\subseteqq S}f_T fS^=TSfT

我们可以推出
f S = ∑ T ⫅ S ( − 1 ) ∣ S ∣ − ∣ T ∣ f ^ T f_S=\sum_{T\subseteqq S}(-1)^{|S|-|T|}\hat{f}_T fS=TS(1)STf^T

所以 莫比乌斯变换与原集合幂级数是双射。此时 h = f ⋅ g h=f\cdot g h=fg 恰满足
h ^ S = f ^ S ⋅ g ^ S \hat{h}_S=\hat{f}_S\cdot\hat{g}_S h^S=f^Sg^S

2.性质

莫比乌斯变换对加法有分配律,即
h ^ = f ^ + g ^ ( h = f + g ) \hat h=\hat f{+}\hat g\quad(h=f{+}g) h^=f^+g^(h=f+g)

对于任意形式幂级数 T ( x ) T(x) T(x),我们现在需要求得 T ( f ) T(f) T(f),可以考虑其莫比乌斯变换的值:由于多项式只涉及乘法和加法,而莫比乌斯变换对二者都有 “分配律”,所以它一定会化简为 T ( f ^ ) T(\hat f) T(f^),其中序列加法和序列乘法都是对应位进行操作。换句话说, T ( f S ^ ) T(\hat{f_S}) T(fS^) 就是 T ( f ) T(f) T(f) 的莫比乌斯变换后 x S x^S xS 的系数。

3.除法

原本应该放在 1.定义 中,但是那里 ÷ \div ÷ 是未定义的。而现在我们可以很轻松的定义 h = f g h=\frac{f}{g} h=gf
h ^ S = f S ^ g ^ S \hat{h}_S=\frac{\hat{f_S}}{\hat{g}_S} h^S=g^SfS^

除法运算是有意义的,当且仅当除数的莫比乌斯变换的每一项系数均非零。这完全是废话

叁、沃尔什变换

适用于乘法定义为集合对称差的情况。

1.定义

f S ^ = ∑ T ⫅ U ( − 1 ) ∣ S ∩ T ∣ f T \hat{f_S}=\sum_{T\subseteqq\Bbb U}(-1)^{|S\cap T|}f_T fS^=TU(1)STfT

f S = 1 2 n ∑ T ⫅ U ( − 1 ) ∣ S ∩ T ∣ f T ^ f_S=\frac{1}{2^n}\sum_{T\subseteqq\Bbb U}(-1)^{|S\cap T|}\hat{f_T} fS=2n1TU(1)STfT^

2.另一种理解

FWT \textit{FWT} FWT 其实就是高维点值。我在另一博客中说了不少,这里就不说了吧。

肆、集合占位幂级数

可用于解决子集卷积问题,即 c L x L ⋅ c R x R = { ( c L c R ) x L ∪ R ( L ∩ R = ∅ ) 0 ( L ∩ R ≠ ∅ ) c_Lx^L\cdot c_Rx^R=\begin{cases}(c_Lc_R)x^{L\cup R}&(L\cap R=\varnothing)\\0&(L\cap R\ne\varnothing)\end{cases} cLxLcRxR={(cLcR)xLR0(LR=)(LR=)

事实上,因为只有它的定义是最良好的,后文的讨论都只针对它。

1.定义

引入 z z z 作为 形式幂级数 的自变量。即形式幂级数环 F ⟦ z ⟧ F\llbracket z\rrbracket F[[z]] 上的集合幂级数。引入这玩意儿,目的也很明显:限制 ∣ L ∣ + ∣ R ∣ = ∣ L ∪ R ∣ |L|+|R|=|L\cup R| L+R=LR 嘛。

对于集合幂级数 σ \sigma σ,用 σ S \sigma_S σS 表示它的系数。当然也需要用 σ S , i \sigma_{S,i} σS,i 表示 [ z i ]    σ S [z^i]\;\sigma_S [zi]σS(即 σ S \sigma_S σS 这个关于 z z z 的形式幂级数中 z i z^i zi 的系数)。

论文中要求 ∀ i < ∣ S ∣ ,    σ S , i = 0 \forall i<|S|,\;\sigma_{S,i}=0 i<S,σS,i=0 。显然这是为了使得 σ S , ∣ S ∣ \sigma_{S,|S|} σS,S 就是子集卷积的结果系数。那么同理,反过来,若 ∀ i > ∣ S ∣ ,    σ S , i = 0 \forall i>|S|,\;\sigma_{S,i}=0 i>S,σS,i=0,这也是良定义的占位多项式。

这里保留论文中记法。称 F ⟦ z ⟧ F\llbracket z\rrbracket F[[z]] 上的集合幂级数 σ \sigma σ 为集合幂级数 f f f集合占位幂级数,当且仅当
σ = ∑ S ⫅ U f S z ∣ S ∣ x S + ∑ S ⫅ U ∑ k > ∣ S ∣ σ S , i z i x S \sigma=\sum_{S\subseteqq{\Bbb U}}f_Sz^{|S|}x^S +\sum_{S\subseteqq\Bbb U}\sum_{k>|S|}\sigma_{S,i}z^ix^{S} σ=SUfSzSxS+SUk>SσS,izixS

2.子集卷积

若直接进行 FMT \textit{FMT} FMT,则有 O ( n 2 n ) \mathcal O(n2^n) O(n2n) 次形式幂级数加法,复杂度 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n)

但反过来,我们以 z z z 作为主元,只需要进行 O ( n 2 ) \mathcal O(n^2) O(n2) 的普通卷积。由于 FMT \textit{FMT} FMT 结果可以保留,所以只有 O ( n ) \mathcal O(n) O(n) FMT \textit{FMT} FMT,复杂度也是 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n) 的。

3.半在线卷积

可以以 z z z 为主元,从小到大枚举其指数,每层直接做 FMT \textit{FMT} FMT 然后卷积即可。复杂度不变。

也可以以 x x x 为主元分治,类似 NTT \textit{NTT} NTT,先递归左侧,并求出正变换结果(对于 ( n − 1 ) (n{-}1) (n1) 个变元的插值)。左侧对右侧作贡献,然后递归右侧,并求出正变换结果。

最后考虑当前变元,就得到了整个区间的正变换结果,可以 return \texttt{return} return

注意操作是对占位幂级数进行的。我们需要预先进行插值——比如,可以做长为 n n n 的循环卷积的插值变换,或者求 [ 0 , 2 n ] [0,2n] [0,2n] 连续点值等,才能保证乘法复杂度是 O ( n ) \mathcal O(n) O(n) 的。显然插值和还原都不会超过 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n) 总复杂度。

所以共 O ( n 2 n ) \mathcal O(n2^n) O(n2n) 操作,总复杂度 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n)

伍、其他

1.微分

将集合幂视为 n n n 元生成函数。取微分算子
D = ∑ x i ∂ ∂ x i {\frak D}=\sum x_i\frac{\partial}{\partial x_i} D=xixi
此时有 D ( x a ⋅ x b ) = x b D x a + x a D x b    ( a ∩ b = ∅ ) {\frak D}(x^{a}\cdot x^{b})=x^b{\frak D}x^a+x^a{\frak D}x^b\;(a\cap b=\varnothing) D(xaxb)=xbDxa+xaDxb(ab=),因此是良定义的。

或者用集合幂的角度,就是
D x S = ∑ i ∈ S x S ∖ { i } {\frak D}x^S=\sum_{i\in S}x^{S\setminus\{i\}} DxS=iSxS{i}

2.逐点牛顿迭代法

任取 n n n 变元中任意 x x x 。注意到 ∂ ∂ x F \frac{\partial}{\partial x}F xF 就是 [ x 1 ] F [x^1]F [x1]F,用这个提取 [ x 1 ] [x^1] [x1],很可能只需要从 [ x 0 ] F = F ∣ x = 0 [x^0]F=F\big\vert_{x=0} [x0]F=F x=0 推出。

比如,求算 G = exp ⁡ F G=\exp F G=expF,其中 F F F 是集合占位幂级数。有 ∂ ∂ x G = G ∂ ∂ x F \frac{\partial}{\partial x}G=G\frac{\partial}{\partial x}F xG=GxF,因此将 [ x 0 ] G [x^0]G [x0]G 求出后与 [ x 1 ] F [x^1]F [x1]F 卷积就是 [ x 1 ] G [x^1]G [x1]G

由于乘法长度在倍增,这显然是 O ( n 2 2 n ) \mathcal O(n^22^n) O(n22n) 的复杂度。并且它并不涉及逆元,即在任意交换环上都可以进行该运算。

在域上,则可以先 FMT \textit{FMT} FMT,再对每个形式幂级数 F ^ S \hat F_S F^S exp ⁡ \exp exp,最后做 FMT \textit{FMT} FMT 逆变换。这里 exp ⁡ \exp exp 涉及逆元(比如最平凡的求导方法)。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值