组合计数课程笔记(二):十二重计数法(初等计数)

组合计数问题是组合数学中重要的最古典的分支。有人将组合计数问题归为 \(12\) 个集合映射问题。但是其中有 \(2\) 个是平凡的,所以我们只研究 \(10\) 个。

十二重计数法

在数学上,严谨的定义是“从一个集合对另一个集合的映射的个数”。但是我们可以用更简单的方法定义它:把 \(n\) 个苹果装进 \(m\) 个盒子的方案数。

首先,我们根据集合的性质来进行分类。对集合 \(S\),如果在映射的过程中,我们令打乱 \(S\) 中的数的顺序后得到的映射和原先的映射是等价的(也就是,在群的形式下,两个映射函数形成等价关系),我们就可以把 \(S\) 中的数划分为同一个等价类,这时我们称 \(S\) 中的元素是不区分的。也就是,所有的苹果 \(/\) 盒子都是相同的。因为有两个集合 \(N\)\(M\),所以一共能分 \(4\) 种。

其次,我们按照映射的性质来分类,分为“不受限”“单射”和“满射”。也就是,每个盒子随便装、最多装一个、最少装一个。

这样,我们列出一张 \(3*4\) 的表,表示所有 \(12\) 种问题。不过其中有 \(2\) 个是平凡的。分别是 XI 和 VIII。

\(\mathrm{N}\) \(\mathrm{M}\) 不受限 单射 满射
区分 区分 \(\text{I: Tuple}\) \(\text{II: Permu}\) \(\text{III: Stir}\)
不区分 区分 \(\text{IV: w-Comp}\) \(\text{V: Binom}\) \(\text{VI: Comp}\)
区分 不区分 \(\text{VII: Stir}\) \(\text{VIII: Ordin}\) \(\text{IX: Stir}\)
不区分 不区分 \(\text{X: GF}\) \(\text{XI: Ordin}\) \(\text{XII: GF}\)

计数公理

映射法则

对于集合 \(S\)\(T\),其中若存在映射 \(f:S\rightarrow T\) 满足:

  • \(f\) 是单射,则 \(|S|\le|T|\)

  • \(f\) 是满射,则 \(|S|\ge|T|\)

  • \(f\) 是双射,则 \(|S|=|T|\)

法则本身的内容只涉及第三条,剩余两条是补充的。其意义在于如果两个集合中的所有元素一一对应,则两者元素数量相同。

实际上,双射法则常常出现在很多的定义中,

乘法法则

不同的代数对象有不同的乘法法则,例如生成函数中的乘法法则就和集合计数的乘法法则不同。

两个集合的笛卡尔积 \(S\times T\) 的定义是 \(\{(a,b)|a\in S,b\in T\}\)

\(|S\times T|=|S|\cdot|T|\)

乘法法则的应用情形是比较好判断和容易使用的。

加法法则

两个不相交的集合 \(S\)\(T\)\(|S\cup T|=|S|+|T|\)

加法法则则不好运用,因为其满足的条件相较苛刻,应用情形难以直观看出,更具技巧性。

组合数

子集总数

组合数是有穷集合的子集。

定义 \([n]\) 的幂集 \(2^{[n]}=\{S|S\subseteq [n]\}\)

我们证明 \(|2^{[n]}|=2^n\)

组合的证明方法是把 \(S\) 表示为一个长 \(n\)\(0/1\) 特征向量(编码集合)。

具体而言,对于 \(i\in [n]\),如果 \(i\in S\),则特征向量的这一位是 \(1\),否则是 \(0\)。我们从而建立了特征向量和子集的双射。而特征向量是 \(\{0,1\}^n\),根据乘法法则,就是 \(2^n\)

或者,我们定义 \(f(n)=|2^{[n]}|\),然后把 \(2^{[n]}\) 表示成 \(\{ S\subseteq [n]|n\in S\}\cup\{ S\subseteq [n]|n\notin S\}\)

则前后无交集且存在双射,都是 \(2^{[n-1]}\)

所以 \(f(n)=2f(n-1)\)

而且 \(2^{\varnothing}=1\) 是良定义的,所以 \(f(n)=|2^n|\)

现在我们在解的是比较简单的线性递推式,那么别的线性递推呢?例如 \(f(n)=a_1f(n-1)+a_2f(n-2)+\cdots+a_kf(n-k)+a_0\)

这就需要使用生成函数的知识解决,例如我的这篇博客讲解了斐波那契数列的通项。

子集

我们定义 \(\text{k-uniform}\)\({S\choose k}=\{T\subseteq S|\ |T|=k\}\)。它涉及到 \(\text{k-complete hypergraph}\) 的一些内容。

十二重计数法

\(\text{I: Tuples}\)

