4.1 函数、复合与逆函数
第 3 章训练了两种习惯:逐字阅读定义,并证明定义要求的每个条件。现在我们把这种习惯用在一种已经不陌生的结构上:输入进入一个过程,过程产生输出。
计算器按键、把用户名转换成账户编号的程序、给每位学生指定毕业年份的规则,都具有函数的直观形态。不过,“函数”有严格含义。我们会从第 1 章学过的集合和有序对出发,一步一步建立这个定义。
设 A 和 B 是集合。回忆笛卡尔积
A×B={(a,b)∣a∈A 且 b∈B}, 它包含所有第一项来自 A、第二项来自 B 的有序对。
从 A 到 B 的一个,就是 A×B 的任意子集。从 A 到 B 的一个,则是一种满足下面两条规则的特殊关系:
1. A 的每个元素都必须在某个有序对中担任第一项;
2. A 的每个元素必须且只能与 B 中的一个元素配对。
我们写成
读作“f 是从 A 到 B 的函数”。集合 A 称为,集合 B 称为。若有序对 (a,b) 属于这个函数,通常写成
真正作为输出出现过的值组成:
range(f)={f(a)∣a∈A}. 值域一定是陪域的子集,但不一定等于陪域。
一个有限集合上的例子
令
A={1,2,3},B={p,q,r,s}, 并定义
f={(1,q),(2,q),(3,s)}. A 中每个元素都有且只有一个输出,所以 f 是函数。定义域是 A,陪域是 B,而值域为
range(f)={q,s}. 虽然 p 和 r 没有被取到,它们仍然属于陪域 B,只是没有进入值域。
再比较两个不合格的关系:
R1={(1,p),(2,q)} 不是从 A 到 B 的函数,因为输入 3 没有输出;而
R2={(1,p),(1,q),(2,r),(3,s)} 也不是函数,因为输入 1 有两个输出。多个输入可以共享一个输出,但单个输入不能分裂成多个输出。
确认一个映射确实是函数后,还可以检查它怎样使用陪域中的元素。
函数 f:A→B 称为,如果不同输入一定得到不同输出:
∀x1,x2∈A,f(x1)=f(x2)⇒x1=x2. 它的逆否形式更容易从箭头图中观察:
x1=x2⇒f(x1)=f(x2). 在单射的箭头图中,不会有两个定义域元素把箭头指向同一个陪域元素。
函数称为,如果陪域中的每个元素都被取到:
∀y∈B,∃x∈A 使得 f(x)=y. 等价地,
range(f)=B. 函数如果既是单射又是满射,就称为。这时陪域中的每个元素恰好收到一支箭头。
对于有限函数,可以依次做下面的审计:
| 检查问题 | 如果答案为“是” |
|---|
| 每个定义域元素是否恰好有一支出发箭头? | 它是函数 |
| 不同定义域元素是否不会共享输出? | 它是单射 |
| 每个陪域元素是否都收到箭头? | 它是满射 |
| 前两项性质检查是否同时成立? | 它是双射 |
要特别注意:单射和满射都依赖题目指定的定义域与陪域。规则 f(x)=x2 作为 Z→Z 的函数不是单射,因为 f(2)=f(−2)。若把定义域限制为非负整数,这个碰撞才会消失。
在映射传送带上为数据包改接输出。你可以留下断开的输入、制造分叉,也可以让多个输入碰撞。实时检测器会把“是否为函数”与单射、满射、双射分开判断,让每次改动影响了哪条定义清楚可见。
设
f:A→B且g:B→C. 因为 f 的输出属于 B,所以它可以继续作为 g 的输入。两个函数的是函数
g∘f:A→C, 定义为
(g∘f)(x)=g(f(x)). 最右边的函数先执行。这不是排版习惯,而是数据流的顺序:输入必须先经过 f,其结果才能交给 g。
让一个值通过流水线
令
f(x)=2x+1,g(y)=y2. 当 x=3 时,
3f7g49, 所以
(g∘f)(3)=g(f(3))=g(7)=49. 把过程写成公式:
(g∘f)(x)=g(2x+1)=(2x+1)2. 交换两台机器会得到另一个函数:
(f∘g)(x)=f(x2)=2x2+1. 例如,
(g∘f)(1)=9,(f∘g)(1)=3. 因此,函数复合通常:
g∘f=f∘g. 如果 g 的输出集合根本不能作为 f 的输入集合,交换顺序甚至没有定义。
集合 A 上的把每个元素原样返回:
idA:A→A,idA(x)=x. 它像一台什么都不改变的机器。对任意 f:A→B,都有
f∘idA=f且idB∘f=f. 会撤销原函数的作用。如果 f:A→B 存在逆函数,就记作
f−1:B→A, 并且必须同时满足
f−1∘f=idA和f∘f−1=idB. 也就是说,对每个 x∈A 和 y∈B,
f−1(f(x))=x,f(f−1(y))=y. 符号 f−1(x) 倒数 1/f(x)。这里的上标 −1 表示“撤销这个映射”。
为什么恰好是双射才可逆
如果 f 不是单射,两个输入会碰撞到同一个输出。逆向机器收到这个输出时,无法判断应该还原成哪个输入。
如果 f 不是满射,陪域里就存在从未被生成的 y。以整个 B 为定义域的逆函数无法为这个 y 找到原输入。
双射没有这两个问题:每个 y∈B 都恰好对应一个 x∈A。因此
f 存在逆函数⟺f 是双射. 例如,定义 f:R→R:
f(x)=3x−2. 为了求逆函数,先令 y=3x−2,再解出 x:
x=3y+2. 最后把临时使用的输入字母 y 换成 x,得到
f−1(x)=3x+2. 检查两个复合方向:
f−1(f(x))=3(3x−2)+2=x, 以及
f(f−1(x))=3(3x+2)−2=x. 把代币送入两台动态机器,交换机器顺序,再尝试逆向返回。实验会显示每个中间值,并故意制造输入碰撞或无法到达的输出,让你亲自诊断逆函数为什么会失效。
复合前,要检查第一台函数的输出能否进入第二台函数的定义域。声称逆函数存在前,要相对于题目指定的集合同时检查单射和满射。
函数是带有“每个输入恰好一个输出”限制的关系。下一节将去掉这个限制,研究一般的二元关系。我们不再只问箭头是否构成函数,而会检查自环、成对箭头和多步路径等结构。