CMU-21-218-离散数学笔记-全-
CMU 21-218 离散数学笔记(全)
001:课程介绍与计数入门
概述
在本节课中,我们将学习卡耐基梅隆大学离散数学课程的基本介绍,并深入探讨组合数学中的计数原理。我们将从简单的计数问题开始,逐步引入更复杂的场景,并学习如何运用递归等高级技巧来解决问题。
课程介绍与安排
大家好,欢迎来到卡耐基梅隆大学。这是新学期的第一天。很高兴见到大家。本课程是关于离散数学的。我们将讨论处理离散对象的各种方法。离散对象可以表现为计数问题,这通常被称为组合数学。我们也会讨论网络等概念。
本课程将涵盖许多不同的主题。课程将通过Zoom进行。如果你有问题或想发言,请在聊天框中输入“raise hand”或“RH”。我会点名让你发言。我理解并非所有人都能打开摄像头和麦克风。但如果你可以,我建议你打开,这样课堂体验会更像与真人一起学习,而不是面对黑屏白字。
课程评分方式如下:作业占10%,考试占60%(三次期中考试),期末考试占30%。作业可以讨论合作,但提交的答案必须是亲自完成。考试将是开卷开卷考试,但需要在Zoom上进行,并打开摄像头。
课程没有固定教材,但有一本由往届学生编写的详细笔记,将作为我们的参考书。我会在每周课程后分享相应的部分。
计数原理入门
上一节我们介绍了课程的基本情况,本节中我们来看看组合数学中最基础的部分:计数。
计数问题通常询问“有多少种方式”来完成某事。我们从一些简单问题开始,逐步增加难度。

基础乘法原理
第一个问题:有多少个四位数?
一个直接的思路是:一个四位数有四个位置。每个位置(数字)有10种选择(0-9)。根据乘法原理,总数为 10 * 10 * 10 * 10 = 10000。
然而,如果我们规定第一个数字不能为0(即它是一个真正的四位数),那么第一个数字只有9种选择(1-9),其他位置仍有10种选择。因此,答案是 9 * 10 * 10 * 10 = 9000。
乘法原理有效的逻辑在于:无论第一个数字选择什么,第二个数字始终有10种选择。因此可以相乘。
引入约束条件
现在,我们增加一个约束条件:有多少个四位数(首位非零),且没有两个相同的数字相邻?
以下是解决思路:
- 第一位有9种选择(1-9)。
- 对于第二位,它可以选0-9中任意一个数字,但不能与第一位相同。因此,无论第一位选了什么,第二位总有9种选择。
- 第三位同样可以选0-9中任意数字,但不能与第二位相同。所以也是9种选择。
- 第四位同理,不能与第三位相同,也是9种选择。
因此,答案是 9 * 9 * 9 * 9 = 9^4。
这个问题的关键在于计算顺序。我们必须从左到右计算,因为约束条件“不能与左边相邻数字相同”依赖于前一个选择。如果从右往左算,会遇到麻烦:当计算最左边的数字时,它的选择数量取决于它右边的数字是否为0,这会使得计算复杂,只能得到一个答案的范围(介于 10*9*9*8 和 10*9*9*9 之间),而非精确值。
复杂计数问题与递归思想
上一节我们处理了带有相邻数字约束的计数问题,本节中我们来看看一个更复杂的问题,并引入递归的解决思路。
一个更具挑战性的问题
问题:有多少个四位数(首位非零),满足偶数,且没有两个相同的数字相邻?
这是一个复杂的问题。直接应用乘法原理很困难,因为最后一位必须是偶数(0,2,4,6,8),但它的选择又受到倒数第二位数字的影响。
我们可以尝试两种思路,但都只能得到答案的范围:
- 从左往右算:第一位9种,第二、三位各9种,最后一位是偶数。但最后一位的选择数取决于第三位是否是偶数。这给出了一个范围:
9^3 * 4到9^3 * 5。 - 从右往左算:最后一位5种(偶数),向前推。同样,最左边的数字选择数取决于其右边数字,得到另一个范围:
10*9*9*5到9*9*9*5。
这些范围重叠,但无法给出精确答案。一种可行但繁琐的方法是分情况讨论,根据前三位数字的奇偶性(共8种情况)分别计算。虽然可行,但过程冗长。
寻找新模式:递归
面对复杂问题,一个有效的策略是先解决更小规模的同类问题,寻找模式。
我们先定义:
- E(n):满足条件(无相同相邻数字,首位非零)的 n 位偶数 的个数。
- O(n):满足条件的 n 位奇数 的个数。
计算小规模问题:
- n=1(一位数): E(1) = 4 (2,4,6,8), O(1) = 5 (1,3,5,7,9). 总数 = 9。
- n=2(两位数): 通过枚举或简单计算可得,E(2) = 41, O(2) = 40. 总数 = 81 = 9^2。
这里出现一个有趣现象:E(2) 和 O(2) 非常接近,仅相差1。总数是9的幂。
关键递归关系:
要构建一个 n+1 位的偶数,我们看最后一位(第 n+1 位):
- 如果前 n 位以偶数结尾,那么最后一位必须选一个偶数,且不能等于第 n 位的数字。因此有 4 种选择(5个偶数中减去1个)。
- 如果前 n 位以奇数结尾,那么最后一位选任意偶数都不与奇数冲突。因此有 5 种选择。
因此,我们得到了递归公式:
E(n+1) = 4 * E(n) + 5 * O(n)
由于总数 T(n) = E(n) + O(n) = 9^n,我们也有 O(n) = 9^n - E(n)。利用这个关系和递归公式,我们可以递推计算:
- E(3) = 4E(2) + 5O(2) = 441 + 540 = 364. O(3) = 9^3 - 364 = 729 - 364 = 365.
- E(4) = 4E(3) + 5O(3) = 4364 + 5365 = 3281. 这就是我们最初问题的答案。
通用公式与总结
观察 E(n) 的序列:4, 41, 364, 3281...
它们非常接近 9^n / 2,并且交替地进行“向上取整”和“向下取整”。事实上,可以推导出精确的通项公式:
E(n) = (9^n + (-1)^n) / 2
验证:
- n=1: (9 - 1)/2 = 4
- n=2: (81 + 1)/2 = 41
- n=3: (729 - 1)/2 = 364
- n=4: (6561 + 1)/2 = 3281
完全匹配。

本节课中我们一起学习了计数问题的基本乘法原理,处理了带有约束条件的计数,并最终通过定义序列、发现递归关系,解决了一个复杂的计数问题,甚至推导出了其优美的通项公式。这展示了离散数学中,将复杂问题分解、寻找模式、建立递归关系这一强大而优雅的思维方式。
002:递归、矩阵与路径计数


在本节课中,我们将继续探讨一个有趣的计数问题,并学习如何运用递归关系和矩阵工具来解决它。我们还将接触一个更经典的网格路径计数问题,并学习如何处理路径中的障碍。
问题回顾与递归建立
上一节我们留下了一个有趣的问题:统计满足以下条件的四位数个数:
- 相邻数字不相等。
- 数字是偶数。
我们定义了两个序列:
- E_n:满足条件的 n 位偶数的个数。
- O_n:满足条件的 n 位奇数的个数。
对于初始情况,我们很容易得出:
- E_1 = 4 (数字为 2, 4, 6, 8)
- O_1 = 5 (数字为 1, 3, 5, 7, 9)
为了建立递归关系,我们考虑如何从一个 n 位数构造一个 n+1 位数。
情况一:如果原来的 n 位数是偶数(E_n 种可能),要使其保持为偶数,最后一位必须是一个不同于原最后一位的偶数。有 4 个偶数可选(5个偶数去掉已用的那个)。因此,这种情况贡献了 4 * E_n 种可能。
情况二:如果原来的 n 位数是奇数(O_n 种可能),要使其变为偶数,最后一位可以是任意一个偶数(5个)。因此,这种情况贡献了 5 * O_n 种可能。
综合两种情况,我们得到关于偶数的递归式:
E_{n+1} = 4E_n + 5O_n
同理,我们可以推导出关于奇数的递归式:
O_{n+1} = 5E_n + 4O_n
引入矩阵工具
上一节我们介绍了递归关系,本节我们来看看如何用矩阵这个强大的工具来求解它。
上述递归关系可以漂亮地改写为矩阵形式:
[ E_{n+1} ] = [ 4 5 ] [ E_n ]
[ O_{n+1} ] [ 5 4 ] [ O_n ]
我们将其简写为:
v_{n+1} = M * v_n
其中 v_n = [E_n, O_n]^T, M = [[4, 5], [5, 4]]。
这个形式的好处是,我们可以通过连续应用矩阵 M 来得到通项公式:
v_n = M^{n-1} * v_1
其中 v_1 = [4, 5]^T。
我们的目标 E_n 就是向量 v_n 的第一个分量。问题转化为如何高效计算矩阵 M 的幂 M^{n-1}。
矩阵对角化:简化幂运算
计算矩阵的高次幂通常很复杂,但对于某些特殊矩阵(如这里的 M),我们可以通过“对角化”来极大地简化计算。
我们发现矩阵 M 有两个很好的性质:
- M * [1, 1]^T = 9 * [1, 1]^T
- M * [1, -1]^T = (-1) * [1, -1]^T
在线性代数中,数字 9 和 -1 被称为矩阵 M 的特征值,向量 [1, 1]^T 和 [1, -1]^T 被称为对应的特征向量。
利用这两个性质,我们可以将 M 分解为:
M = P * D * P^{-1}
其中:
- P = [[1, 1], [1, -1]] (由特征向量组成的矩阵)
- D = [[9, 0], [0, -1]] (由特征值组成的对角矩阵)
- P^{-1} 是 P 的逆矩阵。
这个分解的妙处在于,计算 M 的幂变得非常简单:
M^k = (P * D * P{-1})k = P * D^k * P^{-1}
因为中间的 P^{-1} * P 会相互抵消。而对角矩阵 D 的幂极易计算:
D^k = [[9^k, 0], [0, (-1)^k]]
推导最终公式
将上述结果代入通项公式 v_n = M^{n-1} * v_1,并经过一系列矩阵乘法运算(具体计算过程课上已演示),我们可以得到 E_n 的闭合表达式:
E_n = (1/2) * 9^{n-1} + (1/2) * (-1)^{n-1}
这个简洁的公式完美地解答了我们最初的问题,也揭示了答案中同时出现 9^{n-1} 和 (-1)^{n-1} 的原因。
经典路径计数问题
现在,让我们转向一个更经典的组合数学问题:网格路径计数。
考虑一个 4x4 的菱形网格(如幻灯片所示),我们从最顶端的点出发,每一步只能向左下或右下走,最终到达最底端的点。请问有多少条不同的路径?
解决这个问题的关键在于将路径编码为指令序列。因为从顶端到底端需要走 4 步“左下”(L)和 4 步“右下”(R),总共 8 步。
一条路径就对应一个由 4 个 L 和 4 个 R 组成的特定序列。例如,路径 L, R, R, L, L, R, R, L。
因此,路径总数就等于:在 8 个位置中,选择 4 个位置放置 L(剩下的位置自动放 R)的方案数。这就是组合数 C(8, 4)(读作“8选4”):
C(8, 4) = 8! / (4! * 4!) = 70
处理带有障碍的路径
现在,我们让问题变得复杂一点:如果在网格中央移除一条边(形成一个“洞”),那么有多少条不经过这个洞的路径?
我们可以使用“减法原理”来解决。总路径数减去经过这个洞的路径数,就是不经过洞的路径数。
总路径数我们已经知道是 C(8, 4)。
关键是如何计算经过那个特定洞的路径数。任何经过该洞的路径,都可以被分解为两个独立的部分:
- 从起点走到洞的左端点的路径。
- 从洞的右端点走到终点的路径。
由于网格的结构,第一部分相当于在一个较小的网格中走 3 步(需要 1 个 L 和 2 个 R),路径数为 C(3, 1)。第二部分相当于在另一个网格中走 4 步(需要 2 个 L 和 2 个 R),路径数为 C(4, 2)。
因为第一部分和第二部分的选择是独立的,所以经过洞的路径总数为 C(3, 1) * C(4, 2)。
因此,最终不经过洞的路径数为:
C(8, 4) - C(3, 1) * C(4, 2)
总结
本节课中我们一起学习了:
- 如何将一个复杂的计数问题(无重复相邻数字的偶数)转化为递归关系。
- 如何利用矩阵将递归关系系统化,并通过矩阵对角化的技巧(特征值和特征向量)求出问题的闭合解 E_n = (1/2) * 9^{n-1} + (1/2) * (-1)^{n-1}。
- 如何解决经典的网格路径计数问题,其核心是将路径映射为指令序列,并利用组合数 C(n, k) 进行计算。
- 如何使用“减法原理”和“分步乘法原理”来处理带有障碍的路径计数问题。

这些方法展示了组合数学中递归、代数工具和基本计数原理的强大结合。
003:组合计数基础与递推关系

在本节课中,我们将学习组合计数中的几个核心概念,包括排列、组合、二项式系数以及如何通过递推关系(如动态规划)和数学归纳法来解决计数问题。我们将从简单的字母重排问题开始,逐步深入到更复杂的网格路径计数和数字序列问题。


排列与组合
上一节我们介绍了课程的整体目标,本节中我们来看看如何计算包含重复元素的排列数。
多重集合的排列
考虑一个具体问题:如何计算由3个A、2个B和2个C组成的字符串的所有不同排列数量?
以下是解决此问题的两种方法:
-
先区分后除法:
- 首先,假设所有7个字母都是可区分的(例如,A₁, A₂, A₃, B₁, B₂, C₁, C₂)。那么它们的排列数为
7!。 - 然而,实际上相同的字母是不可区分的。例如,交换两个A的位置不会产生新的排列。因此,我们需要除以每种字母内部排列所导致的重复计数。
- 最终公式为:
7! / (3! * 2! * 2!)。
- 首先,假设所有7个字母都是可区分的(例如,A₁, A₂, A₃, B₁, B₂, C₁, C₂)。那么它们的排列数为
-
分步选择法:
- 另一种思路是分步为字母选择位置。
- 首先从7个位置中选择3个放置A:
C(7, 3)。 - 然后从剩余的4个位置中选择2个放置B:
C(4, 2)。 - 最后剩下的2个位置自动留给C:
C(2, 2) = 1。 - 总排列数为:
C(7, 3) * C(4, 2)。
可以证明,这两种方法得出的结果是相同的:
C(7, 3) * C(4, 2) = (7!/(3!4!)) * (4!/(2!2!)) = 7! / (3! * 2! * 2!)。
二项式系数与多项式系数
像 C(n, k) 这样的数被称为二项式系数,因为它们出现在二项式展开 (x + y)^n 中,是 x^k * y^(n-k) 项的系数。
类似地,n! / (k1! * k2! * ... * km!)(其中 k1 + k2 + ... + km = n)被称为多项式系数,它出现在多项式 (x1 + x2 + ... + xm)^n 的展开式中,是 x1^k1 * x2^k2 * ... * xm^km 项的系数。
网格路径计数
上一节我们学习了处理静态排列的方法,本节中我们来看看如何计算动态路径的数量。
完整网格中的路径
考虑一个从顶部到底部的方形网格,每次只能向右或向下移动一步。从左上角到右下角,需要恰好走4步向右(R)和4步向下(D)。因此,路径总数等于由4个R和4个D组成的序列的排列数。
路径总数公式为:C(8, 4) = 8! / (4! * 4!) = 70。
动态规划方法
对于更复杂的网格(例如存在障碍),我们可以使用动态规划方法。其核心思想是:到达某个点的路径数,等于到达其上方和左方相邻点的路径数之和(前提是能从那些点直接到达该点)。
以下是具体步骤:
- 在起点标记
1。 - 对于网格中的每个其他点,其路径数 = 从其正上方点可到达的路径数 + 从其正左方点可到达的路径数。
- 依次计算每个点的值,最终右下角的值即为总路径数。
对于完整的4x4网格,此方法会生成著名的帕斯卡三角形,其中的数字正是二项式系数。
带有“空洞”的网格
如果网格中缺失了一条边,我们可以结合两种方法:
- 补集原理:总路径数(无空洞)减去必须经过缺失边的路径数。
- 动态规划:直接在有空洞的网格上应用上述递推规则,遇到缺失边时,相应的贡献为0。
两种方法应得到相同的结果,这验证了我们方法的正确性。
递推关系与数学归纳法
上一节我们通过具体计数解决了路径问题,本节中我们来看看如何用公式和证明来处理更抽象的序列计数。
问题回顾:偶数数字序列
定义 E(n) 为满足以下条件的 n 位数字序列个数:
- 每位数字属于 {0, 1, ..., 9}。
- 序列是偶数(最后一位为偶数)。
- 没有两个相邻数字相同。
我们之前推导出 E(n) 满足以下递推关系:
E(1) = 4(数字 0, 2, 4, 6, 8,但0通常不作为首位,此处指一位数,所以是4个偶数)。E(n+1) = 4 * E(n) + 5 * O(n),其中O(n)是以奇数结尾的满足条件的序列数。- 类似地,
O(n+1) = 5 * E(n) + 4 * O(n)。
此外,我们知道所有满足“无相邻相同数字”的 n 位数总数是 9^n(首位9种选择,之后每位有9种选择避免与前者相同),即 E(n) + O(n) = 9^n。
通过归纳法证明通项公式
我们声称 E(n) 的通项公式为:
E(n) = (9^n + (-1)^n) / 2
证明(数学归纳法):
- 基础步骤 (n=1):
E(1) = 4,公式给出(9^1 + (-1)^1)/2 = (9-1)/2 = 4。成立。 - 归纳步骤:假设公式对
n成立,即E(n) = (9^n + (-1)^n)/2。- 由
E(n) + O(n) = 9^n,可得O(n) = 9^n - E(n) = (9^n - (-1)^n)/2。 - 将其代入递推式:
E(n+1) = 4 * E(n) + 5 * O(n)
= 4*((9^n + (-1)^n)/2) + 5*((9^n - (-1)^n)/2)
= (4*9^n + 4*(-1)^n + 5*9^n - 5*(-1)^n) / 2
= (9*9^n + (-1)*(-1)^n) / 2
= (9^(n+1) + (-1)^(n+1)) / 2
这正好是n+1时的公式形式。因此,由归纳法,公式对所有正整数n成立。
- 由
这个证明表明,即使不依赖求解特征值和特征向量的线性代数技巧,我们也能通过巧妙的代数变换和数学归纳法验证递推关系的解。

本节课中我们一起学习了组合计数的多种工具:处理重复排列的公式、计算路径的动态规划思想、以及利用递推关系和数学归纳法求解序列计数问题。这些方法为后续学习更复杂的离散数学结构奠定了基础。
004:狄利克雷逼近定理


在本节课中,我们将学习如何用分数来逼近实数,并介绍一个由狄利克雷提出的重要定理。这个定理揭示了,对于任意实数,都存在无限多个“特别好”的分数近似值。
一个简单的起点
上一节我们介绍了用分数逼近实数的基本概念,本节中我们来看看一个简单的定理。
定理(简单版):对于任意实数 α 和任意正整数 N,总存在整数 P 和 Q(其中 1 ≤ Q ≤ N),使得:
| α - P/Q | ≤ 1/Q
证明:
我们可以选择 Q = N。现在考虑数轴,α 位于某个位置。数轴上存在一系列等间距的点:1/N, 2/N, 3/N, …。α 必然落在某两个相邻点之间,这个区间的宽度是 1/N。我们选择 P 为离 α 最近的那个点的分子。这样,P/N 与 α 的距离就不会超过区间宽度的一半,即 ≤ 1/(2N),这当然满足 ≤ 1/N 的条件。因此,这样的 P 和 Q 总是存在的。
这个定理很容易证明,但它给出的逼近精度(1/Q)并不算特别优秀。
更强大的定理:狄利克雷逼近
我们之前看到的 π 的近似值(如 22/7 和 355/113)之所以令人印象深刻,是因为它们用较小的分母获得了非常高的精度。这引出了一个更强有力的定理。
定理(狄利克雷,黄色版):对于任意实数 α,存在无限多对整数 P 和 Q,使得:
| α - P/Q | ≤ 1/Q²
这个定理比简单版强在哪里?
- 它要求逼近误差在 1/Q² 以内,而 1/Q² 比 1/Q 小得多(当 Q>1 时)。
- 它断言这样的“优秀”近似值有无穷多个。
备注:指数 2 在这里是最优的。一般来说,不能将定理中的指数 2 替换为更大的数(如 3)并期望定理仍然成立。
证明思路:一个更强的等价形式
为了证明黄色定理,我们将借助一个看起来略有不同但更强的“绿色”定理。
定理(狄利克雷,绿色版):对于任意实数 α 和任意正整数 N,总存在整数 P 和 Q(其中 1 ≤ Q ≤ N),使得:
| α - P/Q | ≤ 1/(QN)
为什么绿色定理能推出黄色定理?
- 得到一个近似值:根据绿色定理,对于给定的 α 和 N,我们可以得到一对 (P, Q) 满足 |α - P/Q| ≤ 1/(QN)。
- 提高精度:由于 Q ≤ N,所以 1/(QN) ≤ 1/(Q²)。因此,这对 (P, Q) 自动满足黄色定理的条件:|α - P/Q| ≤ 1/Q²。
- 得到无穷多个:绿色定理对每一个正整数 N 都成立。我们可以取 N = 1, 2, 3, … 从而得到无穷多个不同的 (P, Q) 对……但这里有个小陷阱:不同的 N 可能会产生相同的 (P, Q)。我们需要确保能得到无穷多个不同的分数。
处理“可能重复”的问题:
我们需要分情况讨论:
- 情况一:α 是有理数。如果 α 本身就是一个分数 A/B,那么我们可以直接构造无穷多个精确等于 α 的分数:A/B, 2A/(2B), 3A/(3B), …。这显然满足黄色定理。
- 情况二:α 是无理数。我们使用反证法。
- 假设:只存在有限个满足 |α - P/Q| ≤ 1/Q² 的分数。
- 分析:因为 α 是无理数,这些有限个分数都不等于 α。所以在数轴上,α 和这些分数之间有一个最小的正距离(记作 d > 0)。
- 矛盾:根据绿色定理,对于任意 N,我们都能找到一个分数满足 |α - P/Q| ≤ 1/(QN) ≤ 1/N。如果我们取一个足够大的 N,使得 1/N < d,那么根据绿色定理找到的新分数,其与 α 的距离将小于 d。但这与“d 是到所有已知分数的最小距离”相矛盾。
- 结论:因此,假设不成立,必须存在无穷多个这样的分数。
至此,我们证明了只要绿色定理成立,黄色定理就成立。所以,现在的核心任务是证明绿色定理。
绿色定理的等价变形
绿色定理的表述中同时含有 Q 和 N,看起来有些复杂。我们可以将其转化为一个更简洁的等价形式。
绿色定理的等价形式:对于任意实数 α 和任意正整数 N,总存在整数 P 和 Q(其中 1 ≤ Q ≤ N),使得:
| Qα - P | ≤ 1/N
为什么等价?
将原不等式 |α - P/Q| ≤ 1/(QN) 两边同时乘以 Q,即可得到 |Qα - P| ≤ 1/N。反之亦然。
这个形式更有启发性。|Qα - P| 表示 Qα 到最近整数 P 的距离。所以定理是在说:在 α, 2α, 3α, …, Nα 这 N 个数中,至少有一个数,它到某个整数的距离不超过 1/N。
最终等价表述:
对于任意实数 α 和任意正整数 N,在集合 {α, 2α, 3α, …, Nα} 中,至少有一个数落在某个整数的 1/N 邻域内(即与某个整数的距离 ≤ 1/N)。
这个陈述完全摆脱了分数和不等式,将逼近问题转化为研究实数倍数的分布问题。它优美地揭示了:随着 N 增大(我们考察的倍数增多),我们“命中”整数附近区域的机会也在增加,并且命中的精度(1/N)也越来越高。
总结与预告
本节课中我们一起学习了:
- 用分数逼近实数的基本思想。
- 狄利克雷逼近定理的两种形式:
- 黄色版(核心结论):对任意实数,存在无穷多个分数逼近,精度高达 1/Q²。
- 绿色版(证明关键):对任意实数 α 和任意 N,存在分母不超过 N 的分数,精度高达 1/(QN)。
- 我们通过逻辑推导证明了绿色定理可以推出黄色定理。
- 我们将绿色定理等价转化为一个关于数列 {α, 2α, …, Nα} 分布性质的陈述。
在下节课中,我们将完成这个定理的证明。你会发现,证明这个关于实数倍数分布的命题,将巧妙地运用组合数学中的鸽巢原理。这正是离散数学魅力的体现:用离散的工具解决连续的问题。

注:本教程根据卡耐基梅隆大学离散数学课程(21-228 2023)第4讲内容整理翻译,并按照要求进行了结构化处理、语气词删除、核心概念突出及行文流畅化调整。
005:鸽巢原理与序列结构 🐦


在本节课中,我们将学习两个核心概念:迪尔沃思逼近定理的证明,以及埃尔德什-塞凯赖什定理的引入。我们将看到,看似复杂的数论问题可以通过简单的组合原理(鸽巢原理)巧妙解决,并探索实数序列中必然存在的有序子结构。
迪尔沃思逼近定理的证明 🔍
上一节我们介绍了迪尔沃思逼近定理,它表明任何实数都可以用分数无限地、高精度地逼近。本节中,我们来看看如何利用鸽巢原理来证明这个定理的一个关键引理。
从定理到鸽巢原理
我们回顾一下需要证明的引理:对于任意实数 α 和任意正整数 N,在序列 {α, 2α, 3α, ..., Nα} 中,存在某个倍数 kα,其与某个整数的距离不超过 1/N。
为了证明这一点,一个自然的想法是将数轴“卷起来”看成一个周长为1的圆。在这个圆上,整数点都重合在0点,而实数 α 的位置由其小数部分决定。
构造“鸽巢”
现在,我们将这个单位圆均匀地分成 N 个区间。每个区间的长度为 1/N,并且我们规定这些区间是“左闭右开”的,以确保圆上的每一个点都恰好属于一个区间。
以下是划分方式:
- 区间 1: [0, 1/N)
- 区间 2: [1/N, 2/N)
- ...
- 区间 N: [(N-1)/N, 1)
接下来,我们考虑 N+1 个点:{0, α, 2α, 3α, ..., Nα} 在这个圆上的位置。注意,我们特意加入了 0 这个点。
应用鸽巢原理
我们现在有 N+1 个“鸽子”(即这些点),要把它们放入 N 个“鸽巢”(即划分好的区间)中。根据鸽巢原理,至少有一个区间包含了至少两个点。
假设这两个点是 iα 和 jα(其中 i < j)。由于它们在同一个长度为 1/N 的区间内,因此它们在圆上的距离(即它们小数部分之差的绝对值)严格小于 1/N。
“倒拨时钟”与完成证明
关键的观察来了:如果我们从这两个数中同时减去 iα,它们之间的距离保持不变。即:
|jα - iα| = |(j-i)α - 0| < 1/N
由于 i 和 j 都是从 0 到 N 的整数,它们的差 (j-i) 必然是 1 到 N 之间的一个整数。我们记 k = j-i。
于是我们得到:kα 与整数 0 的距离小于 1/N。这正是我们需要证明的结论。
为什么需要包含0点? 因为两个点 iα 和 jα 的差 kα 可能恰好等于 0α(即0),如果其中一个点本来就是0,那么另一个点本身就满足条件。包含0点保证了无论哪种情况,我们都能构造出有效的 k。
埃尔德什-塞凯赖什定理引入 📊
证明了迪尔沃思定理后,我们转向一个看似不同但同样深刻的问题:实数序列中必然存在的有序性。这是由著名数学家保罗·埃尔德什和乔治·塞凯赖什证明的定理。
定理陈述与例子
定理:任意一个由 N 个不同实数组成的序列中,必然存在一个长度至少为 √N 的单调子序列(可以是递增的,也可以是递减的)。
什么是单调子序列? 它是原序列中按顺序取出的一部分数,这些数要么完全递增,要么完全递减。它们不需要在原序列中连续。
例如,对于序列 [3, 1, 4, 5, 9, 2, 6]:
[1, 5, 9]是一个长度为3的递增子序列。[4, 2]是一个长度为2的递减子序列。[3, 4, 5, 9]也是一个更长的递增子序列。
定理有多“优”?——构造反例
在证明一个“总是存在”的定理前,我们先问:这个下界 √N 还能改进吗?我们尝试构造一个尽可能“混乱”、使得最长单调子序列很短的序列。
以下是一个巧妙的构造思路(假设 N 是一个完全平方数):
- 将数字 1 到 N 分成 √N 组,每组 √N 个数。
- 第一组按递减顺序排列:√N, √N-1, ..., 2, 1。
- 第二组按递减顺序排列:2√N, 2√N-1, ..., √N+2, √N+1。
- 以此类推,将所有组按顺序连接起来。
这个序列的效果是:
- 任何递增子序列最多只能从每组中取一个数(因为组内是递减的),所以长度不超过 √N。
- 任何递减子序列必须完全位于同一组内(因为不同组的数字是递增的),所以长度也不超过 √N。
这个构造表明,√N 这个下界是最优的,你不可能证明一个比 √N 更大的下界对所有序列都成立。
总结 ✨
本节课中我们一起学习了:
- 迪尔沃思逼近定理的证明核心:通过将数轴视为圆,并巧妙运用鸽巢原理,我们证明了总能在 {α, 2α, ..., Nα} 中找到一个非常接近整数的倍数。证明的关键步骤是“划分区间”和“倒拨时钟”。
- 埃尔德什-塞凯赖什定理的引入:我们了解到,任何足够长的不同实数序列都隐藏着有序结构,必然包含一个长度约为 √N 的单调子序列。我们通过构造一个特定的“坏”序列,验证了 √N 这个下界是紧的。

