组合结构符号化学习笔记

· · 个人记录

更好的阅读体验

由于在洛谷博客上编辑很不方便,所以最新版本请到上面的链接查看。

最近发现有个叫“解析组合”的东西里面有一些符号化组合对象的工具,学来用一用。pdf 版本在这里。书中举了大量生动的例子,画了大量的插图,非常的强大。如果你的数数不够好,可以找来看一看加深理解。

这里默认读者有一些数数功底,比如至少做过城市规划和无标号树计数。

定义

一个组合类(combinatorial class)是一个可数集合 \mathcal A,以及一个大小函数(size function)f:\mathcal A\rightarrow\mathbb N。记 f(x)=|x|,或者,在某些需要指出组合类的场合下,|x|_{\mathcal A}

大小函数应该是一个我们很熟悉的东西了。“节点数”“叶子数”……

记对于自然数 nA_n=\Big|\{x\in \mathcal A,|x|=n\}\Big|。称 A_n\mathcal A计数序列(counting sequence)。

一个计数序列的 OGF(ordinary GF)是形式幂级数

A(z)=\sum_{i\in\mathbb N}A_iz^i

因而对于组合类 \mathcal A,它的 OGF 也是

\sum_{x\in A}z^{|x|}

我们记

[z^n]A=A_n

熟悉到不能再熟悉了。(不想熟悉)

两个组合类 \mathcal A,\mathcal B同构的,如果 A_n=B_n。记作 \mathcal A\cong\mathcal B

引出的一些组合类

\mathcal E 是只由一个大小为 0 的元素构成的组合类。我们有 E(z)=1

\mathcal Z 是只由一个大小为 1 的元素构成的组合类。我们有 Z(z)=z

几个基础的构造

下面讨论一些可以直接被翻译为生成函数的构造,称为 admissible constructions,可译为“可接受的构造”。具体来说

称一个构造 \Phi admissible,如果

\mathcal A=\Phi[\mathcal B^{(1)},\mathcal B^{(2)},...,B^{(m)}]

中的 \mathcal A 的计数序列 A_n 只依赖于 B_n^{(i)}。也就是说存在一个对应的函数 \Psi,使得

A=\Psi[B^{(1)},B^{(2)},...,B^{(m)}]

笛卡尔积

此时,

A_n=\sum_{i+j=n}B_iC_j

也就是普通卷积,从而有

\boxed{A(z)=B(z)C(z)}

不交并

此时,

A_n=B_n+C_n,\boxed{A(z)=B(z)+C(z)}

我们意图扩展不交并的概念。为了绕开多重集,我们使用下面的定义:

\mathcal B+\mathcal C:=(\{\square\}\times \mathcal B)\cup(\{\triangle\}\times\mathcal C)

其中 \square\triangle 是两个不同的,大小为 0 的元素。

我们有

\boxed{\mathcal A=\mathcal B+\mathcal C\Rightarrow A(z)=B(z)+C(z)}

请注意,普通的集合并显然不是 admissible 的。

Sequence 构造

[z^0]\mathcal B=0,则我们定义

\text{SEQ}(\mathcal B):=\mathcal E+\mathcal B+\mathcal B\times \mathcal B+\mathcal B\times \mathcal B\times \mathcal B+...

\mathcal B 的 Sequence 构造。换句话说,如果 \mathcal A=\text{SEQ}(\mathcal B),则

\mathcal A=\{(\beta_1,...,\beta_l)\ |\ l\ge 0,\beta\in \mathcal B\}

我们有

\boxed{\mathcal A=\text{SEQ}(\mathcal B)\Rightarrow A(z)=\dfrac{1}{1-B(z)}}

Cycle 构造

首先定义本质相同是什么意思。两个元素 \beta_1,\beta_2 在映射群列 G_0,G_1,G_2,... 下本质相同,如果 |\beta_1|=|\beta_2|,且存在映射 g\in G_{|\beta|} 使得 g(\beta_1)=\beta_2。显然此处的本质相同具有自反性、对称性、传递性,从而是一个等价关系。

