Schrder-Bernstein定理

news/2025/2/22 2:40:50/文章来源:https://www.cnblogs.com/qixingzhi/p/18723207

Schröder-Bernstein's Theorem

对任意集合\(A,B\),若\(f: A \to B\)\(g: B \to A\)都是单射,那么存在\(A\to B\)的双射。

Context

\(f: A \to B, g: B \to A\)是单射。假设\(A,B\)都是有限集,那么该结论是显然的,\(f,g\)本身就是这个双射。否则,说明\(|B|>|A|\)而由\(g\)是单射得到\(|A|\geq |B|\),矛盾。

对于无穷集,这个结论并不显然。例如,我们可以构造\([0,1]\to [0,1)\)的单射\(f(x)=x/2\),也可以构造\([0,1)\to [0,1]\)的单射\(g(x)=x\),但\(f,g\)都不是双射。而根据Schröder-Bernstein's Theorem,应当存在一个\([0,1]\to [0,1)\)的双射。事实上,能够和自己的真子集建立双射是无穷集合的一个特征。

Proof

因为\(g\)是单射,因此\(g(B)\subseteq A\)。我们取出\(A\setminus g(B)\),记为\(C_0\),那么\(f(C_0)\subseteq B\),记\(D_0=f(C_0)\)。我们观察到,从集合\(C_0\)通过\(f\)映射到集合\(D_0\),那么这个映射既是单射又是满射,所以\(C_0\)\(D_0\)之间存在双射。

于是,我们可以抛开\(C_0,D_0\),只需证明\(A_1=A\setminus C_0\)\(B_1=B\setminus D_0\)存在双射(因为如果在两个无交的定义域上有双射,合并起来也是双射)。仿照刚才的方法,令\(C_1=A_1\setminus g(B_1)\)\(D_1=f(C_1)\),可以得到\(C_1\)\(D_1\)之间存在双射。

以上步骤可以无限进行下去。也就是说,我们可以定义\(A_{n+1} = A \setminus \bigcup_{i=0}^{n} C_i\)\(B_{n+1}=B \setminus \bigcup_{i=0}^{n}D_i\),然后得到\(C_{n+1}=A_{n+1}\setminus g(B_{n+1})\)\(D_{n+1}=f(C_{n+1})\)之间存在双射。关键在于,我们可以定义无穷集合序列的并集。根据上面的讨论,对于任何取定的自然数\(n\),我们都可以直接由\(f\)给出\(\bigcup_{i=0}^{n} C_i\to \bigcup_{i=0}^{n}D_i\)的双射,所以\(f\)可以给出\(\bigcup_{i=0}^{\infty} C_i\to \bigcup_{i=0}^{\infty}D_i\)的双射。

于是接下来,我们只需要找到\(A\setminus \bigcup_{i=0}^{\infty} C_i\to B\setminus\bigcup_{i=0}^{\infty}D_i\)的双射。我们发现,这部分的映射恰好可以由\(g\)给出:下面我们证明\(g\)能给出从\(B \setminus \bigcup_{i=0}^{\infty} D_i\)\(A \setminus \bigcup_{i=0}^{\infty} C_i\) 的双射。这也就证明了\(g\)\(A\setminus \bigcup_{i=0}^{\infty} C_i\to B\setminus\bigcup_{i=0}^{\infty}D_i\)的双射。

方便起见,记\(B^\ast=B \setminus \bigcup_{i=0}^{\infty} D_i\)\(A^\ast=A \setminus \bigcup_{i=0}^{\infty} C_i\)。为了证明\(g\)能给出\(B^\ast\to A^\ast\)的双射,只需证明:

(1) \(\forall b \in B^\ast, \exists a \in A^\ast, g(b) = a\)

(2) \(\forall a \in A^\ast, \exists b \in B^\ast, g(b) = a\)