下一讲,我们将完成埃尔德什-塞凯赖什定理的证明,看看如何利用类似鸽巢原理的思想,从任意序列中“抽”出这个必然存在的长单调子序列。
006:Erdős–Szekeres定理与鸽巢原理应用

在本节课中,我们将要学习一个关于序列的重要定理——Erdős–Szekeres定理。我们将通过一个具体的证明过程,理解如何利用鸽巢原理来证明:在任意足够长的不同数字序列中,总能找到一个长度至少为√n的单调(递增或递减)子序列。我们还将探讨该定理的一个更精确的版本。
定理回顾与问题引入
上一节我们介绍了Erdős–Szekeres定理的基本陈述。本节中,我们来看看如何证明它。
该定理指出:对于任意n个不同的数字,其中总是存在一个单调(递增或递减)子序列,其长度至少为√n。
公式:对于任意由n个不同数字组成的序列,总存在一个单调子序列,其长度 L ≥ √n。
证明思路:构建辅助表
我们如何证明这个结论呢?一个巧妙的方法是构建一个辅助表格。以下是我们将要遵循的步骤。
首先,我们写下一个示例序列,例如:3, 1, 4, 5, 9, 2, 6。
在每一个数字下方,我们记录两个值:
- 黄色数字:代表以该数字结尾的最长递增子序列的长度。
- 粉色数字:代表以该数字结尾的最长递减子序列的长度。
例如,对于开头的数字3,以它结尾的最长递增子序列就是它自己[3],所以黄色数字是1。同样,以它结尾的最长递减子序列也是[3],所以粉色数字也是1。
动态计算子序列长度
接下来,我们看看如何高效地计算后续位置的黄色数字(粉色数字的计算逻辑类似)。
以序列中的6为例。我们想找到以6结尾的最长递增子序列的长度。关键在于:要到达6,前一个数字必须小于6。因此,我们查看6之前所有小于6的数字(即1, 4, 5, 2),并找出它们对应的黄色数字中的最大值。
算法逻辑:
- 找到当前位置之前所有值小于当前值的数字。
- 取这些数字对应的“黄色值”中的最大值。
- 将该最大值加1,即得到当前位置的黄色值。
在示例中,小于6的数字对应的黄色值最大是5对应的3。因此,6的黄色值 = 3 + 1 = 4。这意味着存在一个以6结尾的长度为4的递增子序列(例如[1, 4, 5, 6])。
这种方法避免了为每个位置重新从头计算子序列,大大提升了效率。
关键观察:数对的不重复性
构建完整个表格后,我们观察到一个关键现象:将每个数字上方的“原数字”(绿色)和下方的“黄色值”、“粉色值”看作数对(绿色, 黄色)和(绿色, 粉色),这些数对在整个序列中是各不相同的。
为什么?因为序列中的绿色数字本身各不相同。考虑任意两个位置,它们的绿色数字要么递增,要么递减。
- 如果绿色数字递增,那么根据我们计算黄色值的算法(取之前较小值的最大黄色值再加1),后一个位置的黄色值必然大于前一个位置的黄色值。
- 如果绿色数字递减,那么同理,后一个位置的粉色值必然大于前一个位置的粉色值。
因此,任意两个位置对应的(绿色,黄色)或(绿色,粉色)数对不可能完全相同。
应用鸽巢原理完成证明
现在,我们应用鸽巢原理来完成证明。
假设最长的单调子序列长度为 L。那么表格中所有的黄色和粉色数字都介于 1 到 L 之间。每个位置产生两个数对(绿色,黄色)和(绿色,粉色),但更重要的是,这些数对两两不同。
数对的第一元素(绿色数字)有 n 种可能(即序列的 n 个位置),第二元素有 L 种可能(1到L)。如果不考虑重复,最多可能形成 n * L 种组合?不,我们有一个更强的约束:对于每个具体的绿色数字(即每个位置),它对应的(绿,黄)和(绿,粉)这两个数对,由于上述的“递增或递减必导致黄或粉增加”的规则,在整个序列中也是唯一的。更简洁的思路是:所有(黄色,粉色)这样的数对都是唯一的。
因为黄色和粉色值都介于1到L之间,所以不同的(黄色,粉色)数对最多有 L * L = L² 种。
而我们总共有 n 个位置,也就是有 n 个这样的(黄色,粉色)数对。根据鸽巢原理,如果数对的数量 n 超过了可能的不同组合数 L²,那么必然有数对重复。但我们之前已经论证了这些数对各不相同。因此,必然有 n ≤ L²。
公式:n ≤ L²
由此,我们得到 L ≥ √n。这正是Erdős–Szekeres定理的结论。
定理的强化版本
我们刚才证明的定理可以强化为一个更精确的版本。这个版本给出了保证存在特定长度单调子序列的精确阈值。
定理(Erdős–Szekeres 精确形式):对于任意由 (s-1)(t-1) + 1 个不同数字组成的序列,其中必然存在一个长度至少为 s 的递增子序列,或者一个长度至少为 t 的递减子序列。
证明思路:与之前类似,我们采用反证法。
- 假设结论不成立,即不存在长度 ≥ s 的递增子序列,也不存在长度 ≥ t 的递减子序列。
- 那么,每个位置对应的黄色值 ≤ s-1,粉色值 ≤ t-1。
- 因此,每个位置对应的(黄色,粉色)数对可能的不同种类最多有 (s-1)(t-1) 种。
- 但我们有 (s-1)(t-1) + 1 个位置(数字),根据鸽巢原理,至少有两个位置的(黄色,粉色)数对相同。
- 这与我们之前证明的“数对各不相同”的性质矛盾。因此,假设错误,原命题成立。
最优性验证
这个“+1”的阈值是最优的,即不能再减小。以下是说明:
我们可以构造一个恰好有 (s-1)(t-1) 个不同数字的序列,其中既没有长度为 s 的递增子序列,也没有长度为 t 的递减子序列。
构造方法:
将数字排列成 (s-1) 行,每行包含 (t-1) 个数字,且每行内部数字严格递减。然后,从左到右、从上到下读取这些数字,形成我们的序列。
例如,当 s=4, t=4 时,(s-1)(t-1)=9,构造如下:
(第一行) 9, 8, 7
(第二行) 6, 5, 4
(第三行) 3, 2, 1
读取后的序列为:9, 8, 7, 6, 5, 4, 3, 2, 1。
- 递增子序列:只能从每行取最多一个数字(因为行内递减),最多能取 s-1=3 个数字。
- 递减子序列:最多只能在一行内选取,一行最多有 t-1=3 个数字。
这个构造证明了阈值 (s-1)(t-1) + 1 的精确性。
总结
本节课中我们一起学习了Erdős–Szekeres定理及其证明。
- 我们通过为序列中每个位置计算“最长递增/递减子序列长度”来构建辅助表。
- 我们发现了表中(原数字, 递增长度)或(原数字, 递减长度)数对具有唯一性的关键性质。
- 通过应用鸽巢原理,我们证明了在 n 个不同数字中,必然存在长度至少为 √n 的单调子序列。
- 我们进一步探讨了定理的精确强化版本,即对于 (s-1)(t-1)+1 个数字,必存在长度 ≥ s 的递增子序列或长度 ≥ t 的递减子序列,并验证了其最优性。

这个定理是组合数学中鸽巢原理的一个经典而优美的应用,它揭示了序列中必然存在的有序结构。
007:组合数学与球面三角形面积 🧮

在本节课中,我们将学习一个组合数学的核心思想——容斥原理,并通过一个有趣的历史问题来展示其威力:如何计算球面三角形的面积。我们将从卡耐基梅隆大学1913年的入学考试题出发,一步步推导出球面三角形的面积公式,整个过程无需微积分,仅依靠巧妙的组合思想。
问题引入:卡耐基梅隆的入学考题 🌍
在1913年左右,卡耐基梅隆大学(当时称为卡内基理工学院)的入学考试中,曾出现过这样一道题:
给定一个球面三角形,其三个角分别为70度、80度和110度。球的半径为10。请问这个球面三角形的面积是多少?
更具体地说,我们需要求出这个三角形面积占整个球体表面积的比例。已知球体表面积的公式为:
总面积 = 4πR²
因此,如果我们能求出面积比例,问题就迎刃而解。
核心概念:球面几何与“大圆” 📐
在平面上,两点间最短路径是直线。在球面上,两点间最短路径是大圆弧。大圆是球面上以球心为圆心的圆,例如地球的赤道和经线都是大圆。
事实:球面上两点间的最短路径是连接这两点的大圆弧。
理解这一点的一个简单方法是:想象旋转球体,使得其中一个点位于北极。那么从另一点到北极的最短路径就是直接向北走,这条路径就是一条经线(大圆弧)的一部分。
简化问题:从易到难 🧩
面对复杂问题,一个有效的策略是先尝试解决更简单的版本。对于球面三角形面积问题,我们可以从以下简单情况入手:
情况一:一个“大圆”切割
一个大圆将球面平分为两个相等的半球。因此,任何由一个大圆切割出的“月牙形”区域面积是球面总面积的一半。
比例 = 1/2
情况二:两个大圆切割
当两个大圆相交时,它们将球面分割成若干区域。考虑其中一个区域,其面积比例与两个大圆之间的夹角有关。
比例 = θ / 360°
其中,θ是两个大圆平面之间的夹角(二面角)。这类似于切橙子时,一瓣橙皮的大小取决于切的角度。
情况三:特殊球面三角形
为了寻找面积与角度之间的规律,我们计算几种特殊三角形的面积比例:
- 等边三角形(60°, 60°, 60°):当三角形非常小时,它几乎是一个平面三角形,面积接近0。
比例 ≈ 0 - 直角球面三角形(90°, 90°, 90°):例如取球面上相互垂直的三个大圆弧(如两条经线和赤道的一部分)围成的三角形。这个三角形占球面的八分之一。
比例 = 1/8 - “最大”三角形(≈300°, ≈300°, ≈300°):如果取三个大圆,它们围成的区域几乎是整个球面(除了背面一个对称的小三角形)。此时面积比例接近1。
比例 ≈ 1
观察这些数据,我们发现面积比例似乎与三角形内角之和有关。具体来说,比例随着内角和的增大而线性增加。
公式猜想与验证 🔍
基于以上观察,我们可以大胆猜想球面三角形面积比例的公式。设三角形三个内角为α, β, γ。
从数据中我们发现:
- 当 α+β+γ = 180°(平面三角形)时,比例应为0。
- 当 α+β+γ = 90°+90°+90° = 270° 时,比例为 1/8 = 90°/720°。
- 比例似乎与 (α+β+γ - 180°) 成正比。
因此,我们猜想公式为:
面积比例 = (α + β + γ - 180°) / 720°
对于考题中的三角形(70°+80°+110°=260°),代入公式:
比例 = (260° - 180°) / 720° = 80° / 720° = 1/9
因此,三角形面积是球体总表面积的九分之一。
组合证明:引入容斥原理 🧠
现在,我们利用组合数学中的容斥原理来严格证明这个猜想。
首先,我们画出一般球面三角形的示意图。我们可以通过旋转球体,使得构成三角形的一条边位于“赤道”大圆上,另外两条边是其他两个大圆。
我们定义三个集合,它们都是球面上的区域:
- 集合A:位于“绿色”大圆下方的半球的点集。
- 集合B:位于“粉色”大圆上方的半球的点集。
- 集合C:位于“黄色”大圆上方的半球的点集。
这样定义后,我们关心的球面三角形恰好是这三个集合的交集:
球面三角形 = A ∩ B ∩ C
我们的目标是求出这个交集区域的面积比例,记作 X。
应用容斥原理 ⚖️
容斥原理告诉我们,对于任意有限集合,以下公式成立:
|A ∪ B ∪ C| = |A| + |B| + |C| - |A ∩ B| - |B ∩ C| - |C ∩ A| + |A ∩ B ∩ C|
其中,竖线 |·| 表示集合的“大小”。在我们的问题中,它代表球面上区域的面积比例。
现在,我们来逐一确定公式中每一项的值:
-
|A ∪ B ∪ C|:这是至少属于A、B、C之一的点的比例。观察图形可以发现,这三个半球的并集覆盖了整个球面,除了背面一个与目标三角形全等的小三角形。因此:
|A ∪ B ∪ C| = 1 - X -
|A|, |B|, |C|:每个集合都是一个半球,因此:
|A| = |B| = |C| = 1/2 -
|A ∩ B|, |B ∩ C|, |C ∩ A|:以
|A ∩ B|为例,它是“在绿色大圆下方”且“在粉色大圆上方”的区域。这正好是一个“月牙形”,其面积比例等于两个大圆平面夹角(记为α)除以360°。同理,另外两个交集的比例分别是 β/360° 和 γ/360°。
|A ∩ B| = α / 360°
|B ∩ C| = β / 360°
|C ∩ A| = γ / 360° -
|A ∩ B ∩ C|:这就是我们要求的目标
X。
将以上所有值代入容斥原理公式:
1 - X = (1/2 + 1/2 + 1/2) - (α/360° + β/360° + γ/360°) + X
整理方程:
1 - X = 3/2 - (α+β+γ)/360° + X
1 - 3/2 + (α+β+γ)/360° = 2X
(α+β+γ)/360° - 1/2 = 2X
(α+β+γ - 180°) / 360° = 2X
最终,我们得到球面三角形面积比例的公式:
X = (α + β + γ - 180°) / 720°
证明完毕。
总结与展望 📚
本节课中,我们一起学习并应用了组合数学中强大的容斥原理。
- 从具体问题出发:我们面对一个历史上真实的几何难题——计算球面三角形面积。
- 简化与猜想:通过分析简单情况和特殊例子,我们发现了面积与三角形内角和之间的线性关系,并猜想了公式。
- 组合转化:我们将几何面积问题巧妙地转化为集合求交问题,定义了三个合适的半球集合。
- 应用容斥原理:利用容斥原理建立方程,并代入已知量,最终严格推导出了球面三角形的面积公式:
面积比例 = (内角和 - 180°) / 720°

这个推导过程优美地展示了数学不同分支(组合、几何)之间的联系,以及化繁为简、从特殊到一般的数学思想。容斥原理本身将在后续课程中得到更深入和系统的探讨,并应用于更多计数和概率问题中。
008:容斥原理的证明


在本节课中,我们将深入探讨容斥原理的证明。我们将从一个简单的计数问题出发,逐步推导出这个看似神奇的公式,并理解其背后的组合学原理。
回顾容斥原理公式
上一节我们介绍了容斥原理的应用。本节中,我们来看看这个公式本身。
容斥原理的一般形式如下。对于有限集合 A₁, A₂, ..., Aₙ,其并集的大小可以通过以下公式计算:
|A₁ ∪ A₂ ∪ ... ∪ Aₙ| = Σ|Aᵢ| - Σ|Aᵢ ∩ Aⱼ| + Σ|Aᵢ ∩ Aⱼ ∩ Aₖ| - ... + (-1)ⁿ⁺¹|A₁ ∩ A₂ ∩ ... ∩ Aₙ|
其中,第一个求和遍历所有单个集合,第二个求和遍历所有两个集合的交集,依此类推。这个公式的系数交替为正负一,这看起来非常奇妙。
证明思路:追踪元素的计数
为了证明这个公式,我们的目标是证明:对于并集中的任意一个元素,公式右边的求和恰好将其计数一次;而对于不在并集中的元素,则计数零次。
考虑并集中的一个任意元素。设这个元素恰好包含在 k 个集合中,其中 1 ≤ k ≤ n。我们需要计算在公式右边,这个元素被计数的总次数。
以下是计算它在公式右边各项中被计数次数的过程:
- 第一行(单个集合):该元素在 k 个集合中,因此在这一行被计数 k 次。
- 第二行(两个集合的交集):该元素被计入一个交集 Aᵢ ∩ Aⱼ,当且仅当 i 和 j 都来自包含该元素的 k 个集合。因此,计数次数为从 k 个集合中选择 2 个的组合数,即 C(k, 2),但前面有负号。
- 第三行(三个集合的交集):同理,只有当所选三个集合都包含该元素时,它才会被计入。计数次数为 C(k, 3),前面有正号。
以此类推。因此,该元素在公式右边被计数的总次数为:
S = C(k, 1) - C(k, 2) + C(k, 3) - C(k, 4) + ... + (-1)ᵏ⁺¹ C(k, k)
我们的目标是证明对于任意 k ≥ 1,这个和 S 都等于 1。
关键证明:使用二项式定理
现在,我们需要证明这个交替求和等于 1。一个巧妙的方法是借助二项式定理。
考虑表达式 (1 - 1)ᵏ。根据二项式定理,将其展开:
(1 - 1)ᵏ = C(k, 0)1ᵏ(-1)⁰ + C(k, 1)1ᵏ⁻¹(-1)¹ + C(k, 2)1ᵏ⁻²(-1)² + ... + C(k, k)1⁰(-1)ᵏ
简化后得到:
0 = C(k, 0) - C(k, 1) + C(k, 2) - C(k, 3) + ... + (-1)ᵏ C(k, k)
注意,我们想求的和 S 是从 C(k, 1) 开始的。将上述等式稍作变形:
C(k, 1) - C(k, 2) + C(k, 3) - ... - (-1)ᵏ C(k, k) = C(k, 0)
由于 C(k, 0) = 1,并且等式左边正好是 S(当 k 为偶数时,最后一项符号为负,与 S 一致;当 k 为奇数时,最后一项符号为正,移项后也与 S 一致)。因此,我们证明了 S = 1。
对于不在任何集合中的元素(k = 0),它不会出现在任何单个集合或交集中,因此在公式右边被计数 0 次,这也符合要求。
至此,我们完成了容斥原理的证明:公式右边的求和确保了并集中的每个元素恰好被计数一次。
另一种视角:帕斯卡三角形与伸缩求和
证明过程中,我们还可以观察到组合数在帕斯卡三角形中的性质。考虑 k = 4 时的求和:
S = C(4,1) - C(4,2) + C(4,3) - C(4,4)
利用帕斯卡恒等式 C(n, m) = C(n-1, m-1) + C(n-1, m),我们可以将每一项用上一行(n=3)的组合数表示:
- C(4,1) = C(3,0) + C(3,1)
- C(4,2) = C(3,1) + C(3,2)
- C(4,3) = C(3,2) + C(3,3)
- C(4,4) = C(3,3) + C(3,4) (其中 C(3,4)=0)
将上述表达式代入 S,并注意正负号,许多项会相互抵消(例如 +C(3,1) 和 -C(3,1))。这种抵消一直持续到最后,只剩下 C(3,0) = 1。这种求和方式被称为伸缩求和。这种方法直观地展示了交替和如何化简为 1。
总结与延伸思考
本节课中我们一起学习了容斥原理的证明。我们通过追踪一个元素在公式各项中被计数的次数,将问题转化为证明一个组合恒等式 C(k,1) - C(k,2) + ... = 1。我们使用了二项式定理这一有力工具完成了证明,同时也看到了利用帕斯卡三角形性质进行伸缩求和的直观方法。

这个证明揭示了容斥原理的本质:它通过精妙的加加减减,消除了因集合重叠而导致的重复计数,最终实现了对并集的精确计数。这种思想在组合数学、概率论和计算机科学中都有广泛的应用。
009:错位排列与容斥原理

在本节课中,我们将学习如何使用容斥原理来解决一个经典的组合计数问题——错位排列。我们将推导出计算错位排列数量的精确公式,并发现一个与自然常数 e 相关的惊人近似。
课程概述
上一节我们介绍了容斥原理,本节中我们来看看如何应用它来解决一个具体问题:计算错位排列的数量。错位排列是指一种排列,其中没有任何一个元素停留在其原始位置上。
错位排列的定义
首先,我们明确一下什么是错位排列。对于 n 个不同元素的集合,其所有可能的排列数量是 n!。一个错位排列是这些排列中的一个,它满足一个额外的条件:没有任何元素留在其原始位置上。
例如:
- 当 n=2 时,元素为 {1, 2}。唯一的错位排列是 (2, 1)。
- 当 n=3 时,元素为 {1, 2, 3}。错位排列有 (2, 3, 1) 和 (3, 1, 2)。
直接计算错位排列的数量很困难,因为选择会相互依赖。因此,我们需要借助容斥原理。

应用容斥原理
我们的目标是计算“所有元素都不在原位”的排列数。根据容斥原理,我们可以通过计算其对立面——“至少有一个元素在原位”的排列数——来间接求得。
我们定义一系列集合 A_i:
- A_1: 所有满足“元素1留在原位”的排列集合(其他元素位置任意)。
- A_2: 所有满足“元素2留在原位”的排列集合。
- ...
- A_n: 所有满足“元素n留在原位”的排列集合。
那么,至少有一个元素在原位的排列集合就是这些 A_i 的并集:A_1 ∪ A_2 ∪ ... ∪ A_n。错位排列的数量 D_n 就等于总排列数减去这个并集的大小:
D_n = n! - |A_1 ∪ A_2 ∪ ... ∪ A_n|
现在,我们使用容斥原理公式来计算这个并集的大小。
以下是容斥原理公式在本问题中的应用展开:
|A_1 ∪ ... ∪ A_n| = Σ|A_i| - Σ|A_i ∩ A_j| + Σ|A_i ∩ A_j ∩ A_k| - ... + (-1)^{n+1} |A_1 ∩ ... ∩ A_n|
接下来,我们逐项计算这些交集的大小。
计算交集大小
我们需要计算公式中每一项的具体值。
-
单个集合的大小 |A_i|:固定一个元素(例如元素 i)在原位,剩下的 n-1 个元素可以任意排列。因此,|A_i| = (n-1)!。这样的集合有 n 个,所以第一项总和为 n × (n-1)!。
-
两两交集的大小 |A_i ∩ A_j|:固定两个特定元素(例如 i 和 j)在原位,剩下的 n-2 个元素任意排列。因此,|A_i ∩ A_j| = (n-2)!。从 n 个元素中选出哪两个被固定,有 C(n, 2) 种选择。所以第二项总和为 C(n, 2) × (n-2)!。
-
任意 k 个集合的交集大小:同理,固定 k 个特定元素在原位,剩下的 n-k 个元素任意排列。因此,大小为 (n-k)!。选择哪 k 个元素被固定,有 C(n, k) 种方式。所以第 k 项的总和为 C(n, k) × (n-k)!。
我们可以将 C(n, k) × (n-k)! 重写为更简洁的形式:n! / k!。
将这些项代入容斥原理公式,我们得到并集的大小为:
|A_1 ∪ ... ∪ A_n| = n!/1! - n!/2! + n!/3! - ... + (-1)^{n+1} n!/n!
注意,我们这里将 n × (n-1)! 写成了 n!/1!。
推导错位排列公式
现在,我们将这个结果代回 D_n 的公式中:
D_n = n! - [n!/1! - n!/2! + n!/3! - ... + (-1)^{n+1} n!/n!]
为了形式统一,我们可以将开头的 n! 视为 n!/0!。整理后,得到错位排列数 D_n 的精确公式:
D_n = n! × [1/0! - 1/1! + 1/2! - 1/3! + ... + (-1)^n / n!]
这个公式是计算错位排列数量的精确解。
一个惊人的近似
观察上面的公式,中括号内的求和项看起来非常眼熟。它正是数学常数 e^{-1}(即 1/e)的泰勒级数展开式的前 n+1 项。
e^{-1} = 1/0! - 1/1! + 1/2! - 1/3! + ... (这是一个无穷级数)
因此,D_n 近似等于 n! / e。但这个近似有多好呢?让我们分析一下误差。
误差 E_n 是无穷级数被截断后忽略的部分:
E_n = n! × [ (-1)^{n+1}/(n+1)! + (-1)^{n+2}/(n+2)! + ... ]
我们关心的是这个误差的绝对值 |E_n|。利用三角不等式和放缩技巧(例如,用 1/(n+1)^k 替代分母更大的项),可以证明:
|E_n| < n! × [1/(n+1) + 1/(n+1)^2 + 1/(n+1)^3 + ...]
括号内是一个等比数列求和,其和小于 1/n(当 n ≥ 2 时)。因此,我们得到关键结论:
|D_n - n!/e| < 1/n (对于 n ≥ 2)
这意味着,n!/e 与整数 D_n 的差距小于 1/n。当 n ≥ 2 时,1/n ≤ 1/2,所以 n!/e 距离最近的整数(即 D_n)不到 0.5。因此,我们可以通过四舍五入得到精确值。
由此,我们得到一个优美而实用的结论:
n 个元素的错位排列数 D_n,等于 n! / e 四舍五入到最接近的整数。
对于 n=1 的情况,可以单独验证该结论同样成立。
本节总结

本节课中我们一起学习了:
- 使用容斥原理将复杂的“错位排列”计数问题,转化为计算一系列“固定元素”集合的并集。
- 通过系统计算交集大小,推导出了错位排列数 D_n 的精确求和公式:D_n = n! × Σ_{k=0}^{n} (-1)^k / k!。
- 发现了该公式与 e^{-1} 的泰勒展开式的联系,并证明了近似值 n! / e 与真实整数解 D_n 的误差小于 1/n。
- 最终得到了一个简洁有力的结论:错位排列的数量,就是 n! 除以 e 后四舍五入得到的整数。这个结果完美地展示了数学不同领域(组合数学与微积分)之间迷人的联系。
010:组合计数与帕斯卡三角 🔢