定义 \mathcal A/G 是一个组合类,其中的元素 \alpha 是一个组合对象的非空集合,\alpha 中的元素互相等价,如果 \alpha_1\neq \alpha_2,则 \alpha_1\alpha_2 中的元素两两不等价。|\alpha|_{\mathcal A/G} 等于任意 \alpha 中元素的大小,显然它们都相等。我们把 \alpha 称为一个等价类(equivalence class)。

[z^0]\mathcal B=0,则我们定义

\text{CYC}(\mathcal B):=(\text{SEQ}(\mathcal B)-\mathcal E)/\mathbf S

其中 \mathbf S 是所有循环移位(circular shift)构成的群。

根据 Burnside 引理我们容易得到

\boxed{\mathcal A=\text{CYC}(\mathcal B)\Rightarrow A(z)=\sum_{k=1}^{\infty}\dfrac{\varphi(k)}{k}\text{log}\dfrac{1}{1-B(z^k)}}

Multiset 构造

[z^0]\mathcal B=0,则我们定义

\text{MSET}(\mathcal B)=\text{SEQ}(\mathcal B)/\mathbf R

其中 \mathbf R 是任意置换构成的群。

比如,(\beta_1,\beta_2,\beta_3)(\beta_1,\beta_3,\beta_2),(\beta_2,\beta_1,\beta_3),(\beta_2,\beta_3,\beta_1),(\beta_3,\beta_1,\beta_2),(\beta_3,\beta_2,\beta_1) 等价。这是整个 (\beta_1,\beta_2,\beta_3) 所属的等价类。

再比如,(\beta_1,\beta_1,\beta_2)(\beta_1,\beta_2,\beta_1),(\beta_2,\beta_1,\beta_1) 等价。这是整个 (\beta_1,\beta_1,\beta_2) 所属的等价类。

你可能更熟悉它的另两个名字:Euler 变换或 Polya Exp。

于是有我们熟悉的结论:

\boxed{\mathcal A=\text{MSET}(\mathcal B)\Rightarrow A(z)=\begin{cases}\prod_{i=1}^{\infty}(1-x^i)^{-B_i}\\\text{exp}\left(\sum_{i=1}^{\infty}\dfrac{B(z^i)}{i}\right)\end{cases}}

Powerset 构造

[z^0]\mathcal B=0,则我们定义 \text{PSET}(\mathcal B)\mathcal B 的所有有限子集构成的集合。如果 \alpha\in\text{PSET}(\mathcal B),则 |\alpha|=\sum_{\beta\in \alpha}|\beta|

显然有

\text{PSET}(\mathcal B)\cong\prod_{\beta}(Z+\{\beta\})

从而

\boxed{\mathcal A=\text{PSET}(\mathcal B)\Rightarrow A(z)=\begin{cases}\prod_{n}(1+z^n)^{B_i}\\\text{exp}\left(\sum_{i=1}^{\infty}\dfrac{(-1)^{i-1}B(z^i)}{i}\right)\end{cases}}

我们将用以上的几个构造(\mathcal E,\mathcal Z,+,\times,\text{SEQ},\text{CYC},\text{MSET},\text{PSET})构造出一切组合类。具体来讲

specification,可构造性,Pólya 操作

一个 r 阶的 specification(可译作规范)是 r 条方程构成的方程组

\begin{cases}\mathcal A^{(1)}=\Phi_1(\mathcal A^{(1)},\mathcal A^{(2)},...,\mathcal A^{(r)})\\\mathcal A^{(2)}=\Phi_2(\mathcal A^{(1)},\mathcal A^{(2)},...,\mathcal A^{(r)})\\...\\\mathcal A^{(r)}=\Phi_r(\mathcal A^{(1)},\mathcal A^{(2)},...,\mathcal A^{(r)})\end{cases}

其中 \Phi 都是八大构造构建起的函数。

我们称一组组合类是可构造的,如果它满足一个 specification。

The generating function of a constructible class is a component of a system of functional equations whose terms are built from 八大构造。(前面那段文字翻译不能……)

