对「什么是数」问题的再思考
「什么是数?」的问题,对我来说是最难、挑战性最大的问题。看过很多书后有过很多思考,但思考的结果都很碎片,无法形成一个一贯而统一的思想。而现代「数学分析」标准教科书中对这个问题很少有严肃认真的回答,所谓严格建立实数理论云云实际上是后人在为前人的理论补漏洞,使其「看上去」很自洽、完备。不过,与其无头无脑地批评别人,不如深入问题内部得到自己对问题的认识。下面是我最近以来对这个问题思考的一些不成熟想法,因此这篇笔记也会随时间流逝不断修改。
「什么是数」这个大问题下的第一个问题应当是「数的概念从哪里来的」。现在看,是从两种基本活动和一种派生活动中得到。两种基本活动是,第一、计数 (counting),从清点、数人头获得的量;第二、测量 (measuring),从测量长度、面积、体积、重量、温度、强度等对象的连续物理特征获得的量。计数与测量所得到的量是不同性质的量,前者的表达是可枚举的、离散的,后者则是不可枚举的、通常是连续的。由此,数学的研究也分成连续数学和离散数学两大部分。而派生活动是指通过前两种基本活动获取原生的数之后对数进行加工所获得的数,例如通过计算、解方程等数学活动得到的数。
我们现存的以 0-9 作为基本元素的数学语言,只适合表示离散量,不适合表示连续量。为什么?因为不仅仅是这些阿拉伯数字,人类发明的所有符号、符号体系都是离散的,而用离散的符号精确量化连续的对象本质上是不可能的;因为离散对象集合的本质之一是有「下一个」,而连续对象中的元素是不存在「下一个」的概念的(其实「连续对象中的元素」这个表达本身都是矛盾的)。人们通常用「...」表示「无限」的概念其实不负责任的,因为「...」所代表的具体指称必须由读者自行脑补,没有语义学的明确指称意义。表达连续的最有效方法是几何图形,例如,一段定长的有向线段代表了无限数量的点,因此若设线段两端为 A、B,那么以点作为单位,以几何对点的定义(无长度无大小),你是永远无法从 A 走到 B 的。表示连续概念的几何对象要代数化,就面临着如何将其用离散的符号表示的问题。现实中,数学家是通过发现或构建实数来表示连续的概念的,但是实数的表达仍然是一个离散的数字序列,这本身就和连续的概念相矛盾的,因此实数概念并没有在逻辑上毫无瑕疵的条件下展现这个目的,对这个问题我们后面会谈到。
本篇讨论的主题是:作为表达连续、无限概念的实数和表达离散、有限概念的有理数到底有什么本质上的不同。
我们都知道,自然数数列的基数是 1。我们从 1 开始,然后用 1 与当前的数相加获得数列的下一个数。有理数的基本原理和自然数相同,都是基于一个给定的基数(basis)。例如,正偶数数列的基数是 2、 整数数列的基数是集合 {1, -1}、斐波那契数列的基数是函数:;而分数数列的基数是,其中,,小数是分数的特例,其基数是 ,其中,。
而实数则是一个概念上无法确定的对象。为什么?如果从上面讨论的有理数原理的角度,一个数的表达之所以存在,端赖于两个要素:基数 (basis) 和数制 (number system)。
举几个例子,
例1:
0.125米 = 125毫米,
这里,米和毫米的映射机制是 1 → 1000,亦即,我们既可以将基数定为 1 毫米、也可以定为 1 米。而单位换算实际上是一种线性映射,将以 1 米为基数的量映射到以 1 毫米为基数的量。例如0.125 是以 1 米为基数得到的数,125是以 1 毫米为基数,但不管是 0.125 还是 125,二者通过测量获得的量不变、相同。
例2:
1/3 在 10 进制内可表示为 0.333...,而在 3 进制内则是 0.1。通过测量获得量只有一个,但是在不同数制内的表达却不相同,在 10 进制内的表达一个以3作为连续循环体的小数,但是在 3 进制内则是一个以 0 作为循环体的小数,因为 0.1,可以写作 0.10000...。一般而言,所有有理数在以 n 为基数的 m 进制都可以看作是某个整数与某个小数有限数位数列的连续循环体的和。例如,以 1 为基数的 10 进制 ,是整数 3 与 小数有限数位数列 142857 的连续循环体的和。所谓「连续循环体」是指 一个确定小数数位的序列的反复,22/7 的 以 1 为基数的 10 进制表示就是:3 + 0.142857142857142857...。而有理数 3 的小数数位数列是 0,所以 3 可以写作 3 + 0.00000...,循环体是 0。
例3:
作为一个量,10 进制中以 1 作为基数的表达是 3.14,以 0.001 为基数的表达是 3140,以 0.005 为基数的表达是 628。换句话说,以 0.001 为单位你需要从 0 数 3140 次、以 0.005 为基数你需要数 628 次才可以得到以 1 作为基数的 3.14。因此,基数为 1 的 3.14 等于基数为 0.001 的3140、基数 0.005 的 628。改变基数、改变数制,就改变了对同一量的数学表达,但没有改变量本身。其中,量是实质,数是表象,不同基数、不同数制下的各种数是量的表达、量的马甲,所以说王八无论换什么马甲依然是王八,无论是 3.14、3140 还是 628,表达的是同一个量。
把这个思想一般化,可以表述成:
【任何有理数,其所代表的量的外在表达形式,随基数和数制的不同而不同】。其中,基数确定了数系的最小元素的体量,数制确定了数系的最大元素的体量。
我们目前的数学学习与教育大部分仍然是在基于基数为 1 的 10 进制系统内,但是很少有人跳脱这个系统,对数的性质进行出系统、完整、清晰、明确的定义和说明,这使得我们的思想禁锢在这个狭小天地之内,看问题仅限于在这个有限范围的数学直观。幸亏有了计算机,让我们开了眼界,系统地认识和熟悉了 2 进制。其实在我们的日常生活中,我们是多进制并用的。一天等于 24 小时、一小时等于 60 分钟,一打等于 12 个,过去中药房里对药材的计量是以 16 进制为单位的,所以才有「半斤八两」的成语。因此,要想对数的本质进行研究和探讨,从理论和实践两个方面深刻理解数的「基数」(basis) 和「数制」(number system) 对理解「什么是数」这个问题非常关键,这实际上帮助我们跳脱固有、常规、僵化、狭隘、已经习惯化了的、以 1 为基数的 10 进制数制的直觉,就像跳出地球引力,在太空环境下眺望天体一样,对数学基础这门学科获得程度更深、视野更广的理解。
我曾在线性代数学习笔记中说过,任何数都可以 用标量×基数 的形式表达。上面例子中的 3140 是标量,基数是 0.001;如果以 1 为基数、以 10 为进制数表达的是一种结构,那么以 0.001 为基数,以 10 为进制的系统则是另一个结构,两个结构之间可以得到一个同构的映射关系,使得 3.14 的映像是 3140。
基数不但决定了数的表达方式,也隐性规定了算术计算规则的基础 —— 运算时必须从最右侧 —— 基数位开始:例如
1.25
2.6 (+
——————
我们不会让 2.6 中的 6 和 1.25 中的 5 对齐,同时,在做计算时,我们总是先做 5+0,而不会先做 1+2,这两个规则实际上就是基于我们潜在的对非 1 基数的理解。
对比有理数这两个特征,再看实数就会发现,实数没有基数!换句话说,你根本不知道计数的基本单位是什么,因而无法进行上述的加法运算 —— 因为实数是无限不循环。无限,意味着没有最小位的基数,换句话说根本没有什么最右侧的最小基数位;而不循环,则意味着你永远不知道当前数位后面的数是什么。因此,用我们现存的以 0-9 十个阿拉伯数字为基本元素的数学语言是无法表达实数的。这也为什么我们常见的实数, π、e 等超越数、√2 等代数数、以及超越函数的值不用 0-9 作为元素的数字表达,而是采用字母、算术、或函数表达式的形式。
而现实生活中,我们教科书中的实数,在做理论讲解时是抽象的概念,但是在计算时,我们实际使用的却是所谓的近似值——有理数而不是真正的实数,所以才有约等于符号 ≈。但「约等于」的概念是不合逻辑的,例如双生子兄弟两人,我们能因为兄弟俩长得酷似,因为「约等于」让哥哥替弟弟参加高考吗?回到实数,π 和 3.14 是一个数吗?3.14 和 3.1415 是一个数吗?显然不是。3.14 是一个以 1/100 为基数的有理数,而 3.1416 是以 1/10000 为基数的有理数,而 π 显然不是它们其中的任一个,让 3.14 或 3.1415 代替 π 和让双生子兄弟替考有什么区别?用近似有理数代替实数的方法和当年牛顿用 0 代替无穷小但又说明无穷小不是 0 的那种困境是一样的。
学过中学数学的都知道 (√2)² = 2,但我们是怎么知道的?不是通过计算,而是通过简单的推理:平方是平方根的逆运算。但如果真有人让你手工计算 √2 × √2,你会如何?理论上,这不是可计算问题,因为你无法确定计算从哪里开始——从右侧看根本就没有什么「开始」,或者,根本就没有什么「右侧」—— 实数的位数如果枚举,实际上是一个从左向右无限延伸的无穷数列。但现实生活中我们的老师、教科书、数学家们都会走捷径——选一个大家喜爱或都可接受的近似有理数,让一个长得像那个实数的有理数「兄弟」「替考」,例如,1.414*1.414 等。严格说这样的教育是误导,使学生误以为使用 3.14 仍然意味着使用 π,使用 0.707 代表 √2/2,学生依然不知道实数是什么,并且把作为近似值的有理数当作实数,从而使得区分实数和有理数变得无意义。但反过来也正好说明,实数是一个虚拟的概念,无法用于数学计算的实践。我们可以想像一下:如果只有无理数,而没有有理数的近似值存在,也就是说我们再没有无理数「约等于」的有理数「兄弟」,那么计算将无法进行下去。用一句俗话总结:实数,是「只可看不可吃」的画饼。这也是为什么许多具名实数都是以算术表达式的形式给出,如 √2/2、,这其实是隐含了使用现存的以 0-9 为元素的数学语言无法表达实数。而计算机由于物理存储介质的限制,无法表达无限数位的实数概念,因此采用了所谓「浮点数」概念,实际上是去除了实数与有理数的界限,换句话说,实数的概念在计算机上是无法实现的。
但是,实数是现代数学、特别是以微积分为实质内容数学分析的理论基础。毫不夸张地说,实数理论的坚实与否直接关系到整个数学分析体系的正当性。为此,从戴德金、康托尔、希尔伯特开始,一代又一代的数学家在孜孜不倦地试图解开实数这个节。现在通行的就是以康托尔理论为基础的无穷集合论,infinite set theory。但是,实数问题真的解决了吗?我将在后续的笔记中回顾这个理论的历史来龙去脉,看看 100 多年来数学家们是如何研究解决这个问题的。
我个人现在的看法是,实数问题是一个人类到现在都无法在逻辑上和技术上成功解释清楚的问题,问题的根源在于「无限」infinity 的概念。数学中最大的问题就是如何表达「无限」的概念,而这个概念是数学基础、数学哲学的核心问题之一。这个问题自毕达哥拉斯学派发现 √2 的无限性以后陪伴了人类两千多年,尽管有了19世纪无穷集合的概念,有了所谓「无穷集合论」等解决方案,但是「无限」的问题仍然无法在逻辑上被正当化。正如上面的例子所示,当我们解释概念时,我们都知道实数是何物,但是真正当需要计算时我们仍然只能借助近似有理数,类似地,当我们讨论极限概念时,我们似乎都知道无穷小是什么,但是真正在求导数的计算中,我们又简单地把 Δx 当做 0 处理。
我上面只说了实数无法用现存的 0-9 数字系统「表达」,但是,到底仅仅是我们尚未找到精确表达实数的工具、还是人类根本没有从严格的意义上理解实数,这个问题以本人现在的功力无法说清楚。我唯一能做的就是在自己的文字中尽量避开「无限」的概念,当不得不涉及到实数时也只是按照一般流行教科书的说法「敷衍」而过。
小结一下:数的产生源于计数和测量两种基本活动,前者产生自然数,而测量则产生小数、分数。数学意义上的整数、有理数、实数和复数,则来自于数产生的派生活动——计算。其中,有理数的机制基于【基数】和【数制】两大要素,这使得同一量的表达可以呈现多种形态。构成有理数集合的基本生成式就是:基数 × 标量;
而实数的困境源于「无限」的概念,这使得无理数只能停留在虚拟的概念而无法作为一个有精确表达方法的数学对象参加任何有意义的算术运算,而通常的应对方法是使用相对应的有理数近似值。
展望
实数问题,是一个非常复杂的问题,其根源是「无限」这个概念在数学中的合理性问题。我在笔记《「离散数学」是一门什么样的学科》中曾简单提及,其中最重要的就是,以无限概念为基础的实数概念给计算机科学的发展带来麻烦,使得所有以无限、连续为基本概念的数学分支都必须离散化,这使得只有离散化的数学对象才是物理的(唯物主义的)实体 —— 计算机门电路的开关信号,而非离散化的数学对象都是形而上的(唯心主义的)意识。因此,以连续、无限为基础概念的数学分支,至今尚未公理化。公理化的意思是,逻辑推理起始于若干「不言自明」的概念和命题句,而实数、无限的概念,显然不是「不言自明」的,无法作为推理的起点。
现代对数学进行公理化的描述是代数化,因此,我们会发现一长串以代数几何、代数数论、代数拓扑等以「代数XX」为限定词的数学分支也就不奇怪了。那么,微积分能否代数化?现在尚没有系统的理论,虽然世界上有人正在做这方面的努力[1]。我对代数化的初步理解是「非实数化」,去除实数、无限等非逻辑的概念,以代数结构为框架,以自然数为基础建立公理化的微积分体系,虽然这个体系尚不存在,或者只是某些个别人提出的解决方案,没有形成完整、系统、公理化的、为所有数学家接受的代数化微积分体系。
最后说一句题外话,线性代数应当作为数学中最基础的学科,是表达数学对象的语言和工具。数学的两大核心是算术和几何——对「量」这个概念的两种表达方式,而线性代数完美体现了这个关系的统一,因为「线性」是我们所处世界中最简单的概念表达方式。例如我们常形容人是「线性思维」,意思是想法过于简单。而微积分和相关更高级的数学分支是对非线性的算术与几何关系的研究。线性代数已经完全「代数化」或者说「公理化」,而以微积分为代表的非线性的算术几何的研究是否也可以「代数化」,我们只能期待未来的发展。
[1]这个世界上和我这个理念不谋而合的有许多,有兴趣的朋友可参见 https://www.openlearning.com/courses/algebraic-calculus-one/?cl=1
或者在油管上 insights to mathematics 账号下的视频。国内b站有无转载尚且不知。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现