在本节课中,我们将要学习组合计数中的两个核心概念:“海盗分金”问题与帕斯卡三角(二项式系数)的恒等式。我们将通过多种方法证明这些恒等式,并理解它们之间的联系。
海盗与金币问题 🏴☠️
上一节我们介绍了容斥原理,本节中我们来看看一个经典的组合计数问题:海盗分金。问题描述如下:有 N 个海盗和 K 枚无法区分的金币。我们需要计算将这些金币全部分给海盗的方法数,其中允许某些海盗得到 0 枚金币。
方法一:隔板法
解决此类问题的一个经典方法是“隔板法”(也称为“星与棒”法)。我们可以将金币和隔板进行排列来形象化地表示分配方案。
以下是具体思路:
- 我们用点
.代表金币。 - 我们用竖线
|代表海盗之间的分隔。 - 一个排列对应一种分配方案。例如,对于
6枚金币和4个海盗,排列...||..|.表示:第一个海盗得到3枚,第二个得到0枚,第三个得到2枚,第四个得到1枚。
在这种表示法中,我们总共有 K 个点和 N-1 个隔板。我们需要将它们全部排列。排列的总数等于从 (K + N - 1) 个位置中选择 (N-1) 个位置放置隔板(或等价地,选择 K 个位置放置点)的方法数。
因此,分配方法的总数为:
C(K + N - 1, N - 1) = C(K + N - 1, K)
其中 C(n, k) 表示二项式系数,即从 n 个不同元素中选取 k 个的组合数。
方法二:递归与归纳
我们也可以用递归的视角来看待这个问题。假设我们想知道将 K 枚金币分给 N 个海盗的方法数 f(K, N)。
我们可以考虑第一个海盗得到的金币数 x(x 可以从 0 到 K)。如果他得到了 x 枚,那么剩下的 (K - x) 枚金币需要分给剩下的 (N-1) 个海盗,方法数为 f(K - x, N-1)。
因此,我们有递归关系:
f(K, N) = Σ_{x=0}^{K} f(K - x, N-1)
其中 f(m, 1) = 1(所有金币给唯一的海盗),f(m, 2) = m + 1。
通过计算小规模案例(如 N=3,4),我们会发现结果符合二项式系数的形式:
f(K, 3) = C(K+2, 2)
f(K, 4) = C(K+3, 3)
这引导我们猜想通解为 f(K, N) = C(K + N - 1, N - 1),这与隔板法的结论一致。
问题变体:每人至少一枚金币
如果要求每个海盗至少得到一枚金币,我们可以先给每个海盗预先分配一枚。这样,问题就转化为将剩下的 (K - N) 枚金币(如果 K >= N)分给 N 个海盗,且允许得到 0 枚。因此,方法数为:
C((K - N) + N - 1, N - 1) = C(K - 1, N - 1)
帕斯卡三角与恒等式 📐
“海盗分金”问题的解与帕斯卡三角(二项式系数表)紧密相关。帕斯卡三角本身蕴含了许多优美的恒等式。
帕斯卡递推恒等式
帕斯卡三角的构造基于以下基本恒等式,它说明了三角形中每个数是其上方两数之和:
C(n, k) + C(n, k+1) = C(n+1, k+1)
证明:考虑从 (n+1) 个元素中选取 (k+1) 个。我们可以分两类计数:第一类包含某个特定元素(比如最后一个),那么还需要从剩下 n 个中选 k 个,有 C(n, k) 种方法;第二类不包含这个特定元素,那么需要从剩下 n 个中选 (k+1) 个,有 C(n, k+1) 种方法。两类相加即得等式右边。
曲棍球棒恒等式
在帕斯卡三角中,如果我们沿一条斜线(例如所有 C(i, 2))求和,结果等于这条斜线末端下方那个数。因其形状,这被称为“曲棍球棒恒等式”。
C(K, K) + C(K+1, K) + C(K+2, K) + ... + C(N, K) = C(N+1, K+1)
证明1(数学归纳法):
- 基础情况:当
N = K时,左边是C(K, K)=1,右边是C(K+1, K+1)=1,成立。 - 归纳步骤:假设对于某个
N等式成立。考虑N+1的情况,左边和式为[C(K, K)+...+C(N, K)] + C(N+1, K)。根据归纳假设,括号内等于C(N+1, K+1)。再根据帕斯卡递推恒等式C(N+1, K+1) + C(N+1, K) = C(N+2, K+1),这就完成了证明。
证明2(组合解释——计数两次):
等式右边 C(N+1, K+1) 表示从 {1, 2, ..., N+1} 中选取 (K+1) 个数的方法数。
我们可以根据所选集合中最大的那个数是多少来进行分类计数:
- 如果最大数是
(K+1),那么剩下的K个数必须从{1, ..., K}中选,有C(K, K)种方法。 - 如果最大数是
(K+2),那么剩下的K个数必须从{1, ..., K+1}中选,有C(K+1, K)种方法。 - ...
- 如果最大数是
(N+1),那么剩下的K个数必须从{1, ..., N}中选,有C(N, K)种方法。
将这些情况的方法数相加,就得到了等式的左边。注意,最大数不可能小于(K+1),因为那样无法选出(K+1)个数。
这个恒等式直接解释了为什么“海盗分金”的递归求和会得到二项式系数。
范德蒙德卷积恒等式
另一个重要的恒等式是范德蒙德卷积:
Σ_{i=0}^{r} C(m, i) * C(n, r-i) = C(m+n, r)
证明(组合解释):
等式右边 C(m+n, r) 表示从一个有 m 个红球和 n 个蓝球的袋子中,总共取出 r 个球的方法数。
我们可以根据取出的 r 个球中有多少个红球(设为 i)来进行分类。对于固定的 i,取法数为:从 m 个红球中取 i 个 [C(m, i)],乘以从 n 个蓝球中取 (r-i) 个 [C(n, r-i)]。对 i 从 0 到 r 求和,即得到左边,它覆盖了所有可能的情况。
总结 📝
本节课中我们一起学习了:
- “海盗分金”问题:通过隔板法和递归归纳法,我们得到了将
K个无区别物品分给N个有区别容器的公式C(K+N-1, N-1),并讨论了每人至少一个的变体C(K-1, N-1)。 - 帕斯卡三角恒等式:
- 递推关系:
C(n, k) + C(n, k+1) = C(n+1, k+1),这是三角构造的基础。 - 曲棍球棒恒等式:
Σ_{i=K}^{N} C(i, K) = C(N+1, K+1),我们使用归纳法和组合解释(按最大元素分类)两种方法进行了证明。 - 范德蒙德卷积:
Σ_{i} C(m, i)C(n, r-i) = C(m+n, r),其证明体现了按子集重叠部分分类的计数思想。
- 递推关系:

这些内容展示了组合数学中“计数两次”和“寻找巧妙一一对应”的核心证明技巧,并将看似不同的问题(分金币、选子集)通过二项式系数深刻地联系在了一起。
011:卢卡斯定理与组合数的模运算


在本节课中,我们将学习如何确定组合数的最后一位数字,并探索一个强大的定理——卢卡斯定理。它允许我们在模一个质数的情况下,以一种非常巧妙的方式计算组合数。
课程概述与提醒
首先提醒大家,本周五将有一次考试。关于考试的详细信息已发布在Canvas上。请注意,如果需要申请在周五东部时间晚上9点的备用时间参加考试,请在周五东部时间下午2点前联系我。
考试题目将是全新的,我保证它们会很有趣。今天讨论的内容也可能出现在考试中。
问题引入:组合数的最后一位数字
让我们从一个具体问题开始:62选22的组合数,即 C(62, 22),它的最后一位数字是什么?
这是一个在数学竞赛中常见的有趣问题。我们如何着手解决呢?
直接计算 C(62, 22) 的值非常庞大,不现实。一个自然的想法是利用模运算,特别是模10,因为最后一位数字就是该数除以10的余数。
然而,模10运算有一个挑战:10不是质数。在模运算中,加法、减法和乘法都很直接,但除法在模非质数时通常很棘手。例如,我们不能简单地将分子和分母分别取模10然后相除,因为可能会出现分母模10后为0的情况,导致无法定义除法。
因此,我们需要更聪明的方法。
核心思路:分解质因数
由于10 = 2 × 5,而2和5都是质数,我们可以利用中国剩余定理的思想:要知道一个数模10的结果,可以分别找出它模2和模5的结果,然后组合起来。
更具体地说,如果我们能确定 C(62, 22) 模5和模2的余数,我们就能唯一确定它模10的余数(即最后一位数字)。
让我们先尝试找出它模5的余数。
步骤一:计算组合数中因子5的个数
组合数公式为:
C(62, 22) = 62! / (22! * 40!)
要知道它模5的余数,一个关键点是看这个数包含多少个质因子5。如果它至少包含一个因子5,那么它模5的余数就是0;否则,我们需要进一步计算。
计算一个阶乘中包含多少个因子5,有一个经典技巧。以62!为例:
- 计算62 ÷ 5 = 12(向下取整),这给出了至少包含一个因子5的数字个数(如5, 10, 15, ...)。
- 计算62 ÷ 25 = 2(向下取整),这给出了至少包含两个因子5的数字个数(如25, 50)。这些数字在第一步中已经被计算过一次,所以需要额外再加一次。
- 计算62 ÷ 125 = 0(向下取整),因为62 < 125,停止。
因此,62!中因子5的总数为:12 + 2 = 14。
同理,我们计算:
- 22! 中因子5的个数:22 ÷ 5 = 4,22 ÷ 25 = 0。所以是 4。
- 40! 中因子5的个数:40 ÷ 5 = 8,40 ÷ 25 = 1。所以是 8 + 1 = 9。
现在,对于组合数 C(62, 22):
- 分子 62! 提供 14 个因子5。
- 分母 22! 和 40! 总共提供 4 + 9 = 13 个因子5。
在分数化简为整数后,分子会多出一个因子5无法被分母抵消。因此,C(62, 22) 是5的倍数。
这意味着它模5的余数是0,所以它的最后一位数字只能是 0 或 5。
步骤二:计算组合数中因子2的个数(判断奇偶性)
为了区分最后一位是0还是5,我们需要知道这个数是奇数还是偶数。如果是奇数,末位就是5;如果是偶数,末位就是0。
因此,我们计算组合数中因子2的个数。方法与计算因子5类似,但需要考虑更多2的幂次(2, 4, 8, 16, 32...)。
计算62!中因子2的个数:
- 62 ÷ 2 = 31
- 62 ÷ 4 = 15
- 62 ÷ 8 = 7
- 62 ÷ 16 = 3
- 62 ÷ 32 = 1
总和:31 + 15 + 7 + 3 + 1 = 57。
计算40!中因子2的个数(使用快速方法:不断将前一个商除以2并取整):
- 40 ÷ 2 = 20
- 20 ÷ 2 = 10
- 10 ÷ 2 = 5
- 5 ÷ 2 = 2
- 2 ÷ 2 = 1
总和:20 + 10 + 5 + 2 + 1 = 38。
计算22!中因子2的个数:
- 22 ÷ 2 = 11
- 11 ÷ 2 = 5
- 5 ÷ 2 = 2
- 2 ÷ 2 = 1
总和:11 + 5 + 2 + 1 = 19。
现在,对于组合数 C(62, 22):
- 分子 62! 提供 57 个因子2。
- 分母 22! 和 40! 总共提供 19 + 38 = 57 个因子2。
分子和分母的因子2数量完全相等! 这意味着在分数化简后,没有多余的因子2留下。因此,C(62, 22) 是一个奇数。
结合第一步的结论(末位是0或5)和第二步的结论(是奇数),我们可以确定:C(62, 22) 的最后一位数字是 5。
强大的捷径:卢卡斯定理
上面通过计算因子个数的方法虽然有效,但有些繁琐。是否存在一个更直接、更强大的方法呢?答案是肯定的,这就是卢卡斯定理。
卢卡斯定理指出:对于一个质数 p,组合数 C(n, k) 模 p 的结果,可以通过将 n 和 k 用 p 进制表示,然后对应位上的组合数相乘再模 p 来得到。
听起来很神奇?让我们看一个例子。
假设我们想计算 C(17, 7) mod 3。
- 将17和7写成3进制:
- 17 的3进制是
122(因为 1×9 + 2×3 + 2×1 = 17)。 - 7 的3进制是
021(因为 0×9 + 2×3 + 1×1 = 7)。为了位数对齐,我们在前面补零。
- 17 的3进制是
- 根据卢卡斯定理:
C(17, 7) mod 3 = C(1, 0) * C(2, 2) * C(2, 1) mod 3 - 计算每一位的组合数:
C(1, 0) = 1C(2, 2) = 1C(2, 1) = 2
- 相乘并取模:
1 * 1 * 2 = 2。所以 C(17, 7) mod 3 = 2。
这个定理极大地简化了模质数下组合数的计算。对于我们之前的问题,如果想求 C(62, 22) mod 5,我们可以将62和22写成5进制,然后应用卢卡斯定理。
卢卡斯定理的证明思路(直观版)
为什么这个定理会成立?我们可以通过一个组合解释来直观理解。
以 C(17, 7) mod 3 为例。17个物品可以按3的幂次分组:1组9个,2组3个,2组1个。这正好对应其3进制表示 122。
现在,从这17个物品中选取7个。我们可以将选择过程分解为:从9个一组的物品中选几个,从每个3个一组的物品中选几个,从每个1个一组的物品中选几个。
关键点在于,模3运算下,只有当我们从每一组中要么全选,要么全不选时,对应的选择方案总数模3才不为0。如果在一组中只选了一部分,那么通过旋转该组(因为物品在组内是“圆形”对称的),可以产生多个等价的选择方案,而这些方案的数量通常是组大小的倍数(在质数模下,这会导致总和模p为0)。
因此,所有非“全选或全不选”的方案在模3求和时贡献为0。最终,C(17, 7) mod 3 就等价于:有多少种方式,能从各组中通过“全选或全不选”的方式,恰好选出7个物品?
这正好对应于用7的3进制表示 021 来从供应量(17的3进制 122)中选取:从9个组中选0个(全不选),从3个组中选2个(全选两个这样的组),从1个组中选1个(全选一个这样的组)。而 C(1,0), C(2,2), C(2,1) 正是计算这些选择方式的组合数。
这个论证的核心依赖于模数p是质数,确保了非平凡选择方案会产生倍数为p的轨道,从而在模p下消失。
课程总结
本节课我们一起学习了:
- 如何确定组合数的最后一位数字:通过分别分析其因子2和因子5的个数,利用模2和模5的结果联合确定模10的结果。
- 卢卡斯定理:一个关于计算组合数模质数的强大定理。它将问题转化为p进制下对应数字的组合数乘积,极大地简化了计算。
- 定理的直观证明:通过将物品按p的幂次分组,并观察在模p下只有“全选或全不选”的分组方案才有贡献,从而将问题与p进制表示联系起来。

卢卡斯定理是数论和组合数学中一个优美而实用的工具,希望它能帮助你更深入地理解组合数的性质。祝大家在周五的考试中取得好成绩!
012:斐波那契数列与铺砖问题

在本节课中,我们将要学习一个新的计数主题,并探索一个著名的数列——斐波那契数列。我们将从一个具体的铺砖问题入手,推导出斐波那契数列,并学习如何用数学归纳法证明相关的结论。
课程引入与成绩说明
上一节我们介绍了课程的一些背景。本节中,我们来看看本次考试的成绩分布情况。
以下是本次考试的成绩分布图,它展示了学生们的得分情况。


从图中可以看出,大多数学生的得分集中在20分左右。本次考试的设计具有一定难度,部分题目旨在挑战学生。获得50%的分数实际上是非常不错的成绩。
关于评分,需要说明以下几点:
- 本次考试采用等级评分制,A、B、C的分数线大致如图所示。
- 本学期共有三次期中考试和一次期末考试,每次考试都是提升总成绩的机会。
- 评分时,部分得分基于对问题核心思路的理解。即使最终计算有误,只要思路正确,仍可能获得高分。
- 如果对评分有疑问,可以向助教申请重新审阅。
引入新主题:铺砖问题
现在,让我们进入课程的新单元。本节我们将探讨一个与计数相关的新问题。
我们的问题是:有多少种方法,仅使用1x1的正方形砖块和1x2的多米诺骨牌,来铺满一个1xn的长条区域?
以下是解决此类组合问题的一个有效策略。
面对这样的问题,一个很好的起点是研究小规模的情况。
- 当 n=1 时:只有1种铺法,即放一块正方形砖。
F(1) = 1 - 当 n=2 时:有2种铺法。可以放两块正方形砖,或者放一块多米诺骨牌。
F(2) = 2 - 当 n=3 时:有3种铺法。可以放三块正方形砖;或者先放一块多米诺骨牌再放一块正方形砖;或者先放一块正方形砖再放一块多米诺骨牌。
F(3) = 3 - 当 n=4 时:我们通过分析最右侧的砖块来计数。情况一:最右侧是正方形砖。那么剩下的1x3区域有
F(3)种铺法。情况二:最右侧是多米诺骨牌。那么剩下的1x2区域有F(2)种铺法。因此,总铺法为F(4) = F(3) + F(2) = 3 + 2 = 5。
我们发现了递推关系。对于一般的 n,铺砖方法数 F(n) 满足:
F(n) = F(n-1) + F(n-2)
这正是斐波那契数列的递推关系。为了使序列从 F(1)=1, F(2)=2 开始更整齐,我们通常定义:
F(0) = 0, F(1) = 1, F(2)=1, F(3)=2, F(4)=3, F(5)=5, ...
这样,铺砖问题的解就是 F(n+1)。
用数学归纳法证明
上一节我们通过观察得到了结论。本节中,我们来看看如何用严谨的数学归纳法来证明它。
命题:铺满1xn区域的方案数等于斐波那契数 F(n+1)。
证明(使用强归纳法):
- 基础步骤:
- 当 n=1 时,铺法数为1,而
F(2)=1,成立。 - 当 n=2 时,铺法数为2,而
F(3)=2,成立。
- 当 n=1 时,铺法数为1,而
- 归纳步骤:
- 假设对于所有小于 k 的正整数 m,命题都成立。即铺满1xm区域的方案数为
F(m+1)。 - 考虑 n=k 的情况。观察最右侧的砖块,有两种互斥的情况:
- 最右侧是正方形砖:此砖固定,剩余1x(k-1)区域的铺法数,根据归纳假设,为
F((k-1)+1) = F(k)。 - 最右侧是多米诺骨牌:此骨牌固定,剩余1x(k-2)区域的铺法数,根据归纳假设,为
F((k-2)+1) = F(k-1)。
- 最右侧是正方形砖:此砖固定,剩余1x(k-1)区域的铺法数,根据归纳假设,为
- 因此,总铺法数为
F(k) + F(k-1)。 - 根据斐波那契数列的定义,
F(k) + F(k-1) = F(k+1)。 - 所以,当 n=k 时,铺法数为
F(k+1),命题成立。
由数学归纳法,命题对一切正整数 n 成立。
- 假设对于所有小于 k 的正整数 m,命题都成立。即铺满1xm区域的方案数为
斐波那契数列的奇妙性质
斐波那契数列充满了有趣的模式。让我们来探索其中一个。
观察数列:F0=0, F1=1, F2=1, F3=2, F4=3, F5=5, F6=8, F7=13, ...
我们计算一些相邻项的乘积:
F1 * F3 = 1 * 2 = 2,而F2^2 + 1 = 1^2 + 1 = 2。F3 * F5 = 2 * 5 = 10,而F4^2 + 1 = 3^2 + 1 = 10。F5 * F7 = 5 * 13 = 65,而F6^2 + 1 = 8^2 + 1 = 65。
这引出了一个猜想:对于奇数下标,有 F_{n} * F_{n+2} = F_{n+1}^2 + 1。
对于偶数下标,我们检查:
F2 * F4 = 1 * 3 = 3,而F3^2 - 1 = 2^2 - 1 = 3。F4 * F6 = 3 * 8 = 24,而F5^2 - 1 = 5^2 - 1 = 24。
于是有另一个猜想:对于偶数下标,有 F_{n} * F_{n+2} = F_{n+1}^2 - 1。
尝试证明性质
我们尝试用归纳法证明奇数下标的情况。命题为:对奇数 k,F_k * F_{k+2} = F_{k+1}^2 + 1。
我们以 k=7 为例,展示证明思路,此思路可推广到任意奇数。
我们要证:F7 * F9 = F8^2 + 1。
利用斐波那契递推式展开:
F7 = F5 + F6
F9 = F7 + F8
F8 = F6 + F7
代入左式得:(F5 + F6)(F7 + F8)
利用归纳假设(假设对更小的奇数成立):
F5 * F7 = F6^2 + 1F6 * F8 = F7^2 - 1(这里用到了偶数下标性质,说明证明需要同时处理奇偶两种情况)
经过代换和代数化简,最终可以验证等式成立。这个具体推导过程展示了如何通过强归纳法,将关于较大索引的命题转化为关于较小索引的已知命题,从而完成证明。完整的证明需要对奇数和偶数下标分别建立归纳基础并进行推导。
本节课中我们一起学习了斐波那契数列如何从一个具体的铺砖问题中自然产生,并学习了如何使用数学归纳法来证明与之相关的计数公式。我们还探索了斐波那契数列内部一个优美的乘积性质,并初步了解了其证明思路。下节课我们将看到证明这个性质的另一种方法。


013:斐波那契数列与矩阵对角化


在本节课中,我们将学习如何使用矩阵和线性代数的概念来分析和求解斐波那契数列。我们将从一个已知的恒等式(卡西尼恒等式)出发,探索一种完全不同的证明方法,并最终推导出斐波那契数列的通项公式。
回顾与引入
上一节我们讨论了斐波那契数列中一个有趣的恒等式,并使用数学归纳法证明了它。本节中,我们将看看如何利用矩阵这一强大的工具来重新审视这个问题。
斐波那契数列定义为:
- F(0) = 0
- F(1) = 1
- F(n) = F(n-1) + F(n-2),对于 n ≥ 2
我们之前证明的恒等式(卡西尼恒等式)是:
- 对于奇数项:F(odd) * F(odd+2) = F(odd+1)² + 1
- 对于偶数项:F(even) * F(even+2) = F(even+1)² - 1
用矩阵表示递归关系
我们可以将斐波那契数列的递归关系用矩阵形式表示。这是一个非常强大的技巧。
考虑向量 [F(n), F(n-1)]。根据递归定义 F(n) = F(n-1) + F(n-2),我们可以写出:
[ F(n) ] = [ 1 1 ] * [ F(n-1) ]
[ F(n-1) ] [ 1 0 ] [ F(n-2) ]
让我们验证一下矩阵乘法:
- 结果向量的顶部元素是:
1 * F(n-1) + 1 * F(n-2) = F(n-1) + F(n-2) = F(n)。 - 结果向量的底部元素是:
1 * F(n-1) + 0 * F(n-2) = F(n-1)。
矩阵的幂与通项公式
如果我们反复应用这个关系,可以将 [F(n), F(n-1)] 表示为初始向量 [F(1), F(0)] = [1, 0] 乘以一个矩阵的幂。
具体推导如下:
[ F(n) ] = [ 1 1 ] * [ F(n-1) ]
[ F(n-1) ] [ 1 0 ] [ F(n-2) ]
= [ 1 1 ]² * [ F(n-2) ]
[ 1 0 ] [ F(n-3) ]
= ...
= [ 1 1 ]^(n-1) * [ F(1) ]
[ 1 0 ] [ F(0) ]
= [ 1 1 ]^(n-1) * [ 1 ]
[ 1 0 ] [ 0 ]
更常见且方便的形式是考虑 [F(n+1), F(n)]:
[ F(n+1) ] = [ 1 1 ]^n * [ F(1) ] = [ 1 1 ]^n * [ 1 ]
[ F(n) ] [ 1 0 ] [ F(0) ] [ 1 0 ] [ 0 ]
因此,计算斐波那契数 F(n) 的问题,转化为了计算矩阵 M = [[1, 1], [1, 0]] 的 n 次幂,然后取其结果向量的底部元素。
对角化:简化矩阵的幂运算
直接计算矩阵 M 的 n 次幂很麻烦。线性代数提供了一个强大的工具——对角化。如果我们可以将矩阵 M 写成以下形式:
M = P * D * P⁻¹
其中 D 是一个对角矩阵(只有主对角线有非零值),P 是一个可逆矩阵,P⁻¹ 是它的逆矩阵。
那么,计算 M 的 n 次幂将变得非常简单:
M^n = (P * D * P⁻¹)^n = P * D^n * P⁻¹
因为 P⁻¹ 和 P 在连续相乘时会互相抵消。而对角矩阵 D 的 n 次幂,只需将其对角线上的每个元素分别取 n 次幂即可。
寻找特征值与特征向量
为了对角化矩阵 M,我们需要找到它的特征值和特征向量。特征向量 v 和特征值 λ 满足以下方程:
M * v = λ * v
这意味着用矩阵 M 乘以向量 v,结果只是将 v 缩放 λ 倍。
为了找到非零解 v,我们将方程重写为:
(M - λI) * v = 0
其中 I 是单位矩阵 [[1, 0], [0, 1]]。这个齐次方程组有非零解 v 的条件是矩阵 (M - λI) 的行列式为 0。
对于我们的矩阵 M = [[1, 1], [1, 0]]:
M - λI = [ 1-λ 1 ]
[ 1 -λ ]
其行列式为:
det(M - λI) = (1-λ)(-λ) - (1)(1) = λ² - λ - 1
令行列式等于零,我们得到特征方程:
λ² - λ - 1 = 0
解这个二次方程,得到两个特征值:
λ₁ = (1 + √5) / 2 ≈ 1.618... (黄金比例 φ)
λ₂ = (1 - √5) / 2 ≈ -0.618...
这两个值是不同的,这很重要。
构建对角化矩阵
对于每个特征值 λ₁ 和 λ₂,我们可以解方程 (M - λI) * v = 0 来找到对应的特征向量 v₁ 和 v₂。我们不需要具体数值,只需知道它们存在且线性无关。
将这两个特征向量作为列向量,我们可以构造矩阵 P:
P = [ v₁ v₂ ]
而对角矩阵 D 则由特征值构成:
D = [ λ₁ 0 ]
[ 0 λ₂ ]
根据特征值和特征向量的定义,我们有:
M * P = P * D
由于 λ₁ 和 λ₂ 不同,v₁ 和 v₂ 线性无关,因此矩阵 P 是可逆的。在等式两边右乘 P⁻¹,我们就得到了对角化形式:
M = P * D * P⁻¹
斐波那契通项公式的雏形
现在,我们可以写出 M^n 的表达式:
M^n = P * D^n * P⁻¹ = P * [ λ₁^n 0 ] * P⁻¹
[ 0 λ₂^n ]
回顾我们的目标公式:
[ F(n+1) ] [ 1 ]
[ F(n) ] = M^n * [ 0 ]
代入 M^n 的表达式:
[ F(n+1) ] [ λ₁^n 0 ] [ 1 ]
[ F(n) ] = P * [ 0 λ₂^n ] * P⁻¹ * [ 0 ]
虽然这个表达式看起来很复杂,包含了未知的矩阵 P 和 P⁻¹,但关键在于,当我们把所有这些矩阵乘法展开后,F(n) 最终将表示成 λ₁^n 和 λ₂^n 的线性组合。
具体形式会是:
F(n) = A * λ₁^n + B * λ₂^n
其中 A 和 B 是由初始条件 F(0)=0 和 F(1)=1 确定的常数。我们将在下一节课中完成这个计算,得到著名的比内公式。
本节课总结
本节课中我们一起学习了:
- 矩阵表示法:将斐波那契数列的线性递归关系
F(n) = F(n-1) + F(n-2)用矩阵乘法[F(n); F(n-1)] = M * [F(n-1); F(n-2)]简洁地表示出来。 - 矩阵的幂:通过递推,将计算
F(n)转化为计算矩阵M = [[1,1],[1,0]]的(n-1)次幂。 - 对角化思想:介绍了通过寻找矩阵的特征值
λ和特征向量v(满足Mv = λv)来对角化矩阵的方法。对角化的核心优势是能极大简化矩阵的幂运算M^n = P D^n P⁻¹。 - 求解特征值:我们为斐波那契矩阵
M求解了特征方程λ² - λ - 1 = 0,得到了两个特征值:黄金比例φ = (1+√5)/2及其共轭(1-√5)/2。 - 通项公式的框架:我们最终得到了
F(n)表达式的基本框架,它将是这两个特征值的 n 次幂的线性组合。这预示着我们可以直接通过计算φ^n来得到斐波那契数,而无需进行大量的逐次加法。

我们虽然没有完全算出最终的常数并化简公式,但已经搭建起了所有关键的理论桥梁。下一节课,我们将完成最后的计算,揭示斐波那契数列那优美而精确的闭合形式表达式。
014:斐波那契数列的矩阵解法与公式推导 🧮


