怎麼說呢?標題中的三個性質:自動機、可計算性、複雜性是計算理論的核心內容,而教材也完全圍繞這些內容展開描述。為此,我們分別看一下(注意教材的順序是反的!)。
1.1 自動機理論教材給出的說明是:自動機理論闡述了計算的數學模型的定義和性質,那麼明顯地自動機理論的核心是「計算的數學模型」,或者說我們建立一個數學模型叫做自動機。那麼,建立這個模型有什麼作用呢?我們用的電腦(PC)、用來計算的工作站、聯網的交換機等等都能夠用自動機描述嗎? 我之前是搞物理的,我對這個東西的理解與物理學對世界的認識一樣。我們知道,我們眼前見到的世界由經典力學描述,這個模型叫做「Geolileo時空」(Geolileo就是在Pizz斜塔上證明兩個鐵球同時下落的那個物理學家),而數學家也為物理上我們經典力學研究的Geolileo時空建立了一個精準的定義(參見Arnold的書)。這種定義叫做「形式化定義」,其重要之處就是形式化定義是精準的、可以計算的,沒有任何的模糊性。
理論上所有的概念的準確定義都建立在集合的基礎上(這是數學的基本知識),而集合是定義在所謂的「公理」之上(比如ZF公理等),但這不是我們研究的重點,所以我們所有的概念都是準確的。
1.2 可計算性理論可計算性理論研究一個問題能不能被計算機求解,那麼什麼叫做「能夠被計算機求解呢?」 首先,自然的這個問題能夠被自動機在有限步數(計算理論中把時間定義為步數以消除不同機器配置不同造成的差異)內求解就能被現實中的計算機求解了吧,而其次我們研究更強的結論,要求比自動機更好的機器(模型機器)能夠求解,這就是可計算性理論的主要任務。
我們看一個例子:任意給出一個程序,能否用計算機判斷該程序能不能在有限時間內能不能停止,即停機問題。答案當然是不能的(下面證明來自知乎黃玄),因為如果存在這樣的機器is_halt,那麼其定義可以為:
def is_halt(program,input)->bool:
if return(program) = 1: return True;
if return(program) = 0: return False;
# 0 表示停機,1 表示可以結束程序
# input 是 program 的輸入那麼我們定義程序hack為
from halt import is_halt
def loop():
while(True):
pass
def hack(program):
if is_halt(program,program):
loop
else:
return下面我們運行指令is_halt(hack,hack),發現問題之所在。若由於hack(hack)當is_halt(hack,hack)返回True時停機,當is_halt(hack,hack)返回False時有返回值,那麼再根據is_halt(hack,hack)的定義可知is_halt函數對hack程序hack輸入存在兩個不同的結果,唯一的解釋就是is_halt程序不存在。
1.3 複雜性理論我們不僅要證明一個程序能不能算完,更要證明一個程序到底要有多複雜,能算多少,所以我們引入複雜度的概念,其中時間複雜度被定義為完成計算的時間(步數),空間複雜度被定義為完成計算對內存的消耗。一般我們讓複雜度越低越好,但在密碼問題中我們應讓複雜度越高越好。
Section 2:數學概念與術語數學是計算理論的核心,因為計算理論就是通過數學建立計算機的理論模型並進行分析。
2.1 集合其實這部分我本來不想寫的,因為大家高中都學過,但為了完整性我就簡略的描述一下。集合是一系列事物的整體,
併集:
(也記作
同樣地我們定義:
在集合中我們常常還會用到下面的計算:
叫做非Cartesian積,明顯
我們習慣用符號來代替推理運算:
其中
若對所有
若存在一個規則
2.2 關係考慮集合
叫做「二元關係」。若
那麼
2.3 圖圖是一種數學結構,常常表示為
對頂點
讀者應該自己查一下下面的概念:圖中的路徑、圈、簡單路徑、簡單圈,圖的連通性,有向圖的有向路徑、強連通性,樹與樹的根、樹葉,二叉樹等等。
圖是一個非常有意思的東西,而且圖在很多方面都有應用,比如生物中關於物種與進化的部分就用到圖論這一強有力的工具(有首歌就是講這個的:洛天依,樂正綾 — 二叉樹演化論,可以聽一下),有興趣的可以去翻閱一下離散數學的教材。
2.4 字符串與語言一個非空的可數集合叫做字母表,最常見的就是我們的QWERTY鍵盤,其字母表由以下部分組成:
命令:Escape、Tab、Shift、Control、Alt、Windows、Delete、←×、Enter;鎖:Caps Lock、Num Lock、Scroll Lock;把這些符號全部並起來構成的集合就是PC端的輸入字母表。
考慮字母表
我們用
叫做
我們這樣定義「正則語言」的概念:
Section 3: 證明這部分我不講了,有書的看書,沒書的算了。相信經歷過中學數學的折磨,讀者應該都知道怎麼證明一個命題。基本上技巧就兩個:正難則反(反代表「反證法」)、數學歸納法,不能用就只能自己想。
Answer & Analysis: 教材習題解析練習題a. 全體正奇數 b. 全體偶數 c. {2m} d. {2m,3k} e. {00,11} f. ∅a. {1,10,100} b.