符号化方法
符号化方法
我们定义组合类是一系列组合对象组成的可数集合,组合类都是由一些更本质的组合类构造出来的。我们对每个组合类 \(\mathcal A\) 都定义了一个大小函数 \(f:A\to \mathbb N\),满足对于任意 \(k\in \mathbb N\) 只有有限个组合对象 \(a\in \mathcal A\) 满足 \(f(a)=k\),我们记 \(f(a)\) 为 \(|a|\),在需要指出组合类的情况下记为 \(|a|_\mathcal A\)。
我们将 \(a\in \mathcal A,|a|=n\) 的全体记作 \(\mathcal A_n\),并以此可以构造一个计数序列满足 \(A[n]=|\mathcal A_n|\)。
对于两个组合类 \(\mathcal A\) 和 \(\mathcal B\),在组合意义上同构时我们描述为 \(\mathcal A=\mathcal B\) 或 \(\mathcal A \cong \mathcal B\)。我们并不关心对于我们所需的单一性质之外的其他信息,具体的我们忽视组合对象除了大小和组合结构以外的其他信息,从而将很多组合操作简单的映射到并列操作上。
\(a,b\in \mathcal A\) 等价当且仅当 \((a,b)\in\mathbf G\),我们将其定义为 \(a\mathbf Gb\)。
对于一个组合类,其上的一个等价关系 \(\mathbf G\) 是 \(\mathcal A\times \mathcal A\) 的一个子集 \((a,b)|a,b\in \mathcal A\)。其满足以下三个条件:
- \(a \in \mathcal A \Rightarrow (a, a) \in \textbf G\)(自反性)
- \((a, b) \in \textbf G, a \neq b \Rightarrow (b, a) \in \textbf G\)(对称性)
- \((a, b), (b, c) \in \textbf G \Rightarrow (a, c) \in \textbf G\)(传递性)
对于一个组合类 \(\mathcal A\) 和等价关系 \(\mathbf G\) 取 \(\mathcal S \subseteq \mathcal A\) 若 \(\forall a, b \in \mathcal S, (a, b) \in \textbf G\),\(\forall a \in \mathcal S, b \in \complement_{\mathcal A}\mathcal S, (a, b) \not \in \textbf G\) 则称 \(\mathcal S\) 是 \(\textbf G\) 下的一个等价类。实际讨论中一个等价类的组合对象大小一般相等。
对于一个组合类 \(\mathcal A\) 和等价关系 \(\mathbf G\) 取一个新的组合类 \(\bar{\mathcal A}=\mathcal A/G\),满足 \(\mathbf G\) 下 \(\mathcal A\) 的任意一个等价类在 \(\bar {\mathcal A}\) 中只有一个元素作为代表元,一般取某一性质下最小元素例如字典序最小,有时也定义新的组合类的组合对象是原组合类的等价类,就是说新组合类是组合类的组合类。
我们知道一个无标号组合类 \(\mathcal A\) 对应的 OGF 其形式幂级数为 \(A(x) = \sum\limits_{i=0}^{\infty} a_ix^i\),其中 \(x\) 为占位元。它也可以被等价的写作 \(A(x)=\sum\limits_{a\in \mathcal A}x^{|a|}\),我们称此处的 \(z^{|a|}\) 为 \(a\) 的幂表示,这里的 \(x\) 依然只是单位元。两个 OGF 之间的运算具有一系列的组合意义,OGF 之间的加法与两个不相交组合类的并同构。OGF 之间的乘法和这两个组合类的笛卡尔积同构。
我们称一个构造可以映射为生成函数运算时我们想要表达的是这种组合类之间的运算能和各组合类的生成函数间的运算对应,例如 EGF 的 \(\text{exp}\) 的组合意义。
我们记 \(\epsilon\) 为中性对象,对应的组合类为 \(\mathcal E = \{\epsilon \}\) 称为中性类,恒有 \(|\epsilon|=0\),因此有 \(\mathcal E\) 的生成函数 \(E(x)=1\) 。两个中性对象可能不同。
我们有 \(\mathcal A \cong \mathcal E\times \mathcal A \cong \mathcal A\times \mathcal E\),对于任意组合类 \(\mathcal A\) 定义 \(\mathcal A^0=\mathcal E\),但是由于组合意义所以 \(\mathcal E\) 不能作为笛卡尔积的单位元。由于集合论中需要集合内无重复元素,我们可以对两个类乘上不同的中性类,这样两个集合中可能相同的对象也不同。我们定义两个类 \(\mathcal A,\mathcal B\) 的集合并 \(\mathcal A+\mathcal B\) 为 \((\mathcal E_1 \times \mathcal A) \cup (\mathcal E_2 \times \mathcal B)\)。
我们记 \(\bullet\) 为原子对象,对应的组合类记作 \(\mathcal Z=\{\bullet\}\) 称为原子类。恒有 \(|\bullet|=1\) 因此其对应的生成函数 \(Z(x)=x\)。原子对象一般用于合并数个组合对象,比如作为树的根出现。
求得长度为 \(n\) 的 01 串个数
01 串的组合类为 \(\mathcal S\),我们要求的就是 \(|\mathcal S_n|\)。可以写出 \(\mathcal S=\{\epsilon,0,1,00,01,10,11,\cdots\}\)。我们发现对于一个 01 串要么是空串要么就是 0/1 接在一个 01 串前面。可以写出 \(\mathcal S=\epsilon+\{0,1\}\times \mathcal S\),写成生成函数就是 \(S(x)=1+2xS(x)\),求解这个方程得到 \(\frac{1}{1-2x}\),答案写成集合幂级数的形式就是 \(\left[x^n\right]\sum_{i=0}^{\infty}2^ix^i\),也就是 \(2^n\)。
构造长度为 \(n\) 的卡特兰数的生成函数
考虑卡特兰数有一个很经典的组合意义:\(n\) 个节点的二叉树个数,对于一个二叉树,要么为空要么形如左子树-根-右子树。前面提到根可以视为 \(\bullet\),那么我们就知道 \(\mathcal C=\epsilon+\mathcal C\times \mathcal Z\times \mathcal C\)。翻译成生成函数就是 \(C(x)=1+xC(x)^2\)。解方程得到 \(C(x)=\frac{1-\sqrt{1-4x}}{2x}\)。广义二项式定理展开即可。
有标号体系是无标号体系的自然拓展。有标号体系和无标号体系的区别在于,有标号所关注的组合对象有两两不同的标号,可以彼此区分。我们将标号集合视作正整数集合。一个排列可以被视作一系列两两不同正整数依次排开,而循环分解将这排列视作循环有向图的组合,图的每个顶点都有着正整数标号。
有标号体系内的操作基于一类特殊的乘法:有标号乘。这是对无标号体系中笛卡尔积的自然模拟。同样的,我们也需要对无标号体系中的 OGF 进行自然模拟,也就是我们熟知的 EGF。
我们所处理的对象和无标号体系一样具有有限的组合类与组合对象。但不同的,组合对象是有标签的。每个组合对象都 有颜色/被分配标号 ,以保证组合对象两两不同。
一个具有 \(n\) 个部分的离散结构其 \(n\) 个部分分别有一个标号,这些标号组成了一个长度为 \(n\) 的正整数集,我们称满足这条件的对象是弱标号的。我们称满足这条件的对象是弱标号的。等价地,也可以说每个部分都有标号,这种叙述隐含了标号是属于 \(\mathbb Z\) 的彼此不同的数。一个大小为 \(n\) 的强标号/有标号对象需要是弱标号的,其标号所组成的集合是 \([1,n]\)。
一个有标号类是一个由有标号对象组成的组合类,我们上文无标号中提到的组合类命名为无标号类以做区分。一个有标号类 \(\mathcal A\) 可以用她的计数序列 \(A[i]\) 或其中元素表示,即 \(\hat A(x)=\sum\limits_{i=0}^{\infty} A[i] \frac{x^i}{i!}=\sum\limits_{\alpha\in \mathcal A} \frac{x^{|\alpha|}}{|\alpha|!}\)
在无标号体系中,我们已经见到了中性类和原子类发挥的作用,不妨在有标号体系中也定义这样的结构。
我们记 \(\epsilon\) 为中性对象,对应的组合类为 \(\mathcal E = \{\epsilon \}\) 称为中性类,恒有 \(|\epsilon|=0\),因此有 \(\mathcal E\) 的生成函数 \(\hat E(x)=1\)。
我们记 \(\bullet\) 为原子对象,对应的组合类记作 \(\mathcal Z=\{\bullet\}\) 称为原子类。我们令对象中唯一的元素标号恒为 \(1\),因此原子类是强标号的。恒有 \(|\bullet|=1\) 因此其对应的生成函数 \(\hat Z(x)=x\)。
有标号类的集合并可以类似无标号类的集合并一样定义。
而有标号类的乘法不好得到良定义,因为笛卡尔积可能导出非良标号对象,也就是两个有标号对象可能存在标号重叠的情况。我们单独定义新的运算:有标号乘法,这可以自然的翻译为 EGF 之间的乘法。
我们接下来要讨论的是重标号操作。由于我们需要让两个强标号对象合并后仍然是强标号的,我们需要进行重标号操作,这种操作要求新的标号的大小关系中保留原标号之间的大小关系。主要有两种这种操作:减缩和增扩。
- 减缩:对于一个大小为 n 的弱标号结构,减缩操作将每个点的标号映射到整数区间 \([1,n]\) 内,保留了原标号的大小关系,相当于作了离散化。
- 增扩:我们需要一个增扩函数 \(e:[1,n]\to \mathbb Z\),满足 \(\forall i\in [1, n], e(i) > i\)。对于一个强标号对象 \(\alpha\),定义它增扩后得到一个弱标号对象 \(\hat \alpha\),\(\alpha\) 中标号为 \(k\) 的部分在 \(\hat \alpha\) 中标号为 \(e(k)\)。我们称对 \(\alpha\) 做增扩操作得到 \(e(\alpha)\)。
我们可以通过这些操作设计出一种适于有标号类的乘法,称为 partitional product。有标号乘法的思路就是对合并后的部分进行重标号,以避免出现同一个标号出现多次。我们取两个有标号对象 \(\beta \in \mathcal B\) 和 \(\gamma \in \mathcal C\) 我们定义这两个对象的有标号乘法(简称乘法)记作 \(\beta \times \gamma\),一个集合,其包含所有由 \((\beta, \gamma)\) 生成的强标号的有序对 \((\beta', \gamma ')\)。具体的,\(\beta\times \gamma = \{ (\beta', \gamma) \mid (\beta', \gamma ')\) 强标号 ,\(\rho(\beta') = \beta, \rho(\gamma') = \gamma \}\)。
注意到有标号乘积导出的构造中每个对象都是强标号的。假设 \(\beta, \gamma\) 都是强标号的,大小分别为 \(n_1, n_2\),则分配标号的方案总共有 \(\binom{n_1,n_2}{n_1}\) 种。也就是说 \(\lvert\beta\times \gamma\rvert = \dbinom{n_1 + n_2}{n_1}\)。
我们从有标号对象拓展到有标号类 \(\mathcal B\) 和 \(\mathcal C\),定义为 \(\mathcal B \times \mathcal C = \bigcup\limits_{\beta \in \mathcal B, \gamma \in \mathcal C} \beta\times \gamma\),随后我们可以自然地描述计数序列的关系了。
设 \(\mathcal A=\mathcal B\times \mathcal C\) 我们知道 \(\mathcal A_n = \bigcup_{|\beta| + |\gamma| = n} \beta\times \gamma\),\(A[n] = \sum_{i + j = n} \binom{n}{i} B[i]\times C[j]\)。
通过这个构造,我们就可以构造有标号集合、有标号序列和有标号循环了,方法和无标号的构造法类似。
集合的 Sequence 构造生成了所有可能的有序组合。我们定义 \(\text{SEQ}(\mathcal A) = \mathcal E + \mathcal A + \left(\mathcal A \times \mathcal A\right) + \left(\mathcal A \times \mathcal A \times \mathcal A\right) + \cdots\),且要求 \(\mathcal A_0 = \varnothing\),或者说 \(\mathcal A\) 中没有大小为 \(0\) 的组合对象。我们将这种构造生成的组合类写作 \(\text{SEQ}(\mathcal A) = \left\{\left(\beta_1, \beta_2, \dots, \beta_k\right) | k\ge 0, \beta_i \in \mathcal A\right\}\)。翻译为生成函数也就是 \(Q(A(x)) = 1 + A(x) + A^2(x) + A^3(x) + \cdots = \frac{1}{1 - A(x)}\)
其中 \(Q\) 是 Pólya 准逆(\(\text{quasi-inversion}\))
写出 \(\{a,b\}\) 的 \(\text{Sequence}\) 构造。
有序有根树计数
我们可以用 \(\text{Sequence}\) 构造来定义有序有根树(不同儿子之间的顺序有意义的有根树)的计数。设对应的组合类是 \(\mathcal T\),每个儿子属于 \(\mathcal T\) 自身,因此儿子序列对应 \(\text{SEQ}(\mathcal T)\)。也就是说 \(\mathcal T=\mathcal Z \times \text{SEQ}(\mathcal Z)\)。写成生成函数的形式就是 \(T(x)=\frac{x}{1-T(x)}=\frac{1-\sqrt{1-4x}}{2}\),也就是移位的卡特兰数。

浙公网安备 33010602011771号