在本节课中,我们将学习如何使用矩阵和特征值的方法,推导出斐波那契数列的通项公式。我们将从一个看似复杂的矩阵方程出发,通过巧妙的“占位符”技巧,最终得到一个简洁而优美的闭式解。
从递推关系出发
上一节我们介绍了斐波那契数列的递推关系。本节中,我们来看看如何将其转化为矩阵形式。
斐波那契数列定义为:
[
F_0 = 0, \quad F_1 = 1, \quad F_{n} = F_{n-1} + F_{n-2} \quad \text{对于} \quad n \geq 2
]
我们可以将相邻两项写成一个向量。观察发现,从 [F_{n}, F_{n-1}] 到 [F_{n+1}, F_n] 的变换可以通过乘以一个矩阵来实现:
[
\begin{bmatrix} F_{n+1} \ F_n \end{bmatrix} = \begin{bmatrix} 1 & 1 \ 1 & 0 \end{bmatrix} \begin{bmatrix} F_n \ F_{n-1} \end{bmatrix}
]
通过反复应用这个关系,我们可以得到:
[
\begin{bmatrix} F_{n+1} \ F_n \end{bmatrix} = \begin{bmatrix} 1 & 1 \ 1 & 0 \end{bmatrix}^n \begin{bmatrix} F_1 \ F_0 \end{bmatrix} = \begin{bmatrix} 1 & 1 \ 1 & 0 \end{bmatrix}^n \begin{bmatrix} 1 \ 0 \end{bmatrix}
]
因此,问题的核心变成了计算矩阵 M = [[1, 1], [1, 0]] 的 n 次幂。
矩阵对角化的思想
为了高效地计算 M^n,我们希望找到一个方法将其对角化。这意味着我们希望将 M 写成以下形式:
[
M = P D P^{-1}
]
其中 D 是一个对角矩阵。这样,M^n = P D^n P^{-1} 就会变得非常容易计算,因为对角矩阵的幂次只需对其对角线元素分别取幂。
寻找这样的 P 和 D 的关键在于寻找矩阵 M 的特征向量和特征值。
寻找特征值与特征向量
特征向量 v 和特征值 λ 满足方程:
[
M v = λ v
]
这等价于:
[
(M - λI) v = 0
]
其中 I 是单位矩阵。为了使这个方程有非零解 v,矩阵 (M - λI) 的行列式必须为零。
以下是计算步骤:
-
构造矩阵
(M - λI):
[
M - λI = \begin{bmatrix} 1-λ & 1 \ 1 & -λ \end{bmatrix}
] -
令其行列式为零:
[
\det(M - λI) = (1-λ)(-λ) - (1)(1) = λ^2 - λ - 1 = 0
] -
解这个二次方程,得到两个特征值:
[
λ_1 = \frac{1 + \sqrt{5}}{2}, \quad λ_2 = \frac{1 - \sqrt{5}}{2}
]
这正是著名的黄金比例及其共轭。
对于每个特征值 λ_i,我们可以解出对应的特征向量 v_i。例如,对于 λ_1,解方程 (M - λ_1 I) v_1 = 0,可以得到一个非零解(例如 v_1 = [λ_1, 1]^T)。类似地可以得到 v_2。
构建对角化矩阵
将两个特征向量作为列向量,我们可以构造矩阵 P:
[
P = \begin{bmatrix} v_1 & v_2 \end{bmatrix}
]
对应的对角矩阵 D 以特征值为对角线元素:
[
D = \begin{bmatrix} λ_1 & 0 \ 0 & λ_2 \end{bmatrix}
]
根据特征值的定义,我们有:
[
M P = P D
]
假设 P 可逆(由于两个特征值不同,特征向量线性无关,这保证了可逆性),我们得到:
[
M = P D P^{-1}
]
因此:
[
M^n = P D^n P^{-1} = P \begin{bmatrix} λ_1^n & 0 \ 0 & λ_2^n \end{bmatrix} P^{-1}
]
利用“占位符”简化计算
现在,我们的目标是计算:
[
\begin{bmatrix} F_{n+1} \ F_n \end{bmatrix} = M^n \begin{bmatrix} 1 \ 0 \end{bmatrix} = P D^n P^{-1} \begin{bmatrix} 1 \ 0 \end{bmatrix}
]
直接计算 P^{-1} 和后续乘法会非常繁琐。这里我们引入一个关键的简化技巧:使用“占位符”(blob)。
我们注意到,在整个表达式中,唯一的变量是 n。P、P^{-1} 和初始向量 [1, 0]^T 都是与 n 无关的常数矩阵或向量。因此,我们可以将整个计算过程视为常数与 λ_1^n、λ_2^n 的线性组合。
具体推导如下:
P^{-1} [1, 0]^T是一个常数向量,记为[A, B]^T。D^n作用其上,得到[A λ_1^n, B λ_2^n]^T。- 最后乘以
P,F_n作为结果的第二个分量,必然是以下形式:
[
F_n = \alpha λ_1^n + \beta λ_2^n
]
其中α和β是与n无关的常数(由P和A, B决定)。
这就将问题极大地简化了:我们不需要知道 P 的具体形式,只需要确定两个常数 α 和 β。
求解常数并得到最终公式
由于公式 F_n = α λ_1^n + β λ_2^n 对所有的 n 都成立,我们可以选择两个最简单的 n 值来建立方程。
以下是求解步骤:
-
代入
n = 0:
[
F_0 = 0 = α λ_1^0 + β λ_2^0 = α + β
]
得到α + β = 0,即β = -α。 -
代入
n = 1:
[
F_1 = 1 = α λ_1 + β λ_2 = α λ_1 - α λ_2 = α (λ_1 - λ_2)
]
计算λ_1 - λ_2 = \sqrt{5}。
因此,1 = α \sqrt{5},解得α = 1 / \sqrt{5},β = -1 / \sqrt{5}。 -
将
α、β、λ_1、λ_2代回公式,得到斐波那契数列的通项公式(比内公式):
[
F_n = \frac{1}{\sqrt{5}} \left[ \left( \frac{1 + \sqrt{5}}{2} \right)^n - \left( \frac{1 - \sqrt{5}}{2} \right)^n \right]
]
公式的进一步简化与卡西尼恒等式
我们得到的公式非常强大。注意到 |(1 - √5)/2| ≈ 0.618 < 1,当 n 增大时,((1 - √5)/2)^n 项会迅速趋近于零。因此,F_n 实际上就是 ((1 + √5)/2)^n / √5 四舍五入到最近的整数。
此外,利用矩阵表示,我们可以优雅地证明卡西尼恒等式:
[
F_{n+1}F_{n-1} - F_n^2 = (-1)^n
]
观察矩阵 M^n 本身:
[
M^n = \begin{bmatrix} F_{n+1} & F_n \ F_n & F_{n-1} \end{bmatrix}
]
(通过调整初始向量可以验证)。计算其行列式:
[
\det(M^n) = F_{n+1}F_{n-1} - F_n^2
]
另一方面,根据行列式性质,\det(M^n) = (\det M)^n。而 \det M = (1)(0) - (1)(1) = -1。
因此:
[
F_{n+1}F_{n-1} - F_n^2 = (-1)^n
]
这就简洁地证明了该恒等式。
总结
本节课中我们一起学习了:
- 将斐波那契数列的线性递推关系转化为矩阵幂运算。
- 通过对角化矩阵来简化幂运算的核心思想,这涉及到寻找特征值和特征向量。
- 利用“占位符”技巧,避免复杂的矩阵求逆和乘法,直接推断出通项公式的结构。
- 通过代入初始条件,确定了通项公式中的常数,最终得到了优美的比内公式。
- 作为应用,我们使用矩阵方法简洁地证明了卡西尼恒等式。

这种方法的核心优势在于,它将一个复杂的递推问题转化为线性代数中的标准操作(特征值分解),并通过关注变量 n 的依赖关系来大幅简化计算。这种思想可以推广到解决其他线性递推关系。
015:线性递归方程的求解


在本节课中,我们将学习如何求解线性齐次递归方程。我们将从二阶递归方程开始,推导出通用的求解公式,并探讨如何将这种方法推广到更高阶的递归方程。
二阶线性递归方程的求解
上一节我们介绍了斐波那契数列的求解方法。本节中,我们来看看如何将这种方法推广到一般形式的二阶线性递归方程。
假设我们有一个递归方程,其形式为:
[
A_n = B \cdot A_{n-1} + C \cdot A_{n-2}
]
其中,( B ) 和 ( C ) 是常数。我们的目标是找到一个关于 ( n ) 的显式公式来表示 ( A_n )。
建立矩阵方程
求解的第一步是将递归关系转化为矩阵形式。
以下是建立矩阵方程的步骤:
- 我们定义状态向量为 ( \begin{bmatrix} A_{n+1} \ A_n \end{bmatrix} )。
- 根据递归关系 ( A_{n+1} = B \cdot A_n + C \cdot A_{n-1} ),我们可以写出:
[
\begin{bmatrix} A_{n+1} \ A_n \end{bmatrix} = \begin{bmatrix} B & C \ 1 & 0 \end{bmatrix} \cdot \begin{bmatrix} A_n \ A_{n-1} \end{bmatrix}
] - 通过反复应用这个关系,我们可以得到:
[
\begin{bmatrix} A_{n+1} \ A_n \end{bmatrix} = \begin{bmatrix} B & C \ 1 & 0 \end{bmatrix}^n \cdot \begin{bmatrix} A_1 \ A_0 \end{bmatrix}
]
现在,问题的核心转化为计算矩阵 ( \begin{bmatrix} B & C \ 1 & 0 \end{bmatrix} ) 的 ( n ) 次幂。
矩阵对角化
为了高效地计算矩阵的幂,我们采用对角化的方法。对角化的核心是寻找矩阵的特征值和特征向量。
我们需要找到标量 ( \lambda )(特征值)和非零向量 ( \mathbf{v} )(特征向量),使得:
[
\begin{bmatrix} B & C \ 1 & 0 \end{bmatrix} \cdot \mathbf{v} = \lambda \cdot \mathbf{v}
]
这等价于求解方程:
[
(\begin{bmatrix} B & C \ 1 & 0 \end{bmatrix} - \lambda \mathbf{I}) \cdot \mathbf{v} = \mathbf{0}
]
其中 ( \mathbf{I} ) 是单位矩阵。这个方程有非零解 ( \mathbf{v} ) 的条件是系数矩阵的行列式为0:
[
\det \begin{bmatrix} B - \lambda & C \ 1 & -\lambda \end{bmatrix} = 0
]
计算行列式,我们得到特征方程:
[
(B - \lambda)(-\lambda) - C \cdot 1 = 0
]
化简后得到:
[
\lambda^2 - B\lambda - C = 0
]
这个二次方程的根 ( \lambda_1 ) 和 ( \lambda_2 ) 就是我们需要的特征值。
重要提示:如果 ( \lambda_1 \neq \lambda_2 ),那么对应的特征向量 ( \mathbf{v}_1 ) 和 ( \mathbf{v}_2 ) 线性无关(即,一个不是另一个的倍数)。这保证了由这些特征向量组成的矩阵是可逆的,从而能够成功对角化。
得到通解公式
假设我们找到了两个不同的特征值 ( \lambda_1 ) 和 ( \lambda_2 ),以及对应的特征向量。我们可以将原矩阵对角化:
[
\begin{bmatrix} B & C \ 1 & 0 \end{bmatrix} = P \begin{bmatrix} \lambda_1 & 0 \ 0 & \lambda_2 \end{bmatrix} P^{-1}
]
其中,矩阵 ( P ) 的列是特征向量 ( \mathbf{v}_1 ) 和 ( \mathbf{v}_2 )。
那么,矩阵的 ( n ) 次幂就很容易计算:
[
\begin{bmatrix} B & C \ 1 & 0 \end{bmatrix}^n = P \begin{bmatrix} \lambda_1^n & 0 \ 0 & \lambda_2^n \end{bmatrix} P^{-1}
]
将这个结果代入我们的矩阵方程:
[
\begin{bmatrix} A_{n+1} \ A_n \end{bmatrix} = P \begin{bmatrix} \lambda_1^n & 0 \ 0 & \lambda_2^n \end{bmatrix} P^{-1} \cdot \begin{bmatrix} A_1 \ A_0 \end{bmatrix}
]
经过矩阵乘法运算(结果包含一些由初始条件 ( A_0, A_1 ) 和矩阵 ( P ) 决定的常数),最终我们可以将 ( A_n ) 表示为:
[
A_n = \alpha \lambda_1^n + \beta \lambda_2^n
]
其中,常数 ( \alpha ) 和 ( \beta ) 可以通过代入初始条件 ( A_0 ) 和 ( A_1 ) 来求解。
向三阶递归方程的推广
理解了二阶方程的求解后,我们自然想知道如何求解更高阶的方程。本节中,我们来看看三阶线性递归方程。
考虑一个三阶线性齐次递归方程:
[
A_n = A \cdot A_{n-1} + B \cdot A_{n-2} + C \cdot A_{n-3}
]
其中 ( A, B, C ) 是常数。
建立三阶矩阵方程
我们可以采用类似的方法,将其转化为矩阵形式。
以下是建立三阶矩阵方程的步骤:
- 我们定义状态向量为 ( \begin{bmatrix} A_{n+1} \ A_n \ A_{n-1} \end{bmatrix} )。
- 根据递归关系,我们可以写出:
[
\begin{bmatrix} A_{n+1} \ A_n \ A_{n-1} \end{bmatrix} = \begin{bmatrix} A & B & C \ 1 & 0 & 0 \ 0 & 1 & 0 \end{bmatrix} \cdot \begin{bmatrix} A_n \ A_{n-1} \ A_{n-2} \end{bmatrix}
] - 同样地,通过递推得到:
[
\begin{bmatrix} A_{n+1} \ A_n \ A_{n-1} \end{bmatrix} = \begin{bmatrix} A & B & C \ 1 & 0 & 0 \ 0 & 1 & 0 \end{bmatrix}^n \cdot \begin{bmatrix} A_2 \ A_1 \ A_0 \end{bmatrix}
]
三阶矩阵的对角化
现在,我们需要对角化这个3x3矩阵 ( M = \begin{bmatrix} A & B & C \ 1 & 0 & 0 \ 0 & 1 & 0 \end{bmatrix} )。这需要找到三个特征值 ( \lambda_1, \lambda_2, \lambda_3 ) 和对应的特征向量 ( \mathbf{v}_1, \mathbf{v}_2, \mathbf{v}_3 ),满足:
[
M \cdot \mathbf{v}_i = \lambda_i \cdot \mathbf{v}_i, \quad i = 1, 2, 3
]
如果这三个特征值互不相同(( \lambda_1 \neq \lambda_2 \neq \lambda_3 )),那么可以证明对应的特征向量是线性无关的。这意味着由这些特征向量组成的矩阵 ( P = [\mathbf{v}_1, \mathbf{v}_2, \mathbf{v}_3] ) 是可逆的。
线性无关性的证明思路:假设存在不全为零的常数 ( c_1, c_2, c_3 ),使得 ( c_1\mathbf{v}_1 + c_2\mathbf{v}_2 + c_3\mathbf{v}_3 = \mathbf{0} )。我们可以用矩阵 ( M ) 左乘这个等式,并利用 ( M\mathbf{v}_i = \lambda_i \mathbf{v}_i ) 的性质,得到另一个关于 ( \lambda_i ) 和 ( \mathbf{v}_i ) 的线性组合等于零的等式。通过将原等式乘以某个 ( \lambda_i ) 后与新等式相减等操作,并利用特征值互异和二阶情形中已证明的结论(不同特征值对应的特征向量不成比例),可以推导出矛盾,从而证明 ( c_1 = c_2 = c_3 = 0 )。因此,向量组线性无关。
一旦矩阵可对角化,我们就有:
[
M = P \begin{bmatrix} \lambda_1 & 0 & 0 \ 0 & \lambda_2 & 0 \ 0 & 0 & \lambda_3 \end{bmatrix} P^{-1}
]
进而:
[
M^n = P \begin{bmatrix} \lambda_1^n & 0 & 0 \ 0 & \lambda_2^n & 0 \ 0 & 0 & \lambda_3^n \end{bmatrix} P^{-1}
]
最终,( A_n ) 的通解形式为:
[
A_n = \alpha \lambda_1^n + \beta \lambda_2^n + \gamma \lambda_3^n
]
其中常数 ( \alpha, \beta, \gamma ) 由初始条件 ( A_0, A_1, A_2 ) 确定。
总结

