跳到主要内容

可数 — 两种无穷,一种数得过来,一种无论怎么编号都会漏

这一章讲三件事: 「个数」这个词在无穷面前怎么重新定义; 哪些东西能一个个编上号(有些结果会让你意外); 以及有一类东西,无论用什么规律编号,都一定会漏掉其中某一个。

它在全书链条里的位置: 第 13 章说有些问题「跑不完」, 这一章要给出的是一条更硬的界:有些事情在数量级上就不够。 第 17 章那个「谁都写不出来的程序」,靠的正是这一章的数数结果。 需要的基础: 第 15 章的反证法。

1. 先看现象:偶数和整数,哪个多

「0 以上的偶数」是「0 以上的整数」的一部分——0、2、4、6…… 只占一半。 所以偶数比整数少,对吧?

原书让学生问了这个问题,老师的回答是:可以一一对应——而这正是无限集合特有的一件事1

编号: 1 2 3 4 5 6 …
偶数: 0 2 4 6 8 10 …

图说:每个编号对着一个偶数,每个偶数也对着一个编号,不漏不重。
所以从「能不能一一对上」这个角度看,它们一样多。

这一节要你先接受一件不舒服的事:在无穷这里,「整体比部分多」不成立。 下面几节就是把这件事讲成可操作的规矩。

2. 「个数」在无穷面前要重新定义

这一节回答:那到底该怎么比较两堆无穷的东西。

平常说「个数」都以「数得完」为前提2。数不完就不知道有多少个, 所以对无穷的东西,不能沿用「数完」这个动作。

原书的替代办法只有一句:不去数它,而是把两堆东西一一对应起来; 能一一对应,就规定它们的「个数」相同3

「一一对应」这四个字要认真读:它就是第 02、09 章那两条底线—— 既无遗漏,也无重复4

这里要先补一个词:一堆东西凑在一起,数学上管它叫一个集合,里面的每一样东西叫它的元素。 上一节那张图里的两排数——编号那一排、偶数那一排——各是一个集合。

有了这个词,「可数」就定得出来了:一个集合如果元素个数有限, 或者所有元素都能和正整数一一对应,就叫作可数5

说白了:能像「第 1 个、第 2 个、第 3 个……」这样按顺序数下去的,就是可数的6注意它不要求你真的数完——只要求存在一条规律, 让每个元素都能既不漏也不重地被编上号7

3. 三个可数的例子

这一节另起一处走查,把「编号」这件事做三遍。

① 0 以上的偶数8。上一节那张表就是,规律是「第 k 号是 2 × (k − 1)」。

② 全体整数(含负数)9。这个稍微要点技巧:

编号: 1 2 3 4 5 6 …
整数: 0 +1 −1 +2 −2 +3 …

图说:关键在于正负交错着编。
如果先把所有正整数编完再编负数,就永远轮不到负数 ——
因为正整数本身就是无穷的。

③ 全体有理数(能写成分数的数)10。这个最反直觉: 分数看起来「密密麻麻」,任意两个分数之间还夹着无穷多个分数。

但照样能编号。 原书的办法是把所有分数摆成一张二维表—— 横着排分子、竖着排分母——然后沿着斜线走,一个一个编号, 碰到已经出现过的(比如 2/4 和 1/2 是同一个数)就跳过11

这三个例子的共同点:难的不是数,是设计那条「不漏不重」的编号规律。

4. 意外的一个:所有程序的集合也是可数的

这一节另起第二处走查,而它是通向第 17 章的关键一步。

程序有无穷多种。可「所有程序的集合」是可数的12

理由是这样13:

① 一个程序,说到底是一串字符 —— 而写程序能用的字符种类是有限的
(26 个小写、26 个大写、10 个数字、几十个符号,加上空格和换行)
② 于是可以按长度从短到长排:1 个字符的、2 个字符的、3 个字符的……
每一档里再按字符编码的顺序排
③ 中间那些不符合语法的字符串当作错误剔掉,剩下的挨个编号

→ 每一个程序都拿到了一个编号,不漏也不重

图说:这里的「一串字符」就是所谓字符串 —— 一段按顺序排好的文字。
整个论证的钥匙只有一句:能用的字符种类是有限的。

(上面那句「一串字符」就是字符串:一段按顺序排好的文字。)

这个结论要记牢:能写出来的程序,可以一个一个编上号。 换句话说,程序的「个数」不比正整数多。

原书还挂了一条脚注,给了另一条更快的路: 把程序看成一串 0 和 1、当成一个二进制数来看,同样能得出程序可数14

5. 主走查:所有整数数列的集合,数不过来

这一节是全章的主走查。

先说清对象:「无穷个整数排成一排」叫一个整数数列15。比如:

