MathLabs

数学基础

映射与基数

映射 f:A→Bf:A\to B 称为单射,是指它绝不会把两个不同元素送到同一处;称为满射,是指 BB 的每个元素都被取到;两者都成立则称双射。双射使我们能够比较无限集合的大小:∣N∣=∣Z∣=∣Q∣=ℵ0|\mathbb{N}| = |\mathbb{Z}| = |\mathbb{Q}| = \aleph_0,因为这三者都与 N\mathbb{N} 存在显式双射。康托尔定理 ∣A∣<∣P(A)∣|A| < |\mathcal{P}(A)|,通过使用 D={x∈A:x∉f(x)}D = \{x \in A : x \notin f(x)\} 的对角线论证证明,说明幂集总是严格更大,因此存在无穷无尽的无穷层级;康托尔-伯恩斯坦-施罗德定理说明 ∣A∣≤∣B∣|A|\le|B| và ∣B∣≤∣A∣  ⟹  ∣A∣=∣B∣|B|\le|A| \implies |A|=|B|,使得只需两个容易构造的单向单射,而非一个困难的双射,就能比较基数。这些思想是哈希碰撞、数据压缩的极限以及某些问题不可计算性的基础。

直观把两堆物品配对,看哪一堆更大

映射 f:A→Bf : A \to B 给 AA 的每个元素恰好指定 BB 中的一个元素。可把它想象成从 AA 到 BB 的箭头:单射指没有两支箭头落在 BB 的同一点上,满射指 BB 的每一点都被某支箭头击中,双射指两者同时成立——完美的一一对应。当 AA、BB 都是无限集合时,存在双射正是说它们大小相同、具有相同基数的方式,即便逐个计数不可能。

三次函数 y=x^3 的交互式图像,展示其在实数集上是双射
严格递增的三次函数 y=x3y = x^3 是双射 R→R\mathbb{R}\to\mathbb{R}:每条水平线都恰好与图像相交一次。

大学单射、满射、双射:形式化定义

定义: 单射、满射、双射

映射 f:A→Bf : A \to B 称为单射,是指 AA 中不同元素总映到 BB 中不同元素。称为满射,是指 BB 中每个元素都是 AA 中某元素的像。两者都成立则称双射,此时存在良定义的逆映射 f−1:B→Af^{-1} : B \to A。

∀x1,x2∈A, f(x1)=f(x2)  ⟹  x1=x2\forall x_1, x_2 \in A,\ f(x_1) = f(x_2) \implies x_1 = x_2

这是单射性的形式化判据:只要两个输入给出相同输出,它们本来就必须是同一个输入。满射性则从另一个方向判定,要求每个目标都是可以到达的。

∀y∈B, ∃x∈A, f(x)=y\forall y \in B,\ \exists x \in A,\ f(x) = y
f:R→Rf:\mathbb{R}\to\mathbb{R} 的三种性质对比
性质例子单射?满射?
双射f(x)=x3f(x)=x^3是是
仅单射f(x)=exf(x)=e^x是否
仅满射f(x)=x3−xf(x)=x^3-x否是
两者都不是f(x)=x2f(x)=x^2否否

大学两条关键定理及完整证明

对任意集合 AA,∣A∣<∣P(A)∣|A| < |\mathcal{P}(A)|:不存在从 AA 到其幂集 P(A)\mathcal{P}(A) 的满射,因此幂集严格更大。

为什么成立?

这说明不存在"最大的无穷"——无论集合多大,只要取其幂集就总能得到一个严格更大的集合。正是这条定理使得无穷的层级不可避免地无限延伸,其对角线论证的证明技巧,正是用来证明某些问题不可计算的论证方法的直接源头。

证明

为导出矛盾,假设存在满射 f:A→P(A)f : A \to \mathcal{P}(A);下面推出矛盾,从而说明这样的满射不可能存在。

定义"对角线"集合 D={x∈A:x∉f(x)}D = \{x \in A : x \notin f(x)\}:它收集了 AA 中所有不属于自身在 ff 下的像的元素。由于 DD 是 AA 的子集,它是 P(A)\mathcal{P}(A) 的一个元素。

由于假设 ff 是满射,必存在 a0∈Aa_0 \in A 使得 f(a0)=Df(a_0) = D。现在提出关键问题:a0∈Da_0 \in D 吗?

