计算理论基础:2、丘奇-图灵论题
Def3.1Def\ 3.1Def3.1图灵机是一个7元组Q∑Γδq0qacceptqrejectQ∑Γδq0qacceptqrejectQ∑ΓQ∑Γ都是有穷集合,并且QQQ是状态集∑\sum∑是输入字母表,不包括特殊空白符号⊔\sqcup⊔Γ\GammaΓ是带子字母表,其中,⊔∈Γ⊳∈Γ∑⊆Γ⊔∈Γ⊳∈Γ∑⊆ΓδQ×Γ→Q×Γ×L。
什么是算法?算法就是图灵机
3.1 图灵机
图灵机用一个无限长的带子作为无限存储,它有一个读写头,能在带子上读、写和左右移动。图灵机开始运作时,带子上只有输入串,其他地方都是空的,如果需要保存信息,它可将这个信息写在带子上。为了读已经写下的信息,它可将读写头往回移动到这个信息所在的位置。机器不停地计算,直到产生输出为止。机器预置了接收和拒绝两种状态,如果进入这两种状态,就产生接收(accept)或拒绝(reject),如果不能进入任何接收或拒绝状态,就继续执行下去,永不停止。
3.1.1 图灵机的形式化定义
Def 3.1Def\ 3.1Def 3.1 图灵机
图灵机是一个7元组(Q,∑,Γ,δ,q0,qaccept,qreject)(Q,\sum,\Gamma,\delta,q_0,q_{accept},q_{reject})(Q,∑,Γ,δ,q0,qaccept,qreject),其中:Q,∑,ΓQ,\sum,\GammaQ,∑,Γ都是有穷集合,并且
- QQQ是状态集
- ∑\sum∑是输入字母表,不包括特殊空白符号⊔\sqcup⊔
- Γ\GammaΓ是带子字母表,其中,⊔∈Γ,⊳∈Γ,∑⊆Γ\sqcup\in\Gamma,\rhd\in\Gamma,\sum\subseteq\Gamma⊔∈Γ,⊳∈Γ,∑⊆Γ
- δ:Q×Γ→Q×Γ×{L,R}\delta:Q\times\Gamma\rightarrow Q\times \Gamma\times\{L,R\}δ:Q×Γ→Q×Γ×{L,R}是转移函数
- q0∈Qq_0\in Qq0∈Q是起始状态
- qaccept∈Qq_{accept}\in Qqaccept∈Q是接收状态
- qreject∈Qq_{reject}\in Qqreject∈Q是拒绝状态,且qreject≠qacceptq_{reject}\ne q_{accept}qreject=qaccept
例:输入一个二进制数n,低位在前,输出n+1
Input | Output |
---|---|
101⊔⊔101\sqcup\sqcup101⊔⊔ | 011⊔⊔011\sqcup\sqcup011⊔⊔ |
11⊔⊔11\sqcup\sqcup11⊔⊔ | 001⊔⊔001\sqcup\sqcup001⊔⊔ |
∑={0,1},Γ={0,1,⊔,⊳}\sum=\{0,1\},\Gamma=\{0,1,\sqcup,\rhd\}∑={0,1},Γ={0,1,⊔,⊳}
例1:判断回文串
,图灵机编程先写一下想法
- 读一个字符,并写为空格,0和1进入不同的路径
- 接着不停地往右走,直到读到空格,往左走一格
- 进行比较,如果不同,则进入qrejectq_{reject}qreject,如果相同,写为空格后回到qstartq_{start}qstart重复上述过程
- 接收状态有两种:
- 偶数,最终正好把所有字符写为空格后回到qstartq_{start}qstart,则在qstartq_{start}qstart读到空格则接收
- 奇数,最后一次读到一个字符并进入到对应状态,没有下一个有效的字符进行判断,则此时读到空格接收
例2:2的n次方
:图灵机判断L={02n∣n≥0}L=\{0^{2^n}|n\ge0\}L={02n∣n≥0}
每次擦除一半的0,直到只剩一个0则接受,如果为奇数个0则拒绝。(隔一个擦一个)
- 从左往右,隔一个0,擦除一个0(写x)
- 如果在跳过一个0后读到了空格,则说明是奇数,直接拒绝
- 接着回到最左边,重复上述操作,直到0全部被擦除。
∑={0},Γ={0,⊔,x}\sum=\{0\},\Gamma=\{0,\sqcup,x\}∑={0},Γ={0,⊔,x},空格在最左边,x用来表示被擦除的0
例3:判断字符串相等
,图灵机判断L={w#w:w∈{0,1}∗},∑={0,1,#}L=\{w\#w:w\in\{0,1\}^*\},\sum=\{0,1,\#\}L={w#w:w∈{0,1}∗},∑={0,1,#}
- 读取一个字符并改为x后,不断向右移动,直到遇到#\##。
- 跳过x后,进行比较,如果不同则拒绝;如果相同则写为x并回到最左端并重复。
- 最终在x后读到#则接收
练习:
-
二进制整数比较:L={x,y∣x,y∈{0,1}∗,x≥y}L=\{x,y|x,y\in\{0,1\}^*,x\ge y\}L={x,y∣x,y∈{0,1}∗,x≥y} 最高位在前
先比较长度,再回到最高位比较。
-
二进制+1,最高位在前(input:100 ,output:101)
特殊处理全1的情况就好
-
L={0n1n}L=\{0^n1^n\}L={0n1n}
如果第一位是空格则接收,然后就读0,找1,重复
Def 3.2Def\ 3.2Def 3.2 可判定
语言L⊆{0,1}∗L\subseteq \{0,1\}^*L⊆{0,1}∗,M是一个图灵机,L可被M在时间T(n)T(n)T(n)内判定,如果∀x∈{0,1}∗\forall x\in\{0,1\}^*∀x∈{0,1}∗:
-
M在T(n)T(n)T(n)步内停止
-
如果x∈Lx\in Lx∈L,那么MMM接收xxx
-
如果x≠Lx\ne Lx=L,那么MMM拒绝xxx(不允许出现死循环)
Def 3.3Def\ 3.3Def 3.3 图灵可判定
L⊆{0,1}∗L\subseteq\{0,1\}^*L⊆{0,1}∗,如果有一个图灵机可判定他,则称LLL是(图灵)可判定的
Def 3.4Def\ 3.4Def 3.4 可识别
M是一个图灵机,M可接收的字符串集被称为被M识别的语言,记为L(M)L(M)L(M),比判定弱,L之外的语言可不被接收,也可能死循环。
Def 3.5Def\ 3.5Def 3.5图灵可识别
L⊆{0,1}∗L\subseteq\{0,1\}^*L⊆{0,1}∗,称L为图灵可识别,如果存在一个图灵机识别他。
由定义可知,每一个可判定的语言都是可识别的,反过来则不一定,例如:
L={<M,x>,输入x,M会停机}L=\{<M,x>,输入x,M会停机\}L={<M,x>,输入x,M会停机},这是可识别的,因为L是可接收的,单如果x≠Lx\ne Lx=L,M可能会陷入死循环。
Def 3.6Def\ 3.6Def 3.6 时间复杂度`
映射f:{0,1}∗→{0,1}∗∪{undefined}f:\{0,1\}^*\rightarrow\{0,1\}^*\cup\{undefined\}f:{0,1}∗→{0,1}∗∪{undefined},如果∀x∈{0,1}∗,f(x)≠undefined\forall x\in\{0,1\}^*,f(x)\ne undefined∀x∈{0,1}∗,f(x)=undefined,M在T(∣x∣)T(|x|)T(∣x∣)步内停下,并输出f(x)f(x)f(x)
Everything should be made as simple as possbile,but no simplerEverything\ should\ be\ made\ as\ simple\ as\ possbile,but\ no\ simplerEverything should be made as simple as possbile,but no simpler
3.1.2 图灵机变体
Lema 3.7Lema\ 3.7Lema 3.7 图灵机等价
如果语言L⊆{0,1}∗L\subseteq\{0,1\}^*L⊆{0,1}∗可在时间T(n)T(n)T(n)内被图灵机(带子字母表为Γ\GammaΓ)判定,那么他可在
O(log∣Γ∣T(n))=OΓ(T(n)) O(log|\Gamma|T(n))=O_{\Gamma}(T(n)) O(log∣Γ∣T(n))=OΓ(T(n))
时间内被图灵机M′(Γ′={0,1,⊔,⊳})M'(\Gamma'=\{0,1,\sqcup,\rhd\})M′(Γ′={0,1,⊔,⊳})判定
ProofProofProof:
用k=⌈log2∣Γ∣⌉=O(log2∣Γ∣)k=\lceil log_2|\Gamma|\rceil=O(log_2|\Gamma|)k=⌈log2∣Γ∣⌉=O(log2∣Γ∣)bits编码Γ\GammaΓ的标识符,新的图灵机M′M'M′将
- 用kkk步读一个标识a∈Γa\in\Gammaa∈Γ
- 转移到下一步q′q'q′,得到一个新的标识bbb(用来改写aaa)
- 用bbb替换aaa
- 接着用kkk步实现左移右移或者保持
综上所述,这一步的模拟需要k+1+k+k=O(k)k+1+k+k=O(k)k+1+k+k=O(k)步,那么T(n)T(n)T(n)步需要O(log2∣Γ∣T(n))O(log_2|\Gamma|T(n))O(log2∣Γ∣T(n))步
Def 3.8Def\ 3.8Def 3.8 多带图灵机
一个kkk-带图灵机M是一个七元组(Q,∑,Γ,δ,q0,qaccept,qreject)(Q,\sum,\Gamma,\delta,q_0,q_{accept},q_{reject})(Q,∑,Γ,δ,q0,qaccept,qreject),其中δ:Q×Γk→Q×Γk×{L,R,S}k\delta:Q\times \Gamma^k \rightarrow Q\times \Gamma^k\times \{L,R,S\}^kδ:Q×Γk→Q×Γk×{L,R,S}k,通常来说,第一条带子作为输入带,如果要输出,那么最后一条带子作为输出带,k=O(1)k=O(1)k=O(1)(必须是一个常数)
Lema 3.9Lema\ 3.9Lema 3.9 多带等价
L⊆{0,1}∗L\subseteq \{0,1\}^*L⊆{0,1}∗,如果LLL可被一个k−tapek-tapek−tape 图灵机在时间T(n)T(n)T(n)内识别,那么LLL可在时间O(kT2(n))O(kT^2(n))O(kT2(n))内被一个单带图灵机识别。(nnn为输入长度,S(n)S(n)S(n)为K带图灵机用的格子数,T(n)T(n)T(n)为K带图灵机所用的时间,即转移次数,假定T(n)≥nT(n)\ge nT(n)≥n,S′(n)S'(n)S′(n)为单带图灵机用的格子数,显然有S(n)≤T(n)S(n)\le T(n)S(n)≤T(n))
ProofProofProof
用位置i−1,k+i−1,2k+i−1,⋯i-1,k+i-1,2k+i-1,\cdotsi−1,k+i−1,2k+i−1,⋯,来模拟第iii条带子,i=1,2,⋯ ,ki=1,2,\cdots,ki=1,2,⋯,k,∀a∈Γ\forall a \in \Gamma∀a∈Γ,引入a,a^∈Γ′a,\hat a\in \Gamma'a,a^∈Γ′,a^\hat aa^标记表头的位置,来模拟图灵机MMM的一步,单带图灵机M′M'M′将
- 从左到右的扫描一遍表带,读kkk个标志,用 ^\hat{\ } ^标记,但我们并不清楚这k个标志的顺序
- 应用MMM的转移函数δ\deltaδ来决定下一个状态,对于k个标志的顺序,我们可以使用
- 如果需要往回(从右到左)更新k个标志(S’(n)),并移动 ^\hat{\ } ^(2k22k^22k2,去又回,2k,共k个)
总计3步,共用了kS’(n)+O(1)+S′(n)+2k2≤kT(n)+O(1)+O(kT(n))=O(kT(n))kS’(n)+O(1)+S'(n)+2k^2\le kT(n)+O(1)+O(kT(n))=O(kT(n))kS’(n)+O(1)+S′(n)+2k2≤kT(n)+O(1)+O(kT(n))=O(kT(n)),共有T(n)T(n)T(n)步,故为O(kT2(n))O(kT^2(n))O(kT2(n))
Def 3.10Def\ 3.10Def 3.10 双向纸带图灵机
双向纸带图灵机的带子在两端都是无限的
Lema 3.10Lema\ 3.10Lema 3.10 L⊆∑∗L\subseteq \sum^*L⊆∑∗,若LLL可被一个双向纸带图灵机在T(n)T(n)T(n)内判定,那么它可以被一个单带图灵机在O(T(n))O(T(n))O(T(n))内判定。
ProofProofProof
对于双向纸带图灵机,标记起点为0,左边记为负数−i-i−i,右边记为正数iii,可映射到单带图灵为:i→2i,−i→2i+1i\rightarrow 2i,-i\rightarrow 2i+1i→2i,−i→2i+1
对双向纸带图灵机MMM的每一步,单带图灵机M′M'M′将
- 读标记
- 转移到下一个状态
- 更新标记
- 如果需要,向左或向右移动两位
总计4步,每一步需要O(1)O(1)O(1)来模拟,故总计在O(T(n))O(T(n))O(T(n))内
Def 3.11Def\ 3.11Def 3.11 随机访存图灵机
随机访存图灵机(Random access memory,RAM) 是一个拥有随机访存的图灵机
- MMM拥有一条无限内存带AAA,使用自然数集N\NN作为索引
- MMM的其中一条带子是地址带
- Γ\GammaΓ 拥有两种特殊的符号R(read)和W(write)
- QQQ拥有两种特殊的状态Qaccess⊆QQ_{access}\subseteq QQaccess⊆Q,无论何时MMM进入到状态q∈Qaccessq\in Q_{access}q∈Qaccess
- 如果地址带包含iRiRiR,(iii为R之前的一串字符串),A[i]A[i]A[i]的值将会被写到RRR旁边的格子
- 如果地址带包含iWσiW\sigmaiWσ,那么A[i]=σA[i]=\sigmaA[i]=σ
如果有kkk个工作带,那么δ:Q×Γk+1→Q×Γk+1×{L,R,S}k+1\delta:Q\times \Gamma^{k+1}\rightarrow Q\times \Gamma^{k+1}\times\{L,R,S\}^{k+1}δ:Q×Γk+1→Q×Γk+1×{L,R,S}k+1 ,内存带不需要指针
那么随机访存图灵机是一个八元组,假设有k个工作带,一个地址带m,
那么M=(Q,∑,Γ,δ,q0,qaccept,qreject,Qaccess),δ:Q×Γk+1→Q×Γk+1×{L,R,S}k+1M=(Q,\sum,\Gamma,\delta,q_0,q_{accept},q_{reject},Q_{access}),\delta:Q\times \Gamma^{k+1}\rightarrow Q\times \Gamma^{k+1}\times\{L,R,S\}^{k+1}M=(Q,∑,Γ,δ,q0,qaccept,qreject,Qaccess),δ:Q×Γk+1→Q×Γk+1×{L,R,S}k+1
Lema 3.12Lema\ 3.12Lema 3.12 RAM图灵机可被多带图灵机判定
若L⊆{0,1}∗L\subseteq\{0,1\}^*L⊆{0,1}∗,若LLL可在T(n)T(n)T(n)被一个RAM图灵机判定,那么它可以在O(T3(n))O(T^3(n))O(T3(n))的时间内被一个多带图灵机判定。
如果地址带长度为O(1)O(1)O(1)(例如现实中的32位,64位),那么可在O(T2(n))O(T^2(n))O(T2(n))内被多带图灵机判定。
ProofProofProof
用一条额外工作带A作为内存,来保存元组(i,A[i])(i,A[i])(i,A[i]),其中iii是一个二进制整数,A[i]∈ΓA[i]\in\GammaA[i]∈Γ,是所有被引用的内存地址
$pairs\le T(n),length\ of\ each \ pair\le O(T(n)),length\ of\ the\ extra \ memory\ tape\le O(T^2(n)) $
模拟MMM的一步,如果MMM在一次访问中,那么多带图灵机M‘将:
- 扫描带A来找到一个在地址带中匹配iii的地址
- 如果不存在这样的iii,添加一个新的元组(i,A[i])(i,A[i])(i,A[i])
- 读或写A[i]A[i]A[i]
每一步用时O(T2(n))+O(T(n))+O(T(n))=O(T2(n))O(T^2(n))+O(T(n))+O(T(n))=O(T^2(n))O(T2(n))+O(T(n))+O(T(n))=O(T2(n)),T(n)T(n)T(n)步为O(T3(n))O(T^3(n))O(T3(n))
如果地址带长度为O(1)O(1)O(1),那么pairs≤T(n),length of each pair=O(1),length of the extra memory tape≤O(T(n))pairs\le T(n),length \ of\ each\ pair=O(1),length\ of\ the\ extra\ memory\ tape \le O(T(n))pairs≤T(n),length of each pair=O(1),length of the extra memory tape≤O(T(n)),那么每一步将花费O(T(n))O(T(n))O(T(n))的时间,总共花费O(T2(n))O(T^2(n))O(T2(n))
若忽略多项式,所有图灵机都是等价的。
使用RAM图灵机模拟汇编语言:
一组固定数量的寄存器(64bits)
对于加法、减法、 乘法
add R0,R1,R2//R0←R1+R2add\ R_0,R_1,R_2 // R_0\leftarrow R_1+R2add R0,R1,R2//R0←R1+R2
sub R0,R1,R2//R0←R1−R2sub\ R_0,R_1,R_2 // R_0\leftarrow R_1-R2sub R0,R1,R2//R0←R1−R2
MUL R0,R1,R2//R0←R1×R2MUL\ R_0,R_1,R_2 // R_0\leftarrow R_1\times R2MUL R0,R1,R2//R0←R1×R2
比较(将结果储存在状态寄存器中)
CMP R0,R1CMP \ R_0,R_1CMP R0,R1
移动
Mov R0,R1//R0←R1Mov\ R_0,R_1//R_0\leftarrow R_1Mov R0,R1//R0←R1
位运算,or,xor
KaTeX parse error: Undefined control sequence: \or at position 37: …\leftarrow R_1 \̲o̲r̲ ̲R_2
EOR R0,R1,R2//R0←R1⊕R2EOR\ R_0,R_1,R_2//R_0\leftarrow R_1\oplus R_2EOR R0,R1,R2//R0←R1⊕R2
测试相等
TST R0,#8TST\ R_0,\#8TST R0,#8
TEQ R0,R1TEQ\ R_0,R_1TEQ R0,R1
逻辑位移
LSL R0,R1,#3//R0←将R1左移3位,存在R0中LSL\ R_0,R_1,\#3// R_0\leftarrow 将R_1左移3位,存在R_0中LSL R0,R1,#3//R0←将R1左移3位,存在R0中
LSL R0,R1,R2LSL\ R_0,R_1,R_2LSL R0,R1,R2
旋转
ROR R0,R1,#5//R1右移5位,移出的位从另一边进入ROR\ R_0,R_1,\#5//R_1右移5位,移出的位从另一边进入ROR R0,R1,#5//R1右移5位,移出的位从另一边进入
内存相关操作
LDR R0[R1]//R0←M[R1]LDR \ R_0[R_1]//R_0\leftarrow M[R_1]LDR R0[R1]//R0←M[R1]
STR R1[R0]//M[R0]←R1STR\ R_1[R_0]//M[R_0]\leftarrow R_1STR R1[R0]//M[R0]←R1
上述每个汇编操作都可以用RAM图灵机在O(1)O(1)O(1)步内完成
算法相关的书中的时间复杂度,是用的RAM图灵机
复杂性理论的书中的时间复杂度,使用的多带图灵机
Church−Turing thesisChurch-Turing \ thesisChurch−Turing thesis
物理世界中可计算的所有函数都可以被图灵机计算(例如:量子,生物)
Strong CT thesisStrong\ CT \ thesisStrong CT thesis
可在多项式时间内计算完成。(可能的例外:量子计算机)

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)