有理数是能写成两个整数之比 p/q 的数,实数再补上不能这样写的无理数,填满整条数轴。本节的主角是根号 2:一个边长为 1 的正方形,对角线长是根号 2——它存在、可以画出来,却永远写不成分数。我们手工证明这一点,再让程序展示分数逼近的极限过程。承接上节的除法缺口,通往第六章的极限概念。
毕达哥拉斯学派信奉"万物皆数",这里的数指整数及其比。传说门徒希帕索斯发现:单位正方形的对角线与边之比不是任何两个整数之比。勾股定理给出对角线长的平方等于 1 平方加 1 平方等于 2,所以对角线长是"平方等于 2 的数"。问题来了:有没有分数,它的平方恰好是 2?
试一试很自然:7/5 的平方是 49/25 = 1.96,小了;17/12 的平方是 289/144 ≈ 2.0069,大了;再往细找,41/29 的平方 ≈ 1.9988……分数可以无限逼近 2,但逼近和恰好等于是两回事。
反证法,全程只用整数的基本性质:
第一步,假设根号 2 = p/q,其中 p、q 是互素的整数(既约分数,分子分母已约到最简)。
第二步,两边平方:p 的平方比 q 的平方等于 2,即 p 平方 = 2 倍 q 平方。所以 p 的平方是偶数。
第三步,奇数的平方是奇数(2k+1 的平方 = 4k 平方 + 4k + 1,确实是奇数),所以 p 本身是偶数。记 p = 2r。
第四步,代回去:(2r) 平方 = 2 倍 q 平方,化简得 2 倍 r 平方 = q 平方。同理 q 也是偶数。
第五步,p、q 都是偶数,与"互素"矛盾。假设崩塌,根号 2 不是分数。证毕。
这个证明两千多年没变过样,是反证法的教科书范本。注意第三步的关键引理"奇数平方是奇数"——它依赖整数的离散结构,这正是上一节强调良序性的用武之地。
>>> from sympy import Rational, sqrt, nsimplify >>> # 验证几个近似分数的平方,都只是靠近 2 而不等于 2 >>> for p, q in [(7,5), (17,12), (41,29), (99,70)]: ... print(p, q, (Rational(p,q)**2), float(Rational(p,q)**2 - 2)) 7 5 49/25 -0.040000000000000036 17 12 289/144 0.006944444444442867 41 29 1681/841 -0.0011890606420910395 99 70 9801/4900 0.00020408163265309936
误差一路缩小到万分之二,但每一次都不是零——与证明的结论严丝合缝。
>>> from sympy import sqrt >>> sqrt(2) sqrt(2) # SymPy 保持精确符号,不化成小数 >>> sqrt(2).evalf(30) 1.41421356237309504880168872421
SymPy 干脆不给小数,除非你明确要求——精确数学的态度。
有理数的四则运算(除数非零)全部封闭,且在数轴上稠密:任何两个不相等的有理数之间还有第三个(取中点即可),从而有无穷多个。稠密带来一个错觉:有理数好像铺满了数轴。实际上有理数在数轴上布满了"洞"——根号 2 就掉在洞里。更惊人的是,用对角线法可以证明:无理数比有理数"多得多",有理数能排队编号,实数永远排不完。
| 对比项 | 有理数 | 无理数 |
|---|---|---|
| 小数展开 | 有限小数或无限循环 | 无限不循环 |
| 个数 | 可数(可排队编号) | 不可数 |
| 加法封闭 | 是 | 否(根号2 加上 2 减 根号2 = 2) |
| 数轴上 | 稠密但不完备 | 补上后数轴才连续 |
把所有有理数的"洞"补齐得到的完备数系就是实数。补洞的严格办法(戴德金分割或柯西数列)超出本册范围,但它的功能可以用一句话说清:在有理数里,递增有界的数列可以没有极限;在实数里它一定有。上一节那串 7/5、17/12、41/29……递增有界,它的极限正是根号 2——实数保证这个极限存在。
>>> from sympy import Rational >>> # 用中点法在有理数之间继续插值:稠密性的程序演示 >>> a, b = Rational(1,4), Rational(1,2) >>> for _ in range(3): ... m = (a + b)/2 ... print(m) ... a = m 3/8 7/16 15/32
每次取中点都落在前两个之间,这样的插入永远做不完——稠密,但不保证碰到无理点,那些点是后来"补"进去的。
⚠️ 常见坑:把"无限不循环小数"当成无理数的定义来记没问题,但别把 3.14159(有限小数)当成圆周率——有限位写的永远是有理数,无理数只能用符号或无限过程指称。

有限小数(如 0.125 = 125/1000 = 1/8)是有理数;无限循环小数也是有理数——0.3 循环 = 1/3 是最简单的例子,任何循环小数都能用"乘十的幂再相减"还原成分数:设 x = 0.2727 循环,100x = 27.2727 循环,相减得 99x = 27,x = 27/99 = 3/11。反过来,无限不循环就意味着无理数。判断口诀只需一句:看小数展开是否最终进入循环。
问:无理数多还是有理数多?
答:不在一个量级。有理数可数(能排成一队编号),实数不可数(康托尔对角线证明),因此无理数不可数——数轴上"绝大多数"点是无理数。
问:根号 2 加根号 3 是无理数吗?
答:是。反证:若它是有理数 r,则 r 减根号 2 等于根号 3,两边平方整理会逼出根号 2 是有理数,矛盾。
下一节继续追问:根号负一呢?负数开方把数轴本身都撑破了,出路在平面上。