若 a0∈Da_0 \in D,则由 DD 的定义,a0∉f(a0)a_0 \notin f(a_0);但 f(a0)=Df(a_0) = D,这就说明 a0∉Da_0 \notin D——矛盾。若 a0∉Da_0 \notin D,则由 DD 的定义(恰好排除满足 a0∈f(a0)a_0 \in f(a_0) 的元素),这迫使 a0∈f(a0)=Da_0 \in f(a_0) = D——同样矛盾。

无论哪种情况都得到矛盾,故满射 f:A→P(A)f : A \to \mathcal{P}(A) 不可能存在。结合从 AA 到 P(A)\mathcal{P}(A) 的单射 x↦{x}x \mapsto \{x\},即得 ∣A∣<∣P(A)∣|A| < |\mathcal{P}(A)|。

若 ∣A∣≤∣B∣|A|\le|B| và ∣B∣≤∣A∣  ⟹  ∣A∣=∣B∣|B|\le|A| \implies |A|=|B|,即存在单射 A→BA \to B 与单射 B→AB \to A,则 AA 与 BB 之间存在双射。

为什么成立?

仅通过单射来比较基数(每个集合都能嵌入另一个之中),就已经像有限集合那样迫使两个集合大小完全相同。这使得我们可以通过构造两个容易的单向嵌入,而不是一个困难的直接双射,来证明 ∣A∣=∣B∣|A|=|B|——下面的例子正是用这种方法说明区间 [0,1][0,1] 与 (0,1)(0,1) 具有相同的基数。

证明

设 f:A→Bf : A \to B 与 g:B→Ag : B \to A 为给定的两个单射。基本思路是对每个元素追踪其"祖先链"——通过交替撤销 ff 与 gg 得到,再依据每条链"从哪里开始",分块构造最终的双射。

对 a∈Aa \in A,定义其反向链 a,g−1(a),f−1(g−1(a)),…a, g^{-1}(a), f^{-1}(g^{-1}(a)), \ldots,只要所需的逆映射有定义就继续,对 b∈Bb \in B 同理定义。每个元素的链要么无限地往回延伸,要么停在 AA 中某个没有 gg-原像的元素处,要么停在 BB 中某个没有 ff-原像的元素处。这把 AA 划分成三部分:AAA_A(链停在 AA)、ABA_B(链停在 BB)、A∞A_\infty(链永不停止),同样把 BB 划分成 BA,BB,B∞B_A, B_B, B_\infty。

在停于 AA 或永不停止的链上,ff 本身就已给出该部分 AA 到 BB 对应部分的双射(因为这些元素是通过单射到达的,且 BB 一侧不会先"用完")。在停于 BB 的链上,是 gg 给出了该部分 BB 回到对应部分 AA 的双射,因此其逆 g−1g^{-1} 给出了该部分 AA 到该部分 BB 的双射。

定义 h:A→Bh : A \to B:当 a∈AA∪A∞a \in A_A \cup A_\infty 时 h(a)=f(a)h(a) = f(a),当 a∈ABa \in A_B 时 h(a)=g−1(a)h(a) = g^{-1}(a)。由于三部分两两不相交,且各自双射到 BB 中对应部分(ff 映到 BA∪B∞B_A \cup B_\infty,g−1g^{-1} 映到 BBB_B),合并后的映射 hh 就是从整个 AA 到整个 BB 的双射,证明了 ∣A∣=∣B∣|A|=|B|。

大学实际应用与典型例题

基数不仅仅是抽象的记账工具。哈希函数把一个巨大的定义域(所有可能的文件、所有可能的密码)映射到一个小得多的值域(一个32位或64位整数);由于定义域严格大于值域,康托尔式的鸽笼原理保证无论哈希函数多么精巧,碰撞都必然存在。无损数据压缩恰恰是从较长比特串到较短比特串的单射;由于短字符串严格少于长字符串,没有任何压缩器能缩小每一个可能的输入——某些输入必然变大或保持不变。不可计算性结果(例如停机问题的不可判定性)使用了与康托尔定理相同的对角线论证:存在不可数多个可能的函数 N→{0,1}\mathbb{N}\to\{0,1\},但计算机程序只有可数多个,因此几乎每个函数都无法被任何程序计算。

例题: N\mathbb{N} 与 Z\mathbb{Z} 之间的具体双射

设 f:Z→Nf : \mathbb{Z} \to \mathbb{N},当 n≥0n \ge 0 时 f(n)=2nf(n) = 2n,当 n<0n < 0 时 f(n)=−2n−1f(n) = -2n-1。证明 ff 是双射,并由此得出 ∣Z∣=ℵ0|\mathbb{Z}| = \aleph_0。求 f(−5)f(-5)。

