组合符号化

组合符号化构造

将组合对象快速转化为生成函数方法

无标号组合构造

无标号组合构造食用 OGF。

我们定义一个组合类 \((A,|·|)\) ,其中 \(A\) 是对象集合,而 \(|·|\) 将每个对象变成它的大小函数。如字符串长度,图的点集大小等。如对于 \(A=\lbrace 0,1\rbrace\),则 \(|0|=|1|=1\)

一些定义:

  • 集合 \(A\) 中设 \(a_i\) 为大小为 \(i\) 的元素个数,则可以用 OGF \(A(z)=\sum_{\alpha \in A}z^{|\alpha|}=\sum_{i=0}a_iz^i\) 表示。
  • \(\epsilon\) 中性对象,可以理解为空,有 \(|\epsilon|=0\)
  • \(\bullet\) 原子对象,\(|\bullet|=1\),对应 OGF 中的 \(z\),可以理解为指定根等。
  • 组合类 \(A,B\) 同构记作 \(A=B\)
  • 笛卡尔积:\(A\times B=C\)\(C=\lbrace(a,b)|a\in A,b\in B\rbrace\),对应 OGF 运算 \(A(z)\times B(z)=C(z)\),对应组合意义是把两个集合进行两两组合。
  • 集合并,要求两个集合没有交集 \(A\cup B=C\implies A(z)+B(z)=C(z)\)

笔者初学难以理解的地方:其实 \([z^n]A(z)\) 的系数是指的不同的大小为 \(n\) 的元素个数

一些常用的Trick:

\(A(z)+1\):指定一个空组合对象,这样在计数的时候会方便一些

\(A(z)+z\):图计数的时候相当于指定一个根,也可以说是原点

\(SEQ\) 构造

生成所有组合,不考虑顺序。例如 \(\lbrace a,b,c\rbrace\) 会生成 \(\epsilon,a,b,c,ab,bc,ab,aaa,aab,aba,abc,abb,acc,baa……\)

\[\begin{aligned} SEQ(A)(z)&=\sum_{i=1}A(z)^i\\ &=\frac{1}{1-A(z)} \end{aligned} \]

实现:多项式求逆即可。

\(MSET\) 构造与 \(Euler\) 变换

生成所有组合,去掉重复顺序。

例如 \(\lbrace a,b\rbrace\) 会生成 \(\epsilon,a,b,aa,ab,bb,aaa,aab,abb,bbb……\)

\[\begin{aligned} MSET(A)&=\prod_{\alpha \in A}SEQ(z^{|\alpha|})\\ &=\prod_{\alpha \in A}\frac{1}{1-z^{|\alpha|}}\\ &=\prod_{i\ge 0}(\frac{1}{1-z^i})^{a_i}\\ &=\exp(\ln\prod_{i\ge 0}(1-z^i)^{-a_i})\\ &=\exp(\sum_{i\ge 0}a_i\ln \frac{1}{1-z^i})\\ &=\exp(\sum_{i\ge 0}a_i\left(\sum_{j\ge 0}\frac{z^{ij}}{j}\right)\\ &=\exp(\sum_{i\ge 0}\frac{a_i}{j}z^{ij})\\ &=\exp(\sum_{i\ge 0}\frac{A(z^i)}{i})\\ \end{aligned} \]

可以 \(O(n\log n)\) 计算 \(\sum_{i\ge 0}\frac{A(z^i)}{i}\) 然后 \(\exp\) 即可。

\(PSET\) 构造

\(CYC\) 构造与 \(Burnside\) 引理

有限制的组合构造

逆变换

有标号组合构造

标号与 \(exp\) 组合意义

\(SEQ\) 构造

\(POI\) 构造

\(CYC\) 构造

\(SET\) 构造

\(Sub\) 构造

\(BOX\) 构造

参考资料:

posted @ 2024-05-14 13:42  spdarkle  阅读(5)  评论(0)    收藏  举报