我们记

Q(f)=\dfrac{1}{1-f}\quad(\texttt{拟逆}) \text{Log}(f)=\sum_{k=1}^{\infty}\dfrac{\varphi(k)}{k}\text{log}\dfrac{1}{1-f(z^k)}\quad(\text{Pólya Log}) \text{Exp}(f)=\text{exp}\left(\sum_{i=1}^{\infty}\dfrac{B(z^i)}{i}\right)\quad(\text{Pólya Exp}) \overline{\text{Exp}}(f)=\text{exp}\left(\sum_{i=1}^{\infty}\dfrac{(-1)^{i-1}B(z^i)}{i}\right)\quad(\text{Pólya Exp 改})

它们被称为 Pólya 操作。

那个 Pólya Exp · 改真的不是我乱翻,原文就是 Modified Pólya Exp

Pointing 构造

定义

\Theta\mathcal B:=\sum_{i\ge 0}\{\beta\in \mathcal B,|\beta|=i\}\times\{\epsilon_1,\epsilon_2,...,\epsilon_i\}

其中 \epsilon_i 是大小为 0 的对象。

它没有什么组合意义,因为它可以解释成在一个图 \beta 中指明一个特殊节点(比如根),但是在图计数中使用 OGF 往往是因为无标号,而无标号场合下任何操作都要 /\mathbf R,这使得这个鬼构造什么用也没有。

我们有

\boxed{\mathcal A=\Theta\mathcal B\Rightarrow A(z)=z\dfrac{\text{d}}{\text{d}z}B(z)}

Subsitution 构造

定义

\mathcal B\circ\mathcal C:=\sum_{i\ge 0}\{\beta\in\mathcal B,|\beta|=i\}\ {\color{red}\times}\ \mathcal C^{\times i} 这里的 $\color{red}\times$ 较特殊:新的 $|\cdot|$ 定义为 $\sum|\gamma|$。

同上,没有组合意义。

\boxed{\mathcal A=\mathcal B\circ\mathcal C\Rightarrow A(z)=B(C(z))}

Pólya 定理

考虑一个大小为 m 的有限集合 \mathcal M 和一个置换群 G 作用在其上。不妨认为 \mathcal M=\{1,2,...,m\}

定义 G循环指标

Z(G)=Z(G;x_1,x_2,...,x_m)=\dfrac{1}{|G|}\sum_{g\in G}x_1^{j_1(g)}x_2^{j_2(g)}...x_m^{j_m(g)}

其中 j_1(g) 表示 g 中大小为 1 的循环个数。

一个我们并不陌生的东西。

Pólya 定理.\mathcal B 是一个组合类,\mathcal M 是一个有限集合,上有一个置换群 G。考虑集合 \mathcal B^{\mathcal M},即所有 \mathcal M\rightarrow\mathcal B 的映射……

我们指出,这是广义的染色

……两个染色 \phi_1,\phi_2\in\mathcal B^{\mathcal M} 被认为本质相同,如果存在映射 g\in G,\phi_1\circ g=\phi_2。从而我们研究的对象可以称为 \mathcal B^{\mathcal M}/G

