好的,我们来聊聊怎么把一个正方形(单位正方形)映射到一个线段(单位区间)上,并且保证这个映射是“一对一且覆盖全部”的,也就是双射。这听起来有点匪夷所思,因为一个二维的区域怎么可能和一个一维的线段一一对应呢?但数学就是这么奇妙,我们可以做到。
要构造这样一个双射,我们首先要明白什么是双射。简单来说,它有两层意思:
1. 单射(Injectivity):不同的输入一定对应不同的输出。也就是说,在正方形里你选的两个不同的点,映射到线段上后,它们一定是不同的点。没有“挤压”或者“合并”的情况。
2. 满射(Surjectivity):线段上的每一个点,都能在正方形里找到一个对应的点。也就是说,你想在 [0,1] 线段上找到哪个数,总能在单位正方形里找到一个点,映射过去就是你想要的那个数。
之所以一开始觉得不可能,是因为我们直观上觉得二维空间“比”一维空间大很多。但我们这里构造的双射,并不是那种简单的、连续的几何映射(比如把正方形压扁),而是需要一种更巧妙、更“拆解”和“重组”的方式来处理数字本身。
核心思想是利用数字的十进制(或其他进制)展开。
我们考虑单位正方形 [0,1] [0,1],其中的点可以用一对实数 (x, y) 来表示,其中 $0 le x le 1$ 且 $0 le y le 1$。
同时,我们考虑单位区间 [0,1],其中的点可以用一个实数 z 来表示,其中 $0 le z le 1$。
现在,我们来看看如何将 (x, y) 变成 z。关键在于如何把两个数的信息“编码”到一个数里去。
构造过程:
我们采用一个非常经典的方法,叫做 Cantor pairing function 的变种,或者更准确地说,是利用了小数点后数字的交错插入。
1. 实数的十进制展开:
任何一个 [0,1] 之间的实数都可以写成十进制小数的形式:
$z = 0.d_1 d_2 d_3 d_4 dots = sum_{i=1}^{infty} d_i 10^{i}$
其中 $d_i in {0, 1, 2, dots, 9}$。
这里有个小细节需要注意:有些数有唯一的十进制展开(比如 $0.5$),而有些数有两个展开(比如 $0.5 = 0.4999dots$)。为了保证双射的唯一性,我们通常会采用“不使用无限个9”的约定。例如,我们固定 $0.5$ 就写成 $0.5000dots$,而不写成 $0.4999dots$。
类似地,我们可以将单位正方形中的点 $(x, y)$ 表示为:
$x = 0.x_1 x_2 x_3 x_4 dots$
$y = 0.y_1 y_2 y_3 y_4 dots$
其中 $x_i, y_i in {0, 1, 2, dots, 9}$,并且同样遵循不使用无限个9的约定。
2. 交错插入(编码):
现在,我们将 $x$ 的小数点后的数字和 $y$ 的小数点后的数字交错地排列起来,构造一个新的实数 $z$。
$z = 0.x_1 y_1 x_2 y_2 x_3 y_3 dots$
具体来说,如果 $x = 0.x_1 x_2 x_3 dots$ 并且 $y = 0.y_1 y_2 y_3 dots$,那么我们定义的映射 $f: [0,1] imes [0,1] o [0,1]$ 是:
$f(x, y) = z = 0.x_1 y_1 x_2 y_2 x_3 y_3 dots$
用数学公式表示就是:
$f(0.x_1 x_2 x_3 dots, 0.y_1 y_2 y_3 dots) = 0.x_1 y_1 x_2 y_2 x_3 y_3 dots$
例子:
假设我们有一个点 $(x, y) = (0.1234dots, 0.5678dots)$。
那么 $x_1=1, x_2=2, x_3=3, x_4=4, dots$
而 $y_1=5, y_2=6, y_3=7, y_4=8, dots$
映射过去就是 $z = 0.15263748dots$
再来看一个具体值。比如点 $(0.5, 0.75)$。
$x = 0.5 = 0.5000dots$
$y = 0.75 = 0.7500dots$
那么 $z = f(0.5, 0.75) = 0.5705000dots = 0.5705$。
再比如点 $(frac{1}{3}, frac{2}{3})$。
$x = frac{1}{3} = 0.3333dots$
$y = frac{2}{3} = 0.6666dots$
那么 $z = f(0.3333dots, 0.6666dots) = 0.36363636dots = 0.overline{36} = frac{36}{99} = frac{4}{11}$。
为什么这个映射是双射?
1. 满射性(Surjectivity) 线段上的每个点都能被映射到:
对于单位区间 [0,1] 中的任意一个实数 $z = 0.z_1 z_2 z_3 z_4 dots$,我们都可以把它拆分成两组数字:
一组是奇数位的数字:$x_1 = z_1, x_2 = z_3, x_3 = z_5, dots$
另一组是偶数位的数字:$y_1 = z_2, y_2 = z_4, y_3 = z_6, dots$
然后,我们可以根据这两组数字构造出两个实数:
$x = 0.x_1 x_2 x_3 dots = 0.z_1 z_3 z_5 dots$
$y = 0.y_1 y_2 y_3 dots = 0.z_2 z_4 z_6 dots$
根据我们的构造方法,将 $x$ 和 $y$ 的数字交错插入就正好能得到 $z$。这样,对于线段上的任何一个点 $z$,我们都能在单位正方形中找到一个点 $(x, y)$(由 $z$ 的数字拆分而来)映射到它。
2. 单射性(Injectivity) 不同的点一定映射到不同的点:
假设我们有两个不同的点 $(x, y)$ 和 $(x', y')$ 在单位正方形中,并且它们不相等。这意味着至少存在一个位置 $i$ 或 $j$ 使得 $x_i
e x'_i$ 或者 $y_j
e y'_j$。
让我们写出它们对应的 $z$ 值:
$z = f(x, y) = 0.x_1 y_1 x_2 y_2 dots$
$z' = f(x', y') = 0.x'_1 y'_1 x'_2 y'_2 dots$
因为 $(x, y)
e (x', y')$,所以存在某个索引 $k$ 使得 $x_k
e x'_k$ 或者存在某个索引 $l$ 使得 $y_l
e y'_l$。
如果 $x_k
e x'_k$ 且 $y_l$ 与 $y'_l$ 相同,那么在 $z$ 的展开中,第 $2k1$ 位(对应 $x_k$)会与 $z'$ 的第 $2k1$ 位不同。
如果 $y_l
e y'_l$ 且 $x_k$ 与 $x'_k$ 相同,那么在 $z$ 的展开中,第 $2l$ 位(对应 $y_l$)会与 $z'$ 的第 $2l$ 位不同。
如果同时 $x_k
e x'_k$ 且 $y_l
e y'_l$ 发生,那么在 $z$ 的展开中,第 $2k1$ 位 ($x_k$) 和第 $2l$ 位 ($y_l$) 都会与 $z'$ 的对应位不同(前提是 $2k1
e 2l$ )。
总之,由于 $x$ 和 $y$ 的小数点表示至少在一个位置上不同,那么通过交错插入的 $z$ 的十进制表示,至少在一个位置上(对应于 $x$ 的某个数字或 $y$ 的某个数字的位置)会与 $z'$ 不同。因此,$z
e z'$。
处理“无限个9”的问题:
这里需要稍微严谨一点。我们之前约定不使用无限个9。例如,我们不写 $0.4999dots$,而写 $0.5000dots$。
这个约定是如何保证单射的呢?
我们说一个实数 $x$ 的表示是“标准”的,如果它不是以无限个9结尾的。
我们对 $x = 0.x_1 x_2 dots$ 和 $y = 0.y_1 y_2 dots$ 使用标准表示法。
现在考虑 $z = 0.x_1 y_1 x_2 y_2 dots$。
如果 $z$ 的表示是 $0.z_1 z_2 z_3 z_4 dots$,那么我们通过反向操作得到 $(x, y)$ 的方式是:
$x = 0.z_1 z_3 z_5 dots$
$y = 0.z_2 z_4 z_6 dots$
如果 $z$ 恰好是一个以无限个9结尾的数,比如 $z = 0.123999dots = 0.124$。
我们不去将 $z$ 解释为 $0.123999dots$。
我们而是采用标准表示法,$z=0.124000dots$。
那么,我们将它拆分为:
$x = 0.1400dots = 0.14$
$y = 0.2000dots = 0.2$
映射回去 $f(0.14, 0.2) = 0.124000dots = 0.124$。
如果 $z$ 是由 $x$ 和 $y$ 的交错构成的,且 $x$ 或 $y$ 恰好是以无限个9结尾(我们为了避免这种情况,就直接不使用这种表示法),那么它就不会被构造出来。但问题是,我们是先有 $(x,y)$,再构造 $z$。
当 $x=0.5$ ($0.500dots$) 和 $y=0.5$ ($0.500dots$) 时,
$z = f(0.5, 0.5) = 0.55000dots = 0.55$。
关键在于,任何一个实数 $z in [0,1]$ 可以被唯一地表示成十进制形式,只要我们约定不使用以无限个9结尾的表示法。
我们的映射 $f$ 确实会产生一些以无限个9结尾的数,例如 $f(0.1, 0.2) = 0.12$。而像 $0.11999dots$ 这样的数在我们的构造里就不会被直接产生。
更严谨地说,我们可以这样定义:
对于 $x = 0.x_1 x_2 x_3 dots$ 和 $y = 0.y_1 y_2 y_3 dots$ 的标准表示(不含无限个9)。
我们定义 $f(x,y) = z = 0.x_1 y_1 x_2 y_2 dots$。
对于任意 $z in [0,1]$,取其标准表示 $z = 0.z_1 z_2 z_3 dots$。
然后定义 $x = 0.z_1 z_3 z_5 dots$ 和 $y = 0.z_2 z_4 z_6 dots$。
这个过程是 双射 的。为什么?
如果 $x$ 或 $y$ 的标准表示在某个位置是0,比如 $x_k=0$ 且 $y_l=0$,那么 $z$ 的对应位就是0,不会导致无限个9。
唯一的潜在麻烦是,如果一个数字的两个表示法会产生不同的结果,例如 $0.5 = 0.500dots = 0.499dots$。
如果我们选择 $x=0.5$ ($0.500dots$) 和 $y=0.5$ ($0.500dots$),那么 $z = 0.5500dots = 0.55$。
如果我们选择 $x=0.499dots$ 和 $y=0.500dots$,那么 $z = 0.4590dots$。
但我们约定的是使用标准表示。所以 $x=0.5$ ($0.500dots$) 和 $y=0.5$ ($0.500dots$) 是唯一的选择。
因此,由 $(0.5, 0.5)$ 映射得到的 $z=0.55$ 是唯一的。
反过来,任何一个 $z in [0,1]$,取其标准表示 $z=0.z_1 z_2 z_3 dots$。
定义 $x=0.z_1 z_3 z_5 dots$ 和 $y=0.z_2 z_4 z_6 dots$。
这两者 $x$ 和 $y$ 的表示也都是标准表示(除非 $z$ 的某个数字后面跟着无限个9,但我们取的是标准表示)。
例如,如果 $z = 0.123456dots$,那么 $x=0.135dots$,$y=0.246dots$。这两个表示法都是标准的。
这个构造方法,虽然在直观上难以想象,但它确实能实现从二维空间到一维空间的双射。这种构造在数学上非常重要,它展示了两种不同维度集合之间可以存在严格的一一对应关系,这在集合论和拓扑学中有深远的影响。
这种方法也曾被用来证明一个空间“大小”的问题。比如康托尔证明了自然数集合(可数无限)和实数集合(不可数无限)的大小不同。而这个构造则说明,单位正方形(具有不可数无限的实数对)和单位区间(具有不可数无限的实数)在“基数”上是相同的,它们都具有“连续统的基数”。
希望这个解释够详细,也尽量避免了生硬的AI痕迹。这更像是从数学直觉出发,一步步揭示数字表示的奥秘。