省流:集合幂就是 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,j⋅xj,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 c∈F,S⫅U,用 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=S⫅U∑fSxS
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=f⋅g,显然我们希望 乘法对加法有分配律。那么,我们定义 ( 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)xa⋆b,然后根据分配律直接定义项数更长的乘法。
自然,我们希望 ⋆ \star ⋆ 是某种集合运算。如果它满足:
- 交换律。即 L ⋆ R = R ⋆ L L\star R=R\star L L⋆R=R⋆L 。
- 结合律。即 ( L ⋆ M ) ⋆ R = L ⋆ ( M ⋆ R ) (L\star M)\star R=L\star (M\star R) (L⋆M)⋆R=L⋆(M⋆R) 。
那么,集合幂级数就会满足 交换律、结合律。虽然绝大多数集合运算都满足。
然而,这不足以让乘法是良定义的。我们需要
- 单位元为空集,即 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=cx∅⋅xS=c⋅xS
不成立。那么 常数将不再是集合幂级数,这是令人恼怒的!
在单位元为空集时,容易发现,现在集合幂级数构成交换环,并且整个域 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} cLxL⋅cRxR=(cLcR)xL∪R 的情况。
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^=T⫅S∑fT
我们可以推出
f
S
=
∑
T
⫅
S
(
−
1
)
∣
S
∣
−
∣
T
∣
f
^
T
f_S=\sum_{T\subseteqq S}(-1)^{|S|-|T|}\hat{f}_T
fS=T⫅S∑(−1)∣S∣−∣T∣f^T
所以 莫比乌斯变换与原集合幂级数是双射。此时
h
=
f
⋅
g
h=f\cdot g
h=f⋅g 恰满足
h
^
S
=
f
^
S
⋅
g
^
S
\hat{h}_S=\hat{f}_S\cdot\hat{g}_S
h^S=f^S⋅g^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^=T⫅U∑(−1)∣S∩T∣fT
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=2n1T⫅U∑(−1)∣S∩T∣fT^
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} cLxL⋅cRxR={(cLcR)xL∪R0(L∩R=∅)(L∩R=∅) 。
事实上,因为只有它的定义是最良好的,后文的讨论都只针对它。
1.定义
引入 z z z 作为 形式幂级数 的自变量。即形式幂级数环 F ⟦ z ⟧ F\llbracket z\rrbracket F[[z]] 上的集合幂级数。引入这玩意儿,目的也很明显:限制 ∣ L ∣ + ∣ R ∣ = ∣ L ∪ R ∣ |L|+|R|=|L\cup R| ∣L∣+∣R∣=∣L∪R∣ 嘛。
对于集合幂级数 σ \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}
σ=S⫅U∑fSz∣S∣xS+S⫅U∑k>∣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) (n−1) 个变元的插值)。左侧对右侧作贡献,然后递归右侧,并求出正变换结果。
最后考虑当前变元,就得到了整个区间的正变换结果,可以 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=∑xi∂xi∂
此时有
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(xa⋅xb)=xbDxa+xaDxb(a∩b=∅),因此是良定义的。
或者用集合幂的角度,就是
D
x
S
=
∑
i
∈
S
x
S
∖
{
i
}
{\frak D}x^S=\sum_{i\in S}x^{S\setminus\{i\}}
DxS=i∈S∑xS∖{i}
2.逐点牛顿迭代法
任取 n n n 变元中任意 x x x 。注意到 ∂ ∂ x F \frac{\partial}{\partial x}F ∂x∂F 就是 [ 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 ∂x∂G=G∂x∂F,因此将 [ 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 涉及逆元(比如最平凡的求导方法)。