计算理论基础:2、丘奇-图灵论题

什么是算法?算法就是图灵机

3.1 图灵机

图灵机用一个无限长的带子作为无限存储,它有一个读写头,能在带子上读、写和左右移动。图灵机开始运作时,带子上只有输入串,其他地方都是空的,如果需要保存信息,它可将这个信息写在带子上。为了读已经写下的信息,它可将读写头往回移动到这个信息所在的位置。机器不停地计算,直到产生输出为止。机器预置了接收和拒绝两种状态,如果进入这两种状态,就产生接收(accept)或拒绝(reject),如果不能进入任何接收或拒绝状态,就继续执行下去,永不停止。

3.1.1 图灵机的形式化定义

D e f   3.1 Def\ 3.1 Def 3.1 图灵机

图灵机是一个7元组 ( Q , ∑ , Γ , δ , q 0 , q a c c e p t , q r e j e c t ) (Q,\sum,\Gamma,\delta,q_0,q_{accept},q_{reject}) (Q,,Γ,δ,q0,qaccept,qreject),其中: Q , ∑ , Γ Q,\sum,\Gamma Q,,Γ都是有穷集合,并且

  1. Q Q Q是状态集
  2. ∑ \sum 是输入字母表,不包括特殊空白符号 ⊔ \sqcup
  3. Γ \Gamma Γ是带子字母表,其中, ⊔ ∈ Γ , ⊳ ∈ Γ , ∑ ⊆ Γ \sqcup\in\Gamma,\rhd\in\Gamma,\sum\subseteq\Gamma Γ,Γ,Γ
  4. δ : Q × Γ → Q × Γ × { L , R } \delta:Q\times\Gamma\rightarrow Q\times \Gamma\times\{L,R\} δ:Q×ΓQ×Γ×{L,R}是转移函数
  5. q 0 ∈ Q q_0\in Q q0Q是起始状态
  6. q a c c e p t ∈ Q q_{accept}\in Q qacceptQ是接收状态
  7. q r e j e c t ∈ Q q_{reject}\in Q qrejectQ是拒绝状态,且 q r e j e c t ≠ q a c c e p t q_{reject}\ne q_{accept} qreject=qaccept

例:输入一个二进制数n,低位在前,输出n+1

InputOutput
101 ⊔ ⊔ 101\sqcup\sqcup 101 011 ⊔ ⊔ 011\sqcup\sqcup 011
11 ⊔ ⊔ 11\sqcup\sqcup 11 001 ⊔ ⊔ 001\sqcup\sqcup 001

∑ = { 0 , 1 } , Γ = { 0 , 1 , ⊔ , ⊳ } \sum=\{0,1\},\Gamma=\{0,1,\sqcup,\rhd\} ={0,1},Γ={0,1,,}

0,1/S
q 0
q

例1:判断回文串,图灵机编程先写一下想法

  1. 读一个字符,并写为空格,0和1进入不同的路径
  2. 接着不停地往右走,直到读到空格,往左走一格
  3. 进行比较,如果不同,则进入 q r e j e c t q_{reject} qreject,如果相同,写为空格后回到 q s t a r t q_{start} qstart重复上述过程
  4. 接收状态有两种:
    • 偶数,最终正好把所有字符写为空格后回到 q s t a r t q_{start} qstart,则在 q s t a r t q_{start} qstart读到空格则接收
    • 奇数,最后一次读到一个字符并进入到对应状态,没有下一个有效的字符进行判断,则此时读到空格接收

例2:2的n次方:图灵机判断 L = { 0 2 n ∣ n ≥ 0 } L=\{0^{2^n}|n\ge0\} L={02nn0}

每次擦除一半的0,直到只剩一个0则接受,如果为奇数个0则拒绝。(隔一个擦一个)

  1. 从左往右,隔一个0,擦除一个0(写x)
  2. 如果在跳过一个0后读到了空格,则说明是奇数,直接拒绝
  3. 接着回到最左边,重复上述操作,直到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,#}

  1. 读取一个字符并改为x后,不断向右移动,直到遇到 # \# #
  2. 跳过x后,进行比较,如果不同则拒绝;如果相同则写为x并回到最左端并重复。
  3. 最终在x后读到#则接收

练习:

  1. 二进制整数比较: L = { x , y ∣ x , y ∈ { 0 , 1 } ∗ , x ≥ y } L=\{x,y|x,y\in\{0,1\}^*,x\ge y\} L={x,yx,y{0,1},xy} 最高位在前

    先比较长度,再回到最高位比较。

  2. 二进制+1,最高位在前(input:100 ,output:101)

    特殊处理全1的情况就好

  3. L = { 0 n 1 n } L=\{0^n1^n\} L={0n1n}

    如果第一位是空格则接收,然后就读0,找1,重复