我们定义 \([m]\) 是小于等于 \(m\) 的正整数的集合,那么 \([m]=\{1,2,\cdots,m\}\)

根据乘法原则,它的 \(n\) 次笛卡尔积 \([m]^n\) 的大小 \(|[m]^n|\) 就是值域为 \([1,m]\)\(n\) 元组的个数。

那么我们定义 \(f:[n]\rightarrow [m]\),找到 \(f\) 的真值向量 \((f(1),f(2),\cdots,f(n))\),这个向量的集合就和映射的集合建立了双射。同时它还和值域为 \([1,m]\)\(n\) 元组建立了双射。

那么,映射的个数就是 \(m^n\)

\(\text{II: Permutation}\)

我们还是找到 \(f\) 的真值向量 \((f(1),f(2),\cdots,f(n)\)。但是因为是单射,所以 \((f(1),f(2),\cdots,f(n))\) 是一个排列 \(\pi\),它是 \([m]^n\) 的一个子集。

我们考虑别的方法,我们发现,确定第一位的时候有 \(m\) 种,第二位有 \(m-1\) 种……最终一共有 \(m(m-1)(m-2)\cdots(m-n+1)\) 种。我们记作 \((m)_n\),或者 \(m^{\underline{n}}\),也就是 \(m\)\(n\) 次下降幂。

至于严格论证,我们需要链式法则,它不包含于上述法则中,因为它是另一种积而非笛卡尔积,涉及条件概率。

\(\text{III: Stirling}\)

先看 \(\text{IX: Stirling}\)

然后,我们发现这是一个满射。满射具有什么样的性质呢?对于满射 \(f:[n]\rightarrow [m]\),存在逆射 \(f^{-1}\) 满足对任意的 \(i\in [m]\)\(f^{-1}(i)\neq \emptyset\) 并且 \(f^{-1}(i)\cap f^{-1}(j)=\emptyset\)\(\bigcup f^{-1}(i)=[n]\)。我们发现,如果我们忽视 \(f^{-1}(i)\) 之间的区别,它其实等价于一个 \(n\)\(m\) 的集合划分问题。

那么,假设我们找到了集合划分问题的一组解 \(F=\{f^{-1}(1),\cdots,f^{-1}(m)\}\),我们只要乘上一个 \(\pi\),构成一个笛卡尔积集合 \((F,\pi)\),就和原来的映射构成一个双射,那么根据乘法原则,答案就是 $m!\begin{Bmatrix}n \\m\end{Bmatrix} $。

\(\text{IV: weak k-composition}\)

先看 \(\text{VI: composition}\)

然后,我们构造 \(\text{IV}\)\(\text{VI}\) 的双射。在 \(weak k-composition\) 的解决过程中,我们其实在求 \(k=m\) 元组满足\(\sum x_i=n,x_i\in \mathbb{N}\)。和 \(\text{k-composition}\) 唯一的不同就是允许有 \(0\),那么我们就考虑把 \(0\) 去掉,也就是构造双射 \(\phi((x_1,x_2,\cdots,x_k))=(x_1+1,x_2+1,\cdots,x_k+1)\)。这 \(k\) 个数的和是 \(n+k\),而 \(\ge 1\)。两者的双射关系是显然的,则答案即为 \(n+k\)\(k-composition\),即 \(\binom{n+k-1}{k-1}\),也记作 \((\binom{n}{k})\)

\(\text{V: Binom}\)

我们知道,有序的 \(k\) 元子集个数是 \((n)_k\)\(by II)\),而对 \(k\) 个不同元素的排列运算 \(\pi\) 一共有 \(k!\) 个。

那么,我们假设集合 \(n\) 的无序 \(k\) 元子集的集合是 \(\mathrm{R}\),而排列运算的集合是 \(\pi\),那么构成的笛卡尔积集合 \((\mathrm{R},\pi)\) 和有序 \(k\) 元子集 \(\mathrm{R}\) 构成一个双射。

那么,应用乘法原理和双射原理,得到 \(|\mathrm{R}||\pi|=|\mathrm{S}|\)。解出 \(|\mathrm{R}|=\dfrac{(n)_k}{k!}\)

我们就定义 \(\binom{n}{k}=|\mathrm{R}|=\dfrac{n!}{k!(n-k)!}\),这就是组合数。

  • \(n\) 元集的所有子集 \(S\) 到每个 \(S\) 的补集形成双射,所以 \(\binom{n}{k}=\binom{n}{n-k}\)

  • \(T_i\) 表示 \(S\) 的大小为 \(i\) 的子集的集合,那么 \(\bigcup_{i\in[0,n]}{T_i}=2^S\)。所以 \(\sum{i\in[0,n]}{\binom{n}{i}}=2^n\)