对于(1),我们已知\(\forall b\in B^\ast,\exists c \in A, g(b) = c\)。那么只需证明\(\forall n\in \N,c \notin C_n\)。假设 \(c \in C_n\),分类讨论:若\(n = 0\),那么\(c\in C_0=A\setminus g(B)\),因此\(c\not\in g(B)\),与\(g(b)=c\)矛盾;若\(n = m + 1\),那么\(c \in C_{m+1}\),其中\(C_{m+1}=A_{m+1}\setminus g(B_{m+1})\),因此\(c\not\in g(B_{m+1})\),也即\(g(b)\not\in g(B_{m+1})\),也即\(b\not\in B_{m+1}\),也即\(b\in \bigcup_{i=0}^{m}D_i\)。而\(b\in B^\ast\),矛盾。综上,\(c \in A^\ast\)。因此取\(a=c\)即可。

对于(2),我们有\(\forall a\in A^\ast,\exists d \in B, g(b) = a\)。否则,\(a\not\in g(B)\),也即\(a\in A\setminus g(B)=C_0\),与\(a\in A^\ast\)矛盾。那么只需证明\(d\in B^\ast\),也即\(\forall n\in \N,d \notin D_n\)。假设 \(d \in D_n\),也即\(d\not\in B\setminus \bigcup_{i=0}^{n}D_n=B_{n+1}\),因此\(a=g(d)\not\in g(B_{n+1})\),而\(a\in A^\ast\),因此\(a\in A_{n+1}\),所以\(a \in A_{n+1}\setminus g(B_{n+1})\),也即\(a \in C_{n+1}\)。这与\(a \in A^\ast\)矛盾。综上,\(d \in B^\ast\)。因此取\(b=d\)即可。

综上所述,我们只需令

\(h(a) := \begin{cases} f(a), & \text{if} \, a \in \bigcup_{i=0}^{\infty} C_i \\ g^{-1}(a), & \text{if} \, a \in A \setminus \bigcup_{i=0}^{\infty} C_i \end{cases}\)

\(h\)就给出了\(A\)\(B\)的一个双射。

Observation

所以,Schröder-Bernstein定理的证明思路其实很直观。我们每次从右侧用\(g\)映射一个像集到左侧,抠除像集得到的圆环用\(f\)映射到右侧(也是一个圆环)恰好得到一个双射。那么只需不断重复以上步骤,不断剥去圆环,证明双射。最后我们根据定义再证明余下部分可以由\(g\)形成双射即可。该过程可以用下图清晰地表示:

image-20250218225936949

以上Schröder-Bernstein定理的证明本身就是构造性的。我们可以由此给出一个\([0,1]\to [0,1)\)的双射。其中\(f(x)=x/2,g(x)=x\)\(C_0=[0,1]\setminus [0,1)=\{1\}\)\(D_0=f(C_0)=\{1/2\}\)\(A_1=[0,1),B_1=[0,1)\setminus\{1/2\}\)\(C_1=\{1/2\}\)\(D_1=\{1/4\}\)\(A_2=[0,1)\setminus \{1/2\}\)\(B_2=[0,1)\setminus\{1/4,1/2\}\)\(C_2=\{1/4\},D_2=\{1/8\}\),……以此类推,\(A^\ast = B^\ast = [0,1)\setminus\{1/2,1/4,\cdots,1/2^k,\cdots\}\),所以\(h\)可以构造如下:

\(h(x) := \begin{cases} x/2, & \text{if} \, \exists k\in\N,x=1/2^k \\ x, & \text{if} \, \forall k\in\N,x \neq 1/2^k \end{cases}\)

这是\([0,1]\to [0,1)\)的双射。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/886409.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArrayBlockingQueue的take()底层原理

一、ArrayBlockingQueue 的 take() 方法的底层源码的详细介绍 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队列。它的 take() 方法是用于从队列中移除并返回队首元素的核心方法之一。当队列为空时,take() 方法会阻塞当前线程,…

【CodeForces训练记录】Educational Codeforces Round 174 (Rated for Div. 2)