$$ \sum_{\phi\in (\mathcal B^{\mathcal M}/G)}w(\phi)=Z\left(G;\sum_{\beta\in\mathcal B}w(\beta),...,\sum_{\beta\in\mathcal B}w^m(\beta)\right) $$ 如果取 $w(\beta)=z^{|\beta|}$,我们还有 $$ \sum_{\phi\in (\mathcal B^{\mathcal M}/G)}z^{|\phi|}=Z\left(G;B(z),...,B(z^m)\right) $$ 如果取 $G$ 为任意置换的集合 $\mathbf R$,我们还有 $$ \sum_{i=0}^{\infty}\sum_{\phi\in (\mathcal B^{[1..i]}/\mathbf R_i)}w(\phi)=\text{exp}\left(\sum_{i=1}^{\infty}\dfrac{\sum_{\beta\in\mathcal B}w^i(\beta)}{i}\right) $$ 证明可大致参考[这里](https://xyix.gitee.io/posts/?page=1&postid=31)(链接里同时还取 $w(\beta)=z^{|\beta|}$,但是其实不失一般性。注意 $w(\beta)=z^{|\beta|}$ 和 $\text{MSET}$ 的关系。)

《如果早知道,男生也会被真正的 Pólya 定理长这样》

现在运用上面的构造,Burnside 引理和 Pólya 定理,你应该能解决很多无标号计数问题了。可是……标号是什么?我们来介绍有标号计数。

有标号计数

首先定义什么叫做标号。

一个大小为 n 的对象被称作标号的,如果它的每一个节点(这里我们认为一个对象是一个图,如果我们需要的话,可以任意扩展它)都附带一个互不相同的正整数标号,恰好是 [1..n] 的一个排列。

一个对象被称为弱标号的,如果它几乎是标号的,但是其标号不必恰好是 [1..n] 的一个排列。

一个组合类被称作标号的,如果它的元素都是标号的对象。

一个计数序列 A_nEGF(Exponential GF)是形式幂级数

A(z)=\sum_{i\ge 0}A_n\dfrac{z^n}{n!}

因而对于组合类 \mathcal A,它的 EGF 也是

\sum_{x\in \mathcal A}\dfrac{z^{|x|}}{|x|!}

我们记

A_n=n![z^n]A(z)
## 重标号 众所周知,标号的存在就是为了让你重新排的。下面是典型的两种重排。 ### reduction 把一个弱标号的对象排成强标号。比如有一个 $\alpha$,它的标号是 $\left<233,998244353,1\right>$,那么 $\alpha$ 的标号就会被 reduction 成 $\left<2,3,1\right>$。这个被重标号的 $\alpha$ 记作 $\rho(\alpha)$。 ### expansion reduction 的逆操作。显然 expansion 的结果不唯一。记作 $e(\alpha)$。 ## 标号积 你一定记得[城市规划](https://www.luogu.com.cn/problem/P4841)。“一个无向图就是由若干个无向连通图组成的”,组成是什么意思?~~感性理解,请~~今天我们终于可以严谨地定义“组成”了。 两个标号对象 $\beta,\gamma$ 的**标号积**定义为 $$ \beta\star\gamma:=\{(\beta',\gamma')|(\beta',\gamma')\texttt{是强标号的},\rho(\beta')=\beta,\rho(\gamma')=\gamma\} $$ 其大小定义为 $|\beta|+|\gamma|$。 两个组合类的**标号积**定义为 $$ \mathcal B\star\mathcal C:=\bigcup_{\beta\in\mathcal B,\gamma\in\mathcal C}\beta\star\gamma $$ 显然此处 $\beta\star\gamma$ 两两不交。 那么标号积是否 admissible 呢?答案是肯定的。事实上我们都知道它对应二项卷积,也对应 EGF 的乘法。 $$ \mathcal A=\mathcal B\star\mathcal C\Rightarrow A(z)=B(z)C(z) $$ ## 有标号 Sequence 构造 > 若 $[z^0]\mathcal B=0$,则我们定义 > $$ \text{SEQ}(\mathcal B):=\mathcal E+\mathcal B+\mathcal B\star \mathcal B+\mathcal B\star \mathcal B\star \mathcal B+... $$ > 是 $\mathcal B$ 的 Sequence 构造。换句话说,如果 $\mathcal A=\text{SEQ}(\mathcal B)$,则 > $$ \mathcal A=\{\beta_1\star\ldots\star\beta_l\ |\ l\ge 0,\beta\in \mathcal B\} $$ > 比如,$(\beta'_1,\beta'_2,\beta'_3)$ 本身是强标号的,$\rho(\beta_1')=\beta_1,\rho(\beta_2')=\beta_2,\rho(\beta_3')=\beta_3$,那么它就应该的确是 $\text{SEQ}(\mathcal B)$ 的一个元素。 > > 对应数个 $\mathcal B$ “有序地”组合在一起。 有 $$ \boxed{\mathcal A=\text{SEQ}(\mathcal B)\Rightarrow A(z)=\dfrac{1}{1-B(z)}} $$ ## Set 构造 > 若 $[z^0]\mathcal B=0$,则我们定义 > $$ \text{SET}(\mathcal B):=\text{SEQ}(\mathcal B)/\mathbf R $$ > 对应数个 $\mathcal B$ “无序地”组合在一起。 我们终于摆脱了“有序”和“无序”,我们现在只说它们在什么置换下等价。 有~~刻在 DNA 里的~~结论 $$ \boxed{\mathcal A=\text{SET}(\mathcal B)\Rightarrow A(z)=\text{exp}B(z)} $$ ## 有标号 Cycle 构造 > 若 $[z^0]\mathcal B=0$,则我们定义 > $$ \text{CYC}(\mathcal B):=\text{SEQ}(\mathcal B)/\mathbf S $$ > 其中 $\mathbf S$ 是所有循环移位(circular shift)构成的群。 我们有 $$ \boxed{\mathcal A=\text{CYC}(\mathcal B)\Rightarrow A(z)=\text{log}\dfrac{1}{1-B(z)}} $$ ## 有标号可构造性 与普通的可构造性类似。 ## 有标号 Pointing 构造 >定义 >$$ \Theta\mathcal B:=\sum_{i\ge 0}\{\beta\in \mathcal B,|\beta|=i\}\times[1..n] $$ 其组合意义可以解释为在 $\beta$ 中指明一个特殊的节点(也就是指明一个特殊的标号),比如指明根。 我们有 $$ \boxed{\mathcal A=\Theta\mathcal B\Rightarrow A(z)=z\dfrac{\text{d}}{\text{d}z}B(z)} $$ ## 有标号 Subsitution 构造 > 定义 > $$ \mathcal B\circ\mathcal C:=\sum_{i\ge 0}\{\beta\in\mathcal B,|\beta|=i\}\ {\color{red}\times}\ \dfrac{\mathcal C^{\star i}}{i!} $$ > $C^{\star i}:=$ $i$ 个 $\mathcal C$ 连 $\star$。 > > 这里的 $\color{red}\times$ 较特殊:新的 $|\cdot|$ 定义为 $\sum|\gamma|$。 其组合意义可以解释为我们把 $\mathcal B$ 的每一个节点全部换成一个 $\mathcal C$ 结构。由于标号,我们可以区分 $\beta$ 中各节点的不同,从而把 $\dfrac{\mathcal C^{\star i}}{i!}$(请确认你了解这个东西的含义。比如它在有相同的 $\gamma$ 时是否还是正确的?)中的 $\mathcal C$ 挨个按 $\beta$ 的标号填进去即可。 有 $$ \boxed{\mathcal A=\mathcal B\circ\mathcal C\Rightarrow A(z)=B(C(z))} $$ ## boxed product 我们定义 >$$ \mathcal A=\mathcal B^{\square}\star\mathcal C\Rightarrow \left(\dfrac{\text{d}}{\text{d}z}A\right)(z)=\left(\dfrac{\text{d}}{\text{d}z}B\right)(z)C(z) $$ 这个东西的组合意义相当于要求一个特殊标号,比如 $1$ 必须分配进 $\beta$。在关于父亲在 $1..i-1$ 随机选的树的问题中比较有用。 # 例题 好了,你已经掌握数数的基本方法了,让我们来做一道例题练习一下吧! > [ZJOI2018 树](https://www.luogu.com.cn/problem/P4500) 心 肺 停 止 冷静一下。根据题面,我们要数的是每个**有根无标号树**(可以验证这个生成方法会把每个有根无标号树等概率生成)(记所有有根无标号树构成的组合类为 $\mathcal T$)作为一个等价类的大小的 $k$ 次方和。设为 $siz^k(\alpha)$,表述的时候我们说这棵无标号树描述了多少棵有标号树。 首先考虑两个等价类的笛卡尔积(我们当然要先引入笛卡尔积再引入 $\text{MSET}$ 构造),记为 $*$。我们有 $$ |t_1*t_2|=|t_1|+|t_2|$$ $$ siz(t_1*t_2)=siz(t_1)siz(t_2){t_1+t_2\choose t_1,t_2} $$ 这提示我们搞出一个类似 EGF 的东西($k=1$ 就退化到 EGF)。记 $T(\mathcal A;z)=\sum_{\alpha\in\mathcal A}siz^k(\alpha)\dfrac{z^{|\alpha|}}{|\alpha|!^k}$。 分析一下它的性质。 - 线性是自然的: - $$ T(\mathcal A+\mathcal B)=T(\mathcal A)+T(\mathcal B) $$ - 于是我们也容易得到积性: - $$ T(\mathcal A*\mathcal B)=T(\mathcal A)T(\mathcal B) $$ 那么我们分析一棵树的构造。我们容易得到 $$ \mathcal T^{\square}=\text{MSET}(\mathcal T) $$ 那么我们有 $$ \begin{aligned}T(\mathcal T^{\square})&=T(\text{MSET}(\mathcal T))\\ &=T\left(\text{exp}\left(\sum_{i=1}^{\infty}\dfrac 1 i\sum_{t\in\mathcal T}t^i\right)\right)&(\texttt{Pólya}\ \text{定理})\\ &=T\left(\prod_{i=1}^{\infty}\prod_{t\in\mathcal T}\sum_{j=0}^{\infty}\dfrac{t^{ij}}{i^jj!}\right)&(\texttt{拆开}\text{ exp})\\ &=\prod_{i=1}^{\infty}\prod_{t\in\mathcal T}\sum_{j=0}^{\infty}\dfrac{T^{ij}(t)}{i^jj!}&(T\ \texttt{的线性,积性})\\ &=\prod_{i=1}^{\infty}\text{exp}(T^i(\mathcal T)/i)&(\texttt{恢复}\text{ exp}) \end{aligned} $$ 现在出现了一个问题。我们没法描述 $T^i(\mathcal T)$。 可以想到的是修改 $T$ 的定义为 $$ T(\mathcal A;z,u)=\sum_{\alpha\in\mathcal A}z^{|\alpha|}\dfrac{1}{1-u\frac{siz(\alpha)}{|\alpha|!}} $$ $T$ 的乘法定义为 $[u^k](T_1T_2)=[u^k]T_1[u^k]T_2$,即 $z$ 一维卷积,$u$ 一维点乘。它仍然保有之前的线性,积性。于是有 $$ \begin{aligned} \left[u^k\right]T^i(\mathcal T;z)&=\sum_{t\in\mathcal T}siz^{ik}(t)\dfrac{z^{i|t|}}{|t|!^{ik}}\\ &=\sum_{t\in\mathcal T}[u^{ik}]T(t;z^i)\\ &=[u^{ik}]T(\mathcal T;z^i) \end{aligned} $$ 于是我们有 $$ [u^k]T(\mathcal T^{\square};z)=\text{exp}\left(\sum_{i=1}^{\infty}\dfrac{[u^{ik}]T(\mathcal T;z^i)}{i}\right) $$ 那么具体怎么做呢?首先观察到 $u$ 指标乘 $z$ 指标不超过 $nk$ 的项才是有意义的;然后我们从大的 $u$ 指标推到小的 $u$ 指标,有 $$ \text{ln}[u^k]T(\mathcal T^{\square};z)-[u^k]T(\mathcal T;z)=\sum_{i=2}^{\infty}\dfrac{[u^{ik}]T(\mathcal T;z^i)}{i} $$ 从而对 $[u^kz^n]T(\mathcal T)$ 容易 $O(n)$ 算出。复杂度为 $$ \sum_{k=1}^nO\left(\dfrac{n^2}{k^2}\right)=O(n^2) $$ 但是当 $k$ 变动时我们必须重新计算右式,这部分复杂度为 $O(n^2\log n)$。