名字前几项
0 以上的整数数列0、1、2、3、4、5……
0 以上的偶数数列0、2、4、6、8、10……
1 以上的奇数数列1、3、5、7、9、11……
斐波那契数列(第 12 章)0、1、1、2、3、5……
全 0 数列0、0、0、0、0、0……
圆周率各位数字组成的数列3、1、4、1、5、9……

要证的是:所有整数数列的集合不可数16用第 15 章的反证法。

步骤 1:假设它可数。 那就意味着能给所有整数数列编号, 于是可以排成一张无穷大的表——第 k 个数列排在第 k 行17

步骤 2:从这张表造出一个不在表里的数列。 办法是只看对角线:取第 1 行第 1 个数、第 2 行第 2 个数、第 3 行第 3 个数…… 每个都加 118

第1个 第2个 第3个 第4个 第5个 第6个
1号: [0] 1 2 3 4 5 ← 取第 1 个:0
2号: 0 [2] 4 6 8 10 ← 取第 2 个:2
3号: 1 3 [5] 7 9 11 ← 取第 3 个:5
4号: 0 1 1 [2] 3 5 ← 取第 4 个:2
5号: 0 0 0 0 [0] 0 ← 取第 5 个:0
6号: 3 1 4 1 5 [9] ← 取第 6 个:9

对角线上的数: 0 2 5 2 0 9
各加 1 之后: 1 3 6 3 1 10 …… ← 造出来的新数列

图说:方括号里的就是对角线。加 1 是为了「和那一行至少差一处」。

新数列是 1、3、6、3、1、10…… 它在这张表里吗?不在19

为什么不在?挨行检查一遍:

  • 和 1 号数列比:第 1 个数不同(1 ≠ 0)——所以不是 1 号;
  • 和 2 号数列比:第 2 个数不同(3 ≠ 2)——所以不是 2 号;
  • 和 k 号数列比:第 k 个数一定不同(因为它就是照着第 k 个数加 1 造的)。

所以它和表里的每一行都至少差一处,它不在表里20

可这张表号称「包含所有整数数列」——矛盾。 所以最初的假设错了:所有整数数列的集合是不可数的21主走查走完了。

这套论证叫对角论证法,是康托尔提出的22

6. 学生的追问:把它补进表里不就行了

这一节回答一个每个人都会想到的问题,而原书用师生对话答了。

学生问:既然造出来的那个数列不在表里,把它补进去、再做一版新表不就行了?

老师的回答是:不行23因为对新表再做一次同样的操作, 又会造出一个不在新表里的数列。

这就是「不可数」的真正含义:不是「这张表漏了一个」, 而是「不管你怎么做表,一定会漏」24

注意这里的落点:结论不是关于某一张表的,是关于「所有可能的编号规律」的。

7. 这一招的边界:对有理数就不灵

这一节交代最容易用错的地方,而原书同样用师生对话讲了。

学生又问:有理数也能写成小数,那用对角论证法是不是能证明有理数不可数?

老师说:不能25

理由: 对角线改出来的确实是一个小数,但不能保证它是有理数26有理数写成小数一定是循环小数,而新造出来的那个小数不一定循环。

对角论证法真正证明的是:「造出来的那个东西不在表里」。
它要成立,还差一步 —— 「造出来的东西必须属于你正在讨论的那一类」。

整数数列:对角线加 1 之后仍然是整数数列 ✓ → 论证成立
有理数: 对角线改完之后不一定是有理数 ✗ → 论证不成立

图说:这就是这一招唯一的坑,而它在第 17 章还会再出现一次。

这条边界非常要紧,第 17 章有一道思考题专门考它。

8. 顺带一个:函数的集合也不可数

这一节把结论推到第 17 章要用的那个形式。

「输入一个正整数、输出一个整数」的函数,有多少个? 答案是:和整数数列一样多——所以也不可数27

理由是一一对应28:

函数「给定整数加 1」 ←→ 数列 2、3、4、5、…
函数「给定整数求平方」 ←→ 数列 1、4、9、16、…
函数「是质数就输出 1,否则 0」←→ 数列 0、1、1、0、1、0、…

图说:一个函数,把它在 1、2、3、… 上的输出依次写出来,就是一个整数数列;
反过来,一个整数数列也决定了一个函数。两边一一对应。

把第 4 节和这一节并排放,就是第 17 章的地基:

可数吗
所有程序可数——能一个个编号
所有函数不可数——无论怎么编号都会漏

编得完的东西,盖不住编不完的东西。第 17 章就从这里开始。

9. 作者的判断、我们的判断,以及这一章的边界