二项式定理

\((1+x)^n=(1+x)(1+x)\cdots(1+x)=\sum{\binom{n}{k}}x^k\)

这个可以通过简单的在中项中选 \(k\) 个来表示。同时,这也给出了 \(\sum_{i\in[0,n]}{\binom{n}{i}}=2^n\) 的另一种证明。

通过二项式定理,如果我们令 \(x=-1\),那么 \(\sum_{i\in[0,n]}{\binom{n}{i}(-1)^i}=0\),也就是 \(\sum_{i是奇数}{\binom{n}{i}(-1)^i}=\sum_{i是偶数}{\binom{n}{i}(-1)^i}\)。也就证明了大小为奇数的子集个数等于大小为偶数的子集个数。

二项式定理的最大的意义在于,我们用加法和乘法这样基础的代数运算的有机结合,创造出了复杂特殊的具有组合意义的组合数。这种用简单运算组合生成想要的量的思想,为生成函数的涌现埋下了刚刚生出的幼芽。

\(\text{VI: composition}\)

找到问题 \(\text{VI}\) 的解,等价于找到一个 \(k=m\) 元组 \((x_1,x_2,\cdots,x_k)\) 满足 \(x_1+x_2+\cdots+x_k=n\)\(x_i \in \mathbb{Z}^{+}\)

它属于一个巨大类问题的特殊形式:线性规划。

整数线性规划是给定 \(k\) 个变量,若干个不等式,求其整数解的数量。其实就是在 \(k\) 维空间中,在划定的一个凸多面体中寻找整点的个数。这个问题是 \(NP-hard\) 的。不过这个问题显然非常特殊,因为它只有一个等式(相当于两个不等式)。

我们可以用插板法。更加严谨的证明,我们需要构造双射。

\(\phi((x_1,x_2,\cdots,x_k))=(x_1,x_1+x_2,\cdots,x_1+x_2+\cdots+x_k)\)

明显的,右边的每个数都不同,并且都小于 \(n\)。并且 \(\phi\) 是一个双射。而右边其实就是 \(n-1\) 的一个大小为 \(k-1\) 的无序子集,所以等于 \(\binom{n-1}{k-1}\)

\(\text{VII: Stirling}\)

先看 \(\text{IX: Stirling}\)

然后的部分非常简单,我们枚举有多少个集合是空的,答案就是 \(\sum_{i\le m}\begin{Bmatrix}n\\i\end{Bmatrix}\)

\(\text{VIII: Ordin}\)

这个问题是平凡的,答案为 \([n\le m]\)

\(\text{IX: Stirling}\)

这个问题等价于集合划分,也就是对 \(S\),找到 \(S_1,S_2,S_3,\cdots,S_k\),满足 \(S_i\cap S_j=\emptyset(i\neq j),S_i\neq \emptyset\),且 \(\bigcup S_i=S\)

我们也将这个问题称为 \(n\) 元集的 \(\text{k-partition}\)。我们定义第二类斯特林数为 \(\begin{Bmatrix}n\\k\end{Bmatrix}\),也就是把 \(n\) 个不同的元素划分到 \(k\) 个集合的方案数。

同时,还有 \(\text{all-partition}\) 问题,这个问题的答案是 \(B_n=\sum_{k\le n}\begin{Bmatrix}n\\k\end{Bmatrix}\),又称贝尔数.

第二类斯特林数有一个递推公式,通过简单的 \(dp\) 就可以得到,\(\begin{Bmatrix}n\\k\end{Bmatrix}=k\begin{Bmatrix}n-1\\k\end{Bmatrix}+\begin{Bmatrix}n-1\\k-1\end{Bmatrix}\)

\(\text{X: GF}\)

先看 \(\text{XII: GF}\)

然后我们枚举几个划分是 \(0\),答案是 \(\sum_{i\le k} p_i(n)\)

\(\text{XI: Ordinary}\)

\(\text{VIII}\) 一样,这个问题是平凡的,答案是 \([n\le m]\)

\(\text{XII: GF}\)

无序的整数划分,也就是找到一组 \((x_1,x_2,\cdots,x_k)\) 满足 \(x_1+x_2+\cdots+x_k=n\)\(x_i \in \mathbb{Z}^{+}\)\(x_1\ge x_2\ge \cdots \ge x_k\)

我们设 \(p_k(n)\) 为把 \(n\) 划分成 \(k\) 个正整数的方案数,然后根据 \(x_k\) 进行讨论。

  • 如果 \(x_k=1\),我们去掉 \(x_k\) 并不会影响答案

  • 如果 \(x_k>1\),所有的 \(x_i\) 都大于 \(1\),把它们都减掉 \(1\) (和减去 \(k\))也不会影响答案。

