绪论
计算理论的主要研究目的就是计算机的基本能力和局限性,即计算机能够计算什么问题,不能计算什么问题。
主要包含自动机、可计算性和复杂性三部分
-
复杂性理论的核心在于什么使得某些问题很难计算、另一些问题容易计算。该问题目前尚无叫好的答案,但可以根据计算难度进行分类,并给出某些问题难以计算的证据。
对于难以计算的问题,可以计算近似但不完美的解、选择在大多情况下表现良好的算法、或是选择其他计算类型(加速算法)
-
可计算性理论围绕问题是否可以被计算机解决展开;在复杂性理论中,问题被分类为难计算和不难计算,而在可计算性理论中,问题被分类为可解和不可解
-
自动机理论阐述了一些基本数学模型的定义和性质,主要包括有穷自动机和上下文无关自动机。有穷自动机用于文本处理、编译以及硬件设计中;而上下文无关自动机则用于程序设计语言与AI中。
数学基础
理解计算理论,需要掌握一些基本数学概念。包括集合、序列、函数与关系、图、字符串和语言、布尔逻辑以及定义、定理和证明。
集合
集合(set)可以包含任何类型的对象,例如数字、字符或者其他集合,其中的对象称为元素(element)。常用{}
来表示,例如
A
=
{
7
,
3
,
5
}
A = \{7, 3, 5\}
A={7,3,5}
就是一个集合。集合是无序的,其中的元素通常不重复。集合可以是有穷的,也可以是无穷的。
使用
∈
\in
∈来表示元素存在于集合中,例如
7
∈
A
7\in A
7∈A。若某个集合中的任何元素都在另一个集合内,称前者为后者的子集(subset),例如
B
=
{
7
,
3
}
B
⊂
A
B = \{7, 3\}\\ B \sub A
B={7,3}B⊂A
当集合中的元素满足某种特定规则的时候,通常采用
{
w
∣
w
的规则
}
\{w|w的规则\}
{w∣w的规则}的表示方法,例如
{
n
∣
n
为
3
的倍数
(
或
n
%
3
=
=
0
)
}
\{n|n为3的倍数(或n\%3==0)\}
{n∣n为3的倍数(或n%3==0)}
集合常用的操作包括 ∩ , ∪ , A ‾ \cap, \cup, \overline{A} ∩,∪,A,分别代表交(union)、并(intersection)、补(complement)。
集合的叉积(cross product)又称笛卡尔积(Cartesian product),记
A
×
B
A\times B
A×B,可以理解为包含A和B中所有元素有序对的集合,例如
A
=
{
1
,
2
,
3
}
B
=
{
a
,
b
}
A
×
B
=
{
(
1
,
a
)
,
(
2
,
a
)
,
(
3
,
a
)
(
1
,
b
)
,
(
2
,
b
)
,
(
3
,
b
)
}
A = \{1, 2, 3\}\\ B = \{a, b\}\\ A\times B = \left\{\begin{array}{} (1,a),(2,a),(3,a)\\ (1,b),(2,b),(3,b) \end{array} \right\}
A={1,2,3}B={a,b}A×B={(1,a),(2,a),(3,a)(1,b),(2,b),(3,b)}
如果对集合自身求笛卡尔积,则可以简写为
A
k
A^k
Ak的形式。
序列
序列(sequence)是由有序元素组成的列表,序列中元素的重复与否和顺序都很重要。
和集合一样,序列也可以是有穷或无穷的,如果序列是有穷的,则称元组(tuple)。包含k个元素的元组称为k元组,2元组又称有序对(ordered pair)。
函数与关系
函数(function)又称为映射(mapping),是用于建立输入-输出关系的对象。函数所有可能输入组成的集合称为定义域(domain),所有可能输出组成的集合称为值域(range)。
包含k个自变量的函数称为k元函数(k-ary function),其输入为k元组 ( a 1 , a 2 , … , a k ) (a_1, a_2,\dots,a_k) (a1,a2,…,ak),定义域为 A 1 × A 2 × ⋯ × A k A_1\times A_2\times \dots \times A_k A1×A2×⋯×Ak。
值域为 { T r u e , F a l s e } \{True, False\} {True,False}的函数称为谓词(predicate)或者性质(property),若谓词的定义域为 A k A^k Ak,即k元组中的每个元素的定义域都为 A A A,则称该谓词为关系(relation)或k元关系(k-ary relation)。通常使用的关系是二元关系(binary relation)。
【重点】二元关系中存在一种特殊的关系,称为等价关系(equivalence relation),满足以下三个条件:
- 自反性:对每个 x x x,满足 x R x xRx xRx
- 对称性:对每个 x , y x, y x,y,若存在 x R y xRy xRy,则有 y R x yRx yRx
- 传递性:对每个 x , y , z x, y, z x,y,z,若存在 x R y , y R z xRy, yRz xRy,yRz,则有 x R z xRz xRz
决定这三个条件是否成立的因素是范围,可以理解为,只要对关系的定义添加足够的约束,就可以实现特定的等价关系、或使得某个或多个条件不成立。
单个条件不成立的情况举例:
- 不传递:向量平行,对0向量是不能传递的。
- 不对称: x ≤ y x \le y x≤y,不能得出 y ≤ x y\le x y≤x。
- 不自反:定义关系A和B是两个独立的人,在该关系定义下,不满足自反性。
图
图(graph)可以分为无向图(undirected graph)和有向图(directed graph)。由顶点(vertex)的集合和连接某些点的线段/箭头组成。
顶点的度(degree)是以该顶点为端点的边的数目,在有向图中,根据箭头的方向,顶点的度又分为入度(indegree)和出度(outdegree)。
图的路径(path)是以边连接的顶点序列,如果路径中没有重复顶点,称该路径为简单路径(simple path)。任何顶点相互连通的无向图称为连通图(connected graph);在有向图中,如果从每个顶点到任何其他顶点,都存在一条有向路径,则称强连通图(strongly connected graph)。
字符串与语言
定义字母表(alphabet)为任意非空有穷集合,字母表内的元素为该表的符号(symbol)。通常使用
Σ
\Sigma
Σ或
Γ
\Gamma
Γ表示。
Σ
1
=
{
0
,
1
}
Σ
2
=
{
a
,
b
,
c
}
Γ
=
{
0
,
1
,
x
,
y
,
x
}
\Sigma_1 = \{0, 1\}\\ \Sigma_2 = \{a, b, c\}\\ \Gamma = \{0, 1, x, y, x\}
Σ1={0,1}Σ2={a,b,c}Γ={0,1,x,y,x}
任意字母表中符号的有穷序列称为字母表上的字符串(string over the alphabet),例如,01001就是字母表
Σ
1
\Sigma_1
Σ1上的串,abaca就是字母表
Σ
2
\Sigma_2
Σ2上的串。长度为0的串称为空串(empty string),记
ε
\varepsilon
ε。语言(language)为字符串的集合,通常会带有某些条件,例如
{
w
∣
w
由
0
结尾
}
\{w|w由0结尾\}
{w∣w由0结尾}。
字符串的顺序(string order)通常采用字典序(lexicographic order)+ 短串在前的策略,例如 Σ 1 \Sigma_1 Σ1上的字符串的顺序为( ε \varepsilon ε, 0, 1, 00, 01, 11, …)
布尔
布尔逻辑(Boolean logic)是建立在True, False上的代数系统。包含NOT, AND, OR, XOR等运算,这些运算的真值表如下
NOT
0
1
¬
1
0
\begin{array}{c|cc} &0&1\\ \hline \neg&1&0\\ \end{array}
¬0110
AND
0
1
0
0
0
1
0
1
\begin{array}{c|cc} &0&1\\ \hline 0&0&0\\ 1&0&1\\ \end{array}
01000101
OR
0
1
0
0
1
1
1
1
\begin{array}{c|cc} &0&1\\ \hline 0&0&1\\ 1&1&1\\ \end{array}
01001111
XOR
0
1
0
0
1
1
1
0
\begin{array}{c|cc} &0&1\\ \hline 0&0&1\\ 1&1&0\\ \end{array}
01001110
此外,还有等值(equality)和蕴涵(implication)两种运算,分别用
↔
与
→
\leftrightarrow 与\to
↔与→表示
↔
\leftrightarrow
↔
0
1
0
1
0
1
0
1
\begin{array}{c|cc} &0&1\\ \hline 0&1&0\\ 1&0&1\\ \end{array}
01010101
→
\to
→
0
→
0
=
1
0
→
1
=
1
1
→
0
=
0
1
→
1
=
1
0\to0=1\\ 0\to1=1\\ 1\to0=0\\ 1\to1=1
0→0=10→1=11→0=01→1=1
使用AND和OR可以表示其他所有运算
P
∪
Q
=
¬
(
¬
P
∩
¬
Q
)
P
→
Q
=
¬
P
∪
Q
P
↔
Q
=
(
P
→
Q
)
∩
(
Q
→
P
)
P
⊕
Q
=
¬
(
P
↔
Q
)
P \cup Q = \neg (\neg P \cap \neg Q)\\ P \to Q = \neg P \cup Q\\ P \leftrightarrow Q = (P\to Q) \cap(Q\to P)\\ P \oplus Q = \neg (P\leftrightarrow Q)
P∪Q=¬(¬P∩¬Q)P→Q=¬P∪QP↔Q=(P→Q)∩(Q→P)P⊕Q=¬(P↔Q)
定义、定理和证明
定义(difinition)描述了使用的对象和概念。当定义对象时,务必确定什么构成该对象,什么不构成该对象。在定义对象和概念后,通常需要给出对应的数学命题(mathematical statement)。
证明(proof)是一种逻辑论证,目的是使人相信一个命题为真。论证必须是周密且无疑的。
定理(theorem)是证明为真的数学命题。如果某个命题的证明是为了帮助证明另一个命题,则称前者为引理(lemma),后者为推论(corollary)。
证明的基本策略包含两步:首先,看清并理解命题中的每个符号,尝试拆分命题(有些命题可能隐含多个部分,例如充要条件的证明,纪要证明充分性,也要证明必要性);然后,尽可能证明每个部分为真,例如寻找一些符合真个性质的对象,或者找到一个不符合该性质的对象。
常见的证明类型包括构造性证明、反证以及归纳。
构造性证明
构造性证明的目的是证明存在满足某种条件的对象,即说明如何构造这种对象,下面用例子来说明。
首先定义k正则图(k-regular graph):如果一个图中的每个顶点度都为k,则称这个图为k正则图。
给出待证:对每个大于2的偶数n, ∃ \exists ∃有n个顶点的3正则图。
证明:
-
理解命题,n为大于2的偶数,即n的取值为{4, 6, 8…};3正则图意味着每个顶点的度为3.
-
易知对任意n > 3顶点的图,将所有顶点按圆周顺序相连,可以得到2正则图;可得边集
E 1 = { { i , i + 1 } ∣ 0 ≤ i ≤ n − 2 } ∪ { { n − 1 , 0 } } E_1 = \{\{i, i+1\}|0\le i\le n-2\} \cup \{\{n-1, 0\}\} E1={{i,i+1}∣0≤i≤n−2}∪{{n−1,0}} -
若将n > 2的偶数个顶点在圆周上均匀排布,对任意顶点,都可以找到过圆心的对称顶点;可得第三条边的边集
E 2 = { { i , i + n / 2 } ∣ 0 ≤ i ≤ n / 2 − 1 } E_2 = \{\{i, i+n/2\}| 0\le i \le n/2 - 1\} E2={{i,i+n/2}∣0≤i≤n/2−1} -
令 E = E 1 ∪ E 2 E = E_1 \cup E_2 E=E1∪E2,得证。
反证法
反证法首先会假设待证定理为假,然后在该假设下,寻找一个明显错误的结论,来拒绝该假设,从而证明定理为真。举例说明。
定义:若一个数可以表示为分式m/n,则该数称为有理数;否则为无理数。
待证:2的平方根为无理数。
证明:
-
假设 2 \sqrt 2 2为有理数,则根据有理数定义,有
2 = m n \sqrt 2 = \frac m n 2=nm
该分式应该为最简形式。 -
整理该式,可知 m 2 m^2 m2为偶数。
m 2 = 2 n 2 m^2 = 2n^2 m2=2n2 -
证明引理:奇数的平方总是奇数。
∀ n = 2 k + 1 , { k = 0 , 1 , … } n 2 = 4 k 2 + 2 k + 1 ∵ 4 k 2 % 2 = 0 , 2 k % 2 = 0 ∴ n 2 % 2 = 1 \forall n = 2k+1, \{k=0, 1, \dots\}\\ n^2 = 4k^2 + 2k + 1\\ \because 4k^2\ \%\ 2 = 0,\ 2k\ \% 2 = 0\\ \therefore n^2\ \% \ 2 = 1 ∀n=2k+1,{k=0,1,…}n2=4k2+2k+1∵4k2 % 2=0, 2k %2=0∴n2 % 2=1 -
根据引理,m一定是偶数,可以表示为 2 k 2k 2k,故有
4 k 2 = 2 n 2 n 2 = 2 k 2 4k^2 = 2n^2\\ n^2 = 2k^2 4k2=2n2n2=2k2 -
可见 n 2 n^2 n2也应该是偶数,即n为偶数
-
若m, n都为偶数,则m/n可以继续化简,显然假设不成立,拒绝原假设, 2 \sqrt 2 2为无理数。
归纳法
归纳法用于证明无穷集合的所有元素具有特定性质。归纳证明包含两部分:归纳基础(basis)和归纳步骤(induction step),即
- 归纳基础:证明 P ( 1 ) \mathcal{P}(1) P(1)成立
- 归纳步骤:对 ∀ i ≥ 1 \forall i \ge 1 ∀i≥1,假设 P ( i ) \mathcal{P}(i) P(i)为真,通过该假设证明 P ( i + 1 ) \mathcal P (i + 1) P(i+1)为真
例子:在房产贷款中,会使用月付计算公式来计算每个月的固定偿还金额;设 P P P为本金, I > 0 I > 0 I>0为年利率, Y Y Y为月付数,由于存在利息,贷款的余额每月会发生变化,为方便计算,使用 I I I计算月倍增系数 M M M, M = 1 + I / 12 M = 1 + I/12 M=1+I/12。
每月的还款分为两部分:1. 贷款的余额会按 M M M每月复利, P t M P_tM PtM;2. 贷款月会随着清偿而定额减少, − Y -Y −Y。
设
P
t
P_t
Pt为t个月后未清偿的贷款余额,
P
0
=
P
P_0 = P
P0=P,试证
∀
t
≥
0
\forall t \ge 0
∀t≥0,
P
t
=
P
M
t
−
Y
(
M
t
−
1
M
−
1
)
P_t = PM^t - Y\left(\frac {M^t - 1}{M-1}\right)
Pt=PMt−Y(M−1Mt−1)
证明:
-
令 t = 0 t = 0 t=0, M 0 = 1 M^0 = 1 M0=1,带入得 P t ( t = 0 ) = P − 0 = P P_t(t = 0) = P - 0 = P Pt(t=0)=P−0=P,基础成立。
-
设当 t = k t = k t=k时,上式成立;根据 P k P_k Pk与 P k + 1 P_{k + 1} Pk+1得关系,有
P k + 1 = P k M − Y P_{k + 1} = P_kM - Y Pk+1=PkM−Y -
展开,得证
P k + 1 = P k M − Y = P M k + 1 − M Y ( M k − 1 M − 1 ) − Y = P M k + 1 − Y ( M k + 1 − M M − 1 + M − 1 M − 1 ) = P M k + 1 − Y ( M k + 1 − 1 M − 1 ) P_{k + 1} = P_kM - Y\\ = PM^{k + 1} - MY\left(\frac {M^k - 1}{M-1}\right) - Y\\ = PM^{k + 1} - Y\left(\frac {M^{k+1} - M}{M-1} + \frac {M-1} {M-1}\right)\\ = PM^{k + 1} - Y\left(\frac {M^{k+1} - 1}{M-1}\right) Pk+1=PkM−Y=PMk+1−MY(M−1Mk−1)−Y=PMk+1−Y(M−1Mk+1−M+M−1M−1)=PMk+1−Y(M−1Mk+1−1)