说法书里给了什么
无穷集合的「个数」用一一对应来定给了理由:数不完,所以不能用「数完」这个动作
偶数、整数、有理数都可数给了三条编号规律,不是断言
程序的集合可数给了完整论证(字符种类有限 → 按长度排 → 编号)
整数数列的集合不可数给了完整走查(对角线 + 1),并回答了「补进去行不行」
对角论证法对有理数不灵给了理由(造出来的小数不一定循环),而且是用师生对话点破的

判断(我们的,不是书里的):这一章的价值不在「数学上有两种无穷」, 在于它示范了一种非常硬的论证形式——「无论你怎么做,都一定会漏」。 平时我们说「做不到」,多半意思是「我没想到办法」; 而这一章的「做不到」是对所有可能的办法一次性封死的。 能分清这两种「做不到」,是这一章唯一要带走的东西。 如果错,会错在: 这种论证有个前提——你得先把「所有可能的办法」刻画清楚 (这里是「所有编号规律」)。刻画不清,封不死。判据是: 你能不能说出「任意一种办法」长什么样。

这一章的边界:

  • 没有讲「基数」这套概念的正式体系(原书只在师生对话里提了一句这个词);
  • 没有讲实数不可数的完整证明,只说了「0 到 1 之间的实数也不可数」和做法;
  • 没有讲连续统假设之类的后续问题;
  • 程序可数的论证依赖「字符种类有限」,原书没讨论无限字符集的情形;
  • 对角论证法这一节严重依赖那张表,原书是用图给的,我们照文字重画了一张。

10. 可带走的

  1. 在无穷面前,「整体比部分多」不成立:偶数和整数能一一对应;
  2. 比较两堆无穷,不数它们,而是看能不能一一对应——能对应就规定「个数」相同;
  3. 一一对应 = 不漏 + 不重,还是第 02 章那两条底线;
  4. 能一个个编上号的,叫可数;不要求真的数完,只要求存在那条编号规律;
  5. 偶数、全体整数、有理数都可数;整数要正负交错编,有理数要沿斜线走并跳过重复;
  6. 所有程序的集合也可数——因为程序是有限种字符排成的有限长字符串;
  7. 所有整数数列的集合不可数:取对角线上的数各加 1,造出来的那个必定不在表里;
  8. 「不可数」不是「这张表漏了一个」,是「不管怎么做表都会漏」;
  9. 这一招叫对角论证法,是康托尔提出的;
  10. 它有一个坑:造出来的东西必须仍然属于你讨论的那一类——对有理数就不成立;
  11. 程序可数、函数不可数——这一条是第 17 章的地基。

11. 原文地图

主题原书章原文位置
整体与部分能一一对应第8章 不可解问题text/13-ch08.txt:165(搜「都是「1 以上的整数」的一部分」) · :171(搜「这正是无限集合的特征」)
可数的定义第8章 不可解问题text/13-ch08.txt:131(搜「被定义为可数」) · :138(搜「简而言之」) · :143(搜「元素可按一定规律既无」)
偶数、整数、有理数的编号第8章 不可解问题text/13-ch08.txt:156(搜「0 以上的所有偶数的集合是可数的」) · :180(搜「重点在于正数和负数的交互编号」) · :190(搜「所有有理数的集合是可数的」)
程序的集合可数第8章 不可解问题text/13-ch08.txt:271(搜「符合编程语言语法的有限字符的排列」) · :290(搜「可以按从短到长的顺序排列」) · :293(搜「因此,程序的集合是可数的」)
整数数列与对角论证法第8章 不可解问题text/13-ch08.txt:312(搜「现将」) · :338(搜「是不可数的」) · :411(搜「设第 1 个整数数列的第 1 个数 +1」) · :420(搜「至少有 1 处不同」)
康托尔第8章 不可解问题text/13-ch08.txt:430(搜「这种论」) · :431(搜「对角论证法是康托尔」)
补进表里行不行第8章 不可解问题text/13-ch08.txt:436(搜「再做一版」) · :441(搜「所以肯定会存在」)
对有理数不灵第8章 不可解问题text/13-ch08.txt:484(搜「能证明」) · :489(搜「但是不能保证这个小数肯定是」)
函数的集合不可数第8章 不可解问题text/13-ch08.txt:501(搜「所有函数的集合也是不可数的」) · :504(搜「给定整数加 1 的函数」)