本节课中我们一起学习了求解线性齐次递归方程的系统方法。
- 对于二阶递归 ( A_n = B A_{n-1} + C A_{n-2} ),我们通过将其转化为矩阵方程并利用对角化技术,得到了通解 ( A_n = \alpha \lambda_1^n + \beta \lambda_2^n ),其中 ( \lambda_1, \lambda_2 ) 是特征方程 ( \lambda^2 - B\lambda - C = 0 ) 的根。
- 这种方法可以推广到更高阶。对于三阶递归 ( A_n = A A_{n-1} + B A_{n-2} + C A_{n-3} \”,我们同样构建矩阵并寻求对角化。如果找到三个互异的特征值,就能得到形如 ( A_n = \alpha \lambda_1^n + \beta \lambda_2^n + \gamma \lambda_3^n ) 的通解。
- 求解的关键步骤包括:建立矩阵方程、求解特征值和特征向量、对角化矩阵、利用初始条件确定组合系数。当特征值出现重根时,情况会稍复杂,我们将在后续课程中讨论。
016:使用矩阵与线性代数求解线性递推关系


在本节课中,我们将学习如何使用矩阵和线性代数的方法,来求解线性递推关系。我们将重点讨论三阶线性递推,并推导出通用的求解公式。通过本课,你将理解特征多项式、特征值等核心概念,并掌握求解此类问题的系统方法。
回顾:将递推关系转化为矩阵形式
上一节我们介绍了如何将递推关系转化为矩阵形式。本节中,我们来看看如何利用这个矩阵形式来求解。
假设我们有一个三阶线性递推关系:
A_n = A * A_{n-1} + B * A_{n-2} + C * A_{n-3}
其中 A, B, C 是常数。
我们可以将其改写为矩阵形式。定义向量:
[ A_{n+2} ]
[ A_{n+1} ]
[ A_n ]
那么,递推关系可以表示为:
[ A_{n+2} ] [ A B C ] [ A_{n+1} ]
[ A_{n+1} ] = [ 1 0 0 ] * [ A_n ]
[ A_n ] [ 0 1 0 ] [ A_{n-1} ]
我们记这个矩阵为 M。通过递推,我们可以得到:
[ A_{n+2} ] [ A_2 ]
[ A_{n+1} ] = M^n * [ A_1 ]
[ A_n ] [ A_0 ]
因此,问题的核心转化为计算矩阵 M 的 n 次幂。
对角化矩阵以计算幂
为了高效地计算 M^n,我们希望将矩阵 M 对角化。这意味着我们需要找到特征值 λ 和对应的特征向量 v,使得:
M * v = λ * v
对于三阶矩阵 M,我们希望找到三个特征值 λ1, λ2, λ3 和对应的特征向量 v1, v2, v3。
如果这些特征值互不相同,那么由这些特征向量组成的矩阵 P = [v1, v2, v3] 是可逆的。此时,我们可以将 M 对角化:
M = P * D * P^{-1}
其中 D 是一个对角矩阵,其对角线元素就是特征值 λ1, λ2, λ3。
那么,M 的 n 次幂就很容易计算:
M^n = (P * D * P^{-1})^n = P * D^n * P^{-1}
而 D^n 就是一个对角矩阵,其对角线元素是 λ1^n, λ2^n, λ3^n。
求解特征值与特征多项式
如何找到特征值 λ?根据定义 M * v = λ * v,我们可以将其改写为:
(M - λI) * v = 0
其中 I 是单位矩阵。为了使这个方程有非零解 v,矩阵 (M - λI) 的行列式必须为零:
det(M - λI) = 0
对于我们的矩阵 M,计算这个行列式:
det( [A-λ B C]
[1 -λ 0]
[0 1 -λ] ) = 0
通过行列式展开(例如按第三列展开),我们可以得到:
C * det([1 -λ; 0 1]) + (-λ) * det([A-λ B; 1 -λ]) = 0
计算后得到:
C + (-λ) * [ (A-λ)(-λ) - B*1 ] = 0
整理后,我们得到一个关于 λ 的三次方程:
λ^3 - Aλ^2 - Bλ - C = 0
这个多项式被称为该递推关系的特征多项式。它的根就是我们要找的特征值 λ1, λ2, λ3。
当特征值互异时的通解
如果特征多项式有三个互不相同的根(即 λ1, λ2, λ3 互异),那么我们可以保证矩阵 P 可逆,对角化过程成功。
通过之前的矩阵运算,最终我们可以得到序列 A_n 的通解形式为:
A_n = α * λ1^n + β * λ2^n + γ * λ3^n
其中 α, β, γ 是仅依赖于初始条件 A_0, A_1, A_2 的常数。
为了确定这些常数,我们可以代入 n = 0, 1, 2,得到一个线性方程组:
A_0 = α + β + γ
A_1 = α*λ1 + β*λ2 + γ*λ3
A_2 = α*λ1^2 + β*λ2^2 + γ*λ3^2
这个方程组的系数矩阵是一个范德蒙德矩阵。由于 λ1, λ2, λ3 互异,该矩阵可逆,因此我们可以唯一地解出 α, β, γ。
推广到更高阶递推关系
上述方法可以推广到任意 k 阶的齐次线性递推关系:
A_n = c1 * A_{n-1} + c2 * A_{n-2} + ... + ck * A_{n-k}
对应的特征多项式为:
λ^k - c1 * λ^{k-1} - c2 * λ^{k-2} - ... - ck = 0
如果这个多项式的 k 个根 λ1, λ2, ..., λk 互不相同,那么通解为:
A_n = α1 * λ1^n + α2 * λ2^n + ... + αk * λk^n
常数 α1, α2, ..., αk 可以通过前 k 个初始项 A_0, A_1, ..., A_{k-1} 确定的线性方程组解得。
总结
本节课中我们一起学习了如何使用矩阵和线性代数工具求解线性递推关系。核心步骤包括:
- 建立矩阵形式:将递推关系转化为矩阵乘法。
- 对角化:通过求解特征值
λ和特征向量v来对角化矩阵,以便计算矩阵的幂M^n。 - 求解特征多项式:特征值
λ是特征多项式det(M - λI) = 0的根。 - 写出通解:当特征值互异时,通解是各特征值
n次幂的线性组合。 - 确定系数:利用初始条件建立方程组,解出线性组合的系数。

这种方法为求解一大类递推关系提供了强大而系统的工具。下一节,我们将探讨当特征值出现重复(即特征多项式有重根)时,应如何处理。
017:生成函数入门


在本节课中,我们将学习一种强大的数学工具——生成函数。我们将从一个有趣的数学现象(1/89与斐波那契数列的关系)出发,逐步推导出斐波那契数列的生成函数,并利用它来求解数列的通项公式。整个过程将展示生成函数如何将复杂的递归问题转化为代数问题来处理。
一个有趣的现象:1/89
首先,让我们观察一个有趣的现象。计算 1 / 89 得到的小数展开如下:
0.011235955056...
请注意前几位数字:0, 1, 1, 2, 3, 5。这恰好是斐波那契数列的前几项(F0=0, F1=1, F2=1, F3=2, F4=3, F5=5)。然而,下一个数字是9,而斐波那契数列的下一项应该是8(3+5)。这似乎“出错”了。
但如果我们继续计算并考虑进位,会发现这个规律依然成立。例如,5+8=13,产生进位,使得后续数字依然符合斐波那契数列的规律。这暗示着 1/89 与斐波那契数列的和存在某种深刻联系。
建立联系:斐波那契数列与无穷级数
上一节我们观察到了一个有趣的现象,本节中我们来看看如何用数学语言描述它。
我们考虑以下无穷级数 X,它将斐波那契数 F_n 与10的幂次相结合:
X = F0/10^1 + F1/10^2 + F2/10^3 + F3/10^4 + ...
如果这个级数收敛,那么它的值似乎应该等于我们观察到的 1/89。我们的目标是证明 X = 1/89。
以下是证明思路:
- 写出 X 的表达式。
- 利用斐波那契数列的递推关系
F_n = F_{n-1} + F_{n-2}对级数进行拆分和重组。 - 在重组过程中,识别出 X 本身或其缩放版本,从而建立一个关于 X 的方程。
- 解这个方程求出 X。
让我们开始推导。设:
X = F0/10 + F1/100 + F2/1000 + F3/10000 + ...
我们从第三项开始应用递推关系 F2 = F1 + F0,第四项应用 F3 = F2 + F1,依此类推:
X = F0/10 + F1/100 + (F0+F1)/1000 + (F1+F2)/10000 + (F2+F3)/100000 + ...
我们将项按列对齐,以便观察模式:
X = [F0/10 + F1/100] + [F0/1000 + F1/1000] + [F1/10000 + F2/10000] + [F2/100000 + F3/100000] + ...
现在,观察这个重新排列的级数:
- 第一列(黄色部分)恰好是 X / 100,因为每一项的分母都比原始 X 中的对应项多了一个因子
10^2。 - 第二列(蓝色部分)是 X / 10,因为每一项的分母都比原始 X 中的对应项多了一个因子
10^1,但缺少了第一项F0/10。由于F0 = 0,所以缺少的项为0。
因此,我们可以建立方程:
X = (F0/10 + F1/100) + (X / 100) + (X / 10)
代入 F0 = 0, F1 = 1:
X = 0/10 + 1/100 + X/100 + X/10
X = 1/100 + X/100 + X/10
将所有含 X 的项移到左边:
X - X/10 - X/100 = 1/100
(1 - 1/10 - 1/100)X = 1/100
(100/100 - 10/100 - 1/100)X = 1/100
(89/100)X = 1/100
两边同时乘以100:
89X = 1
最终得到:
X = 1/89
这就证明了我们的观察。这个推导的核心技巧是利用递推关系,在级数表达式中“重新发现”级数本身,从而建立可解的方程。
重要提醒:收敛性
上一节的推导依赖于对无穷级数进行重新排列和组合,这在数学上需要级数收敛才能严格成立。对于发散级数,这种操作可能导致荒谬的结果。
例如,考虑级数 Y = 1 + 2 + 4 + 8 + 16 + ...。如果错误地应用类似技巧,可以写出:
Y = 1 + 2(1 + 2 + 4 + 8 + ...) = 1 + 2Y
解得 Y = -1,这显然是错误的,因为正数相加不可能得到负数。错误的原因在于级数 Y 是发散的(和趋于无穷大),我们不能对其应用有限的代数运算规则。
在我们的斐波那契级数例子中,由于斐波那契数呈指数增长,而分母 10^n 增长更快,因此级数 X 是收敛的,我们的操作是合理的。在本课程中,当我们使用生成函数时,通常会默认所处理的级数具有良好的收敛性,或者我们将其视为一种形式化的代数工具。最终得到的公式可以通过数学归纳法等严格方法进行验证。
推广与生成函数的引入
上一节我们解决了以10为底的特定问题。一个自然的推广是:如果使用其他进制(例如100进制,即每两位斐波那契数占一个小数位),对应的分数是多少?
设基数为 b,我们考虑更一般的级数:
X(b) = F0/b^1 + F1/b^2 + F2/b^3 + F3/b^4 + ...
重复之前的推导过程(将10替换为 b),我们可以得到方程:
X(b) = 1/b^2 + X(b)/b^2 + X(b)/b
解得:
X(b) = 1 / (b^2 - b - 1)
当 b=10 时,X(10) = 1/(100-10-1) = 1/89,与之前一致。当 b=100 时,X(100)=1/(10000-100-1)=1/9899,这就是每两位显示一个斐波那契数的分数。
观察这个一般形式,它启发我们定义一个新的函数,即斐波那契数列的生成函数。我们不再将 b 放在分母,而是将其作为一个变量 z 放在分子,形成幂级数:
F(z) = F0*z^0 + F1*z^1 + F2*z^2 + F3*z^3 + ...
这个函数 F(z) 就是斐波那契数列的生成函数。注意,我们之前的 X(b) 与 F(z) 有关系:X(b) = F(1/b) / b。
求解斐波那契数列生成函数
现在,让我们直接求解生成函数 F(z) 的封闭形式。我们使用与之前类似的技巧,但这次是在变量 z 的幂级数框架下。
我们有:
F(z) = F0 + F1*z + F2*z^2 + F3*z^3 + F4*z^4 + ...
代入 F0=0, F1=1,并从 F2 开始应用递推关系 F_n = F_{n-1} + F_{n-2}:
F(z) = 0 + 1*z + (F0+F1)z^2 + (F1+F2)z^3 + (F2+F3)z^4 + ...
= z + F0*z^2 + F1*z^2 + F1*z^3 + F2*z^3 + F2*z^4 + F3*z^4 + ...
将项分组:
F(z) = z + (F1*z^2 + F2*z^3 + F3*z^4 + ...) + (F0*z^2 + F1*z^3 + F2*z^4 + ...)
观察括号内的部分:
- 第一个括号:
z^2 * (F1*z^0 + F2*z^1 + F3*z^2 + ...) = z^2 * (F(z) - F0*z^0) = z^2 * F(z)(因为F0=0)。 - 第二个括号:
z * (F0*z^1 + F1*z^2 + F2*z^3 + ...) = z * (F(z) - F0*z^0 - F1*z^1?)仔细看,它实际上是z * (F0*z^1 + F1*z^2 + F2*z^3 + ...) = z * [z * (F0*z^0 + F1*z^1 + F2*z^2 + ...)] = z^2 * F(z)。更简单的方法是注意到从F2*z^2开始的项可以配对,实际上两个括号都等于z^2 * F(z)。让我们更清晰地处理:
实际上,更标准的推导如下:
F(z) = F0 + F1*z + F2*z^2 + F3*z^3 + F4*z^4 + ...
z*F(z) = F0*z + F1*z^2 + F2*z^3 + F3*z^4 + ...
z^2*F(z) = F0*z^2 + F1*z^3 + F2*z^4 + F3*z^5 + ...
现在计算 z*F(z) + z^2*F(z):
z*F(z) + z^2*F(z) = (F0*z + F1*z^2 + F2*z^3 + F3*z^4 + ...) + (F0*z^2 + F1*z^3 + F2*z^4 + F3*z^5 + ...)
= F0*z + (F1+F0)z^2 + (F2+F1)z^3 + (F3+F2)z^4 + ...
= F0*z + F2*z^2 + F3*z^3 + F4*z^4 + ... (根据递推关系)
注意到 F(z) = F0 + F1*z + F2*z^2 + F3*z^3 + F4*z^4 + ...。
因此:
z*F(z) + z^2*F(z) = (F(z) - F0 - F1*z) + F2*z^2? 这样不对。
更准确地说,观察 z*F(z) + z^2*F(z) 从 z^2 项开始,正好等于 F(z) - F0 - F1*z 从 z^2 项开始的部分。即:
z*F(z) + z^2*F(z) = F(z) - F0 - F1*z
代入 F0=0, F1=1:
z*F(z) + z^2*F(z) = F(z) - 0 - 1*z
z*F(z) + z^2*F(z) = F(z) - z
现在,解这个关于 F(z) 的方程:
F(z) - z*F(z) - z^2*F(z) = z
F(z) * (1 - z - z^2) = z
因此,我们得到生成函数的封闭形式:
F(z) = z / (1 - z - z^2)
这就是斐波那契数列生成函数的简洁表达式。
从生成函数到通项公式
现在我们有了生成函数 F(z) = z / (1 - z - z^2)。如何从中提取出斐波那契数 F_n(即 z^n 的系数)呢?直接进行泰勒展开求导会很繁琐。我们采用部分分式分解的方法。
首先,处理分母:
F(z) = z / (1 - z - z^2) = -z / (z^2 + z - 1)
对分母进行因式分解,需要求方程 z^2 + z - 1 = 0 的根。利用二次求根公式:
z = [-1 ± √(1 + 4)] / 2 = (-1 ± √5) / 2
令 r = (-1 + √5)/2, s = (-1 - √5)/2。则分母可写为 (z - r)(z - s)。
接下来,将 F(z) 分解为部分分式:
F(z) = -z / ((z - r)(z - s)) = A/(z - r) + B/(z - s)
其中 A 和 B 是待定常数。为了便于展开成几何级数,我们改写每一项:
A/(z - r) = (-A/r) / (1 - z/r)
B/(z - s) = (-B/s) / (1 - z/s)
因为 1/(1 - α) = 1 + α + α^2 + α^3 + ...(当 |α| < 1)。因此:
F(z) = (-A/r) * [1 + (z/r) + (z/r)^2 + (z/r)^3 + ...] + (-B/s) * [1 + (z/s) + (z/s)^2 + (z/s)^3 + ...]
现在,z^n 的系数 [z^n]F(z) 就是:
[z^n]F(z) = (-A/r) * (1/r)^n + (-B/s) * (1/s)^n = (-A) * r^{-(n+1)} + (-B) * s^{-(n+1)}
由于 [z^n]F(z) 就是斐波那契数 F_n,所以我们有:
F_n = C * (1/r)^n + D * (1/s)^n
其中 C = -A/r, D = -B/s 是新的常数。
计算 1/r 和 1/s:
1/r = 2 / (-1 + √5) = 2(1 + √5) / (5 - 1) = (1 + √5)/2 = φ (黄金比例)
1/s = 2 / (-1 - √5) = 2(1 - √5) / (5 - 1) = (1 - √5)/2 = ψ
因此,通项公式形式为:
F_n = C * φ^n + D * ψ^n
最后,利用初始条件 F_0 = 0 和 F_1 = 1 来确定常数 C 和 D:
- 当
n=0:C * φ^0 + D * ψ^0 = C + D = 0=>D = -C - 当
n=1:C * φ^1 + D * ψ^1 = Cφ + Dψ = 1=>Cφ - Cψ = 1=>C(φ - ψ) = 1
由于φ - ψ = √5,所以C = 1/√5,D = -1/√5。
最终得到著名的斐波那契数列通项公式(比内公式):
F_n = (1/√5) * [ ((1+√5)/2)^n - ((1-√5)/2)^n ]
总结
本节课中我们一起学习了生成函数的基本思想。我们从 1/89 这个有趣的现象出发,通过建立无穷级数并利用斐波那契数列的递推关系,证明了其与斐波那契数列的联系。随后,我们将问题推广到一般进制,并自然引出了生成函数 F(z) 的概念。
我们推导出斐波那契数列生成函数的封闭形式:
F(z) = z / (1 - z - z^2)
接着,通过部分分式分解和几何级数展开的技巧,我们从生成函数中成功提取出了斐波那契数列的通项公式。这个过程展示了生成函数如何将序列的递归信息编码进一个函数中,并通过分析这个函数来获取序列的性质(如通项公式)。

生成函数是解决离散数学问题,特别是递归关系计数问题的强大工具。在接下来的课程中,我们将继续探索生成函数的更多应用。
018:生成函数法求解线性递推关系


在本节课中,我们将学习如何使用生成函数这一强大工具来求解二阶线性齐次递推关系。我们将从回顾上节课的斐波那契数列例子出发,推导出求解一般形式的通用方法,并处理具有重根的特殊情况。
从斐波那契数列到一般形式
上一节我们介绍了如何使用生成函数求解斐波那契数列。本节中,我们来看看如何将这个方法推广到更一般的二阶线性递推关系。
假设我们有一个递推关系:
A_n = A * A_{n-1} + B * A_{n-2}
其中 A 和 B 是常数,A_n 是我们要求解的序列。
我们的目标是找到一个公式,可以直接计算 A_n,而不需要递归地计算前面的所有项。
生成函数的定义
我们首先为序列 {A_0, A_1, A_2, ...} 定义一个生成函数 F(z):
F(z) = A_0 + A_1z + A_2z^2 + A_3*z^3 + ...
这个函数将整个序列“压缩”成了一个关于变量 z 的无穷级数。这里我们使用 z 作为变量,是因为在数学中它常用来表示复数变量,这为理论分析提供了便利,尽管在本课程中我们主要进行形式上的代数操作。
建立关于 F(z) 的方程
接下来,我们利用递推关系来建立关于 F(z) 的方程。我们将 F(z) 与递推关系中的各项相乘并对齐 z 的幂次。
以下是具体步骤:
- 写出
F(z)的展开式。 - 写出
A * z * F(z)的展开式,这会将原序列的系数与A相乘,并将z的幂次提升一次。 - 写出
B * z^2 * F(z)的展开式,这会将原序列的系数与B相乘,并将z的幂次提升两次。
当我们把这三项相加时,根据递推关系 A_n = A * A_{n-1} + B * A_{n-2},对于 n >= 2 的项,其系数正好等于 A_n。因此,我们有:
F(z) = A_0 + A_1z + AzF(z) + Bz^2F(z) - (AA_0z + BA_0z^2 + BA_1*z^2)
最后减去的项是为了修正 n=0 和 n=1 时多出来的项。
求解 F(z)
现在,我们将所有包含 F(z) 的项移到等式一边:
F(z) - AzF(z) - Bz^2F(z) = A_0 + (A_1 - AA_0)z
提取公因式 F(z):
F(z) * (1 - Az - Bz^2) = A_0 + (A_1 - AA_0)z
于是,我们解出了生成函数 F(z):
F(z) = [A_0 + (A_1 - AA_0)z] / (1 - Az - Bz^2)
部分分式分解与几何级数
我们的目标是将 F(z) 写成易于展开成幂级数的形式。观察分母 1 - A*z - B*z^2,我们希望将其因式分解为 (1 - λ_1*z)(1 - λ_2*z) 的形式。这样,F(z) 就可以通过部分分式分解为:
F(z) = α/(1 - λ_1z) + β/(1 - λ_2z)
其中 α 和 β 是待定常数。
为什么这样有用呢?因为每一项 1/(1 - λ*z) 正好是一个无穷几何级数的和:
1/(1 - λz) = 1 + λz + λ2*z2 + λ3*z3 + ...
寻找 λ_1 和 λ_2
为了找到 λ_1 和 λ_2,我们需要分解分母。一个巧妙的方法是考虑方程:
1 - Az - Bz^2 = (1 - λ_1z)(1 - λ_2z)
将右边展开:1 - (λ_1 + λ_2)*z + (λ_1*λ_2)*z^2。
比较系数,我们得到:
λ_1 + λ_2 = A
λ_1 * λ_2 = -B
这等价于求解二次方程 x^2 - A*x - B = 0 的根。这个方程正是我们在矩阵/特征值方法中遇到的特征方程。因此,λ_1 和 λ_2 就是特征方程的根。
得到通项公式
假设 λ_1 和 λ_2 是两个不同的根。通过部分分式确定常数 α 和 β 后,我们将 F(z) 展开为两个几何级数之和:
F(z) = α(1 + λ_1z + λ_12*z2 + ...) + β(1 + λ_2z + λ_22*z2 + ...)
合并同类项,z^n 的系数就是:
A_n = α * λ_1^n + β * λ_2^n
这与我们之前用线性代数方法得到的结果完全一致。
处理重根的情况
上一节我们讨论了特征根不同的情况。本节中,我们来看看当特征方程有重根时该如何处理。此时,部分分式分解和最终的公式会有所不同。
考虑一个具体例子:
A_n = 6A_{n-1} - 9A_{n-2},且 A_0 = 0, A_1 = 1。
按照上述步骤,我们得到生成函数:
F(z) = z / (1 - 6z + 9z^2)
注意,分母可以写为完全平方:
1 - 6z + 9z^2 = (1 - 3*z)^2
现在,我们面对的是 z / (1 - 3*z)^2,而不是简单的 1/(1 - λ*z) 的形式。为了展开它,我们需要一点技巧。
我们先考虑一个简单的几何级数:
G(z) = 1/(1 - 3z) = 1 + 3z + 32*z2 + 33*z3 + ...
对 G(z) 两边关于 z 求导:
d/dz [G(z)] = d/dz [1/(1 - 3z)] = 3 / (1 - 3z)^2
同时,对右边的级数逐项求导:
d/dz [1 + 3z + 32*z2 + 33*z3 + ...] = 0 + 3 + 23^2z + 333*z2 + 4*34*z3 + ...
= 3 + 23^2z + 333*z2 + 434*z3 + ...
因此,我们得到:
3 / (1 - 3z)^2 = 3 + 23^2z + 333*z2 + 4*34*z3 + ...
两边同时乘以 z/3,就得到了我们需要的 F(z):
z / (1 - 3z)^2 = z + 23z^2 + 332*z3 + 4*33*z4 + ...
观察 z^n 项的系数,我们可以总结出通项公式:
A_n = n * 3^{n-1}
我们可以验证前几项:A_0=0, A_1=1, A_2=2*3=6, A_3=3*9=27,这符合递推关系 A_n = 6*A_{n-1} - 9*A_{n-2}。当特征根重复时,通解中会包含一个 n 的因子,形式为 (C_1 + C_2*n) * λ^n。
总结
本节课中,我们一起学习了如何使用生成函数求解线性递推关系。
- 我们首先定义了序列的生成函数,并将其表示为一个幂级数。
- 然后,利用递推关系建立关于生成函数的方程并求解。
- 接着,通过将分母因式分解并进行部分分式展开,我们将生成函数转化为几何级数的和。
- 最后,通过比较系数,我们得到了序列通项的直接公式
A_n = α * λ_1^n + β * λ_2^n。 - 对于特征方程有重根的特殊情况,我们通过求导的技巧进行处理,得到了形如
(C_1 + C_2*n) * λ^n的通项公式。

生成函数法提供了一种强大而系统的方法来解决这类问题,并且可以自然地推广到更高阶的递推关系。下次课我们将继续深入,探讨更一般的情况。
019:齐次线性递推的通解 🧮


在本节课中,我们将学习如何求解所有齐次线性递推关系。我们将从上一讲结束的地方开始,通过一个具体的例子,引出处理具有重根情况的通用方法,并最终推导出求解任意齐次线性递推的通解公式。
上一节我们介绍了使用生成函数求解递推关系,并遇到了分母为完全平方的情况。本节中,我们来看看如何处理更一般的情况,特别是当特征多项式具有重根时,解的形式会如何变化。
从具体例子到一般观察
我们上次以递推关系 A_n = 6A_{n-1} - 9A_{n-2} 为例。使用生成函数法后,我们得到的分母是一个完全平方,这导致在部分分式分解时,不能简单地使用一次项,而需要使用高次项。
具体来说,我们最终得到解的形式为:
A_n = n × 3^{n-1}
这与之前特征根互异时得到的纯指数形式(如 C × r^n)不同。现在,指数项前面多了一个关于 n 的多项式因子。
构建一般性递推关系
让我们考虑一个更一般的四阶齐次线性递推关系:
A_n = A × A_{n-1} + B × A_{n-2} + C × A_{n-3} + D × A_{n-4}
我们的目标是找到求解此类所有递推关系的通用方法。
以下是使用生成函数法求解的步骤概要:
- 设生成函数 F(z) = A_0 + A_1 z + A_2 z^2 + A_3 z^3 + ...
- 利用递推关系,将 F(z) 与自身进行代数操作。
- 将所有包含 F(z) 的项移到等式一边,最终得到形如:
F(z) = (某个三次多项式) / (1 - A z - B z^2 - C z^3 - D z^4) - 下一步是对这个有理函数进行部分分式分解。
特征多项式与根的情况
部分分式分解的关键在于分母的根。我们定义特征多项式为:
λ^4 - A λ^3 - B λ^2 - C λ - D = 0
求解这个多项式,我们得到根 λ_1, λ_2, λ_3, λ_4。
情况一:所有根互异
如果所有根都是不同的,那么部分分式分解很简单:
F(z) = α/(1 - λ_1 z) + β/(1 - λ_2 z) + γ/(1 - λ_3 z) + δ/(1 - λ_4 z)
通过比较系数,我们可以得到通解:
A_n = α λ_1^n + β λ_2^n + γ λ_3^n + δ λ_4^n
情况二:存在重根
如果特征多项式有重根,例如 (λ - 7)^3 (λ + 5) = 0,即根为 7, 7, 7, -5。
那么,对应的生成函数分母为 (1 - 7z)^3 (1 + 5z)。
根据微积分中的部分分式法则,对于重根,分解形式如下:
F(z) = blob_1/(1 - 7z) + blob_2/(1 - 7z)^2 + blob_3/(1 - 7z)^3 + blob_4/(1 + 5z)
这里的 blob 代表与 n 和 z 无关的常数系数。
处理重根项:探索系数模式
现在,核心问题是如何求出像 1/(1 - λ z)^r 这样的项的幂级数展开式中 z^n 的系数。
我们以 1/(1 - λ z)^3 为例,探索三种方法。
方法一:反复求导(泰勒级数法)
我们知道几何级数:
1/(1 - λ z) = 1 + λ z + λ^2 z^2 + λ^3 z^3 + ...
对其求导一次,可以得到 1/(1 - λ z)^2 的展开式。再求导一次,可以得到 1/(1 - λ z)^3 的展开式。通过观察模式,我们发现 z^n 的系数具有组合数的形式。
方法二:组合解释(乘法原理)
注意到:
1/(1 - λ z)^3 = [1/(1 - λ z)] × [1/(1 - λ z)] × [1/(1 - λ z)]
每个括号内都是一个几何级数。要得到 z^n 的系数,我们需要从三个几何级数中分别选取项,使得所选项的指数之和为 n。这等价于将 n 个相同的“硬币”分配给 3 个人的方案数。
这个方案数由“星棒法”给出:
系数 = (n + 3 - 1) choose (3 - 1) × λ^n = (n + 2) choose 2 × λ^n
方法三:直接泰勒展开
直接对函数 G(z) = 1/(1 - z)^r 在 z=0 处求各阶导数,并除以相应的阶乘,也能得到相同的系数形式,即包含上升阶乘的项。
通用结论与解的形式
综合以上方法,我们得到一个重要结论:
对于项 1/(1 - λ z)^r,其幂级数中 z^n 的系数为:
系数 = (n + r - 1) choose (r - 1) × λ^n
由于 (n + r - 1) choose (r - 1) 展开后是关于 n 的 r-1 次多项式,因此我们可以说:
系数 = (一个次数 ≤ r-1 的关于 n 的多项式) × λ^n
回到我们具有三重根 7 的例子:
- 1/(1 - 7z) 贡献:(一个常数多项式) × 7^n
- 1/(1 - 7z)^2 贡献:(一个一次多项式) × 7^n
- 1/(1 - 7z)^3 贡献:(一个二次多项式) × 7^n
- 1/(1 + 5z) 贡献:(一个常数) × (-5)^n
将这些部分相加,A_n 的通解最终形式为:
A_n = (P_2(n)) × 7^n + (C) × (-5)^n
其中 P_2(n) 是一个次数不超过 2 的关于 n 的多项式(即 c_0 + c_1 n + c_2 n^2),C 是一个常数。
求解常数:代入初始条件
通解公式中有若干个未知常数(本例中是 c_0, c_1, c_2, C)。为了确定它们,我们利用递推关系的初始条件(例如 A_0, A_1, A_2, A_3)。
只需将 n = 0, 1, 2, 3 代入通解公式,得到一个关于这些常数的线性方程组。解这个方程组,即可得到唯一确定的常数,从而获得该递推关系的特解。
本节课中我们一起学习了求解齐次线性递推关系的完整通用方法:
- 根据递推关系写出特征多项式并求根。
- 根据根的情况(互异或重根)写出通解的形式:
- 单根 λ 贡献 C × λ^n。
- r 重根 λ 贡献 (一个 r-1 次多项式) × λ^n。
- 将所有贡献相加,得到完整的通解公式。
- 利用初始条件建立方程组,解出通解中的所有常数系数。

这种方法可以系统性地解决任何齐次线性递推关系。下节课我们将继续深入,并探讨更多相关的例子和应用。
020:线性递推与卡特兰数
在本节课中,我们将要学习如何求解齐次线性递推关系,并探索一个著名的组合问题——计算合法的括号对排列数,即卡特兰数。我们将使用生成函数这一强大工具来推导其通项公式。

线性递推的求解定理
上一节我们介绍了使用生成函数求解线性递推的方法。本节中,我们来看看其最终结论,一个可以直接使用的通用定理。
考虑一个齐次线性递推关系:
a_n = A * a_{n-1} + B * a_{n-2} + ... + Z * a_{n-k}
求解此类递推的步骤如下:
-
写出特征多项式:
该多项式为:λ^k - A * λ^{k-1} - B * λ^{k-2} - ... - Z = 0 -
求特征多项式的根:
设求得的根为 λ₁, λ₂, ..., λ_r,其重数分别为 m₁, m₂, ..., m_r。这些根是互不相同的。 -
写出通项公式的一般形式:
通项a_n具有以下形式:
a_n = (P₁(n)) * λ₁^n + (P₂(n)) * λ₂^n + ... + (P_r(n)) * λ_r^n
其中,每个P_i(n)是一个关于n的多项式,其次数小于该根的重数m_i。 -
确定具体系数:
通过代入递推的初始条件(例如a_0,a_1等),建立方程组,解出各个多项式P_i(n)中的系数(即“blob”),从而得到a_n的精确表达式。
这个定理的强大之处在于,它将求解递推关系的问题,转化为了寻找多项式根的问题。
卡特兰数问题:合法括号排列
现在,我们来看一个不同的计数问题。它导出的递推关系不是线性的,但我们可以用生成函数巧妙地解决它。
问题:对于 n 对括号,有多少种不同的合法排列方式?合法的意思是,每个左括号都必须有对应的右括号,并且在任何位置,已出现的右括号数量不能超过左括号数量。
以下是几个小例子:
n = 1:()→ 1 种。n = 2:()(),(())→ 2 种。n = 3:()()(),(())(),()(()),(()()),((()))→ 5 种。
这个数列 1, 2, 5, ... 非常著名,被称为卡特兰数,记作 C_n。
推导卡特兰数的递推关系
为了找到 C_n 的递推式,我们采用一种巧妙的分类方法:观察与第一个左括号配对的右括号的位置。
对于任何合法的 n 对括号序列,第一个字符一定是左括号。设与它配对的右括号将整个序列分成了两部分:
- 第一部分:在这对括号内部,是一个合法的
k对括号序列。 - 第二部分:在这对括号外部(右侧),是一个合法的
n-1-k对括号序列。
其中,k 可以是 0, 1, 2, ..., n-1。
根据这一分析,我们可以将 C_n 分解为所有可能 k 值的情况之和。内部有 C_k 种排列,外部有 C_{n-1-k} 种排列,根据乘法原理,每种 k 对应 C_k * C_{n-1-k} 种方式。
因此,我们得到卡特兰数的递推关系:
C_n = C_0 * C_{n-1} + C_1 * C_{n-2} + ... + C_{n-1} * C_0
其中,我们定义 C_0 = 1(0对括号有一种排列方式:空序列)。
这个递推关系不是线性的,因为它包含了前面所有项乘积的和。
使用生成函数求解卡特兰数
为了求解这个递推关系,我们引入生成函数。设生成函数为:
F(z) = C_0 + C_1*z + C_2*z^2 + C_3*z^3 + ...
我们考虑 F(z) 的平方:
F(z)^2 = (C_0 + C_1*z + C_2*z^2 + ...) * (C_0 + C_1*z + C_2*z^2 + ...)
计算乘积中 z^{n-1} 项的系数。根据多项式乘法规则,该项系数为所有满足 i+j = n-1 的 C_i * C_j 之和,而这正是递推式中 C_n 的表达式(注意下标:C_n 对应 z^{n-1} 的系数)。
因此,我们有:
F(z)^2 = C_1 + C_2*z + C_3*z^2 + ... = (F(z) - C_0) / z = (F(z) - 1) / z
由此我们得到一个关于 F(z) 的方程:
z * F(z)^2 - F(z) + 1 = 0
这是一个关于 F(z) 的二次方程。应用求根公式并选择在 z=0 处有定义的解(以保证生成函数在原点收敛),我们得到:
F(z) = (1 - sqrt(1 - 4z)) / (2z)
广义二项式定理与最终解
我们的目标是找到 F(z) 的幂级数展开式中 z^n 的系数,即 C_n。这需要展开 sqrt(1 - 4z) = (1 - 4z)^{1/2}。
这里我们需要广义二项式定理。对于任意实数 r,有:
(1 + z)^r = Σ_{k=0}^{∞} (r choose k) * z^k
其中广义二项式系数定义为:
(r choose k) = r * (r-1) * ... * (r-k+1) / k!
当 r 是非负整数时,这就是普通的二项式定理。
将 r = 1/2 和 z 替换为 -4z 代入:
(1 - 4z)^{1/2} = Σ_{k=0}^{∞} (1/2 choose k) * (-4z)^k
我们可以计算 (1/2 choose k)。将其代入 F(z) 的表达式,并提取 z^n 的系数,经过化简(具体计算将在下节课完成),可以得到卡特兰数的封闭形式:
C_n = (1/(n+1)) * (2n choose n)
这就是第 n 个卡特兰数的著名公式。
总结

本节课中我们一起学习了两个核心内容:
- 齐次线性递推的求解定理:通过特征多项式求根,可以直接写出通项公式的一般形式。
- 卡特兰数及其求解:我们定义了一个著名的组合数列——卡特兰数
C_n,它表示n对括号的合法排列数。通过分析其结构,我们得到了一个非线性递推关系。利用生成函数将其转化为二次方程,并最终借助广义二项式定理,推导出了卡特兰数的通项公式C_n = (1/(n+1)) * C(2n, n)。这展示了生成函数在处理复杂递推关系时的强大能力。
021:卡特兰数

在本节课中,我们将学习卡特兰数。我们将回顾其递归定义,使用生成函数推导其封闭形式,并通过一个巧妙的组合证明(反射原理)来验证结果。课程最后将总结卡特兰数的核心公式及其组合意义。
递归关系与生成函数
上一节我们介绍了卡特兰数的递归定义。本节中,我们来看看如何利用生成函数求解这个递归关系。
卡特兰数 C_n 计算的是 n 对括号的有效排列方式数量。其递归关系源于分析第一个开括号的匹配位置。设第一个开括号在第 2k+1 个位置闭合,则其内部有 k 对括号,外部有 n-1-k 对括号。这给出了递归式:
C_n = Σ_{k=0}^{n-1} C_k * C_{n-1-k},其中 C_0 = 1。
这个递归不是简单的线性关系。我们引入生成函数 F(z) = Σ_{n>=0} C_n * z^n。将递归式代入并利用卷积性质,可以得到关于 F(z) 的方程:
[F(z)]^2 = Σ_{n>=1} C_{n-1} z^{n-1} = (F(z) - C_0) / z = (F(z) - 1) / z
整理后得到一个二次方程:
z * [F(z)]^2 - F(z) + 1 = 0
应用求根公式并选择在 z=0 处解析的解,我们得到生成函数的表达式:
F(z) = (1 - sqrt(1 - 4z)) / (2z)
广义二项式定理与系数提取
上一节我们得到了生成函数的根式形式。本节中,我们利用广义二项式定理将其展开为幂级数,以提取系数 C_n。
我们需要展开 (1 - 4z)^{1/2}。广义二项式定理指出,对于任意实数 r,有:
(1 + w)^r = Σ_{k>=0} (r choose k) * w^k
其中广义二项式系数定义为:
(r choose k) = r * (r-1) * ... * (r-k+1) / k!
将 w = -4z 和 r = 1/2 代入,得到展开式:
(1 - 4z)^{1/2} = Σ_{k>=0} (1/2 choose k) * (-4z)^k
我们需要 F(z) 中 z^n 的系数。注意 F(z) 的分子中,常数项 1 与展开式的常数项 1 相消,使得我们可以安全地除以 2z。因此,C_n 对应于展开式中 z^{n+1} 项的系数,再除以 -2(考虑负号)。具体推导如下:
C_n = - (1/2) * (1/2 choose n+1) * (-4)^{n+1} / 2
化简符号和幂次后,我们得到:
C_n = (1/2) * (1/2 choose n+1) * 4^{n+1}
化简为组合公式
上一节我们得到了一个包含广义二项式系数的表达式。本节中,我们通过代数运算将其化为更熟悉的形式。
首先,写出广义二项式系数的展开:
(1/2 choose n+1) = (1/2) * (-1/2) * (-3/2) * ... * ( (1-2n)/2 ) / (n+1)!
分子是 n+1 个项的乘积。将表达式 C_n = (1/2) * (1/2 choose n+1) * 4^{n+1} 中的各部分代入并化简:
4^{n+1} = 2^{2n+2}。- 分子中的每个
(1/2)因子与分母中的2的幂次合并。 - 所有负号成对出现,因此最终结果为正。
经过一系列代数操作(包括分子分母同乘 n! 以构造完整阶乘),最终可化简为:
C_n = (2n)! / ((n+1)! * n!)
这等价于:
C_n = (1/(n+1)) * (2n choose n)
反射原理:一个组合证明
上一节我们通过生成函数得到了卡特兰数的公式。本节中,我们介绍一个纯粹的组合证明方法——反射原理,它揭示了卡特兰数与格路计数之间的深刻联系。
考虑一个等价的组合问题:计算从 (0,0) 移动到 (n,n)、且始终不穿过对角线 y=x(即始终保持在线上或上方)的格路数量。每一步只能向上 (0,1) 或向右 (1,0)。这对应于 n 个“上”和 n 个“右”的序列。
所有路径的总数(不考虑限制)是 (2n choose n)。我们需要减去那些“坏”的路径,即至少穿过一次对角线的路径。
反射原理的精妙之处在于,它建立了“坏”路径与另一类更容易计数的路径之间的一一对应关系。以下是具体步骤:
- 将对角线
y=x向下平移一格,得到直线L: y = x - 1。 - 对于任何一条“坏”路径,找到它第一次触碰到直线
L的点P。 - 将路径在点
P之后的部分,关于直线L进行反射。
这个操作将一条从 (0,0) 到 (n,n) 的坏路径,唯一地映射为一条从 (0,0) 到 (n+1, n-1) 的普通路径(无限制)。反之,任何一条从 (0,0) 到 (n+1, n-1) 的路径,由于其终点位置,必然穿过直线 L。找到第一次穿过的点并反射其后部分,就能唯一地恢复出一条从 (0,0) 到 (n,n) 的坏路径。
因此,“坏”路径的数量就等于从 (0,0) 到 (n+1, n-1) 的无限制路径数量,即 (2n choose n-1) 或 (2n choose n+1)。
于是,合法的好路径数量为:
C_n = (2n choose n) - (2n choose n-1)
通过简单的代数运算可以验证:
(2n choose n) - (2n choose n-1) = (1/(n+1)) * (2n choose n)
这与我们之前得到的结果完全一致。
总结

本节课中我们一起学习了卡特兰数。我们从其递归定义出发,利用生成函数和广义二项式定理,推导出了其封闭形式公式 C_n = (1/(n+1)) * (2n choose n)。随后,我们通过反射原理这一巧妙的组合技巧,给出了该公式另一个优雅的证明,揭示了卡特兰数在格路计数问题中的直观意义。这个数出现在许多组合问题中,其简洁的公式与丰富的解释体现了数学的美感。
022:图论入门


在本节课中,我们将开始学习图论。图论是研究由节点(顶点)和连接线(边)组成的结构的数学分支。我们将了解图的基本概念、不同类型的图,以及图论在现实世界中的应用。

图的基本概念
图由两部分组成:顶点和边。顶点是图中的点,边是连接顶点的线。图的核心在于顶点之间的邻接关系,即哪些顶点是直接相连的。
一个图可以用多种方式绘制,只要顶点之间的邻接关系保持不变,它们就是同一个图。例如,以下两个图本质上是相同的,因为它们表示了相同的连接模式。
- 顶点 A 邻接于顶点 B 和 E。
- 顶点 B 邻接于顶点 A 和 E。
- 顶点 C 邻接于顶点 D 和 F。
- 顶点 D 邻接于顶点 C。
- 顶点 E 邻接于顶点 A 和 B。
- 顶点 F 邻接于顶点 C。
现实世界中的图
图可以用来表示许多现实世界中的关系。以下是几个例子:
- 交通网络:地铁站或航线连接的城市可以构成图。
- 互联网链接:网页之间的超链接构成一个巨大的图。
- 社交网络:社交平台上的好友关系或关注关系构成图。
- 文本预测:单词在语言中的常见连接顺序可以建模为图。
- 生物网络:蛋白质之间的相互作用可以表示为图。
- 人际网络:“谁认识谁”的关系图在现实中非常有用。
理解这些图的结构,可以帮助我们解决实际问题,例如规划路线、分析信息传播或设计算法。
一个图论应用实例:疾病防控
上一节我们介绍了图的基本概念,本节中我们来看看图论如何应用于一个具体问题:疾病传播防控。
想象一个图,其中顶点代表人,边代表两个人有密切的物理接触。传统的疾病防控方法是:当发现一个感染者(病患顶点),就找出并隔离所有与其直接相连的人(邻接顶点)。
我们的团队提出了一种新思路:不强制隔离,而是告知每个人他们与感染者之间的图距离。图距离定义为两个顶点之间最短路径的边数。
公式:图距离(u, v) = 连接顶点u和v的最短路径上的边数
这个简单的改变将策略从“你已被暴露,请隔离以保护他人”转变为“风险正在接近,你可以主动采取措施保护自己”。这改变了人们的动机,使防控工具更可能被自愿使用。这个创新正是基于从“是否邻接”的二元判断,转向“距离是多少”的整数度量这一图论思想。
图的类型与性质
现在,让我们认识一些常见的图类型及其性质。
树
树是一种特殊的图。以下是树的一些关键性质:
- 图中没有环(即从一个顶点出发,不重复经过任何顶点或边,最终能回到起点的路径)。
- 图是连通的(即任意两个顶点之间都存在一条路径)。
- 任意两个顶点之间存在唯一的一条路径。
树因其分支结构而得名,在计算机科学(如数据结构)和网络分析中非常常见。
顶点的度
顶点的度是指与其直接相连的边的数量。在社交网络图中,一个人的度可以近似代表他的“朋友”数量。
公式:度(v) = 与顶点v相连的边数
关于度,有一个重要的定理:
握手引理
握手引理指出,一个图中所有顶点的度数之和等于边数的两倍。
公式:∑ 度(v) = 2 * |E|,其中 |E| 表示边的总数。
这个引理之所以得名,可以想象边是一次握手,每次握手涉及两个人,各计一次。利用这个引理,我们可以快速判断某些图是否可能被构造出来。例如,不可能构造一个具有5个顶点且每个顶点度数都是3的图,因为度数总和15是奇数,不可能是边数(整数)的两倍。
特殊图族
在图论中,有一些经常被研究的标准图。以下是其中几种:
- 完全图 (K_n):每对不同的顶点之间都有一条边相连。例如,K₅ 表示有5个顶点的完全图。
- 环图 (C_n):顶点排列成一个环,每个顶点恰好与两个邻居相连。例如,C₄ 是一个四边形环。
- 完全二分图 (K_{s,t}):顶点分为两个集合S和T,S中的每个顶点都与T中的所有顶点相连,但S内部或T内部的顶点互不相连。
了解这些“图动物园”里的成员,有助于我们分析和建模更复杂的现实网络。
图的建模与现实意义
我们为什么要区分不同类型的图?因为图的结构直接影响其性质和应用。
考虑疾病传播网络的例子。如果我们假设人际接触网络是一个树结构,那么如果中间某些人没有使用防控应用(相当于从图中移除这些顶点),原本相连的两个人之间的路径可能会断裂,距离变为无穷大,导致系统失效。
然而,现实中的社交网络更可能由许多高度连通的子团(近似完全图)重叠而成。在这种模型中,即使一部分顶点(人)缺失,任意两点间的距离估计仍然相对稳健,不会发生巨大变化。
这种对图结构的直觉和理解,是设计鲁棒算法和系统的基础。图论使我们能够对复杂系统的行为进行理论推理和预测。
总结

本节课中我们一起学习了图论的入门知识。我们定义了图的基本组成部分——顶点和边,并理解了邻接和图距离的概念。我们看到了图在现实世界中的广泛应用,并通过一个疾病防控的创新案例了解了图论思想的实际威力。我们还介绍了几种重要的图类型(如树、完全图、环图)和基本性质(如顶点的度、握手引理)。最后,我们讨论了理解图结构对于建模和分析现实网络的重要性。在接下来的课程中,我们将继续深入探索图论的更多有趣性质和定理。
023:树的基本定理与等价定义 🌳


在本节课中,我们将深入学习图论中的一个核心概念——树。我们将探讨树的两种不同定义,并证明它们是等价的。同时,我们还将揭示树的一些基本性质,例如其边数与顶点数之间的关系。
树:两种视角
上一节我们介绍了图的基本概念。本节中,我们来看看一种特殊的图——树。
树可以通过两种方式来理解。第一种方式是通过一个直观的“生长过程”来构建。
树的生长过程
以下是树的生长过程的定义:
- 从一个顶点开始。
- 重复以下步骤:添加一个新的顶点,并用一条新的边将其连接到已有的某个顶点上。
这个过程产生的结构就是一棵树。在计算机科学中,这种向下生长的树很常见,以至于有个玩笑说“计算机科学家画的树都是倒着的,因为他们没见过真正的树”。
然而,我们也可以从另一个角度来定义树。
树的图论定义
在图论教科书中,树通常被定义为:
- 连通且无环的图。
这里需要明确两个术语的含义:
- 连通:从图中的任何一个顶点出发,都可以沿着边到达任何其他顶点。
- 无环:图中不存在任何环。环是指一条从某个顶点出发,经过一系列不同的顶点和边,最终又回到起点的路径。
核心定理:两种定义的等价性
现在,我们面临一个关键问题:通过“生长过程”得到的树,是否等同于“连通且无环”的图?在数学中,一个概念只能有一个定义,另一个必须是需要证明的定理。
定理:所有有限、连通且无环的图的集合,等于所有通过树的生长过程可以得到的有限图的集合。
为了证明两个集合相等,我们需要证明两个方向的包含关系。
方向一:生长过程得到的图是连通且无环的
首先,我们证明任何通过生长过程得到的图都是连通且无环的。
- 连通性:在生长过程中,每个新添加的顶点都通过一条边直接连接到已有的图上。因此,图中所有顶点都通过路径连接到最初的那个“根”顶点。任意两个顶点可以通过先走到根顶点,再走到另一个顶点的方式连通。
- 无环性:我们使用反证法。假设通过生长过程得到的图中存在一个环。考虑这个环中最后一个被“生长”出来的顶点。当这个顶点被添加时,它只带有一条新的边连接到图中。然而,一个环至少需要两条边连接该顶点。在它被添加之后,生长过程每次只添加一个连接到全新顶点的边,因此环中缺失的另一条边永远无法被添加。这就产生了矛盾,所以图中不可能有环。
方向二:任何连通无环图都可以通过生长过程得到
这个方向的证明更具挑战性,因为我们面对的是一个未知结构的连通无环图。证明的核心思路是“逆向构造”:如果我们能找到一种方法从图中逐步移除顶点,最终只剩下一个顶点,那么把这个过程反过来,就是生长过程。
为此,我们需要一个关键引理。
引理:任何一个至少有两个顶点的有限连通无环图,都至少存在一个叶子顶点(即度数为1的顶点)。
引理的证明(反证法):
- 假设图是连通且无环的,但没有任何度数为1的顶点。
- 因为图是连通的,所以每个顶点的度数至少为1。结合假设,可知所有顶点的度数都至少为2。
- 现在,从任意顶点开始,沿着边行走。由于每次到达一个顶点,其度数至少为2,我们总可以选择一条之前没走过的边离开(除了折返)。
- 因为图的顶点数是有限的,这种行走最终必然会访问到一个已经访问过的顶点,从而形成一个环。
- 这与图“无环”的前提矛盾。因此,假设不成立,图中必然存在度数为1的叶子顶点。
利用这个引理,我们可以完成主定理的证明:
- 对于一个给定的连通无环图,根据引理,它有一个叶子顶点。
- 移除这个叶子顶点以及连接它的那条边。剩下的图仍然是连通且无环的。
- 对剩下的图重复步骤1和2,不断移除叶子顶点。
- 由于图是有限的,这个过程最终会只剩下一个顶点。
- 现在,将整个过程倒过来看:从一个顶点开始,按照我们移除顶点的相反顺序,依次添加顶点和边,这就精确地构成了一个树的生长过程。
至此,我们证明了两种定义是等价的。从现在起,当我们提到“树”时,可以自由地在“连通无环图”和“可通过生长过程构建的图”这两种理解间切换。
树的基本性质与应用
有了等价定义,我们可以轻松推导出树的一些重要性质。
事实:对于任何树,其边数 E 和顶点数 V 满足公式 E = V - 1。
证明思路:根据等价性,树可以通过生长过程得到。该过程从1个顶点、0条边开始,每增加1个顶点就增加1条边。因此,最终边数总比顶点数少1。
这个性质非常有用,它引出了另一个有趣的定理。
定理:如果一个连通图满足 E = V - 1,那么它一定是无环的(即它是一棵树)。
证明思路(方法一,利用引理):
- 对于一个连通图,若
E = V - 1,我们可以证明它必然有叶子顶点(通过握手定理和度数分析)。 - 移除一个叶子顶点,剩下的图仍连通,且新的边数和顶点数仍满足
E‘ = V’ - 1。 - 重复此过程,最终会得到一个显然无环的单顶点图。由于移除叶子不会引入环,所以原图也是无环的。
证明思路(方法二,反证法):
- 假设该连通图有环。
- 从环中移除任意一条边。图仍然保持连通(因为环提供了替代路径),且边数减少。
- 重复移除边直到图中没有环为止。最终我们得到一个连通无环图,即一棵树,它必须满足
E_final = V - 1。 - 但是,我们一开始的边数
E_initial就等于V - 1。这意味着我们在过程中没有移除任何边,与“存在环”的假设矛盾。因此,原图无环。
与这个定理对偶的另一个性质是:
定理:树是极大无环的。即,在一棵树中任意添加一条新边,都会产生一个环。
证明思路:假设添加一条边后仍然无环,那么新图也是连通无环的,即一棵树。但这棵新树的边数将等于顶点数,与 E = V - 1 矛盾。
总结:树的三个等价条件
本节课中,我们一起学习了关于树的核心内容。我们可以将树的特性总结为以下三个等价条件:
- 连通且无环。
- 可以通过树的生长过程构建。
- 满足边数与顶点数的关系
E = V - 1。

一个非常优美的结论是:对于有限图,只要上述任意两个条件成立,第三个条件就必然成立。这深刻揭示了连通性、无环性和边数关系之间的内在联系,构成了图论中树这一概念的坚实基础。
024:哈密顿回路 🚀


在本节课中,我们将学习一种与欧拉回路不同的回路概念——哈密顿回路。我们将探讨其定义、存在的条件,并深入理解一个重要的定理:狄拉克定理。
上一节我们讨论了欧拉回路,其目标是恰好经过每条边一次。本节中,我们来看看一个不同的问题:如何恰好经过每个顶点一次。
哈密顿回路的定义
哈密顿回路是指一个回路,它恰好经过图中的每一个顶点一次。由于是回路,它不能重复使用任何顶点,并且最终会回到起点。因此,一个哈密顿回路本质上就是一个包含图中所有顶点的环。
寻找存在的条件
对于欧拉回路,我们有简洁的充要条件(所有顶点度数为偶数且图连通)。然而,对于哈密顿回路,我们很难找到这样简单且易于判断的充要条件。事实上,判断一个图是否存在哈密顿回路是一个著名的难题(与P vs. NP问题相关)。
我们的目标是找到一些充分条件,即满足某些条件时,图必定存在哈密顿回路。
首先,我们可以思考一些必要条件。例如,如果一个图存在哈密顿回路,那么它必须是连通的。但这只是一个必要条件,而非充分条件。
一个显然的充分条件是:如果一个有 n 个顶点的图是完全图(即每个顶点的度数都是 n-1),那么它当然存在哈密顿回路。但这个条件过于平凡,没有太多理论价值。
狄拉克定理
一个更深刻且非平凡的结论是狄拉克定理。该定理指出:
对于一个有
n个顶点(n ≥ 3)的简单图,如果每个顶点的度数都至少为n/2,那么该图必定存在哈密顿回路。
这个定理非常有力,因为它只要求每个顶点与图中超过一半的顶点相连,就能保证哈密顿回路的存在。
定理的最优性
狄拉克定理中的条件 n/2 是最优的。这意味着,如果我们把条件放宽到“所有度数至少为 n/2 - 1”,那么结论就不再成立。以下是两个反例:
- 奇数顶点情况:构造一个图,它由两个大小均为
(n-1)/2的完全子图,以及一个连接这两个子图中所有顶点的“中心”顶点构成。这个图没有哈密顿回路(存在瓶颈),但除了中心顶点外,其他顶点的度数至少为(n-1)/2(当n为奇数时,这等于⌈n/2⌉ - 1)。 - 偶数顶点情况:构造一个由两个大小均为
n/2的完全子图组成的非连通图。它显然没有哈密顿回路,但每个顶点的度数都是n/2 - 1。
这些例子表明,n/2 这个阈值是精确的。
狄拉克定理的证明思路
狄拉克定理的证明是图论中一个经典且巧妙的论证。其核心思想分为几个步骤:
步骤一:证明图是连通的
首先,利用度数条件 δ(G) ≥ n/2 证明图 G 必须是连通的。
- 证明思路(反证法):假设图不连通,则它可以分成至少两个连通分支。考虑顶点数最少的那个分支,其顶点数
k ≤ n/2。在该分支内,任何一个顶点的度数最多为k-1 ≤ n/2 - 1。这与所有顶点度数至少为n/2的条件矛盾。因此,图必须是连通的。
步骤二:利用“最长路径”构造长环
考虑图中的一条最长路径 P(即无法再扩展的路径)。我们将证明,基于这条最长路径和度数条件,可以构造出一个长度至少为 |P| 的环(圈)。
- 关键观察:设最长路径
P的端点为u和v。由于路径无法再延长,u和v的所有邻居都必须在路径P上。 - 构造环的核心技巧:我们希望找到一条从
u到v的边,或者找到路径P上的两个顶点u_i和u_{i+1},使得u与u_{i+1}相邻,且v与u_i相邻。如果存在这样的结构,我们就可以将路径P改造成一个包含所有P上顶点的环。 - 利用鸽巢原理:假设上述环结构不存在。对于
v在路径P上的每个邻居u_i,我们都“禁止”u去连接u_{i-1}(如果u_i是v的邻居,则u_{i-1}被标记为禁区)。由于d(v) ≥ n/2,我们至少有n/2个这样的禁区。同时,u本身也有至少n/2个邻居,且u不能是它自己的邻居。然而,路径P上可供u连接的顶点(不包括它自己)最多只有n-1个。现在,我们需要在这最多n-1个位置中,为u的至少n/2个邻居找到位置,同时还要避开至少n/2个禁区。根据鸽巢原理,这是不可能的。因此,假设不成立,我们必定能构造出所需的环。
步骤三:完成证明
现在,我们有了一个长环 C,其长度至少等于最长路径 P 的长度。
- 如果环
C包含了所有n个顶点,那么它就是哈密顿回路,证明完成。 - 如果环
C没有包含所有顶点(即缺少一些顶点),由于我们在步骤一中已证明图是连通的,因此必然存在环C外的某个顶点x,通过一条边连接到环C上的某个顶点y。利用这条边,我们可以将环C“打开”并融入顶点x,从而构造出一条比原来最长路径P更长的路径。这与P是“最长路径”的定义矛盾。
因此,情况2不可能发生,唯一可能的就是情况1,即我们构造的环 C 已经是一个哈密顿回路。至此,狄拉克定理得证。

本节课中我们一起学习了哈密顿回路的概念及其与欧拉回路的区别。我们重点探讨了狄拉克定理,该定理给出了保证哈密顿回路存在的一个强有力且最优的充分条件(所有顶点度数 ≥ n/2),并深入剖析了其巧妙而经典的证明思路,其中涉及最长路径、构造环以及鸽巢原理等核心思想。
025:最小生成树与Prim算法

在本节课中,我们将学习图论中的一个重要概念——最小生成树。我们将从生成树的定义开始,探讨如何在一个带权连通图中找到总权重最小的生成树,并详细介绍一个名为Prim的高效贪心算法及其工作原理。
生成树与最小生成树
上一节我们介绍了哈密顿回路,本节我们来看看图论中的另一个核心概念:生成树。
一个生成树是图的一个子集,它包含原图的所有顶点,以及一部分(可能是全部)边,并且这些边构成一棵树。换句话说,生成树是一个连通且无环的子图。
一个有用的事实是:每个连通图都包含至少一棵生成树。证明思路很简单:如果图中有环,就删除环上的一条边,重复此过程直到图中没有环为止。由于每次删除的是环上的边,图的连通性得以保持。
现在,我们引入权重的概念。一个带权连通图是指图中每条边都被赋予了一个数值(权重)。权重通常为正数。
在带权连通图中,最小生成树是指所有生成树中,其所有边的总权重最小的那一个。总权重的计算公式为:
总权重 = 所有边权重之和
寻找最小生成树有很强的实际应用背景,例如,规划连接多个城市且总建设成本最低的公路网络。
为什么寻找最小生成树是可行的?
你可能会想,寻找最小生成树会不会像著名的“旅行商问题”(寻找访问所有顶点一次且总权重最小的路径)一样困难?后者是计算机科学中著名的难题,目前没有已知的在多项式时间内解决的通用算法。
然而,寻找最小生成树却是一个可以在多项式时间内高效解决的问题。关键区别在于:生成树允许“分叉生长”(像九头蛇一样可以从多个点延伸),而哈密顿路径或旅行商路径则是一条单一的“线”。这种结构上的灵活性,使得贪心策略在寻找最小生成树时变得有效。
Prim算法:一种贪心策略
以下是寻找最小生成树的一个高效算法,称为Prim算法。其核心思想是“贪心地”从任意起点开始,逐步“生长”出一棵树。
算法步骤:
- 初始化:从图中任意选择一个顶点作为起始点,加入我们正在构建的树中。
- 循环生长:当还有顶点未被加入树中时,重复以下步骤:
- 查看所有连接“已构建树”与“未加入顶点”的边(即横跨两部分的边)。
- 从这些边中,选择权重最小的一条。
- 将这条边及其连接的未加入顶点,加入到正在构建的树中。
这个算法非常高效。对于有 n 个顶点的图,大约只需要进行 n 次循环,每次循环检查至多 n^2 条边,因此总时间复杂度的上界是多项式级别的(例如 O(n^3)),远优于需要检查指数级数量可能性的暴力方法。
Prim算法正确性证明
为什么这种看似简单的贪心策略总能找到最小生成树?关键在于证明:在算法的每一步,我们当前构建的部分树,都包含在原图的某棵最小生成树之中。
证明思路(归纳法):
- 基础情况:开始时,我们只选择了一个顶点。显然,这个顶点包含在任意一棵最小生成树中。
- 归纳步骤:假设当前已构建的部分树
T包含在某棵最小生成树MST_old中。- 现在,我们选择了一条横跨边
e(连接T和外部顶点),它是当前所有横跨边中权重最小的。 - 情况一:如果
MST_old本身就包含边e,那么将e加入T后,新树T+e显然仍包含在MST_old中。 - 情况二:如果
MST_old不包含边e,那么我们将e加入MST_old。由于MST_old是一棵树,加入一条新边必然会产生一个环。这个环中必然包含另一条连接T和外部顶点的边f(因为环必须从T出发,通过e到达外部,再通过其他边返回T)。 - 现在,我们构造一棵新树
MST_new = MST_old + e - f。即,将边e加入,同时移除边f以打破环。这仍然是一棵生成树。 - 由于我们选择的是最小权重的横跨边
e,因此有weight(e) ≤ weight(f)。所以,新树MST_new的总权重小于或等于原最小生成树MST_old的总权重。这意味着MST_new也是一棵最小生成树。 - 并且,
MST_new包含了我们之前构建的树T以及新加入的边e。
- 现在,我们选择了一条横跨边
因此,无论哪种情况,在每一步添加边之后,我们当前构建的部分树都仍然包含在某棵最小生成树中。当算法结束时,我们得到了一棵生成树,而这棵树本身就被包含在某棵最小生成树中,所以它自己就是一棵最小生成树。证明完毕。
这个证明的精髓在于说明了贪心选择永远不会导致“死胡同”,总存在一条通往全局最优解的路径。
总结
本节课我们一起学习了:
- 生成树的定义及其存在性。
- 最小生成树的概念及其在实际问题中的应用。
- Prim算法,一个用于寻找最小生成树的高效贪心算法。
- 通过严谨的归纳法证明了Prim算法的正确性,其核心是证明每一步的局部贪心选择都能保持在某个全局最优解的框架内。

最小生成树问题是图论中少数几个贪心算法能取得全局最优解的例子之一,这与更困难的旅行商问题形成了鲜明对比。理解其原理和证明,有助于我们掌握贪心算法的适用条件与分析技巧。
026:最小生成树与旅行商问题


在本节课中,我们将要学习两种寻找最小生成树的算法,并探索最小生成树与著名的旅行商问题之间的有趣联系。
最小生成树回顾
上一节我们介绍了最小生成树的基本概念。本节中我们来看看它的定义。
一个最小生成树是一个连通加权图中的一个子图,它满足以下条件:
- 它是一棵树(连通且无环)。
- 它包含原图的所有顶点。
- 其所有边的权重之和最小。
如果图本身不连通,则不存在生成树。
克鲁斯卡尔算法
上一节我们介绍了普里姆算法,它从一个顶点开始,逐步“生长”出一棵树。本节中我们来看看另一种思路不同的算法——克鲁斯卡尔算法。
克鲁斯卡尔算法从一个空边集开始,目标是构建一个尽可能大的无环子图。其核心步骤如下:
- 初始化:将所有顶点视为独立的连通分量(即没有边)。
- 循环执行:在不形成环的前提下,不断将当前权重最小的边加入到边集中。
以下是该算法的伪代码描述:
Kruskal(G):
初始化一个空边集 T
将图 G 的所有边按权重升序排序
for 每条边 (u, v) in 排序后的边列表:
if 将 (u, v) 加入 T 不会形成环:
将 (u, v) 加入 T
return T
算法正确性分析
我们需要证明两点:第一,算法最终会生成一棵树;第二,这棵树是最小生成树。
1. 算法生成的是树
- 算法保证了最终结果无环。
- 假设算法结束时,图不连通,存在至少两个连通分量。由于原图是连通的,这两个分量之间必然存在边。这条边加入当前结果不会形成环(因为它在两个独立分量之间),这与算法“无法再加入不形成环的边”的结束条件矛盾。因此,最终结果必然是连通的。
- 一个连通且无环的图就是一棵树。
2. 算法生成的是最小生成树
核心是证明:在算法的每一步,当前构建的部分生成树(森林)都包含在某个真正的最小生成树中。
- 基础情况:初始时边集为空,显然包含在任何最小生成树中。
- 归纳步骤:假设当前边集
T包含在某个最小生成树M中。现在算法要加入下一条边e(当前不形成环的最小权重边)。- 如果
M已经包含e,则加入e后,T ∪ {e}仍然包含在M中。 - 如果
M不包含e:将e加入M,M中必然形成一个包含e的环。在这个环上,至少有一条边f不在当前的T中(因为e加入T不会形成环)。由于e是当前可选边中权重最小的,且f在此时加入T也不会形成环(因为f在M中,而M包含T且无环),所以有weight(e) ≤ weight(f)。现在,我们用e替换M中的f,得到一棵新的生成树M'。M'的权重不大于M,因此也是一个最小生成树,并且它包含了T ∪ {e}。
- 如果
因此,算法每一步都走在“正确”的轨道上,最终得到的必然是一棵最小生成树。
旅行商问题及其近似算法
找到最小生成树是高效的。现在,我们来看一个著名且计算困难的问题——旅行商问题,并了解最小生成树如何帮助我们找到它的一个近似解。
旅行商问题:给定一个加权连通图,寻找一个访问每个顶点恰好一次并回到起点的哈密顿回路,且使其总权重最小。
然而,在一般图中,甚至判断哈密顿回路是否存在都是困难的。因此,我们关注一个更易处理的特例:度量旅行商问题。
- 图是完全图(任意两点间都有边)。
- 边的权重满足三角不等式:对于任意三个顶点 A, B, C,有
weight(A, B) + weight(B, C) ≥ weight(A, C)。这符合现实世界中“直达距离最短”的直观。
2-近似算法
虽然找到精确的最优解很难,但我们可以高效地找到一个解,其成本不超过最优解的两倍。
算法步骤:
- 寻找最小生成树:在图 G 中找到一个最小生成树
MST。 - 绕树行走:从任意顶点出发,沿着
MST的边进行深度优先遍历,记录下访问顶点的顺序。这个遍历会访问每个顶点,但某些顶点会被访问多次,总路径长度恰好是2 * weight(MST)。 - 短路优化:根据上一步得到的顶点访问序列,从前到后扫描。当遇到一个之前已经出现在序列中的顶点时,就跳过它,直接从上一次出现的顶点走到序列中下一个首次出现的顶点。根据三角不等式,这种“短路”操作不会增加总路径长度。
最终得到的路径是一个访问每个顶点恰好一次的哈密顿回路。
算法性能证明
设我们得到的回路总权重为 C,最小生成树权重为 W_MST,最优旅行商回路权重为 OPT。
C ≤ 2 * W_MST:短路操作不会增加权重,而绕树行走的权重为2 * W_MST,因此C至多是它的两倍。W_MST ≤ OPT:考虑最优旅行商回路。如果从这个回路中删除任意一条边,我们就得到一棵生成树(一条访问所有顶点的路径)。这棵生成树的权重至少等于最小生成树的权重,即W_MST。因此,原最优回路的权重OPT必然大于这棵生成树的权重,即OPT ≥ W_MST。
结合以上两点,我们得到:C ≤ 2 * W_MST ≤ 2 * OPT。证毕。
总结

本节课中我们一起学习了:
- 克鲁斯卡尔算法:通过不断添加当前不构成环的最小权重边来构建最小生成树。我们通过归纳法证明了其正确性,核心思想是每一步的部分解都包含在某个全局最优解中。
- 旅行商问题的近似解法:对于满足三角不等式的度量旅行商问题,我们可以利用最小生成树构造一个高效的 2-近似算法。该算法先求出最小生成树,然后通过“绕树行走”和“短路”操作得到一个哈密顿回路,并证明了其成本不超过最优解的两倍。这展示了如何用解决简单问题(MST)的工具来逼近复杂问题(TSP)的解决方案。
027:鸽巢原理
在本节课中,我们将学习组合数学中的一个重要原理——鸽巢原理。这个原理虽然简单,但在解决许多存在性问题时非常强大。
鸽巢原理的直观理解
鸽巢原理,也被称为抽屉原理。其核心思想非常直观:如果你有n个鸽巢和m只鸽子,并且m > n,那么至少有一个鸽巢里会有多于一只鸽子。
我们可以用更正式的数学语言来描述它。
鸽巢原理的正式表述
上一节我们介绍了鸽巢原理的直观理解,本节中我们来看看它的正式定义。
鸽巢原理:如果将m个物体放入n个盒子中,且m > n,那么至少有一个盒子包含两个或两个以上的物体。
这个原理的公式化表述是:
如果 |物体| > |盒子|,则至少有一个盒子包含 ≥ 2 个物体。
鸽巢原理的简单应用
理解了原理的基本形式后,我们来看一些简单的例子,以加深理解。

以下是几个应用鸽巢原理的经典场景:
- 生日问题:在一个有367人的房间里,至少有两个人的生日相同(考虑闰年)。因为天数(366个“鸽巢”)少于人数(367只“鸽子”)。
- 袜子配对:抽屉里有10只黑袜子和10只白袜子,它们混在一起。如果你在黑暗中取袜子,需要取出多少只才能保证得到一双颜色相同的袜子?答案是3只。因为颜色只有两种(两个“鸽巢”),取3只(“鸽子”)就必然有一种颜色出现两次。
- 头发数量:在一个人口超过20万的城市中,至少有两个人的头发数量完全相同。因为人的头发数量通常不超过20万根。
广义鸽巢原理
基本的鸽巢原理可以推广到更一般的情况,这能帮助我们解决更复杂的问题。
上一节我们看了基本形式的例子,本节中我们来看看它的一个有力推广。
广义鸽巢原理:如果将m个物体放入n个盒子中,那么至少有一个盒子包含至少 ⌈m/n⌉ 个物体。
其中,符号 ⌈x⌉ 表示“向上取整”,即大于或等于x的最小整数。
例如,如果有20只鸽子(m=20)和6个鸽巢(n=6),那么 ⌈20/6⌉ = ⌈3.333...⌉ = 4。这意味着至少有一个鸽巢里至少有4只鸽子。

广义原理的应用实例
让我们通过一个具体问题来应用广义鸽巢原理。
问题:一个抽屉里有红色、蓝色和绿色的袜子各若干只。至少需要取出多少只袜子,才能保证其中至少有4只是同一种颜色?
推理过程:
- 颜色种类是3种(n=3)。
- 我们希望保证至少有一个颜色出现4次(k=4)。
- 根据广义原理,我们需要让物体总数
m满足⌈m/3⌉ = 4。 - 解这个不等式:
⌈m/3⌉ ≥ 4意味着m/3 > 3,所以m > 9。 - 最小的整数
m是10。 - 结论:需要取出10只袜子。
我们可以验证一下:在最坏的情况下,前9只袜子每种颜色各3只(共9只)。那么第10只袜子无论是什么颜色,都会使该颜色的袜子达到4只。
总结
本节课中我们一起学习了鸽巢原理及其推广。
- 我们首先理解了基本鸽巢原理:如果物体比容器多,那么至少有一个容器包含多个物体。
- 接着,我们学习了更强大的广义鸽巢原理,它给出了至少一个容器中物体数量的下限计算公式
⌈m/n⌉。 - 最后,我们通过几个例子看到了如何应用这些原理来解决实际的存在性问题。鸽巢原理是组合数学中一个基础而重要的工具,它用极其简单的逻辑揭示了某些必然性。
028:凯莱公式与Prüfer编码 🌳


在本节课中,我们将学习如何证明一个关于树数量的著名公式——凯莱公式。我们将重点介绍一种巧妙的方法,称为Prüfer编码,它能将一棵带标签的树压缩成一个简洁的代码,从而帮助我们精确地计数。
证明凯莱公式的目标
上一节我们介绍了凯莱公式:一个有 n 个顶点的带标签树的数量是 n^{n-2}。这个公式非常简洁,但我们需要找到一种有效的方法来证明它。为了证明这一点,我们需要一种高效计数这些树的方法。
回顾:父节点编码法
我们之前讨论过一种编码树的方法,称为“父节点编码法”。这种方法的工作原理是:
- 将最大的顶点作为树的根。
- 创建一个表格,列出除最大顶点外的每个顶点(1, 2, ..., n-1)及其父节点。
示例表格结构:
| 顶点 | 1 | 2 | 3 | ... | n-1 |
|---|---|---|---|---|---|
| 父节点 | p₁ | p₂ | p₃ | ... | p_ |
通过这个表格,我们可以重建树的结构。这种方法建立了一个从树到这些“底部条带”(即父节点列表)的单射映射。这意味着树的数量最多是 n^{n-1}(即底部条带所有可能的组合数)。
然而,这并非我们想要的 n^{n-2}。问题在于,并非每一个底部条带都对应一棵有效的树。有些条带会产生无效结构(例如,出现自环或重复边)。因此,树的数量严格少于 n^{n-1},这个方法无法用于精确计数。
引入Prüfer编码
为了解决上述问题,我们引入一种新的编码方法——Prüfer编码。这种方法初看可能有些奇特,但它能完美地建立树与代码之间的一一对应。
编码过程
以下是Prüfer编码的步骤,我们称之为“扩展Prüfer码”的生成过程:
- 初始化:给定一棵顶点标签为
1, 2, ..., n的树。 - 迭代删除:
- 找到当前树中标签最小的叶子节点。
- 记录下这个叶子节点及其唯一的邻居(因为叶子节点的度为1)。
- 从树中删除这个叶子节点及其相连的边。
- 重复:重复步骤2,直到只剩下一个顶点。
- 生成表格:将每次记录的(最小叶子, 其邻居)对排列起来,形成一个有
n-1列的表格。
示例:假设我们有一棵9个顶点的树。按照上述过程,我们可能会得到如下表格:
| 最小叶子 | 2 | 4 | 5 | 6 | 7 | 1 | 8 | 3 |
|---|---|---|---|---|---|---|---|---|
| 其邻居 | 7 | 7 | 1 | 3 | 1 | 3 | 3 | 9 |
这个表格(扩展Prüfer码)完整地定义了树,但信息量似乎更大了(有 2(n-1) 个数字)。
关键观察与压缩
现在,我们玩一个“压缩”游戏:在双方约定使用此编码的前提下,我们能否减少需要传输的信息量?
以下是几个关键观察,让我们可以安全地省略部分信息:
-
最后一个数字总是
n:- 定理:任何至少有两个顶点的树都至少有两个叶子节点。
- 证明概要:所有顶点的度之和为
2 * 边数 = 2(n-1)。如果只有一个度为1的顶点,其余n-1个顶点度数至少为2,那么度数和至少为1 + 2(n-1) = 2n-1 > 2(n-1),矛盾。因此至少有两个叶子。 - 由于总是有至少两个叶子可选,在编码过程中我们永远不会被迫选择最大的顶点
n作为“最小叶子”。因此,最大的顶点n总是最后一个被留下的。在表格中,它出现在右下角。 - 结论:接收方只要数一下表格有
n-1列,就知道最后一个数字必然是n,无需传输。
-
倒数第二列的顶部数字可以省略:
- 观察表格的顶部行,它包含了所有被删除的顶点,恰好是集合
{1, 2, ..., n}去掉最后剩下的那个顶点(即n)。 - 因此,在倒数第二列,顶部数字就是集合
{1, 2, ..., n-1}中,尚未在顶部行出现过的那个唯一数字。 - 结论:接收方可以通过查找“缺失的数字”来复原它,无需传输。
- 观察表格的顶部行,它包含了所有被删除的顶点,恰好是集合
-
更一般化的压缩——复原算法:
- 实际上,我们可以只传输表格的底部一行(邻居列表),并完全省略顶部一行(最小叶子列表)。
- 接收方可以通过以下算法,仅从底部一行
(a₁, a₂, ..., a_{n-1})复原出完整的扩展Prüfer码,从而重建树:- 设顶点集合
V = {1, 2, ..., n}。 - 对于
i从1到n-1:- 在
V中,找出不在当前已复原的顶部行{v₁, ..., v_{i-1}}中,也不在当前及后续底部行{a_i, a_{i+1}, ..., a_{n-1}}中的最小数字x。 - 这个
x就是第i列的顶部数字v_i。它与底部数字a_i相连。 - 将
x从集合V中移除(因为它已被作为叶子删除)。
- 在
- 最后,剩下的一个顶点就是
n,它与a_{n-1}相连。
- 设顶点集合
- 算法正确性:在每一步,集合
V中满足“不在顶部历史且不在底部未来”条件的顶点,恰好就是当前步骤在原树中真实的叶子节点集合。而我们总是选择其中最小的一个,这与编码过程完全一致。
Prüfer编码的威力
通过上述压缩过程,我们得到了最终的Prüfer码:它仅仅是一个长度为 n-2 的序列 (b₁, b₂, ..., b_{n-2}),其中每个数字都在 1 到 n 之间。
- 编码:对一棵树进行Prüfer编码,最终得到的就是这个
n-2序列。 - 解码:利用上述复原算法,可以从任何一个
n-2序列唯一地重建出一棵带标签的树。 - 一一对应:这就在
n个顶点的带标签树与所有可能的n^{n-2}个序列之间建立了一个双射。
总结
本节课我们一起学习了证明凯莱公式的核心工具——Prüfer编码。
- 我们首先回顾了父节点编码法的局限性。
- 然后,我们详细介绍了Prüfer编码的生成过程(扩展Prüfer码)。
- 接着,我们通过关键的图论性质(树至少有两片叶子)和巧妙的逻辑推理,展示了如何将扩展码无损压缩为仅包含
n-2个数字的Prüfer码。 - 最后,我们给出了从Prüfer码复原树的算法。这完美地证明了,每个树对应一个唯一的
n-2序列,而每个n-2序列也对应一棵唯一的树。因此,树的数量正好等于序列的数量,即n^{n-2}。

Prüfer编码以其简洁和优美,成为了组合数学中一个经典的结果。
029:Prüfer编码与无标号树计数


在本节课中,我们将学习如何用Prüfer编码来唯一地表示一棵带标号的树,并利用这个编码来证明著名的凯莱公式:n个顶点的带标号树的数量是 n^(n-2)。我们还将探讨如何估算无标号树的数量。
Prüfer编码回顾
上一节我们介绍了Prüfer编码的概念。其核心思想非常简单:通过反复删除树中编号最小的叶子节点,并记录其邻居,来生成一个数字序列。
具体编码算法如下:
- 找到当前树中编号最小的叶子节点。
- 删除这个叶子节点及其相连的边。
- 记录下这个叶子节点的邻居编号。
- 重复步骤1-3,直到只剩下两个顶点为止。最终得到的序列(忽略最后剩下的那个最大编号顶点)就是Prüfer码。
这个序列的长度是 n-2,其中每个数字都是1到n之间的整数。
从编码解码树
本节中,我们来看看如何从一个Prüfer码反向构造出原来的树。这个过程证明了编码和解码是一一对应的。
给定一个长度为 n-2 的Prüfer码序列,我们可以通过以下算法重建树:
- 写出数字1到n,作为候选顶点集。
- 找出不在当前Prüfer序列中的最小数字。这个数字就是第一个被删除的叶子节点。
- 将这个最小数字与Prüfer序列中的第一个数字用边连接起来。
- 从候选集中删除这个最小数字,并从Prüfer序列中删除第一个数字。
- 重复步骤2-4,直到Prüfer序列为空。
- 此时候选集中还剩两个数字,将它们用边连接起来。
解码算法示例
假设Prüfer码为 [3, 6, 1, 1, 2, 5, 4, 7],n=10。
- 候选集: {1,2,3,4,5,6,7,8,9,10}。不在序列中的最小数字是8。连接8-3,删除8,序列变为
[6,1,1,2,5,4,7]。 - 候选集: {1,2,3,4,5,6,7,9,10}。不在序列中的最小数字是3。连接3-6,删除3,序列变为
[1,1,2,5,4,7]。 - 候选集: {1,2,4,5,6,7,9,10}。不在序列中的最小数字是6。连接6-1,删除6,序列变为
[1,2,5,4,7]。 - 候选集: {1,2,4,5,7,9,10}。不在序列中的最小数字是9。连接9-1,删除9,序列变为
[2,5,4,7]。 - 候选集: {1,2,4,5,7,10}。不在序列中的最小数字是1。连接1-2,删除1,序列变为
[5,4,7]。 - 候选集: {2,4,5,7,10}。不在序列中的最小数字是2。连接2-5,删除2,序列变为
[4,7]。 - 候选集: {4,5,7,10}。不在序列中的最小数字是5。连接5-4,删除5,序列变为
[7]。 - 候选集: {4,7,10}。不在序列中的最小数字是4。连接4-7,删除4,序列变为
[]。 - 候选集剩余{7,10},连接7-10。
最终得到的边集为:{(8,3), (3,6), (6,1), (9,1), (1,2), (2,5), (5,4), (4,7), (7,10)},这构成了一棵树。
证明凯莱公式
现在,我们利用Prüfer编码来证明凯莱公式。
证明思路:
- 编码是单射:我们已经看到,不同的树会产生不同的Prüfer码。
- 解码是满射:我们需要证明,任何一个由1到n的数字组成、长度为n-2的序列,都能通过上述解码算法对应到一棵唯一的树。
为了证明第二点,需要验证两件事:
- 解码算法始终可行:在解码过程的每一步,我们总能找到一个“不在序列中的最小数字”。这是因为在每一步,候选顶点有n个,而被排除的顶点(已出现在解码表上方或序列中)最多只有n-2个,所以至少有两个候选,其中最小的那个就是我们要找的。
- 解码结果总是一棵树:解码过程产生了n-1条边。可以证明这些边不会重复,并且它们构成的图中没有环。一个简化的论证是:如果存在环,考虑环上在解码表中“最左边”的边,其上方顶点的编号将违反解码规则(它本应避免出现在其右侧下方的序列中)。因此,结果必然是一棵具有n-1条边且无环的连通图,即一棵树。
由此,我们建立了n个顶点的带标号树集合与长度为n-2、元素在1到n之间的序列集合之间的一一对应关系。后者的数量显然是 n^(n-2)。因此:
n个顶点的带标号树的数量 = n^(n-2)
无标号树的数量估计
对于无标号树(即不考虑顶点编号,只考虑结构),没有一个像凯莱公式这样简洁的封闭表达式。但我们可以估计其数量级。
核心思路:为无标号树设计一种编码方式,并证明编码数量是顶点数n的指数级,从而说明无标号树的数量最多也是指数级。
“蚂蚁爬行”编码法:
- 任意选择一个顶点作为树的“根”。
- 想象一只蚂蚁从任意顶点开始,沿着树的“外围”爬行,遍历每条边两次后回到起点。
- 蚂蚁记录下每一步:如果这一步是朝着根的方向移动,记为
-;如果是远离根的方向,记为+。
这样,对于一棵有n个顶点的树,蚂蚁会爬行2(n-1)步,产生一个长度为2(n-1)的由 + 和 - 组成的序列。
为什么这给出了一个上界?
- 不同的树可能产生相同的序列,但关键在于,同一个序列不可能由两棵不同的树产生。给定一个合法的
+/-序列,我们可以唯一地重建出蚂蚁爬行的路径,从而唯一地确定树的结构。 - 所有可能的
+/-序列的数量是 2^(2(n-1)) = 4^(n-1)。 - 因此,n个顶点的无标号树的数量 ≤ **4(n-1)**。这证明了其数量级是**指数级**的(O(cn)),远小于带标号树的数量级(n^(n-2),约为 e^(n ln n))。
总结
本节课中我们一起学习了:
- Prüfer编码:一种将带标号树唯一映射到长度为
n-2的数字序列的方法。 - 凯莱公式的证明:利用Prüfer编码建立一一对应,证明了n个顶点的带标号树的数量为 n^(n-2)。
- 无标号树的计数:通过巧妙的“蚂蚁爬行”编码法,我们证明了无标号树的数量最多是顶点数n的指数函数,明确了其数量级远小于带标号树。

Prüfer编码不仅是一个优美的计数工具,也在随机树生成和组合证明中有广泛应用。
030:拉姆齐理论入门 🧩


在本节课中,我们将要学习图论中一个引人入胜的分支——拉姆齐理论。我们将从一个关于社交关系的有趣观察开始,逐步理解其背后的数学原理,并学习如何定义和计算拉姆齐数。
引言:一个社会学的观察
大约一百年前,一位匈牙利社会学家在分析班级学生时,提出了一个有趣的观察。他发现,在任何大约有20个孩子的班级中,总能找到以下两种情况中的至少一种:
- 可以找到四个孩子,他们彼此之间都是朋友。
- 或者,可以找到四个孩子,他们彼此之间都不是朋友。
这里,我们假设“友谊”是相互的,即两个人要么是朋友,要么不是。同时,数学中的“或”是包含性的,意味着两种情况可能同时成立。
这位社会学家后来意识到,这个现象与孩子或人际关系无关,而是一个关于图的普遍事实。
拉姆齐理论的核心概念
上一节我们介绍了一个社会学观察,本节中我们来看看如何将其转化为一个严格的数学问题。
对于任意一个有20个顶点的图,它必然包含以下两种结构之一:
- 一个包含4个顶点的团(clique),记作 K₄。这意味着有4个顶点,并且它们之间两两相连。
- 一个包含4个顶点的独立集(independent set),记作 K₄̅。这意味着有4个顶点,并且它们之间没有任何边相连。
这引出了一个更深层的问题:我们真的需要20个顶点吗?是否存在一个最小的顶点数,使得任何具有该顶点数的图都必然包含一个大小为t的团或一个大小为t的独立集?这个最小的数就是拉姆齐数。
拉姆齐数的定义
拉姆齐数 R(t, t) 被定义为:保证任意一个具有该顶点数的图都包含一个 Kₜ(大小为t的团)或一个 Kₜ̅(大小为t的独立集)所需的最小顶点数。
需要强调的是,拉姆齐数的存在本身就是一个定理(拉姆齐定理),它断言对于任意正整数t,这个最小数总是存在的。
等价表述:边的着色
拉姆齐数还有一个更常用的等价定义,它使用边的着色来描述:
- R(t, t) 等于最小的顶点数n,使得:如果将完全图 Kₙ(即n个顶点且所有顶点对之间都有边)的每条边任意涂成红色或蓝色,则总能找到一个所有边颜色相同的 Kₜ(即一个单色的t顶点完全图)。
这种表述更直观,因为我们可以把原图中的“存在边”视为蓝色,“不存在边”视为红色。
计算具体的拉姆齐数
现在,让我们尝试计算几个简单的拉姆齐数,以加深理解。
R(1,1)
- 含义:需要多少个顶点,才能保证总能找到一个单色的 K₁(单个顶点)?
- 分析:K₁ 没有边,因此谈论其边的颜色没有意义。实际上,根据定义,R(1,1) = 1。因为只要有一个顶点,就“包含”了一个团(或独立集)。
- 结论:R(1,1) = 1
R(2,2)
- 含义:需要多少个顶点,才能保证总能找到一个单色的 K₂(一条边)?
- 分析:
- 首先证明2个顶点足够:对于两个顶点,只有一条边。无论这条边是红是蓝,它本身就是一个单色的 K₂。
- 其次证明1个顶点不够:只有一个顶点时,没有边,因此不存在单色的 K₂。
- 结论:R(2,2) = 2
R(3,3) 与六人聚会问题
这是第一个非平凡的拉姆齐数,它对应一个著名的问题:在任何六个人的聚会中,总有三个人彼此都认识,或者总有三个人彼此都不认识。
证明 R(3,3) > 5
我们需要找到一个5个顶点的图(或对 K₅ 的边进行红蓝着色),使其不包含任何单色的三角形(K₃)。以下是这样一个着色方案:将顶点排列成一个五边形,五边形的边涂成一种颜色(比如红色),所有对角线涂成另一种颜色(比如蓝色)。可以验证,这个图中没有同色的三角形。
一个五边形,边为红,对角线为蓝。
因此,5个顶点不足以保证存在单色三角形,所以 R(3,3) > 5。
证明 R(3,3) ≤ 6
现在证明,对于任意一个有6个顶点且边被红蓝着色的完全图,必然存在一个单色三角形。
- 任取一个顶点 v。从 v 出发有5条边连接到其他5个顶点。
- 根据鸽巢原理,这5条边中至少有3条是同色的(比如红色)。记这3条边连接的顶点为 a, b, c。
- 现在考虑顶点 a, b, c 之间的边(即三角形 abc 的三条边)。
- 如果 a, b, c 之间有任何一条边是红色,那么这条边与 v 相连的两条红边就构成了一个红色三角形。
- 如果 a, b, c 之间的所有边都是蓝色,那么 a, b, c 本身就构成了一个蓝色三角形。
- 因此,无论如何,都存在一个单色三角形。
结论:结合以上两点,R(3,3) = 6。
拉姆齐数的性质与上界
我们已经看到,R(4,4)=18,而 R(5,5) 的确切值至今未知(已知在43到48之间)。通过穷举法用计算机计算更大的拉姆齐数非常困难,因为可能的着色方案数量是顶点数的指数级增长(2^(n选2))。
尽管精确值难以计算,但我们可以证明拉姆齐数总是有限的,并且有一个递归的上界。
递归不等式
对于 s, t ≥ 2,拉姆齐数满足以下不等式:
R(s, t) ≤ R(s-1, t) + R(s, t-1)
证明思路:
- 设 N = R(s-1, t) + R(s, t-1)。考虑一个有N个顶点且边被红蓝着色的完全图。
- 任取一个顶点 v。将与 v 以红边相连的顶点集合记为 A,以蓝边相连的记为 B。
- 根据鸽巢原理,|A| ≥ R(s-1, t) 或 |B| ≥ R(s, t-1) 至少有一个成立。
- 如果 |A| ≥ R(s-1, t),那么在 A 诱导的子图中,根据 R(s-1, t) 的定义,要么存在一个红色的 K_(s-1),加上 v 就构成一个红色的 K_s;要么存在一个蓝色的 K_t。无论哪种情况,原图都包含红色 K_s 或蓝色 K_t。
- 如果 |B| ≥ R(s, t-1),推理类似,会得到一个蓝色的 K_t 或一个红色的 K_s。
- 因此,在N个顶点下,结论总是成立,所以 R(s, t) ≤ N。
与组合数的联系
利用上述递归关系以及边界条件 R(1, t) = R(s, 1) = 1,我们可以得到一个上界:
R(s, t) ≤ C(s+t-2, s-1)
其中 C(n, k) 是组合数(即二项式系数)。这个上界恰好是帕斯卡三角形中的数字。例如,R(3,3) ≤ C(4,2)=6,这与我们已知的结果一致。
总结

本节课中我们一起学习了拉姆齐理论的基础知识。我们从一个人际关系的观察出发,定义了拉姆齐数 R(s, t),它衡量了“无序中必然出现有序”的临界规模。我们计算了 R(1,1), R(2,2), R(3,3) 等简单情况,并证明了著名的“六人聚会问题”。最后,我们探讨了拉姆齐数的一般性质,包括其递归上界以及与组合数的联系,从而理解了为什么这些数虽然难以精确计算,但总是有限的。拉姆齐理论揭示了大规模系统中无法避免的规律性,是组合数学中一个深刻而优美的领域。
031:拉姆齐理论深入


在本节课中,我们将深入学习拉姆齐理论,特别是关于拉姆齐数上界和下界的证明。我们将从回顾上节课的结论开始,然后探讨如何利用这些结论推导出拉姆齐数的上界,最后介绍一个巧妙的概率方法,证明存在一个指数级的下界。
回顾定义与定理
上一节我们介绍了拉姆齐数的基本概念。本节中,我们首先回顾其定义和上节课证明的关键定理。
拉姆齐数 R(s, t) 定义为最小的顶点数 n,使得在任意一个对 n 个顶点的完全图的边进行 2-着色(使用最多两种颜色)后,图中必然包含一个红色的 K_s(s 个顶点的完全子图,所有边为红色)或一个蓝色的 K_t(t 个顶点的完全子图,所有边为蓝色)。
上节课我们证明了一个重要的不等式,通常称为 Erdős–Szekeres 定理:
R(s, t) ≤ R(s-1, t) + R(s, t-1)
这个不等式意味着,如果我们有 R(s-1, t) + R(s, t-1) 个顶点,就足以保证存在一个红色的 K_s 或一个蓝色的 K_t。
推导拉姆齐数的上界
基于上述递归关系,我们可以通过归纳法推导出拉姆齐数的一个具体上界。
我们利用边界条件 R(1, t) = 1 和 R(s, 1) = 1 来填充一个表格。表格的行和列分别对应 s 和 t 的值,每个单元格填入 R(s, t) 的一个上界,该上界等于其上方单元格和左侧单元格数值之和。
以下是填充表格的步骤:
- 第一行和第一列的所有值均为 1。
- 对于其他单元格,其值等于正上方单元格的值加上正左方单元格的值。
通过这种方式,我们得到了一个类似帕斯卡三角形的结构。例如,R(3,3) 的上界是 6,这与我们已知的 R(3,3)=6 相符。对于 R(4,4),我们得到上界为 20(尽管已知实际值更小,例如 18)。
更一般地,我们可以推导出公式:
R(s, t) ≤ C(s+t-2, s-1),其中 C(n, k) 表示组合数。
特别地,当 s = t 时,我们得到对角拉姆齐数的上界:
R(t, t) ≤ C(2t-2, t-1)
分析上界的增长速率
现在我们来分析 R(t, t) 这个上界的增长速率,即 C(2t-2, t-1) 的大小。
首先,我们可以给出一个非常宽松的上界。因为二项式系数 C(2t-2, t-1) 是 2^(2t-2) 这一行帕斯卡三角形中的一个数,所以它显然小于该行所有数之和:
C(2t-2, t-1) < 2^(2t-2) ≤ 4^t
因此,我们得到 R(t, t) < 4^t。这意味着,如果我们有 4^t 个顶点,那么无论如何对边进行 2-着色,都必然存在一个单色的 K_t。
然而,这个上界 4^t 可能并不紧。一个著名的未解难题就是:能否将这个指数的底数 4 改进得更小(例如 3.999)?对于足够大的 t,目前已知的证明方法无法做到这一点。
探索拉姆齐数的下界
上一节我们得到了一个指数级的上界,本节我们来看看问题的另一面:如何构造一个着色方案,在尽可能多的顶点上避免出现单色的 K_t,从而为 R(t, t) 建立一个下界。
一个简单的构造是使用 (t-1)^2 个顶点。我们将顶点分成 t-1 组,每组内有 t-1 个顶点。
以下是具体的着色规则:
- 每组内部的所有边都着蓝色。
- 不同组之间的所有边都着红色。
为什么这个构造中没有单色的 K_t 呢?
- 没有蓝色的 K_t:因为最大的蓝色完全子图只能在一个组内部,而每组只有 t-1 个顶点。
- 没有红色的 K_t:要形成一个红色的完全子图,你不能从同一个组中选取两个顶点(因为组内边是蓝色的)。因此,你最多只能从每个组中选一个顶点,总共最多能选 t-1 个顶点。
这个构造表明 R(t, t) > (t-1)^2。但这只是一个多项式级别的下界,与我们刚刚得到的指数级上界 4^t 之间存在巨大的鸿沟。
概率方法:一个指数级下界的证明
保罗·埃尔德什(Paul Erdős)引入了一个巧妙的概率方法,证明了存在一个指数级的下界。
他证明了对于所有正整数 t,存在一种对 n = 2^(t/2) 个顶点的完全图的边进行着色的方法,使得图中没有单色的 K_t。这意味着 R(t, t) > 2^(t/2)。
这个证明不是直接构造出着色方案,而是证明了这种方案“几乎肯定”存在。以下是证明思路:
- 随机着色:考虑一个有 n = 2^(t/2) 个顶点的完全图。对于图中的每一条边,我们独立地、随机地抛一枚均匀的硬币来决定其颜色:红色或蓝色,概率各为 1/2。
- 分析失败的概率:我们想要证明,在这种随机着色下,存在一个单色 K_t 的概率 小于 1。如果这个概率小于1,那么其对立事件——“没有单色 K_t”——的概率就大于0。这意味着,在所有可能的随机结果中,至少有一种着色方案是成功的。
- 使用布尔不等式(Union Bound):计算“存在一个单色 K_t”的概率很复杂。我们转而计算它的一个上界。我们考虑所有大小为 t 的顶点子集(共有 C(n, t) 个)。对于每个这样的子集 S,令事件 A_S 表示“子集 S 中的边构成一个单色 K_t”。
- 对于任意一个固定的 t 顶点子集,其所有边同色的概率是:所有边全红的概率加上所有边全蓝的概率,即 2 * (1/2)^(C(t,2))。
- 根据布尔不等式,“存在一个单色 K_t”的概率 P 不超过所有事件 A_S 的概率之和:
P ≤ C(n, t) * 2 * (1/2)^(C(t,2))
- 代入 n 并简化:将 n = 2^(t/2) 代入上述不等式,并利用近似 C(n, t) ≤ n^t / t!,我们可以得到:
P ≤ (2(t/2))t / t! * 2 * (1/2)^(t(t-1)/2) = 2 * 2(t2/2) / (t! * 2(t2/2 - t/2)) = 2^(t/2 + 1) / t! - 结论:当 t ≥ 4 时,2^(t/2 + 1) / t! < 1。事实上,随着 t 增大,这个值会迅速趋近于 0。这就证明了在随机着色下,成功(即没有单色 K_t)的概率是正的,因此这样的着色方案必然存在。
这个结果令人惊讶:尽管人们难以显式构造出一个指数级大的、无单色 K_t 的图,但随机方法却以极高的概率产生了这样的图。这揭示了组合数学中一个深刻的现象:某些结构虽然难以直接描述,但却“几乎无处不在”。
总结

本节课中我们一起学习了:
- 利用 Erdős–Szekeres 递归不等式推导出拉姆齐数 R(t, t) 的一个上界:R(t, t) ≤ 4^t。
- 通过一个简单的分组构造,得到了一个多项式下界:R(t, t) > (t-1)^2。
- 重点介绍了保罗·埃尔德什的概率方法,它证明了存在一个指数级的下界:R(t, t) > 2^(t/2)。
因此,对角拉姆齐数的真实值被夹在两个指数函数之间:2^(t/2) < R(t, t) ≤ 4^t。精确确定其增长速率(即指数的底数)是组合数学中一个长期未决的著名难题。概率方法不仅为解决此类问题提供了强大工具,也揭示了随机性在发现确定性结构中的非凡力量。
032:二分图与图着色

在本节课中,我们将要学习图论中的一个重要概念——二分图。我们将了解二分图的定义,学习如何判断一个图是否为二分图,并探讨二分图与奇环之间的关系。最后,我们会简要提及将二分图概念推广到三分图时所带来的计算复杂性差异。

二分图的定义
上一节我们介绍了图的基本概念,本节中我们来看看一种特殊的图结构。
一个图被称为二分图,如果存在一种方式将其顶点集划分成两个集合,使得图中没有边完全位于同一个集合内部。
用公式描述,即存在一个划分 V = A ∪ B,其中 A ∩ B = ∅,使得对于图中的每一条边 (u, v),都有 u ∈ A, v ∈ B 或 u ∈ B, v ∈ A。

在上图中,所有边都连接了左右两侧的顶点,这是一个典型的二分图。需要注意的是,一个图可能有多种不同的二分划分方式,并且划分中的集合可以是空集。
如何判断二分图
上一节我们定义了二分图,本节中我们来看看如何高效地判断一个给定的图是否为二分图。
最直接的方法是尝试所有可能的顶点划分。对于一个有 n 个顶点的图,每个顶点可以属于集合A或集合B,因此总共有 2^n 种可能的划分(考虑到集合A和B的对称性,可以节省大约一半的检查,但这仍然是指数级的复杂度)。对于大型图来说,这种方法是不切实际的。
因此,我们需要一个更高效的判定方法。
奇环:二分图的“破坏者”
在寻找高效算法之前,我们先来探讨一个关键性质:奇环。
一个奇环是指一个包含奇数个顶点的环。如果图中存在任何一个奇环,那么这个图就不可能是二分图。
原因如下:
假设我们试图将一个奇环的顶点分配到两个集合中。从任意一个顶点开始,将其放入集合A。由于边必须连接两个不同集合的顶点,它的邻居必须放入集合B,邻居的邻居又必须放回集合A,以此类推。当我们沿着这个奇环走一圈回到起点时,会发现起点被迫同时属于两个集合,这产生了矛盾。
因此,我们得到结论:
如果一个图包含奇环,那么它不是二分图。
核心定理:无奇环等价于二分图
上一节我们看到奇环会阻碍二分图的形成。一个自然而然的猜想是:如果一个图没有奇环,那么它就是二分图。这个猜想是正确的,它构成了一个完整的判定定理。
定理:一个图是二分图,当且仅当它不包含任何奇环。
我们已经证明了“如果包含奇环,则不是二分图”。现在需要证明另一个方向:“如果不包含奇环,则一定是二分图”。
证明思路(构造性算法):
- 从任意一个顶点
v开始,将其标记为1。 - 将所有与
v相邻的顶点标记为2。 - 将所有与标记为
2的顶点相邻、且未被标记的顶点标记为1。 - 重复此过程,像波纹一样一层层向外标记顶点(这类似于广度优先搜索BFS)。
在这个过程中,我们会将顶点分成不同的“层”:
N0(v): 顶点v本身(距离为0)。N1(v): 所有与v距离为1的顶点。N2(v): 所有与v距离为2的顶点。- 以此类推。
关键观察:
- 在这个标记方案下,边只可能存在于相邻的层之间(例如
Nk和Nk+1之间)。不可能存在“跳跃”的边(例如从N1直接到N3),否则最短路径距离的定义会被破坏。 - 更重要的是,不可能存在连接同一层内两个顶点的边。如果存在这样一条边,结合它们回到起点
v的两条路径,就会构成一个奇环,这与我们“无奇环”的假设矛盾。
因此,所有奇数层的顶点可以构成集合A,所有偶数层的顶点构成集合B,这样就得到了一个合法的二分划分。如果图不连通,对每个连通分量重复此过程即可。
这个证明过程本身也提供了一个高效算法来判断二分图:执行上述的BFS或DFS标记过程。如果在标记过程中,发现一条边连接了两个相同标记的顶点,就找到了一个奇环,说明图不是二分图。如果整个过程顺利完成而没有冲突,那么图就是二分图,并且标记结果直接给出了一个二分划分。
从二分到三分:复杂性的跃迁
上一节我们完美解决了二分图的判定问题。本节中我们来看看,如果将问题推广到三分图,情况会发生什么变化。
一个图被称为三分图,如果其顶点可以被划分成三个集合,且每个集合内部没有边。显然,任何二分图也是三分图(只需让第三个集合为空集)。
那么,如何判断一个图是否是三分图呢?一个诱人的想法是寻找类似于“奇环”的简单禁止结构。例如,完全图 K4(四个顶点两两相连)就不能被三分着色,因为四个顶点需要四种不同的颜色。
然而,问题在于不存在一个像“奇环”那样简洁的禁止子图列表来刻画三分图。存在一些复杂的图(例如彼得森图),它们不包含 K4,但同样不是三分图。判断三分图(等价于判断图是否可用三种颜色着色)是一个著名的NP完全问题,目前认为不存在对所有情况都高效的多项式时间算法。
为什么二分和三分有如此大的差异?
关键在于“约束力”。在二分图着色时,一个顶点的颜色确定后,其所有邻居的颜色都被强制确定为另一种颜色,没有选择余地。而在三分着色时,一个顶点的颜色确定后,其邻居仍有两种可能的颜色选择。这种微小的选择自由度,在图中传播开来会导致需要回溯的可能性呈指数级增长,从而使得问题在计算上变得异常困难。
总结
本节课中我们一起学习了:
- 二分图的定义:顶点可划分为两个集合,所有边跨越集合。
- 判断二分图的高效方法:利用BFS/DFS进行顶点标记,其本质是检查图中是否存在奇环。
- 核心定理:图是二分图 当且仅当 它不包含奇环。
- 问题的推广:将二分图判定推广到三分图判定时,问题会从简单的多项式时间可解(P问题)转变为目前认为的难解问题(NP完全问题),这体现了计算复杂性中“二分”与“三分”之间的根本差异。

理解二分图及其判定是图论学习中的重要基础,它在匹配问题、网络流等领域有着广泛的应用。
033:二分图匹配与霍尔定理


在本节课中,我们将要学习二分图匹配的核心概念,特别是如何判断一个二分图中是否存在“完美匹配”。我们将从一个实际问题出发,引出匹配的定义,并最终学习一个非常强大且优美的定理——霍尔定理。这个定理给出了完美匹配存在的充要条件。

考试回顾与课程过渡
上一周我们刚刚结束了考试。这次考试涉及了较多证明内容,在历史上通常被认为难度较高。但从结果分布来看,大多数同学能够完成大约三道题目,这达到了课程的基本目标。考试中的每一道题目都旨在考察我们对课程核心概念的理解与应用,而非直接套用。
关于考试的详细讨论将在本周的习题课中进行,建议大家参加。
现在,让我们回到课程内容。我们将继续探讨二分图,但焦点将转向“匹配”这一主题。
什么是匹配?一个分配问题
想象一个场景:有一群人,还有一些物品。每个人对某些物品感兴趣,愿意接受它们。我们可以用二分图来表示这种关系:左侧顶点代表人,右侧顶点代表物品,如果一个人对某个物品满意,就在他们之间连一条边。
核心问题:是否存在一种分配方式,给每个人恰好一个他/她满意的物品,并且每个物品只能分配给一个人?这就是寻找一个“完美匹配”的问题。
更形式化地说,在一个二分图中,一个从左侧到右侧的完美匹配是指:为左侧的每一个顶点,都找到一个不同的右侧顶点与之配对,并且这对顶点之间必须有一条边相连。
完美匹配的必要条件
在探讨如何找到完美匹配之前,我们先思考一下,如果一个完美匹配存在,这个图必须满足哪些显而易见的条件?这些条件被称为“必要条件”——如果连这些条件都不满足,那么完美匹配绝对不可能存在。
考虑一个一般的二分图,左侧有 L 个顶点,右侧有 R 个顶点。
-
基数条件:右侧的顶点数量必须至少和左侧一样多。
- 公式:
|R| ≥ |L| - 解释:如果物品比人少,那无论如何都会有人分不到物品。
- 公式:
-
霍尔条件(局部邻居条件):对于左侧的任意一个子集
S,这个子集中所有人“感兴趣”的物品总数(即这些人的邻居集合N(S))的大小,必须至少等于子集S本身的大小。- 公式:对于所有
S ⊆ L,有|N(S)| ≥ |S| - 解释:
N(S)是S中所有顶点的邻居的并集。这个条件防止了“内部竞争”:任何k个人,他们合起来至少要对k个不同的物品感兴趣,否则这k个人就会因为选择太少而无法全部被满足。
- 公式:对于所有
-
连通性条件(由条件2推出):如果二分图可以分成两个完全不相连的部分,那么上述霍尔条件必须在每一个部分内部都成立。
- 解释:匹配问题在不相连的部分中是独立的。
实际上,条件2(霍尔条件)是最强的,它蕴含了条件1和条件3。如果条件2成立,那么条件1自动成立(只需取 S 为整个左侧集合 L)。
霍尔定理:必要即充分
一个非常了不起的结论是,对于二分图,上述显而易见的必要条件同时也是充分的。这就是霍尔定理(Hall‘s Marriage Theorem)。
霍尔定理:在一个二分图中,存在一个从左侧到右侧的完美匹配,当且仅当对于左侧的每一个子集 S,都有 |N(S)| ≥ |S|。
我们已经证明了“必要性”(⇒):如果存在完美匹配,那么霍尔条件必须成立。否则,那些“选择太少”的人就无法被匹配。
定理中困难且精彩的部分是证明“充分性”(⇐):只要霍尔条件成立,我们就一定能够构造出一个完美匹配。
证明思路:寻找“增广路径”
直接检查所有子集 S 的算法是指数级的,不可行。我们的证明将提供一个有效的构造性方法。
核心思想是使用“贪心+调整”算法。我们从一个空的匹配开始,尝试逐步增加匹配的边数。
-
初始尝试(贪心算法):简单地依次为每个人分配第一个可用的物品。这种方法很容易失败,例如,后来的人可能发现所有他感兴趣的物品都已被占用。
-
关键调整(增广路径):当一个人(设为
P)无法匹配时,我们尝试进行“调整”。P可以去“抢占”一个已被分配的物品。这迫使原拥有者(设为Q)必须去寻找一个新的物品。如果Q能找到一个新的空闲物品,那么问题就解决了;如果Q的新物品又是从别人那里“抢占”来的,这个过程就像连锁反应一样继续下去。 -
增广路径的定义:这种“抢占-重分配”的链,在图论中称为增广路径。形式上,给定一个部分匹配
M,一条增广路径是一条起始于左侧未匹配顶点、终止于右侧未匹配顶点的路径,并且路径上的边交替地不属于M和属于M。- 不属于 M 的边:代表“抢占”或新的潜在连接。
- 属于 M 的边:代表沿着现有匹配进行“回溯”或调整。
-
增广路径的作用:一旦找到一条增广路径,我们可以通过“翻转”路径上边的状态来得到一个更大的匹配:将路径上原来不在
M中的边加入M,同时将原来在M中的边从M中移除。这样,匹配的边数就增加了1。
因此,证明霍尔定理的充分性就转化为:在霍尔条件成立的前提下,只要当前匹配还不是完美匹配,我们就一定能找到一条增广路径。
证明核心:为何增广路径必然存在?(反证法草图)
假设存在一个满足霍尔条件的部分匹配 M,但它不是完美匹配,并且不存在任何增广路径。我们将推导出矛盾。
- 设
B是左侧所有未匹配顶点的集合。 - 由于没有增广路径,
B中的顶点不能直接连接到右侧任何未匹配的顶点(否则这就是一条长度为1的增广路径)。 - 根据霍尔条件,
B必须有邻居。因此,B的所有邻居都位于右侧那些已被匹配的顶点集合中。 - 考虑这些右侧匹配顶点的“配偶”(即它们在左侧的匹配对象),将这些左侧顶点加入考虑范围。
- 通过反复应用“没有增广路径”的假设和霍尔条件,我们可以分析出,从初始集合
B出发,通过交替行走(从左侧到右侧用非匹配边,从右侧到左侧用匹配边)所能到达的所有左侧顶点构成的集合S,其邻居N(S)恰好就是我们行走过程中访问过的那些右侧顶点。 - 然而,根据我们的行走方式,
N(S)的大小等于S中通过匹配边相连的顶点数,而这个数严格小于S的大小(因为S包含了起点B,而B中的顶点是未匹配的)。 - 这就得到了
|N(S)| < |S|,与霍尔条件矛盾!
因此,假设不成立,增广路径必然存在。
总结
本节课中,我们一起学习了:
- 匹配问题:将二分图左侧顶点(如人)与右侧顶点(如物品)配对的实际背景。
- 完美匹配的必要条件,特别是强大的霍尔条件:
∀S ⊆ L, |N(S)| ≥ |S|。 - 霍尔定理:该条件同样是完美匹配存在的充分条件,这是一个深刻而优美的结论。
- 证明的核心思想:通过构造性地寻找增广路径并利用反证法,证明了只要霍尔条件成立,就可以通过有限步的调整最终得到完美匹配。这个证明过程也隐含了一个寻找匹配的有效算法(如匈牙利算法)的基本原理。

霍尔定理是组合数学和图论中的一个基石,它在任务分配、调度、网络流等众多领域有广泛应用。
034:霍尔定理与图着色


在本节课中,我们将要学习霍尔定理的完整证明,并探讨其在正则二分图中的应用。最后,我们将引入图着色的基本概念,为下一讲学习平面图理论做准备。


霍尔定理的证明
上一节我们介绍了霍尔定理的陈述:对于一个二分图,如果对于左侧的任意子集 S,其邻居集合 N(S) 的大小都至少等于 S 的大小,那么该图存在一个从左侧到右侧的完美匹配。本节中,我们来看看如何证明这个定理。
证明的核心思想是使用“增广路径”的概念。我们假设存在一个不完美的部分匹配,并试图证明总能找到一条增广路径来扩大匹配。
增广路径 是一条交替使用“未匹配边”和“已匹配边”的路径,它从一个未匹配的左侧顶点开始,到一个未匹配的右侧顶点结束。通过翻转路径上所有边的匹配状态,我们可以使匹配的边数增加 1。
目标:证明在霍尔条件成立的前提下,任何不完美的部分匹配都存在一条增广路径。
以下是证明的关键步骤:
- 假设:为了推出矛盾,我们假设存在一个不完美的部分匹配,且没有增广路径。
- 定义集合:
- 设左侧顶点集为 L,右侧顶点集为 R。
- 设 B 是左侧所有未匹配顶点的集合。
- 定义 S 为所有从 B 出发的“交替路径”所能到达的左侧顶点的集合(包括 B 本身)。交替路径类似于增广路径,但可能提前终止于左侧。
- 关键观察:
- 由于假设没有增广路径,集合 S 中的任何顶点都不能直接连接到右侧的未匹配顶点集合 D。
- 此外,S 中的顶点也不能连接到其“匹配伙伴”不在 S 中的那些右侧顶点(记作 C‘)。否则,我们可以延长交替路径,将更多顶点纳入 S,这与 S 是“从 B 出发可到达的所有左侧顶点”的定义矛盾。
- 推导矛盾:
- 因此,S 的所有边都只能连接到其匹配伙伴在 S 中的那些右侧顶点(记作 C)。
- 考虑从 S 发出的总边数:
|S| * d,其中 d 是每个顶点的度数(在二分图中,从 S 发出的边都指向 N(S))。 - 对于 N(S) 中的每个顶点,它从 S 接收的边数 ≤ d(因为它可能还连接到 S 之外的顶点)。
- 因此,我们有:
|S| * d ≤ |N(S)| * d,化简得|S| ≤ |N(S)|。 - 然而,由于部分匹配不完美,B 非空,且 S 包含 B。通过更精细的计数(考虑 S 中匹配顶点和未匹配顶点的贡献),可以得出
|S| > |N(S)|。这与霍尔条件|N(S)| ≥ |S|直接矛盾。
因此,假设不成立,增广路径必然存在。通过反复寻找增广路径,我们最终能得到一个完美匹配。
正则二分图的完美匹配
利用霍尔定理,我们可以得到一个漂亮的推论:每个正则二分图都有完美匹配。
正则图 是指图中每个顶点的度数都相同的图。
证明思路:我们只需验证正则二分图满足霍尔条件。
- 设二分图左右两部分顶点集分别为 L 和 R,每个顶点的度数均为 d。
- 首先,由握手引理可知:
|L| * d = |R| * d,因此|L| = |R|。这保证了完美匹配在数量上是可能的。 - 现在,任取左侧的一个子集 S。考虑从 S 发出的所有边。
- 边的总数为
|S| * d。 - 这些边都指向 S 的邻居集合 N(S)。
- N(S) 中每个顶点最多能接收 d 条来自 S 的边(因为它的总度数就是 d)。
- 边的总数为
- 因此,我们有:
|S| * d ≤ |N(S)| * d,即|S| ≤ |N(S)|。这正是霍尔条件。
根据霍尔定理,该正则二分图存在完美匹配。
正则二分图的边分解
上述推论还有一个更深入的结论:一个 d-正则二分图可以分解为 d 个不相交的完美匹配的并集。
证明:
- 根据上述推论,d-正则二分图 G 存在一个完美匹配 M₁。
- 从 G 中移除完美匹配 M₁ 的所有边,得到新图 G‘。此时,图中每个顶点的度数变为 d - 1。
- 图 G‘ 是一个 (d-1)-正则二分图。我们可以再次应用推论,找到另一个完美匹配 M₂。
- 重复此过程,每次移除一个完美匹配,直到所有边的度数降为 0。
最终,我们将原图 G 的边集划分成了 d 个互不相交的完美匹配 M₁, M₂, ..., M_d。这个结论在调度、比赛安排等领域有实际应用。
图着色简介
接下来,我们转向图的另一个基本概念——着色,这将在下一讲关于平面图的理论中扮演核心角色。
正常顶点着色 是指为图的每个顶点分配一种颜色,使得任意两个相邻的顶点颜色不同。
一个经典的着色问题来源于地图绘制:如何用最少的颜色给地图上的国家(或地区)着色,使得有共同边界的国家颜色不同?
我们可以将地图转化为一个图:
- 每个国家用一个顶点代表。
- 如果两个国家共享一条非零长度的边界(不仅仅是点),则在对应的顶点间连一条边。
这样,地图着色问题就等价于对其对应的图进行正常顶点着色。
四色定理 指出:任何平面图(即可以画在平面上且边不相交的图)都可以用最多四种颜色进行正常顶点着色。这是一个非常著名且证明极其复杂的定理(需要计算机辅助证明)。
在本课程中,我们不会证明四色定理,但下一讲我们将探讨平面图的一些基本性质,并可能触及更简单的六色定理。
总结
本节课中我们一起学习了:
- 霍尔定理的完整证明,其核心是通过构造集合 S 并利用增广路径不存在这一假设来推导矛盾。
- 霍尔定理的应用:证明了任何正则二分图都存在完美匹配,并且可以分解为多个不相交完美匹配的并集。
- 图着色概念的引入,了解了正常顶点着色的定义,以及其在地图着色问题中的体现,为学习平面图理论做好了准备。

下一讲,我们将深入探讨平面图的性质和着色理论。
035:平面图与欧拉公式


在本节课中,我们将要学习图论中一个非常有趣的概念:平面图。我们将了解什么是平面图,并学习一个关于平面图的顶点、边和面的重要公式——欧拉公式。最后,我们将利用这个公式来证明某些特定的图(如K5和K33)不是平面图。
什么是平面图?
上一节我们介绍了图的基本概念,本节中我们来看看一种特殊的图:平面图。
一个图被称为平面图,当且仅当它可以被画在平面上,并且没有任何边相交。
例如,完全图K3是一个平面图,因为我们可以轻松地画出它而不让边相交。然而,对于K4,如果我们画成一个正方形加两条对角线,边就会相交。但这并不意味着K4不是平面图,只是我们画得不好。实际上,K4可以画成一个四面体(或三角形加中心点)的形状,从而避免边相交,因此K4是平面图。
那么,完全图K5呢?我们似乎很难找到一种画法让它的所有边都不相交。但要证明K5不是平面图,我们不能仅仅依靠“尝试所有画法都失败了”,因为画法有无限多种。我们需要一个更严谨的数学工具。
欧拉公式
为了严谨地分析平面图,我们需要引入一个核心概念:面。在一个平面图的画法中,边将平面分割成若干区域,这些区域被称为“面”。我们总是将图形外部无限大的区域也计为一个面。
现在,我们来看一个连接平面图顶点数、边数和面数的重要公式。
对于任何一个连通的平面图画法,以下公式恒成立:
V - E + F = 2
其中:
- V 是顶点数。
- E 是边数。
- F 是面数。
这个公式被称为欧拉公式。它同样适用于多面体(例如立方体、四面体),这也是它有时被称为“欧拉多面体公式”的原因。
证明欧拉公式
我们可以使用数学归纳法来证明欧拉公式。证明的思路是,对于一个连通平面图,我们通过逐步移除边,将其简化到最基本的情况(树),然后验证公式成立,再反向推导回原图。
以下是证明的关键步骤:
1. 基础情况
我们考虑所有可能的顶点数V。对于一个有V个顶点的连通平面图,其边数的最小值是 V - 1(此时图是一棵树)。对于一棵树,它只有一个面(即外部无限面)。代入公式:
V - (V - 1) + 1 = 2
公式成立。
2. 归纳步骤
现在,考虑一个边数 E > V - 1 的连通平面图。因为边数多于顶点数减一,根据图论知识,该图中至少存在一个环。
- 我们从这个环中删除任意一条边。删除后,图仍然是连通的(因为删除的是环上的边),并且仍然是平面的(没有引入新的相交)。
- 对于这个新的、边数更少的图,根据归纳假设,欧拉公式成立:V' - E' + F' = 2。
- 比较新旧图:顶点数不变(V = V‘),边数减少1(E = E’ + 1)。由于我们删除的是环上的一条边,这条边原本分隔了两个不同的面,删除后这两个面会合并成一个面,因此面数也减少1(F = F’ + 1)。
- 将变化代入归纳假设的公式:(V') - (E' + 1) + (F' + 1) = V' - E' + F' = 2。
因此,原图的公式 V - E + F = 2 也成立。
通过归纳法,我们证明了欧拉公式对所有连通平面图都成立。
利用欧拉公式推导边的上界
欧拉公式本身很优美,但我们如何用它来证明某个图不是平面图呢?关键在于将面数F与边数E联系起来,从而得到一个只关于V和E的不等式。
我们通过“双计数”技巧来建立联系:计算所有面的周长(即围绕每个面的边数)之和。
重要观察:
- 每条边恰好属于两个面(或者为同一个面的边界贡献两次),因此所有面的周长之和等于 2E。
- 在一个顶点数至少为3的连通平面图中,每个面至少由3条边围成(最小的面是三角形)。因此,所有面的周长之和至少为 3F。
结合以上两点,我们得到不等式:
3F ≤ 2E
将这个不等式与欧拉公式 V - E + F = 2 结合,我们可以消去F:
- 由 3F ≤ 2E 得 F ≤ (2/3)E。
- 代入欧拉公式:2 = V - E + F ≤ V - E + (2/3)E = V - E/3。
- 整理不等式:2 ≤ V - E/3 => E ≤ 3V - 6。
于是,我们得到了一个重要的结论:
对于任何顶点数 V ≥ 3 的连通平面图,其边数满足 E ≤ 3V - 6。
这个结论非常有用,它表明平面图的边数不能太多,其增长是线性的(O(V)),而不是像完全图那样的平方级(O(V²))。
应用:证明 K5 和 K33 不是平面图
现在,我们可以利用上述结论来证明某些图不是平面图。
证明 K5 不是平面图:
- K5有 V = 5 个顶点,E = 10 条边。
- 如果K5是平面图,它必须满足 E ≤ 3V - 6。
- 计算:3V - 6 = 3*5 - 6 = 9。
- 但是 10 > 9,不满足不等式。
- 因此,K5不是平面图。
证明 K33 不是平面图:
K33(二分完全图)有 V = 6 个顶点,E = 9 条边。直接套用 E ≤ 3V - 6 得到 9 ≤ 12,无法推出矛盾。我们需要一个更强的条件。
- K33是一个二分图,这意味着它不包含奇数长度的环。因此,在K33的任何平面画法中(如果存在),它的每个面至少由4条边围成(因为三角形面需要3条边,但二分图没有三角形)。
- 因此,对于二分图,我们有更强的条件:所有面的周长之和 ≥ 4F。
- 结合 2E ≥ 4F,得到 F ≤ E/2。
- 代入欧拉公式:2 = V - E + F ≤ V - E + E/2 = V - E/2。
- 整理得:E ≤ 2V - 4。
- 对于K33:V=6, 2V - 4 = 8。
- 但K33的边数 E=9 > 8,产生矛盾。
- 因此,K33也不是平面图。
库拉托夫斯基定理
为什么我们特别关注K5和K33?这是因为一个非常重要的定理——库拉托夫斯基定理。该定理指出:
一个图是非平面图,当且仅当它包含K5或K33的“细分”作为其子图。
“细分”操作是指在一条边上插入新的顶点,将其分成多条边。这意味着,任何非平面图的“核心”结构里,都藏着一个K5或K33的变形。这就是为什么证明这两个基本图是非平面图如此重要。
总结
本节课中我们一起学习了:
- 平面图的定义:可以画在平面上且边不相交的图。
- 平面图的欧拉公式:对于连通平面图,V - E + F = 2。我们使用归纳法完成了证明。
- 利用欧拉公式和双计数法,推导出了平面图边数的上界:E ≤ 3V - 6(对于一般图)和 E ≤ 2V - 4(对于二分图)。
- 应用这些上界,我们严谨地证明了K5和K33不是平面图。
- 最后,我们提到了库拉托夫斯基定理,它揭示了K5和K33在判定平面性中的核心地位。

希望本节课能帮助你理解平面图的基本性质,并学会运用欧拉公式这一强大工具进行推理和证明。

浙公网安备 33010602011771号