训练情况赛后反思 被英语读题背刺了,原来 C 题里面的 an element 不是 exacly one element 的意思,是 at least one element,读错题被一直硬控,这题没做出来的死因是高中组合数学。 A题 我们手玩样例可以发现 101 的情况必定不合法,abcd,第一个1说明abc相等,第三个1说明…

关于ENSP中 防火墙USG6000V 配置了双机热备后重启发现接口的VRRP状态变成Initialize状态的故障分析

一、故障现象:开启一个大型的配置正常的ENSP拓扑时,发现两台防火墙(主备)的接口vrrp状态都一直是Initialize状态,无法切换到master或者backup状态,或者部分接口正常。(测试发现,该故障在高配置的电脑上不是必然发生) 具体故障截图如下(vrrp状态会一直卡着初始状态,不…

关于ENSP中USG6000V重启后VRRP状态变成Initialize

一、故障现象:开启一个大型的配置正常的ENSP拓扑时,发现两台防火墙(主备)的接口vrrp状态都一直是Initialize状态,无法切换到master或者backup状态,或者部分接口正常。(测试发现,该故障在高配置的电脑上不是必然发生) 具体故障截图如下(vrrp状态会一直卡着初始状态,不…

Transformer——CNN和RNN的颠覆者?【论文精读随笔】

transformer是一种基于自注意力机制的深度神经网络模型,通过并行处理和长距离依赖捕捉,显著提升序列建模效率。其多头注意力设计增强特征提取能力,位置编码保留序列顺序信息。在机器翻译、NLP等领域表现卓越,并广泛扩展至视觉、语音等多模态任务。一、技术背景 RNN的困境与…

ArrayBlockingQueue的put方法底层原理

一、ArrayBlockingQueue的put方法底层原理 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队列。它的 put 方法是用于向队列中插入元素的核心方法之一。当队列满时,put 方法会阻塞当前线程,直到队列有空闲空间 1、put 方法的功能…

初始工程的排错

如图的错误如何排掉呢:看如下步骤截图 step1: 在idea的初始界面的右上角点击齿轮图标,然后点击"Project Structure",然后看到如下图:两个下拉框都选择jdk17,然后点击“ok” step2: 然后点击“settings”,找到“Build, Execution, Deployment”,然后点击“Bu…

黑马点评3:基于Redis实现共享session登录

在之前基础上,登录流程的变化:保存用户信息数据类型:最终:修改代码: 1. 发送验证码:src/main/java/com/hmdp/service/impl/UserServiceImpl.java@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {@Resource…

这份DeepSeek免费资源清单请收好(手慢无)

你是不是也遇到过这样的困境👇 👉 和Deepseek对话遇到“服务器繁忙,请稍候再试” 👉 动不动Deepseek App无响应,一堆Prompt白写 👉 想用第三方Deepseek却被告知"额度已用尽" 今天偷偷告诉你:大厂早就接入了DeepSeek满血版,免费羊毛速来!(建议先收藏再阅…

西电校园网通过PPPoE方式单线多拨

西电校园网通过PPPoE单线多拨的方式实现带宽的叠加,实现总带宽的有效利用。前言 西电的收费校园网现阶段(2025.2)执行的设备管控策略如下:一个账号可同时在线 6 台设备。 限速仅针对单设备,最高速率为 200M。针对这种设备数限制宽松的管控策略,一个非常自然的想法就是可以…

PyTorch入门--手写数字识别项目

概述 本文整理自BiliBli的《孔工码字》, 这是一个很好的视频号。讲的非常好,整理在这里,自己学习 他的Gitee地址:https://gitee.com/kongfanhe 本文通过手写数字识别项目来学习如何搭建训练神经网络。 PyTorch框架 在这个项目里,我们使用PyTorch框架,它是由Facebook开发的…

vscode+continue+ollama+deepseek-r1 实现AI代码自动补全

准备 下载: vscode: https://code.visualstudio.com/download continue( vscode 插件): https://marketplace.visualstudio.com/items?itemName=Continue.continue ollama: https://ollama.com/download deepseekR1: https://ollama.com/library/deepseek-r1 (通过 ollama…