Footnotes

  1. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 165 段(text/13-ch08.txt:165,搜「都是「1 以上的整数」的一部分」)与第 171 段(text/13-ch08.txt:171,搜「这正是无限集合的特征」)。这是原书的师生对话。

  2. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 533 段(text/13-ch08.txt:533,搜「一般考虑「个数」时都以「数得完」为前提」)。

  3. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 549 段(text/13-ch08.txt:549,搜「我们要将它和其他集合一一对应起来」)与第 553 段(text/13-ch08.txt:553,搜「要规定这两个集合的「个数」都相同」)。原书还说:不应该说是个数,而应该说基数。

  4. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 565 段(text/13-ch08.txt:565,搜「因为一一对应是既无」)。

  5. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 131 段(text/13-ch08.txt:131,搜「被定义为可数」)。原书给的英文是 countable,脚注说有时也作 enumerable。

  6. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 138 段(text/13-ch08.txt:138,搜「简而言之」)。原文说:「可数」的词义就是「可以计数」。

  7. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 143 段(text/13-ch08.txt:143,搜「元素可按一定规律既无」)。原文明说:如果元素是无限的,实际上也不可能全部数尽。

  8. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 156 段(text/13-ch08.txt:156,搜「0 以上的所有偶数的集合是可数的」)与第 162 段(text/13-ch08.txt:162,搜「这里将偶数」)。

  9. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 180 段(text/13-ch08.txt:180,搜「重点在于正数和负数的交互编号」)。原文给了理由:把所有正整数编完再编负数是行不通的,因为正整数是无穷的。

  10. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 185 段(text/13-ch08.txt:185,搜「以如下分数形式表示的数称为有理数」)与第 190 段(text/13-ch08.txt:190,搜「所有有理数的集合是可数的」)。

  11. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 265 段(text/13-ch08.txt:265,搜「如此一来就能既不」)与第 267 段(text/13-ch08.txt:267,搜「得跳过重复出现的数」)。原书图 8-1 画了那张二维表和斜线走法。

  12. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 271 段(text/13-ch08.txt:271,搜「符合编程语言语法的有限字符的排列」)。原文说:程序是无穷的,但是程序的集合是可数的。

  13. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 281 段(text/13-ch08.txt:281,搜「假设共有 N 种字符可用」)、第 290 段(text/13-ch08.txt:290,搜「可以按从短到长的顺序排列」)与第 293 段(text/13-ch08.txt:293,搜「因此,程序的集合是可数的」)。原书把可用字符列了三行(大小写字母、数字、符号),并说明还有换行和空格。

  14. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 302 段(text/13-ch08.txt:302,搜「当作 2 进制数来看」)。这是原书的脚注。

  15. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 312 段(text/13-ch08.txt:312,搜「现将」)。原书随后举了六个例子,我们表里那六行就是它们。

  16. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 338 段(text/13-ch08.txt:338,搜「是不可数的」)。

  17. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 369 段(text/13-ch08.txt:369,搜「首先,假设」)与第 372 段(text/13-ch08.txt:372,搜「编号为 k 的整数数列在表的第 k 行」)。

  18. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 411 段(text/13-ch08.txt:411,搜「设第 1 个整数数列的第 1 个数 +1」)起的几行。表里那六行数和对角线上的 0、2、5、2、0、9 都出自原书图 8-2。

  19. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 418 段(text/13-ch08.txt:418,搜「1, 3, 6, 3, 1, 10」)。

  20. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 420 段(text/13-ch08.txt:420,搜「至少有 1 处不同」)。

  21. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 421 段(text/13-ch08.txt:421,搜「却没有包含数列」)与第 423 段(text/13-ch08.txt:423,搜「所有整数数列的集合」是不可数的)。

  22. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 430 段(text/13-ch08.txt:430,搜「这种论」)与第 431 段(text/13-ch08.txt:431,搜「对角论证法是康托尔」)。原书给的生卒年是 1845—1918。原文还说:即使限制得更严格(比如只用 0 到 9,甚至只用 0 和 1),同样能找出不可数的集合。

  23. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 436 段(text/13-ch08.txt:436,搜「再做一版」)与第 437 段(text/13-ch08.txt:437,搜「如果再对这个新表进行对角论证法会怎么样呢」)。

  24. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 441 段(text/13-ch08.txt:441,搜「所以肯定会存在」)与第 445 段(text/13-ch08.txt:445,搜「所以说「做不出这样的表」就意味着「不可数」」)。

  25. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 484 段(text/13-ch08.txt:484,搜「能证明」)与第 486 段(text/13-ch08.txt:486,搜「老师:不能」)。

  26. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 490 段(text/13-ch08.txt:490,搜「但是不能保证这个小数肯定是」)与第 494 段(text/13-ch08.txt:494,搜「会变成循环小数」)。

  27. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 501 段(text/13-ch08.txt:501,搜「所有函数的集合也是不可数的」)。原文说,就连「只要输入 1 以上的整数就输出一个整数」这么简单的函数也是不可数的。

  28. 出处:「第8章 不可解问题——不可解的数、无法编写的程序」第 504 段(text/13-ch08.txt:504,搜「给定整数加 1 的函数」)起的三行,以及第 508 段(text/13-ch08.txt:508,搜「一般而言,可以将下列函数」)。