集合论中的映射:从单射、满射到双射的完整解析

集合论中的映射:从单射、满射到双射的完整解析 1. 为什么几乎所有数学分支都在用“映射”这个词在集合论乃至整个现代数学里映射map也称函数、变换、算子是最基本也最容易被忽略的概念之一。很多初学者会觉得映射不就是“函数的另一个名字”吗但在集合论的语境下映射不是某个具体函数的代号而是一种描述两个集合之间对应关系的结构。换句话说你只要想表达“把集合A里的每个元素按照某种规则对应到集合B里的某个元素”你就是在用映射。我第一次认真重新审视映射这个概念是当年学集合论时被一道题逼的给定两个集合A和B问A到B的映射一共有多少个当时觉得这不是很简单吗如果是有限集|A| m|B| n那映射数量就是n^m。但真正深挖下去才发现光是“映射”这三个字背后藏着单射、满射、双射、像、原像、限制、扩充、复合、逆映射这一整串相互关联的概念。而这些概念往后会渗透到拓扑、代数、分析、几何的每个角落。所以这篇总结我不打算写得像教材那样一条条罗列定义而是想用更贴近实际理解的方式把映射这条线从头捋一遍。你会看到映射为什么需要明确集合与规则单射满射双射到底在描述什么复合映射和逆映射为什么需要条件以及有限集和无限集在映射视角下会展现出怎样不同的“脾气”。如果你是刚学集合论这篇可以作为课本之外的补充梳理如果你已经在用映射做研究或写代码那些与像、原像、限制相关的坑或许也能帮你省点时间。2. 先搞清楚一个映射到底由哪三样东西决定很多人在初学阶段容易把映射直接等同于“解析式”。比如提到函数就想到 f(x) x²然后默认定义域是实数集、值域是大于等于零的实数。这种习惯在高中数学里问题不大但到了集合论层面会产生一个很隐蔽的误解——映射并不天然携带定义域和陪域定义域、陪域和对应规则这三者是共同决定一个映射的。2.1 定义域、陪域和对应规则缺一不可设X、Y是两个集合。一个从X到Y的映射 f 通常写作f: X → Yx ↦ f(x)这里的X叫定义域domainY叫陪域codomainf 本身是“给每个X中元素指派Y中元素”的规则。三者合在一起才构成一个完整的映射。如果你只知道对应规则而不知道定义域和陪域那么这个映射其实是没有被严格确定的。有个例子可以帮助理解考虑规则“把一个数映射到它的平方”。如果定义域是全体实数、陪域是全体实数那么这是一个映射如果定义域是自然数、陪域仍然是全体实数这也是一个映射如果定义域是全体实数、陪域是非负实数这同样是一个映射。这三个映射的“计算公式”完全一样但按集合论的标准它们是不同的映射因为陪域不同。这一点在刻画满射时尤其关键后面我会专门展开。2.2 一个元素只能映到一个元素映射最基本的要求是“单值性”对于定义域里的任意一个元素x都必须存在且只存在一个Y中的元素y与之对应。这里有两个需要注意的地方。第一是“存在性”。定义域里不能有元素被漏掉每个x都得有一条箭头出去。如果一个规则只在部分元素上有定义那它严格来说不叫X到Y的映射而是部分映射partial map。在计算机科学里部分函数这个概念很常见比如除法在除数为0时没有定义。但在纯粹集合论的映射框架里我们通常要求全域定义。第二是“唯一性”。同一个x不能对应两个不同的y。一个x不能同时映到a又映到b哪怕规则本身很复杂、有分支讨论最终落到每个具体x身上时结果也必须唯一。比如定义 f(x) 1若x有理数且 f(x) 0若x无理数这依然是一个映射因为每个实数都有唯一结果。但如果规则说“x对应它的一个平方根”那就不是一个从R到R的映射了因为正数有两个平方根结果不唯一。提示判断一个规则是不是映射先看定义域里的每个元素是否都有唯一确定的像。这是所有后续性质讨论的前提也是最容易出错的一步。2.3 像集与值域别把陪域和像集混为一谈映射 f: X → Y 在某个元素 x 上的输出记为 f(x)它有个专门名称叫“x在f下的像”image。所有像的集合f(X) { f(x) | x ∈ X }叫作 f 的像集image set。过去中学里常说的“值域”在集合论语境下一般对应的是这个像集而不是陪域Y。举个例子f: R → Rf(x) x² 1。它的陪域是R但像集是 [1, ∞)。这两个概念一旦混淆后面理解满射就会出现严重偏差。我还见过一个不太显眼的坑有些教材把f(x)本身也叫“值”把整个集合 { f(x) } 也叫“值域”术语不统一容易让初学者晕头转向。我的建议是看到“值域”两个字时先确认作者指的是像集还是陪域。在严格集合论讨论中我更倾向于直接用“像集”和“陪域”这两个词避免歧义。3. 单射、满射、双射到底在刻画什么性质映射的许多性质都可以归结为三类基础箭头单射injection、满射surjection、双射bijection。这三个概念不只是在数学分析中判断函数是否可逆时有用它们更准确的叫法是描述集合之间“结构关系”的工具。3.1 单射不同元素不能落到同一处设 f: X → Y。如果对于任意 x₁, x₂ ∈ X只要 x₁ ≠ x₂就有 f(x₁) ≠ f(x₂)那么称 f 是单射。也就是说不同的输入必须产生不同的输出。这个条件也可以从另一个角度看如果 f(x₁) f(x₂)那必然有 x₁ x₂。这两种表述是等价的实际证明时哪个方便用哪个。比如 f: N → Nf(n) n 1这是单射因为不同的自然数加1后仍然不同。但如果 f(n) n²那就不是单射了因为1和-1如果定义域是整数会映射到同一个值1。3.2 满射陪域里的每个元素都要被“射到”设 f: X → Y。如果对于Y中的任意一个元素y都存在某个x ∈ X使得 f(x) y那么称 f 是满射。换句话说像集等于陪域f(X) Y。这里马上能看出陪域设定的重要性。同样是 f(x) x²若 f: R → [0, ∞)它是满射若 f: R → R它不是满射因为像集不含负数若 f: N → N它既不是满射像集不含2也不是单射吗这里如果定义域是N而不是Z其实 f(n) n² 在N上是单射因为自然数没有正负对称性问题。这个例子可以充分说明是否满射不仅取决于对应规则还取决于你选的陪域是谁。在解题时如果有人只给你“f(x)x²”而不告诉你陪域你是无法判断它是否满射的。3.3 双射既是单射又是满射集合之间的一一对应双射就是同时满足单射和满射的映射。它是集合论里非常重要的概念因为双射意味着两个集合之间存在“一一对应”关系。这种关系让我们可以在不数数的情况下比较两个集合的大小也正是用它来定义有限集的基数和无限集的基数。一个经典例子f: R → Rf(x) 2x 1。它是单射若2x₁1 2x₂1则x₁ x₂也是满射任给y取x(y-1)/2即可。所以它是双射。可以说双射就是建立两个集合之间完美配对的桥梁。3.4 映射数量与单射满射数量的组合视角回到开头那个问题如果|X| m|Y| n都是有限集从X到Y的映射总数是n^m。怎么理解对X中的每个元素都有n种选择而选择之间互不影响所以总数是 n × n × … × n共m个 n^m。如果要求单射就必须|X| ≤ |Y|即m ≤ n。第一个元素有n种选择第二个元素不能与之相同所以有n-1种选择以此类推总数为 n(n-1)(n-2)…(n-m1)也就是排列数。如果要求满射则必须m ≥ n。满射计数稍微复杂一些因为要对X中元素进行分组然后每组对应Y中一个元素这涉及第二类斯特林数。如果要求双射则必须m n这时双射数量就是m!。这张表可以帮你快速理清| 映射类型 | 条件 | 数量|X|m, |Y|n有限 | | --- | --- | --- | | 一般映射 | 无 | n^m | | 单射 | m ≤ n | n! / (n-m)! | | 满射 | m ≥ n | n! · S(m, n) | | 双射 | m n | n! |这里S(m, n)表示第二类斯特林数即把m个不同元素分成n个非空子集的方法数。提示有限集背景下单射、满射、双射三个条件形成一个有趣的不等式链条。若mn则单射等价于满射等价于双射若mn则不可能有满射若mn则不可能有单射。这是很多组合计数题目的判断基础。4. 复合映射与逆映射为什么它们都有严格前提两个映射一旦满足定义域与陪域的匹配条件就可以复合一个映射只有满足双射条件才能求逆。这两件事的“前提条件”往往是初学者最容易忽略的地方。4.1 复合映射的方向与定义设有两个映射g: X → Yf: Y → Z那么可以定义复合映射 f ∘ g: X → Z规则为(f ∘ g)(x) f(g(x))注意这里符号的书写习惯先作用g再作用f但在表达式中f写在前面。很多人第一次看到 f ∘ g 容易读反以为先算f。我的记忆方式是复合符号右侧的映射先执行。数学中这种“从右往左”的运算顺序其实和函数嵌套 f(g(x)) 完全一致。复合成立的唯一要求是g的值域必须包含在f的定义域内。上面的定义中g把X中元素送到Yf定义在整个Y上显然可以复合。如果g的值域只落在Y的某个子集里而f只定义在这个子集上严格来说f还不是定义在Y上的映射需要先把f限制到该子集上或者确认f在整个Y上都有定义。4.2 复合映射的结合律为什么可以放心去掉括号复合映射满足结合律h ∘ (g ∘ f) (h ∘ g) ∘ f这只需要按定义展开验证两个方向最终都等于 h(g(f(x)))。因为函数作用结果的唯一性等式自然成立。结合律非常重要它使得我们可以放心地写 h ∘ g ∘ f不必加括号。在群论、范畴论中正是这种结合律支撑了一系列结构定义。4.3 逆映射存在的充要条件必须双射如果 f: X → Y 是双射那么存在唯一的逆映射 f⁻¹: Y → X满足f⁻¹ ∘ f id_Xf ∘ f⁻¹ id_Y其中 id_X 是X上的恒等映射即把每个元素映到自身的映射。为什么双射是充分必要条件如果f不是单射那么两个不同元素有同一个像逆映射无法决定这个像应该还原到哪一个元素逆规则不唯一。如果f不是满射那么陪域里至少有一个元素没有原像逆映射在这个元素上没有定义。只有双射才能保证Y中每个元素恰好有一个原像逆映射的规则才能被唯一确定。这其实也解释了为什么线性代数里只有方阵才可能可逆对应双射不是方阵的矩阵在维数不匹配时连单射或满射都无法同时满足自然谈不上可逆。4.4 复合映射的逆顺序要反过来一个经典结论如果f和g都可逆那么(g ∘ f)⁻¹ f⁻¹ ∘ g⁻¹注意顺序。我们可以直接验证(f⁻¹ ∘ g⁻¹) ∘ (g ∘ f) f⁻¹ ∘ (g⁻¹ ∘ g) ∘ f f⁻¹ ∘ id_Y ∘ f f⁻¹ ∘ f id_X换顺序之所以会出错是因为映射复合不是交换的。g ∘ f 的意思是先f后g反过来求逆自然要先反g再反f。这很像穿袜子穿鞋的顺序穿的时候先穿袜子再穿鞋脱的时候要先脱鞋再脱袜子。注意两个可逆映射的复合一定可逆其逆正是倒序复合后的结果。如果你在编码或推导时遇到了复合函数的反函数这个“翻顺序”的规则能帮你节省一半验证时间。5. 像与原像之间的运算规律比你想象中更“不对称”映射并不是简单的“把元素送过去”就完了。当我们将视角从单个元素提升到子集层面时像image和原像preimage就会展现出一些非常重要的运算规律。这些规律在证明集合等式时非常常用但也存在一些容易记反的现象。5.1 像与原像的定义设 f: X → YA ⊆ XB ⊆ Y。A在f下的像f(A) { f(x) | x ∈ A }B在f下的原像f⁻¹(B) { x ∈ X | f(x) ∈ B }注意f⁻¹(B)不要求f可逆。这里使用的是“原像”记号即便f没有逆映射只要B是Y的子集它的原像也始终有定义。这个记号容易让人以为f⁻¹表示逆映射实际上它不是。要分清上下文如果B是集合f⁻¹(B)是原像如果y是元素f⁻¹(y)有时也用来表示单点集 {y} 的原像而真正的逆映射 f⁻¹ 只能作用于Y中的元素且要求f是双射。5.2 像对并集、交集的保持情况像对并集是保持的f(A₁ ∪ A₂) f(A₁) ∪ f(A₂)这一点很好理解一个元素在并集中的像必然来自A₁或A₂之一所以等式两边完全一致。但像对交集可能出现包含关系而非相等f(A₁ ∩ A₂) ⊆ f(A₁) ∩ f(A₂)为什么会这样因为交集中的元素经过f后确实同时属于两个像集所以左⊆右没问题。但反过来并不总是成立可能有一个元素a₁ ∈ A₁也有一个元素a₂ ∈ A₂它们满足 f(a₁) f(a₂) y但a₁和a₂并不都在交集里所以 y ∈ f(A₁) ∩ f(A₂)却不一定存在某个x ∈ A₁ ∩ A₂ 使得 f(x) y。换句话说右边有多余的“来自不同源头的像”左边没有。只有在f是单射时上述包含关系才会变成等式。5.3 原像对并集、交集的保持情况原像相对“温顺”得多它对并集和交集都保持f⁻¹(B₁ ∪ B₂) f⁻¹(B₁) ∪ f⁻¹(B₂)f⁻¹(B₁ ∩ B₂) f⁻¹(B₁) ∩ f⁻¹(B₂)甚至对补集也有f⁻¹(Y \ B) X \ f⁻¹(B)这说明原像运算与集合的布尔运算具有良好的交换性。在研究连续映射或代数结构同态时往往是原像的性质更容易控制所以许多拓扑命题会把条件重点放在原像上。提示当你需要证明某个集合等式时如果等式的一边是f(...)另一边是f(...) ∩ f(...)或者反过来大概率要找原因为单射/满射条件的缺失。一个非常高效的策略是分别证明左⊆右和右⊆左并注意哪一步需要额外条件。5.4 一个反例交集像不保持举一个最朴素的反例。设 f: R → Rf(x) x²。取 A₁ { -1 }A₂ { 1 }。那么A₁ ∩ A₂ ∅f(A₁ ∩ A₂) ∅但f(A₁) { 1 }f(A₂) { 1 }f(A₁) ∩ f(A₂) { 1 }显然 ∅ ≠ { 1 }。这里f不是单射所以交集像就“撑大了”。这提醒我们涉及像与集合运算的等式不能想当然默认交换次序。6. 映射的限制、扩充与自然投影实操中高频出现的三种变形除了基本的单射满射双射之外映射还有一些“变形”操作。乍看起来只是修改定义域、陪域或做点商集操作但在实际问题中它们出现频率非常高。这里单独拎出来说是希望大家能提前建立“这些不是新概念而是映射的派生操作”的意识。6.1 限制映射把定义域缩小设 f: X → YA ⊆ X。把f的定义域限制到A上得到新的映射f|A: A → Yf|A(x) f(x)当 x ∈ A限制映射的对应规则与原映射完全一致只是定义域变了。一个常见误区是认为限制映射会自动变成单射。显然不会如果f本身不是单射即使缩小定义域只要被缩小的区域里还残留着两个不同的元素映射到同一个像限制映射依然不是单射。不过在很多应用场景中我们正是通过选取合适的子集来“修复”单射性。比如 f(x) x² 在R上不是单射但限制到 [0, ∞) 上就是单射了。这也就是为什么反函数的定义经常要求“限制定义域”。6.2 扩充映射扩大定义域或陪域与限制相反扩充extension是把一个部分定义的规则延伸到一个更大的集合上。但这里有个微妙之处并不是任意部分映射都能被“自然”地扩充为全定义映射。如果一个规则在某些点上没有定义你可以自由地赋予这些点任意合理值只要不违反映射的单值性即可。这样得到的扩充不唯一。这在实际编程里有对应如果你在写一个函数处理数组但数组里可能存在缺失值一种做法是给缺失值一个默认值这本质上就是在做一种扩充。数学语境下扩充的不唯一性提醒我们当题目要求“把f扩充到某个集合上”时通常需要额外性质来约束选择比如要求扩充后仍然是连续的、线性的、或者保持某种结构的。6.3 自然投影从集合到商集的映射设X是一个集合~ 是X上的等价关系。商集 X/~ 是所有等价类组成的集合。自然投影或叫商映射π: X → X/~π(x) [x]其中 [x] 是x所在的等价类。π把每个元素送到它所属的等价类这是一个满射但不一定是单射除非每个等价类都只有一个元素。自然投影的直觉特别好理解想象一堆人按班级分组每个人都被送到自己班级这个“容器”里。不同的人可能落在同一个班级所以π不是单射但每个班级都至少对应一个人所以π是满射。在群论、环论、拓扑学中商结构都是通过自然投影建立起来的。理解自然投影是满射这一点能解释很多“商空间比原空间更小”的现象。6.4 用自然投影理解第一同构定理的雏形虽然我们这里主要谈集合论但我还是想提前埋一个伏笔。设 f: X → Y 是一个映射。在X上定义一个等价关系x₁ ~ x₂ ⇔ f(x₁) f(x₂)那么每个等价类就是X中那些“被f送到同一个像”的元素集合。我们可以建立一个新的映射f̄: X/~ → f(X)f̄([x]) f(x)这个映射是双射的。为什么因为等价类的定义保证了单值性而陪域取为f(X)保证了满射性。这个结构非常像是“把非单射的f改造为双射”的标准操作。以后你学群同态基本定理或线性映射的秩-零度定理时会看到几乎一模一样的思路。所以说早期在集合论里把这个等价类与映射的关系吃透后面就是顺水推舟的事。7. 映射视角下的基数比较为什么“一样多”可以这样定义集合论最核心的贡献之一就是用映射来精确定义“多少个”这个概念。对于有限集我们可以数数对于无限集“数数”不再适用我们只能依赖双射。7.1 等基数与优势基数如果存在双射 f: A → B则称A与B等基数记作 |A| |B|。这表示两个集合的“数量”相同。如果存在单射 f: A → B则称B的基数不小于A记作 |A| ≤ |B|。这表示A可以被“嵌入”B中就像每个A元素在B中都能找到不同的对应位置。如果存在满射 f: A → B且承认选择公理那么通常也有 |B| ≤ |A|。因为满射意味着B可以“装进”A的一部分里B比A“小”。这种基于映射的基数比较在有限集时与我们的直觉完全一致在无限集时则产生许多反直觉的结论。7.2 无限集的“一样多”N、Z、Q的可数性最经典的例子是自然数集N与整数集Z。直觉上Z比N“多”因为Z包含了负数。但我们可以构造一个双射f: N → Z0 ↦ 01 ↦ 12 ↦ -13 ↦ 24 ↦ -2...也就是说偶数位置对应非负整数奇数位置对应负整数。这样每个整数都恰好被一个自然数对应所以 |N| |Z|。有理数集Q也是可数的。最常见的证明思路是把正有理数排成一个二维网格然后用对角线走法把它们排列成一个序列。这个序列去掉重复项后就给出了Q到N的一个单射反过来N显然可以嵌入Q所以根据后面会提到的施罗德-伯恩斯坦定理|Q| |N|。7.3 R的不可数性对角线论证康托用对角线论证证明了实数集R不可数。这里我不打算完整重写证明只提示核心思路假设(0,1)区间内所有实数能被排列成一个序列那么构造一个新的实数它的第n位小数与序列第n个数在第n位不同。这个新实数不在序列的任何位置矛盾。这个论证的优美之处在于它展示了一种“用映射自我否定”的策略。后来在图灵机停机问题、哥德尔不完备定理中都可以看到类似的技巧。7.4 施罗德-伯恩斯坦定理两边夹逼的威力有一个非常实用的定理如果存在单射 f: A → B 且存在单射 g: B → A那么存在双射 h: A → B。这个定理告诉我们只要两个集合能相互嵌入对方它们就等基数。虽然定理的构造性证明比较绕但它的应用价值极大。很多时候直接构造一个双射很困难但构造两个单射要容易得多。比如证明 |Q| |N|我们可以先构造Q到N的某种编码单射同时N到Q的包含映射本身就是单射于是立刻得到等基数。提示处理基数比较时优先考虑单射的存在性而非满射。如果构造一个从A到B的单射那么|A| ≤ |B|。若再构造一个从B到A的单射那么|A| |B|。这条策略在集合论中几乎百试百灵。8. 映射在其他数学分支中的“变脸”以及学习中的常见误区这篇博文既然叫“集合论知识总结——映射”那就有必要将视角稍微外延一下看看映射进入不同领域后会以什么新姿态出现。同时我也想集中梳理几个初学者最容易踩的坑算是给这篇总结收个尾。8.1 代数中的同态保持结构的映射在群论中同态映射是一个保持运算的映射f(a · b) f(a) · f(b)把“映射”从单纯的集合对应提升为“结构对应”。一个同态如果还是双射就叫同构。同构的两个群本质上不可区分所有群论性质都相同。这里映射不仅是“搬运元素”还要求“搬运运算”结构在映射下被保留。8.2 拓扑中的连续映射原像开集在拓扑学中连续映射的核心定义是任意开集的原像仍是开集。注意这里关注的是原像而不是像。这跟我们前面提到的“原像运算有更好的集合运算性质”是一脉相承的。很多初学拓扑的人会好奇为什么不定义成“开集的像是开集”原因之一就是像集在并集和交集下的行为不如原像稳定。8.3 计算机科学中的函数式编程在函数式编程语言比如Haskell、Scala中映射的概念以一种非常纯粹的形式出现函数就是一等公民可以被传递、复合、返回。单射和满射的思想也被应用到集合操作和类型系统的设计中比如在类型论中函数类型 A - B 本质就是一个从A到B的映射集合的一部分。而“fmap”这样的高阶函数正是把“对集合中每个元素应用映射”这种操作抽象成了通用模式。8.4 常见误区清单混淆陪域与像集。这是最常见的问题。判断满射时一定要看陪域是否等于像集而不是凭直觉认为“定义出来就是满满的”。认为 f⁻¹ 一定表示逆映射。集合论里 f⁻¹(B) 表示B的原像即使f不可逆只要B是陪域的子集这个记号就是合法的。需要结合上下文判断它到底是逆映射还是原像。复合映射的顺序读错。f ∘ g 先执行g再执行f。这是形式记号的约定大量后续推导都依赖这个顺序。逆映射的前提记不住。只有双射才存在逆映射。半吊子的单射或半吊子的满射都不行。像的交集不一定等于交集的像。很多人在证明集合等式时默认这两个可以交换实际上是包含关系且只有在单射条件下才能升级为相等。无限集的“一样多”不能用有限集直觉。N、Z、Q都是可数无限集Funnily enough它们居然“一样多”但R比N“多”。映射与基数理论就是用来克服这种有限集直觉带来的偏差。8.5 学习路径建议如果你想把映射这一章真正学扎实我建议按下面几步走彻底掌握定义能用自己的话解释“映射由定义域、陪域、对应规则三部分组成”并能写出完整的映射定义。多举反例每学一个性质都尝试构造一个不满足该性质的具体例子。例如给出一个非单射非满射的映射、一个单射但不满射的映射、一个满射但不单射的映射以及一个双射映射。练习集合运算像与原像的并、交、补运算等式分别用包含关系或等式证明一遍并构造反例说明某个包含关系不能变成等式。过渡到基数理论理解等基数、优势基数、可数、不可数这些概念后尝试独立写出N与Z的双射构造。为后续抽象结构做准备当你学习同态、连续映射等概念时回头再想想它们如何建立在“映射”这个基础之上会更容易形成体系。我当年学映射时最大的收获就是意识到它不是一个孤立的章节而是整个现代数学的“语法”。函数、变换、算子、同态、连续映射、可测映射……这些五花八门的名字背后本质上都是同一个“从集合到集合的对应结构”。把这个基础概念吃透了后续无论学代数、拓扑还是分析都等于有了一张可信赖的地图。最后补充一个个人经验别把映射的练习题当成计算题来刷更多的精力应该放在“构造”和“证明”上。今天你多花一小时把单射满射双射的关系在有限集、无限集里各折腾一遍明天在学任何其他数学分支时都会发现这里的积累没有白费。