1.4 基本计数原理的应用Applications of basic counting principles
本页为译文 + 高中讲解合一:黑色正文为忠实翻译;彩色框(目标 / 例 / 分步推演)与配图为面向高中生的详解,逐步推演、举例、画图,不用比喻。
现在,我们要考察一些更复杂的情形,在这些情形里,基本的计数原理会显示出它们的用处。
1.4.1 双射证明
下面这个例子,将教给我们枚举组合学中一种极其重要的证明技巧。
- (a) 我们有多少种方式开到点 \(X=(6,4)\)?
- (b) 如果途中想在 \(Y=(4,2)\) 处的面包店停一下,有多少种方式开到 \(X\)?
- (c) 如果途中想在 \(U=(3,2)\) 处的冰激凌店或 \(V=(2,3)\) 处的咖啡店停一下,有多少种方式开到 \(X\)?
(a) 汽车需要走十个街区:六个向东、四个向北。换句话说,司机要从 \([10]=\{1,2,\dots,10\}\) 中选出一个六元子集,用来指明在第几步向东走。例如,若他选择集合 \(\{2,3,5,7,8,9\}\),那么他的第二、三、五、七、八、九步向东,其余各步(即第一、四、六、十步)向北。由于 \([10]\) 的六元子集共有 \(\binom{10}{6}\) 个,这就是汽车能到达点 \(X\) 的方式数。♦
(b) 汽车先要到达 \(Y\)。由 (a) 的论证,到 \(Y\) 共有 \(\binom{6}{4}=15\) 种方式。然后还要从 \(Y\) 走到 \(X\),由类似论证,共有 \(\binom{4}{2}=6\) 种方式。由于从 \((0,0)\) 到 \(Y\) 的任意一条路径都可以接上从 \(Y\) 到 \(X\) 的任意一条路径,故合法路径总数为 \(\binom{6}{4}\binom{4}{2}=15\cdot 6=90\)。
(c) 用 (b) 中解释的论证,经 \(U\) 从 \((0,0)\) 到 \(X\) 的路径有 \(\binom{5}{3}\binom{5}{3}=100\) 条;经 \(V\) 的路径有 \(\binom{5}{2}\binom{5}{4}=50\) 条。注意,没有任何一条路径会同时经过 \(U\) 与 \(V\)。因此,合法路径总数为 \[\binom{5}{3}\binom{5}{3}+\binom{5}{2}\binom{5}{4}=150.\]
- 第 1 步不在子集里 → 向北;
- 第 2、3 步在子集里 → 连向东两次;
- 第 4 步不在 → 向北;第 5 步在 → 向东;第 6 步不在 → 向北;
- 第 7、8、9 步都在 → 连向东三次;第 10 步不在 → 向北。
- 合计东向步数 \(=6\),北向步数 \(=4\),正好到 \((6,4)\)。每一个 \(6\) 元子集都唯一对应一条路径,反之亦然。
- \(O\to Y=(4,2)\):\(4\) 东 \(2\) 北共 \(6\) 步,选 \(2\) 步向北,\(\binom{6}{2}=\binom{6}{4}=15\) 条。
- \(Y\to X=(6,4)\):还差 \(2\) 东 \(2\) 北共 \(4\) 步,\(\binom{4}{2}=6\) 条。
- 前段任配后段(乘法原理):\(15\times 6=90\) 条。
让我们详细分析上面例子里的论证。在 (a) 中,我们要数从 \((0,0)\) 到 \((6,4)\) 的所有可能路径。我们说这等同于数 \([10]\) 的六元子集。为什么可以这样说?因为在我们的格点路径集合 \(S\) 与 \([10]\) 的六元子集集合 \(T\) 之间,存在一个一一对应。因此必有 \(|S|=|T|\)。注意,这正是定理 1.21(除法原理)在 \(d=1\) 时的特殊情形。
除法原理在 \(d=1\) 时的这一特殊情形如此重要,以至于它有了自己专门的名字。
换句话说,若 \(f:S\to T\) 是双射,它就把 \(S\) 的每个元素与 \(T\) 的一个不同的元素配成一对。
注意,“\(S\) 与 \(T\) 为有限集”这一要求其实可以去掉;这样一来,便可定义这样的概念:若两个无限集合之间存在双射,则称它们具有相同的“大小”。这是一个非常有趣的话题,但它属于集合论教材的范畴,因此我们在此不作讨论。双射的一般图示见图 1.4。
双射的思想,或者说双射证明,在计数论证中被极其频繁地使用。当我们想数出集合 \(S\) 的元素个数时,可以转而去证明:存在一个双射 \(f:S\to T\),其中 \(T\) 是某个我们已知其元素个数的集合。通常的做法是:先定义一个函数 \(f\),再证明这个 \(f\) 确实是从 \(S\) 到 \(T\) 的双射。一旦做到这一点,就能断定 \(|S|=|T|\)。有时我们甚至并不需要知道集合的具体元素个数,只需知道“两个集合元素个数相同”这一事实即可。在那种情形下,双射方法能替我们省去实际的计数。读者将在下一节,乃至本书其余部分,看到这一方法的许多例子。现在,先看几个该方法的简单应用。
由于这是我们的第一个双射证明,我们将把它讲得非常详尽。特别地,我们要演示如何证明一个映射确实是双射。读者不必因为觉得这个证明太“技术化”而气馁——我们所做的全部,不过是通过把两个集合的元素一个一个配对起来,来说明它们一样大。
现在来到证明的核心,即:我们要说明 \(f\) 确实是从 \(S\) 到 \(T\) 的双射。第一,对一切 \(s\in S\),等式 \[\tag{1.6}s\cdot f(s)=n\] 成立,所以 \(f(s)\) 确实是 \(n\) 的约数。第二,必有 \(f(s)<\sqrt{n}\),否则 \(s\cdot f(s)>\sqrt{n}\cdot\sqrt{n}=n\),与 (1.6) 矛盾。因此 \(f(s)\) 总是 \(T\) 的元素,于是 \(f\) 确实是从 \(S\) 到 \(T\) 的函数。
现在要证明 \(f\) 是双射,即:对一切 \(t\in T\),恰好存在一个 \(s\in S\) 使 \(f(s)=t\)。一方面,至少存在一个这样的 \(s\),即 \(s=n/t\)。事实上,由 \(f\) 的定义,\(f(n/t)=\dfrac{n}{n/t}=t\)。另一方面,这个 \(s\) 是唯一合用的:若 \(f(s)=t\),则由 (1.6) 必有 \(s\cdot t=n\),故 \(s=n/t\)。因此 \(f\) 是双射,从而 \(S\) 与 \(T\) 元素个数相同。♦
换句话说,我们不必在区间 \([32,1000]\) 里搜寻约数,只需在短得多的区间 \([1,31]\) 里搜寻。
我们在上例中证明函数 \(f\) 确实是从 \(S\) 到 \(T\) 的双射的方式相当典型。为便于今后引用,我们把这一方法总结如下。
- 在集合 \(S\) 上定义一个有望成为 \(S\to T\) 双射的函数 \(f\)。
- 证明:对一切 \(s\in S\),有 \(f(s)\in T\)(即 \(f\) 真把 \(S\) 映到 \(T\) 里)。
- 证明:对一切 \(t\in T\),恰好存在一个 \(s\in S\) 满足 \(f(s)=t\)。这一步常拆成两小步:
- (a) 证明至少有一个 \(s\) 满足 \(f(s)=t\)(满射);
- (b) 证明至多有一个 \(s\) 满足 \(f(s)=t\)(单射)。
1.4.1.1 卡塔兰数
为了看一个更复杂的双射,让我们回到例 1.26。例中所允许的那种行车路线,称为东北格点路径(northeastern lattice path,即每一步只能向东或向北的格点折线)。东北格点路径在枚举组合学中无处不在,因为它们可以表示形形色色、数目繁多的对象。
为简便起见,一个 \(2\times n\) 的矩形,若其方格里装入 \([2n]\) 的元素、每个元素恰用一次、且每行每列都递增(向右、向下),就称为一个形状为 \(2\times n\) 的标准杨表(Standard Young Tableau,简记 SYT)。
我们的双射 \(f\) 定义如下:设 \(s\in S\)。令 \(e_1,e_2,\cdots,e_n\) 表示 \(s\) 的 \(n\) 个东向步所处的位置。也就是说,如果 \(s\) 的前三个东向步实际上是它的第一、第三、第四步(于是第二、第五、第六步向北),那么 \(e_1=1,\ e_2=3,\ e_3=4\)。类似地,令 \(n_1,n_2,\cdots,n_n\) 表示 \(s\) 的北向步的位置;沿用刚才的例子,则 \(n_1=2,\ n_2=5,\ n_3=6\)。
令 \(f(s)\) 为形状 \(2\times n\) 的阵列,其第一行是 \(e_1,e_2,\cdots,e_n\),第二行是 \(n_1,n_2,\cdots,n_n\)。我们断言 \(f(s)\in T\)。\(f(s)\) 的各行是递增的,因为第 \(i\) 个东向步必发生在第 \((i+1)\) 个东向步之前;北向步同理。我们还断言各列也递增。事实上,若不然,则对某个 \(j\) 有 \(n_j 反过来,对任意标准杨表 \(t\in T\),恰好存在一条路径 \(s\) 使 \(f(s)=t\):表的第一行告诉我们哪几步向东、第二行告诉我们哪几步向北,这就唯一地确定了一条路径;而“列递增”这一条件恰好保证这条路径不越过主对角线。于是 \(f\) 是双射,从而 \(|S|=|T|\)。♦
(说明:本节原文 PDF 页面在引理 1.32 证明“…即对某个 \(j\) 有 \(n_j<e_j\),这意味着”处结束;上面对该证明结尾以及“反过来”一段的论证,按双射方法的标准框架补全,逻辑与原书一致,便于读者完整理解。)
- 同一行内位置自然从小到大,所以每行递增。
- “路径不越过对角线”⟺“任何前缀里东向步不少于北向步”⟺“第 \(j\) 个东向步早于第 \(j\) 个北向步”,即 \(e_j<n_j\),正是每列递增。两件事是同一件事的两种说法。
- 反向也能唯一还原:给定表,第一行的数说明哪几步是 E、第二行说明哪几步是 N,路径被完全确定。
- 东向步在第 \(1,2,4\) 步 → 上行 \(e_1,e_2,e_3=1,2,4\)。
- 北向步在第 \(3,5,6\) 步 → 下行 \(n_1,n_2,n_3=3,5,6\)。
- 拼成杨表 \(\begin{smallmatrix}1&2&4\\3&5&6\end{smallmatrix}\),正是图 1.6 第二个。检查:每行递增(\(1<2<4\),\(3<5<6\)),每列递增(\(1<3,\ 2<5,\ 4<6\)),合格。
返回 全书目录