D e f   3.2 Def\ 3.2 Def 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}:

  1. M在 T ( n ) T(n) T(n)步内停止

  2. 如果 x ∈ L x\in L xL,那么 M M M接收 x x x

  3. 如果 x ≠ L x\ne L x=L,那么 M M M拒绝 x x x(不允许出现死循环)

D e f   3.3 Def\ 3.3 Def 3.3 图灵可判定

L ⊆ { 0 , 1 } ∗ L\subseteq\{0,1\}^* L{0,1},如果有一个图灵机可判定他,则称 L L L是(图灵)可判定的

D e f   3.4 Def\ 3.4 Def 3.4 可识别

M是一个图灵机,M可接收的字符串集被称为被M识别的语言,记为 L ( M ) L(M) L(M),比判定弱,L之外的语言可不被接收,也可能死循环。

D e f   3.5 Def\ 3.5 Def 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>,输入xM会停机},这是可识别的,因为L是可接收的,单如果 x ≠ L x\ne L x=L,M可能会陷入死循环。

D e f   3.6 Def\ 3.6 Def 3.6 时间复杂度`

映射 f : { 0 , 1 } ∗ → { 0 , 1 } ∗ ∪ { u n d e f i n e d } f:\{0,1\}^*\rightarrow\{0,1\}^*\cup\{undefined\} f:{0,1}{0,1}{undefined},如果 ∀ x ∈ { 0 , 1 } ∗ , f ( x ) ≠ u n d e f i n e d \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)

E v e r y t h i n g   s h o u l d   b e   m a d e   a s   s i m p l e   a s   p o s s b i l e , b u t   n o   s i m p l e r Everything\ should\ be\ made\ as\ simple\ as\ possbile,but\ no\ simpler Everything should be made as simple as possbile,but no simpler

3.1.2 图灵机变体

L e m a   3.7 Lema\ 3.7 Lema 3.7 图灵机等价

如果语言 L ⊆ { 0 , 1 } ∗ L\subseteq\{0,1\}^* L{0,1}可在时间 T ( n ) T(n) T(n)内被图灵机(带子字母表为 Γ \Gamma Γ)判定,那么他可在
O ( l o g ∣ Γ ∣ 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,,})判定

P r o o f Proof Proof:

k = ⌈ l o g 2 ∣ Γ ∣ ⌉ = O ( l o g 2 ∣ Γ ∣ ) k=\lceil log_2|\Gamma|\rceil=O(log_2|\Gamma|) k=log2∣Γ∣=O(log2∣Γ∣)bits编码 Γ \Gamma Γ的标识符,新的图灵机 M ′ M' M

  1. k k k步读一个标识 a ∈ Γ a\in\Gamma aΓ
  2. 转移到下一步 q ′ q' q,得到一个新的标识 b b b(用来改写 a a a
  3. b b b替换 a a a
  4. 接着用 k k k步实现左移右移或者保持

综上所述,这一步的模拟需要 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 ( l o g 2 ∣ Γ ∣ T ( n ) ) O(log_2|\Gamma|T(n)) O(log2∣Γ∣T(n))

D e f   3.8 Def\ 3.8 Def 3.8 多带图灵机

一个 k k k-带图灵机M是一个七元组 ( Q , ∑ , Γ , δ , q 0 , q a c c e p t , q r e j e c t ) (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×ΓkQ×Γk×{L,R,S}k,通常来说,第一条带子作为输入带,如果要输出,那么最后一条带子作为输出带, k = O ( 1 ) k=O(1) k=O(1)(必须是一个常数)

L e m a   3.9 Lema\ 3.9 Lema 3.9 多带等价

L ⊆ { 0 , 1 } ∗ L\subseteq \{0,1\}^* L{0,1},如果 L L L可被一个 k − t a p e k-tape ktape 图灵机在时间 T ( n ) T(n) T(n)内识别,那么 L L L可在时间 O ( k T 2 ( n ) ) O(kT^2(n)) O(kT2(n))内被一个单带图灵机识别。( n n n为输入长度, S ( n ) S(n) S(n)为K带图灵机用的格子数, T ( n ) T(n) T(n)为K带图灵机所用的时间,即转移次数,假定 T ( n ) ≥ n T(n)\ge n T(n)n S ′ ( n ) S'(n) S(n)为单带图灵机用的格子数,显然有 S ( n ) ≤ T ( n ) S(n)\le T(n) S(n)T(n))

P r o o f Proof Proof

​ 用位置 i − 1 , k + i − 1 , 2 k + i − 1 , ⋯ i-1,k+i-1,2k+i-1,\cdots i1,k+i1,2k+i1,,来模拟第 i i i条带子, i = 1 , 2 , ⋯   , k i=1,2,\cdots,k i=1,2,,k ∀ a ∈ Γ \forall a \in \Gamma aΓ,引入 a , a ^ ∈ Γ ′ a,\hat a\in \Gamma' a,a^Γ, a ^ \hat a a^标记表头的位置,来模拟图灵机 M M M的一步,单带图灵机 M ′ M' M

  1. 从左到右的扫描一遍表带,读 k k k个标志,用   ^ \hat{\ }  ^标记,但我们并不清楚这k个标志的顺序
  2. 应用 M M M的转移函数 δ \delta δ来决定下一个状态,对于k个标志的顺序,我们可以使用
  3. 如果需要往回(从右到左)更新k个标志(S’(n)),并移动   ^ \hat{\ }  ^ 2 k 2 2k^2 2k2,去又回,2k,共k个)

总计3步,共用了 k S ’ ( n ) + O ( 1 ) + S ′ ( n ) + 2 k 2 ≤ k T ( n ) + O ( 1 ) + O ( k T ( n ) ) = O ( k T ( 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)+2k2kT(n)+O(1)+O(kT(n))=O(kT(n)),共有 T ( n ) T(n) T(n)步,故为 O ( k T 2 ( n ) ) O(kT^2(n)) O(kT2(n))

D e f   3.10 Def\ 3.10 Def 3.10 双向纸带图灵机

​ 双向纸带图灵机的带子在两端都是无限的

L e m a   3.10 Lema\ 3.10 Lema 3.10 L ⊆ ∑ ∗ L\subseteq \sum^* L,若 L L L可被一个双向纸带图灵机在 T ( n ) T(n) T(n)内判定,那么它可以被一个单带图灵机在 O ( T ( n ) ) O(T(n)) O(T(n))内判定。

P r o o f Proof Proof

​ 对于双向纸带图灵机,标记起点为0,左边记为负数 − i -i i,右边记为正数 i i i,可映射到单带图灵为: i → 2 i , − i → 2 i + 1 i\rightarrow 2i,-i\rightarrow 2i+1 i2i,i2i+1

​ 对双向纸带图灵机 M M M的每一步,单带图灵机 M ′ M' M

  1. 读标记
  2. 转移到下一个状态
  3. 更新标记
  4. 如果需要,向左或向右移动两位

总计4步,每一步需要 O ( 1 ) O(1) O(1)来模拟,故总计在 O ( T ( n ) ) O(T(n)) O(T(n))

D e f   3.11 Def\ 3.11 Def 3.11 随机访存图灵机

随机访存图灵机(Random access memory,RAM) 是一个拥有随机访存的图灵机

  1. M M M拥有一条无限内存带 A A A,使用自然数集 N \N N作为索引
  2. M M M的其中一条带子是地址带
  3. Γ \Gamma Γ 拥有两种特殊的符号R(read)和W(write)
  4. Q Q Q拥有两种特殊的状态 Q a c c e s s ⊆ Q Q_{access}\subseteq Q QaccessQ,无论何时 M M M进入到状态 q ∈ Q a c c e s s q\in Q_{access} qQaccess
    1. 如果地址带包含 i R iR iR,( i i i为R之前的一串字符串), A [ i ] A[i] A[i]的值将会被写到 R R R旁边的格子
    2. 如果地址带包含 i W σ iW\sigma iWσ,那么 A [ i ] = σ A[i]=\sigma A[i]=σ

如果有 k k k个工作带,那么 δ : 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+1Q×Γk+1×{L,R,S}k+1 ,内存带不需要指针

那么随机访存图灵机是一个八元组,假设有k个工作带,一个地址带m,

那么 M = ( Q , ∑ , Γ , δ , q 0 , q a c c e p t , q r e j e c t , Q a c c e s s ) , δ : Q × Γ k + 1 → Q × Γ k + 1 × { L , R , S } k + 1 M=(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+1Q×Γk+1×{L,R,S}k+1

L e m a   3.12 Lema\ 3.12 Lema 3.12 RAM图灵机可被多带图灵机判定

​ 若 L ⊆ { 0 , 1 } ∗ L\subseteq\{0,1\}^* L{0,1},若 L L L可在 T ( n ) T(n) T(n)被一个RAM图灵机判定,那么它可以在 O ( T 3 ( n ) ) O(T^3(n)) O(T3(n))的时间内被一个多带图灵机判定。

​ 如果地址带长度为 O ( 1 ) O(1) O(1)(例如现实中的32位,64位),那么可在 O ( T 2 ( n ) ) O(T^2(n)) O(T2(n))内被多带图灵机判定。

P r o o f Proof Proof

​ 用一条额外工作带A作为内存,来保存元组 ( i , A [ i ] ) (i,A[i]) (i,A[i]),其中 i i i是一个二进制整数, A [ i ] ∈ Γ A[i]\in\Gamma A[i]Γ,是所有被引用的内存地址

$pairs\le T(n),length\ of\ each \ pair\le O(T(n)),length\ of\ the\ extra \ memory\ tape\le O(T^2(n)) $

模拟 M M M的一步,如果 M M M在一次访问中,那么多带图灵机M‘将:

  1. 扫描带A来找到一个在地址带中匹配 i i i的地址
  2. 如果不存在这样的 i i i,添加一个新的元组 ( i , A [ i ] ) (i,A[i]) (i,A[i])
  3. 读或写 A [ i ] A[i] A[i]

每一步用时 O ( T 2 ( n ) ) + O ( T ( n ) ) + O ( T ( n ) ) = O ( T 2 ( 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 ( T 3 ( n ) ) O(T^3(n)) O(T3(n))

​ 如果地址带长度为 O ( 1 ) O(1) O(1),那么 p a i r s ≤ T ( n ) , l e n g t h   o f   e a c h   p a i r = O ( 1 ) , l e n g t h   o f   t h e   e x t r a   m e m o r y   t a p e ≤ O ( T ( n ) ) pairs\le T(n),length \ of\ each\ pair=O(1),length\ of\ the\ extra\ memory\ tape \le O(T(n)) pairsT(n),length of each pair=O(1)length of the extra memory tapeO(T(n)),那么每一步将花费 O ( T ( n ) ) O(T(n)) O(T(n))的时间,总共花费 O ( T 2 ( n ) ) O(T^2(n)) O(T2(n))

若忽略多项式,所有图灵机都是等价的。

使用RAM图灵机模拟汇编语言:

一组固定数量的寄存器(64bits)

对于加法、减法、 乘法

a d d   R 0 , R 1 , R 2 / / R 0 ← R 1 + R 2 add\ R_0,R_1,R_2 // R_0\leftarrow R_1+R2 add R0,R1,R2//R0R1+R2

s u b   R 0 , R 1 , R 2 / / R 0 ← R 1 − R 2 sub\ R_0,R_1,R_2 // R_0\leftarrow R_1-R2 sub R0,R1,R2//R0R1R2

M U L   R 0 , R 1 , R 2 / / R 0 ← R 1 × R 2 MUL\ R_0,R_1,R_2 // R_0\leftarrow R_1\times R2 MUL R0,R1,R2//R0R1×R2

比较(将结果储存在状态寄存器中)

C M P   R 0 , R 1 CMP \ R_0,R_1 CMP R0,R1

移动

M o v   R 0 , R 1 / / R 0 ← R 1 Mov\ R_0,R_1//R_0\leftarrow R_1 Mov R0,R1//R0R1

位运算,or,xor

KaTeX parse error: Undefined control sequence: \or at position 37: …\leftarrow R_1 \̲o̲r̲ ̲R_2

E O R   R 0 , R 1 , R 2 / / R 0 ← R 1 ⊕ R 2 EOR\ R_0,R_1,R_2//R_0\leftarrow R_1\oplus R_2 EOR R0,R1,R2//R0R1R2

测试相等

T S T   R 0 , # 8 TST\ R_0,\#8 TST R0,#8

T E Q   R 0 , R 1 TEQ\ R_0,R_1 TEQ R0,R1

逻辑位移

L S L   R 0 , R 1 , # 3 / / R 0 ← 将 R 1 左移 3 位,存在 R 0 中 LSL\ R_0,R_1,\#3// R_0\leftarrow 将R_1左移3位,存在R_0中 LSL R0,R1,#3//R0R1左移3位,存在R0

L S L   R 0 , R 1 , R 2 LSL\ R_0,R_1,R_2 LSL R0,R1,R2

旋转

R O R   R 0 , R 1 , # 5 / / R 1 右移 5 位,移出的位从另一边进入 ROR\ R_0,R_1,\#5//R_1右移5位,移出的位从另一边进入 ROR R0,R1,#5//R1右移5位,移出的位从另一边进入

内存相关操作

L D R   R 0 [ R 1 ] / / R 0 ← M [ R 1 ] LDR \ R_0[R_1]//R_0\leftarrow M[R_1] LDR R0[R1]//R0M[R1]

S T R   R 1 [ R 0 ] / / M [ R 0 ] ← R 1 STR\ R_1[R_0]//M[R_0]\leftarrow R_1 STR R1[R0]//M[R0]R1

​ 上述每个汇编操作都可以用RAM图灵机在 O ( 1 ) O(1) O(1)步内完成

算法相关的书中的时间复杂度,是用的RAM图灵机

复杂性理论的书中的时间复杂度,使用的多带图灵机

C h u r c h − T u r i n g   t h e s i s Church-Turing \ thesis ChurchTuring thesis

​ 物理世界中可计算的所有函数都可以被图灵机计算(例如:量子,生物)

S t r o n g   C T   t h e s i s Strong\ CT \ thesis Strong CT thesis

​ 可在多项式时间内计算完成。(可能的例外:量子计算机)

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值