数学 / 排列组合 · 从计数原理到 P(n,k) 与 C(n,k) / 鸽巢原理 待审核 13 / 25
pigeonhole · ⌈n/m⌉

鸽巢原理

本系列前面的每一页都在把方案数算出来。计数之外还有另一类问题:不问共有多少种,只断言某种情形一定出现。鸽巢原理(pigeonhole principle)是其中最简单的一条,它既不指出是哪一屉,也不给出分布,却能推出一批按两条计数原理硬算不出来的结论。

1 · 基本形与加强形

pigeonhole · ⌈n/m⌉

定理 1.1nn 件物品放进 mm 个抽屉(m1m \ge 1),必有一屉不少于 n/m\lceil n/m \rceil 件。

证明 反设每屉都至多 n/m1\lceil n/m \rceil - 1 件。由 n/m<n/m+1\lceil n/m \rceil < n/m + 1n/m1<n/m\lceil n/m \rceil - 1 < n/m,故总件数不超过 m(n/m1)<mn/m=nm(\lceil n/m \rceil - 1) < m \cdot n/m = n,与共有 nn 件矛盾。∎

n>mn > mn/m2\lceil n/m \rceil \ge 2,退回最常见的说法:物品比抽屉多,必有一屉装了不止一件。加强形给出的下界是紧的,均分即达到:写 n=qm+rn = qm + r0r<m0 \le r < m),让 rr 个抽屉各放 q+1q + 1 件、其余各放 qq 件,最满的一屉恰好 n/m\lceil n/m \rceil 件。所以这条原理的结论无法再改进,能改进的只有巢的选法。

图 1-1 · nn 件物品在 mm 个抽屉间的重排。可拖动 nnmm,单击某屉把物品从最满的另一屉挪来,最满一屉的件数始终不低于 n/m\lceil n/m \rceil

2 · 巢的设计

原理本身一行就能证完,用起来的全部难度在一步:谁是鸽子、谁是巢。两个经典例子的巢都不是题面上现成的。

112n2n 中任取 n+1n + 1 个数,必有一个整除另一个。巢取最大奇因子:每个正整数唯一写成 2ab2^a bbb 为奇数),而 112n2n 之间的奇数只有 nn 个,于是 n+1n + 1 个数里必有两个共用同一个 bb,写成 2a1b2^{a_1} b2a2b2^{a_2} b 后,指数小的整除指数大的。n+1n + 1 这个数量不能再减:n+1,n+2,,2nn + 1, n + 2, \dots, 2nnn 个数两两不整除,因为其中任意两个的比值都严格落在 1122 之间。

任意 nn 个整数中,必有若干连续项之和被 nn 整除。鸽子是 n+1n + 1 个前缀和 S0=0,S1,,SnS_0 = 0, S_1, \dots, S_n,巢是模 nnnn 个余数;两个前缀和同余时相减,SjSiS_j - S_i 正好是第 i+1i + 1 项到第 jj 项之和,被 nn 整除。空前缀 S0S_0 必须算作一只鸽子,否则只有 nn 只鸽子进 nn 个巢,结论落空;consecutiveSumDivisible 里那句把余数 00 预先记在下标 1-1 上的初始化,兑现的就是这一只鸽子。

3 · Erdős–Szekeres 定理

Erdős–Szekeres · mn+1 → m+1 或 n+1

定理 3.1mn+1mn + 1 的实数序列必含长 m+1m + 1 的递增子列,或含长 n+1n + 1 的递减子列。

证法是给每个位置贴一对标号。第 ii 位标 (inci,deci)(\text{inc}_i, \text{dec}_i),分别是以该位结尾的最长递增子列长度与最长递减子列长度。任取两个位置 i<ji < j:若 aiaja_i \le a_j,把第 jj 位接到第 ii 位的递增子列后面,得 incj>inci\text{inc}_j > \text{inc}_i;否则 ai>aja_i > a_j,同理得 decj>deci\text{dec}_j > \text{dec}_i。两种情形下标号都不相同,故 mn+1mn + 1 个标号两两互异。若定理不成立,每个 inc\text{inc} 至多 mm、每个 dec\text{dec} 至多 nn,全部标号只能落进 m×nm \times n 个格子,装不下 mn+1mn + 1 个互异标号。

长度 mnmn 是紧的。把 11mnmn 切成 nn 段,段内递增而段与段之间整体下降,m=n=3m = n = 3 时即 7,8,9,4,5,6,1,2,37, 8, 9, 4, 5, 6, 1, 2, 3。递增子列跨不了段,最长为 mm;递减子列每段至多取一项,最长为 nn。定理给的只是下界,随机序列离它很远:m=n=4m = n = 4、长 171720002000 个随机排列实测,17821782 个同时含长 55 的递增子列与长 55 的递减子列,最长单调子列平均 6.016.01 项。

图 3-1 · 序列各位置的标号与找出的单调子列。可拖动阈值 mmnn 切换随机序列与长 mnmn 的极值构造,单击两项交换其位置,观察标号如何挤出 m×nm \times n 个格子。

警示 · 相等元素让「递增」的严格与否成为必须先定的口径。本页取递增非严格、递减严格,incDecLabels 的默认参数即此。若两侧都取严格,标号互异这一步立刻失效:相邻两项都是 11 时两个位置的标号同为 (1,1)(1, 1)。实测长 55、取值来自 33 个数的全部 243243 条序列,严格口径下 223223 条出现标号相同的两个位置,其中 147147 条连结论都不成立(m=n=2m = n = 2,长 5=mn+15 = mn + 1,却既无长 33 的严格递增子列也无长 33 的严格递减子列,全等序列即是)。改用非严格递增后,同一批 243243 条序列的标号全部两两互异,147147 处失效一并消失。

把「必有一屉两件」从抽屉搬到图的边上,就得到 Ramsey 型结论:Ramsey 理论R(3,3)=6R(3, 3) = 6 的上界论证,正是对某个顶点的 55 条边按二色分巢,取出不少于 5/2=3\lceil 5/2 \rceil = 3 条同色边。

4 · 参考文献

  1. Pigeonhole principle. Wikipedia. 基本形、加强形与若干标准应用。https://en.wikipedia.org/wiki/Pigeonhole_principle
  2. Erdős–Szekeres theorem. Wikipedia. 定理陈述、标号法证明与 mnmn 紧例。https://en.wikipedia.org/wiki/Erd%C5%91s%E2%80%93Szekeres_theorem
  3. Longest increasing subsequence. Wikipedia. 标号的计算方法与 O(nlogn)O(n \log n) 算法。https://en.wikipedia.org/wiki/Longest_increasing_subsequence