所以 \(p_k(n)=p_{k-1}(n-1)+p_k(n-k)\),得到了一个递推式子。

我们想办法逼近一下 \(p_k(n)\)

首先,用 \(x_1,x_2,\cdots,x_k\) 构造一个满射,这个满射是 \(({x_1,x_2,\cdots,x_k},\pi)\rightarrow (x_1,x_2,\cdots,x_k)\),也就是 \(\text{k-composition}\)。我们把 \({x_1,x_2,\cdots,x_k}\) 任意排列都会得到一个 \(\text{k-composition}\)

也就是 \((\overline{x},\pi)\rightarrow \overrightarrow{x}\)。由满射原理得 \(|S|\ge |T|\),即 \(k!p_k(n)\ge \begin{pmatrix}n-1\\k-1\end{pmatrix}\)

然后再构造一个单射,我们发现,如果我们把 \(x_i\) 加上 \(k-i\) 的话,序列变得单调不降。并且满足单射条件。而如果单调不降,就又可以双射到 \(k-composition\)

在构造的过程中,我们一共给数加上了 \(\dfrac{k(k-1)}{2}\),所以由单射原理得 \(k!p_k(n)\le \begin{pmatrix}n+\dfrac{k(k-1)}{2}-1\\k-1\end{pmatrix}\)

由此又得到 \(\dfrac{\begin{pmatrix}n-1\\k-1\end{pmatrix}}{k!}\le p_k(n)\le \dfrac{\begin{pmatrix}n+\dfrac{k(k-1)}{2}-1\\k-1\end{pmatrix}}{k!}\)。而若 \(k\) 是常数,\(n\rightarrow \infty\),则 \(p_k(n)\sim \dfrac{n^{k-1}}{k!(k-1)!}\)

实际上,这个范围就是初等计数所能达到的终点了,它象征着一个时代的终点,用一把斧头就能劈开前路的情况已然不再,没有舟船,谁也无法度过汪洋大海。

你只得到此,不能逾越

拉努马金的研究告诉我们 \(p(n)=\sum p_k(n)\approx \dfrac{1}{4n}\exp{\pi\sqrt{\dfrac{2n}{3}}}\)

\(OI\) 中,想要计算划分数,需要用到 \(\text{GF}\) \(\text{Girl Friend}\) \(\text{Generating Function}\)

埋下的种子将发芽。

相关的其他计数

可重集的 \(k\) 元子集

我们现在有一个集合 \(\{1,2,3,4\}\),它的大小为 \(3\) 的子集是 \(\{1,2,3\}\{1,2,4\}\{1,3,4\}\{2,3,4\}\)

但是,如果我们需要的是它的可重子集呢?那就可以是 \(\{1,1,1\}\{1,1,2\}\) 等等很多的答案。

要计算可重子集的个数,先要明确可重集的定义。

可重集是从集合 \(S\)\(\mathbb{N}\) 的一个映射。

我们可以用 \(0/1\) 串来表示子集,也就是 \(x_i\) 表示 \(S\) 中的第 \(i\) 个数是否出现在子集中。这是从 \(S\)\(\{0,1\}\) 的映射。那么从 \(S\)\(\mathbb{N}\) 的映射就是 \(m(i)\) 可以为任意的正整数,子集的大小就是 \(\sum m(i)\)

我们发现,这个求可重集的 \(k\) 元子集个数,就是 \(\sum m(i)=k,m(i)\in \mathrm{N}\),等价于十二重计数法之 \(IV\)。答案就是 \(\binom{n+k-1}{k-1}\)

多项式系数

我们考虑多重集 \(S\) 的排列。如果我们将其可视化,就是若干个可重的字母,求其排列个数。

形式化的,对于集合 \(T\)\(\mathrm{N}\) 的映射一个映射 \(m(i)\),求其排列个数。我们可以先计算 \(|S|\) 的全排列 \(n!\)。在每个排列中,每个字符之间的全排列都是等价的,也就是对于 \(i\)\(m(i)!\) 个排列等价,那么最终的答案就是 \(\dfrac{n!}{m(1)!m(2)!m(3)!\cdots m(k)!}\),记作 \(\binom{n}{m(1),m(2),\cdots,m(k)}\)

同时,有多项式定理:\((x_1+x_2+\cdots+x_k)^n=\sum_{m_1+m_2+\cdots+m_k=n}\binom{n}{m_1,m_2,\cdots,m_k}x_1^{m_1}x_2^{m_2}\cdots x_k^{m_k}\)

这也是一种形式的代数生成。

posted @ 2023-02-17 15:18  jucason_xu  阅读(184)  评论(0编辑  收藏  举报