解答

该 ff 把非负整数送到自然数中的偶数,把负整数送到自然数中的奇数,向外锯齿状排列:f(0)=0f(0)=0、f(−1)=1f(-1)=1、f(1)=2f(1)=2、f(−2)=3f(-2)=3、f(2)=4,…f(2)=4, \ldots

单射性:偶数输出只来自 n≥0n\ge 0(此时 f(n)=2nf(n)=2n 唯一确定 nn),奇数输出只来自 n<0n<0(此时 f(n)=−2n−1f(n)=-2n-1 唯一确定 nn),且每种情形下 ff 都严格单调,故不会有两个不同整数共享同一输出。

满射性:每个偶自然数 2k2k(k≥0k\ge 0)都是 f(k)f(k),每个奇自然数 2k+12k+1(k≥0k\ge 0)都是 f(−(k+1))f(-(k+1)),故每个自然数都能取到。

由于 ff 是双射 Z→N\mathbb{Z} \to \mathbb{N},Z\mathbb{Z} 与 N\mathbb{N} 具有相同基数 ℵ0\aleph_0,即便 Z\mathbb{Z} 看起来大一倍,仍确认 ∣Z∣=ℵ0|\mathbb{Z}| = \aleph_0。

最后求 f(−5)f(-5):因为 −5<0-5 < 0,使用 f(n)=−2n−1f(n) = -2n - 1,所以 f(−5)=−2×(−5)−1=10−1=9f(-5) = -2 \times (-5) - 1 = 10 - 1 = 9。

例题: 哈希碰撞的鸽笼原理

某哈希函数把任意文件映射为一个 3232 位编码,因此恰好有 2322^{32} 种可能编码。某公司存储了 55 十亿个不同文件(5,000,000,0005{,}000{,}000{,}000)。请用基数/鸽笼原理解释为什么必定至少有两个文件共享同一哈希码,并估算最少不可避免的"碰撞对"数量。

解答

该哈希函数的值域恰好有 232=4,294,967,2962^{32} = 4{,}294{,}967{,}296 个元素——记这个集合为 BB。被哈希的文件构成的定义域 AA 有 5,000,000,0005{,}000{,}000{,}000 个元素,由于 5,000,000,000>4,294,967,2965{,}000{,}000{,}000 > 4{,}294{,}967{,}296,故 ∣A∣>∣B∣|A| > |B|。

由(有限版)鸽笼原理——即"不存在从较大有限集合到较小集合的单射"的有限版本——把哈希函数看作映射 A→BA \to B,它不可能是单射:若是单射则给出 ∣A∣≤∣B∣|A| \le |B|,与 ∣A∣>∣B∣|A| > |B| 矛盾。因此至少有两个不同的文件必须被赋予相同的哈希码。

估算最少不可避免的碰撞数:把 5,000,000,0005{,}000{,}000{,}000 个文件尽可能均匀地分配到 4,294,967,2964{,}294{,}967{,}296 个桶中,至少会有 ⌈5,000,000,000/4,294,967,296⌉=2\lceil 5{,}000{,}000{,}000 / 4{,}294{,}967{,}296 \rceil = 2 个文件落入某个桶,被迫重复的"多余"文件数至少为 5,000,000,000−4,294,967,296=705,032,7045{,}000{,}000{,}000 - 4{,}294{,}967{,}296 = 705{,}032{,}704。

所以至少约有 705705 百万个文件被迫落入已被其他文件占用的桶中——这是 ∣A∣>∣B∣|A| > |B| 直接且不可避免的后果,无论哈希函数设计得多么精巧都无法避免。

要使 AA 中不同元素总映到 BB 中不同元素,f:A→Bf:A\to B 需要具有什么性质?

若 ∣A∣=5|A|=5,由康托尔定理 ∣P(A)∣|\mathcal{P}(A)| 是多少?

一个16位哈希函数有 2162^{16} 种可能输出。若系统对 100,000100{,}000 个不同文件进行哈希,鸽笼/基数论证保证了什么?

康托尔-伯恩斯坦-施罗德定理的前提条件要求什么?

参考文献

  1. Paul R. Halmos (1960). Naive Set Theory
  2. Karel Hrbacek, Thomas Jech (1999). Introduction to Set Theory