Week 2 定義 5.2:多項式歸約 \(X\le_pY\) 到底在說什麼?\(f\) 是誰、方向為什麼是這樣、「雙向」與「多項式」各自防什麼弊?(第 3 章)
Week 10 第 6 節:停機問題有 Terminating 的屬性嗎?——先破題:Terminating 是「演算法」的屬性,不是「問題」的屬性;把問題問對之後,答案自然浮現。(第 2 章)
Week 11:映射歸約 \(A\le_mB\) 與多項式歸約差在哪?各自用在什麼場合?考試的歸約題有沒有固定寫法?(第 4 章)
Exercises 第二部分 Q1、Q3、Q11:這三題不是孤立的難題,而是三種可以套模板的觀念題型——「證明屬於 NP」「解釋歸約為何正確」「寫出近似性定義」。每個模板都示範如何遷移到 2019/2020 年真題。(第 5 章)
建議閱讀順序:第 1 章是全書地基(十分鐘),之後四章可依需要跳讀;最後的速查表與自我測驗(第 6 章)適合考前一天使用。
你的四個疑難點,追根究柢都繞著同一組概念打轉。先把這組概念的文法弄對,後面每一章都會輕鬆一半。
三個屬性:形容一個演算法
設 \(\mathcal{A}\) 是一個演算法(一台圖靈機),\(X\) 是一個判定問題。Week 10 教材給過三個屬性:
| 屬性 | 定義 | 白話 |
|---|---|---|
| 健全 Sound | \(\mathcal{A}(w)=\text{Yes} \Rightarrow w\in X\) | 說 Yes 就真的是(不誤報) |
| 完備 Complete | \(w\in X \Rightarrow \mathcal{A}(w)=\text{Yes}\) | 真的是就會說 Yes(不漏報) |
| 會停機 Terminating | 對所有輸入 \(w\),\(\mathcal{A}\) 都在有限步內停止 | 不管餵什麼都等得到答案 |
Sound、Complete、Terminating 這三個形容詞,只能拿來形容演算法,不能拿來形容問題。 說「停機問題是 terminating 的」就像說「數學考卷很誠實」——考卷沒有誠實不誠實,作答的人才有;問題沒有停不停機,解題的演算法才有。
問題(語言)擁有的是另一組形容詞:可判定、遞迴可枚舉(C.E./r.e./可辨識)、不可判定——而這些分類全部是用「存在怎樣屬性的演算法」來定義的。
三個分類:形容一個問題
定義 1 (問題的分類). 設 \(X\) 是判定問題。
\(X\) 可判定(decidable) \(\iff\) 存在一個 sound \(+\) complete \(+\) terminating 的演算法。
\(X\) 遞迴可枚舉(recursively enumerable, r.e.;又稱 C.E.、可辨識) \(\iff\) 存在一個 sound \(+\) complete 的演算法(不要求 terminating)。
\(X\) 不可判定(undecidable) \(\iff\) 不存在 sound \(+\) complete \(+\) terminating 的演算法。
注意這些定義裡的量詞都是「存在」。一個問題永遠都有爛演算法(例如永遠回答 No 的機器:sound 或 complete 必有一個失守),這不影響分類;分類看的是最好情況下找不找得到夠好的演算法。
三件立刻要記住的事實:
可判定 \(\Rightarrow\) C.E.(有 S\(+\)C\(+\)T 當然有 S\(+\)C),反之不然;
「不可判定」\(\ne\)「毫無演算法」:\(\textsc{Halt}_{\mathrm{TM}}\) 不可判定,卻有 sound\(+\)complete 的演算法(下一章主角);
SAT、TSP、CLIQUE 都是可判定的!它們只是(大概)很慢——NP-hard 說的是「多項式時間內大概解不了」,跟「有限時間內解不解得了」是兩個世界的問題。複雜度理論(Week 1–9)與可計算性理論(Week 10–11)的分界線就在這裡。
2019 年 1 月 Q1:「\(X\) 是 r.e.」的意思?答案 A =「存在一個 sound 且 complete 的演算法」——一字不差就是定義 1。
2020 年 1 月 Q1:同一題換選項(答案 D)。干擾項 A「不存在 S\(+\)C\(+\)T 演算法」是不可判定的定義——出題者就是在考你會不會把兩組形容詞張冠李戴。
Week 10 疑問:停機問題有「Terminating」的屬性嗎?
先把問題問對
停機問題(Week 10 教材第 6 節): \[\textsc{Halt}_{\mathrm{TM}}\;=\; \{\langle \mathrm{code}(M), w\rangle \;:\; M \text{ 在輸入 } w \text{ 上會停機}\}.\]
「\(\textsc{Halt}_{\mathrm{TM}}\) 有 Terminating 的屬性嗎?」——依第 1 章的文法,這句話犯了類別錯誤:Terminating 形容演算法,\(\textsc{Halt}_{\mathrm{TM}}\) 是問題。但這個疑問非常自然,因為它其實是三個合法問題疊在一起。把它們拆開,逐一回答:
「存在 sound \(+\) complete \(+\) terminating 的演算法判定 \(\textsc{Halt}_{\mathrm{TM}}\) 嗎?」
不存在。這正是 Turing 1936 年用對角線論證證明的事——\(\textsc{Halt}_{\mathrm{TM}}\) 不可判定。「存在 sound \(+\) complete(可以不 terminating)的演算法辨識 \(\textsc{Halt}_{\mathrm{TM}}\) 嗎?」
存在。用萬能圖靈機模擬 \(M(w)\),一停(不論接受或拒絕)就回答 Yes。所以 \(\textsc{Halt}_{\mathrm{TM}}\) 是 C.E.(遞迴可枚舉)。「那這個模擬演算法自己 terminating 嗎?」
不。當 \(M(w)\) 不停機時,模擬也陪著跑到永遠——它對 No 實例永遠給不出答案。這不是實作不夠聰明,而是任何 sound\(+\)complete 的 \(\textsc{Halt}_{\mathrm{TM}}\) 演算法都必然如此(否則就與第 1 點矛盾)。
一句話總結:停機問題「談論」的是停機,但它自己「不具有」會停機的判定演算法——它是「可辨識但不可判定」的招牌例子。
混淆的根源:兩層「停機」
這個疑問之所以纏人,是因為題目裡有兩台機器、兩層停機,名字還撞在一起:
內層停機:被詢問的機器 \(M\) 在 \(w\) 上停不停——這是 \(\textsc{Halt}_{\mathrm{TM}}\) 的題目內容,是輸入資料的性質。
外層停機:解題的演算法 \(\mathcal{H}\) 對每個輸入 \(\langle\mathrm{code}(M),w\rangle\) 停不停——這才是 Terminating 屬性的所在。
不可判定性說的是:外層想永遠停機,就必須有辦法在有限時間內看穿內層的無限行為(「\(M\) 永遠不會停」是一個關於無限未來的斷言)。模擬只能忠實重播內層,內層不停、外層就跟著不停;而對角線論證證明了任何「不靠模擬的聰明捷徑」也一律不存在。
模擬策略的成績單:
若 \(\langle\mathrm{code}(M),w\rangle\in\textsc{Halt}_{\mathrm{TM}}\)(\(M\) 會停):模擬在有限步後親眼看到停機,回答 Yes。——Yes 端有「有限證據」:跑 \(t\) 步停了,這個 \(t\) 就是證據。
若 \(\langle\mathrm{code}(M),w\rangle\notin\textsc{Halt}_{\mathrm{TM}}\)(\(M\) 不停):跑了一百萬步還沒停,什麼都不能下結論——也許第一百萬零一步就停了。No 端沒有有限證據。
「Yes 端有有限證據、No 端沒有」正是 C.E. 類的本質特徵。這也解釋了為什麼補問題 \(\overline{\textsc{Halt}}_{\mathrm{TM}}\)(\(M\) 不停機)連 C.E. 都不是:它的 Yes 端(=原問題的 No 端)沒有有限證據可驗。若 \(\overline{\textsc{Halt}}_{\mathrm{TM}}\) 也是 C.E.,把兩個半判定器平行執行就能判定 \(\textsc{Halt}_{\mathrm{TM}}\)(Week 11 核心定理),矛盾。
對角線證明三十秒複習
反設有 terminating 的判定器 \(H\)。造「唱反調機」\(D\):輸入 \(\mathrm{code}(M)\),問 \(H\)「\(M\) 吃自己的編碼會停嗎?」——\(H\) 說會停,\(D\) 就故意進入無窮迴圈;\(H\) 說不停,\(D\) 就立刻停。現在把 \(D\) 餵給自己:\(D(\mathrm{code}(D))\) 停 \(\Rightarrow\) 依定義它不停;不停 \(\Rightarrow\) 依定義它停。兩頭都矛盾,故 \(H\) 不存在。(結構同理髮師悖論:規則套到自己身上時自爆。)
注意這個證明用到了 \(H\) 的 terminating:\(D\) 必須等得到 \(H\) 的答覆才能唱反調。這再一次凸顯:被推翻的是「S\(+\)C\(+\)T 三者兼得」,而不是「S\(+\)C」——後者由模擬演算法安然實現。
2019 年 1 月 Q11:對 \(\mathrm{REJECT}_{TM}\) 重演這整套劇本——(a) 對角線證不可判定(題目指明 from first principles,就是要你寫 \(D\) 的自我指涉論證);(b) 模擬建 S\(+\)C 演算法證 r.e.;(c) 用「\(X\) 與 \(\overline{X}\) 皆 r.e. \(\Rightarrow\) \(X\) 可判定」證補語言非 r.e.。
2020 年 1 月 Q11:同樣三部曲,主角換成 \(E_{\mathrm{TM}}\),且 (a) 改用映射歸約(見第 4 章)。兩年對照:題目說「from first principles」用對角線;題目給你一個已知不可判定的語言,用歸約。
Week 2 定義 5.2:多項式歸約 \(X\le_pY\)
動機:歸約是「難度的比較器」
我們常常無法直接算出一個問題「有多難」,但可以比較相對難度。日常版本:
「找中位數」不比「排序」難——因為會排序就會找中位數:先排好,取中間那個。
把「先把輸入改寫一下,再呼叫另一個問題的求解器」這件事正式化,就是歸約。
定義 2 (多項式歸約;即 Week 2 教材定義 5.2). 從問題 \(X\) 到問題 \(Y\) 的多項式歸約(polynomial reduction)是一個可在多項式時間內計算的函數 \(f:\Sigma^*\to\Sigma^*\),使得對所有 \(w\in\Sigma^*\): \[w\in X \iff f(w)\in Y.\] 記作 \(X\le_pY\),讀作「\(X\) 可多項式歸約到 \(Y\)」,直覺是「\(X\) 不比 \(Y\) 難(頂多差一個多項式的翻譯費)」。
定義的三個零件,各司其職
零件一:\(f\) 是「翻譯器」,不是「求解器」。
\(f\) 吃進 \(X\) 的實例 \(w\),吐出 \(Y\) 的實例 \(f(w)\)。它全程不知道也不需要知道 \(w\) 的答案——它只負責改寫題目,讓「新題目在 \(Y\) 中的答案」恰好等於「舊題目在 \(X\) 中的答案」。真正回答問題的是後面 \(Y\) 的求解器:
答案原封不動照抄:\(Y\) 的求解器說 Yes 我們就答 Yes,說 No 就答 No。整個管線只呼叫 \(Y\) 一次、不翻轉答案——這是 \(\le_p\)(與 \(\le_m\))的特徵。
零件二:「\(\iff\)」必須雙向。
\[\underbrace{w\in X \Rightarrow f(w)\in Y}_{\text{Yes 送到 Yes}} \qquad\text{且}\qquad \underbrace{w\notin X \Rightarrow f(w)\notin Y}_{\text{No 送到 No}}.\] 少了第二半,管線會壞掉:\(Y\) 的求解器對 \(f(w)\) 說 Yes 時,你無法分辨是「\(w\) 真的屬於 \(X\)」還是「\(f\) 把 No 實例亂丟進 \(Y\)」。
取 \(f(w) \equiv\)(某個固定的 \(Y\) 之 Yes 實例),對所有 \(w\)。那麼「\(w\in X\Rightarrow f(w)\in Y\)」永遠成立——但這個 \(f\) 顯然沒有傳遞任何關於 \(w\) 的資訊:管線對每個輸入都答 Yes。可見單向條件太弱,弱到任何兩個問題之間都「歸約」得起來。雙向等價才逼著 \(f\) 把答案的「形狀」忠實搬運過去。
考試檢查歸約正確性時,永遠分開驗證兩個方向(見第 5 章模板 B)。
零件三:「多項式時間」防止翻譯器作弊。
若允許 \(f\) 花指數時間,\(f\) 可以自己暴力解掉 \(X\):算出 \(w\) 的答案後,輸出 \(Y\) 的某個固定 Yes 或 No 實例。這樣的「歸約」什麼都沒比較——翻譯器把工作全做完了。限制 \(f\) 是多項式時間,翻譯器就買不起「先解再翻」,只能做結構上的忠實改寫;於是 \(X\le_pY\) 才真的意味著「\(Y\) 的求解能力被借用了」。
多項式的另一個好處是封閉性:多項式 \(\circ\) 多項式 \(=\) 多項式,所以:
定理 3 (歸約的兩個基本性質;Week 2 引理 5.3).
傳遞性:\(X\le_pY\) 且 \(Y\le_pZ\) \(\Rightarrow\) \(X\le_pZ\)。
向上封閉:\(X\le_pY\) 且 \(Y\in \mathrm{P}\) \(\Rightarrow\) \(X\in \mathrm{P}\)。(把 \(f\) 接上 \(Y\) 的多項式求解器:多項式時間算 \(f(w)\),其輸出長度也是多項式,再花多項式時間求解——總時間仍是多項式。)
一正一反:歸約的兩種用法
定理 3(b) 是「正著用」;把它取逆否就得到「反著用」——後者才是 NP 理論的日常:
| 正用(借力:傳遞「容易」) | 反用(傳遞「困難」) | |
|---|---|---|
| 形式 | \(X\le_pY\),\(Y\) 容易 \(\Rightarrow\) \(X\) 容易 | \(X\le_pY\),\(X\) 難 \(\Rightarrow\) \(Y\) 難 |
| 方向感 | 容易沿著 \(\le\) 往左流 | 困難沿著 \(\le\) 往右流 |
| 用途 | 設計演算法(化歸為已解問題) | 證明 NP-hard(把已知難題歸約到新問題) |
| 例子 | 2SAT \(\le_p\) SCC 分析 \(\Rightarrow\) 2SAT \(\in\) P | \(\textsc{Sat}\le_p\textsc{Clique}\) \(\Rightarrow\) \(\textsc{Clique}\) 是 NP-hard |
\(X\le_pY\) 的 \(\le\) 就讀成「難度 \(\le\)」:左邊不比右邊難。
要證新問題 \(B\) 難 \(\Rightarrow\) 把已知難題放左邊:\(\text{難題}\le_pB\)。(難題的困難「灌」進 \(B\)。)
寫反了(\(B\le_p\text{難題}\))只證明「\(B\) 不比難題難」——這永遠是廢話,因為 NP 裡每個問題都 \(\le_p\) NP-complete 問題。
自我檢查口訣:歸約完成後,「被呼叫的求解器」屬於誰?屬於右邊 \(Y\)。你想白嫖誰的求解器來解難題,難題就要 \(\le\) 誰。
NP-hard、NP-complete 與 Cook–Levin
定義 4 (NP-hard 與 NP-complete). \(Y\) 是 NP-hard \(\iff\) 對每一個 \(X\in\mathrm{NP}\) 都有 \(X\le_pY\)。\(Y\) 是 NP-complete \(\iff\) \(Y\in\mathrm{NP}\) 且 \(Y\) 是 NP-hard。
「每一個 NP 問題」有無窮多個,不可能逐一歸約——這就是 Cook–Levin 定理(\(\textsc{Sat}\) 是 NP-complete)偉大的地方:它一次對付了全部(把任意 NP 機器的計算表編成布林公式)。此後要證 \(B\) 是 NP-hard,只需一條 \(\textsc{Sat}\le_pB\)(或任何已知 NP-complete 問題 \(\le_pB\)),再靠傳遞性收工。這是「反用」的制度化。
完整小例子:把定義的每個零件踩過一遍
玩具例(看格式):\(X=\{\text{二進位偶數}\}\),\(Y=\{\text{二進位奇數}\}\)。取 \(f(w)=w+1\)(二進位加法)。 (i)\(f\) 多項式時間可計算 ;(ii)\(w\) 是偶數 \(\iff w+1\) 是奇數 ——雙向成立。故 \(X\le_pY\)。雖然內容平凡,但考試論證歸約時要寫的就是這兩張支票:\(f\) 快、\(\iff\) 雙向。
課程主例(看實戰):\(\textsc{Sat}\le_p\textsc{Clique}\)。給定 CNF 公式 \(F=C_1\land\cdots\land C_k\),\(f\) 輸出圖 \(G_F\) 與整數 \(k\):每個子句的每個文字出現當一個頂點;兩頂點連邊 \(\iff\) 不同子句且不互為否定(\(X\) 與 \(\lnot X\))。 (i)\(f\) 只是逐對檢查文字、畫 \(O((nk)^2)\) 條邊——多項式 ;(ii)\(F\) 可滿足 \(\iff G_F\) 有 \(k\)-團——雙向論證正是 Exercises 第二部分 Q3 與本教材模板 B(第 5.2 節)的內容。
常見誤解清單
| 誤解 | 矯正 |
|---|---|
| 「\(f\) 要能解出 \(X\) 的答案」 | \(f\) 只翻譯實例,不知道答案;知道答案的是 \(Y\) 的求解器。 |
| 「只要 Yes 映到 Yes 就夠了」 | 必須同時 No 映到 No(雙向 \(\iff\)),否則歸約報廢(見反例)。 |
| 「\(f\) 要是一一對應」 | 不需要。多對一完全合法(mapping reduction 舊名就叫 many-one reduction);\(Y\) 中也可以有實例沒被任何 \(w\) 映到。 |
| 「\(X\le_pY\) 且 \(X\in\mathrm{P}\),所以 \(Y\in\mathrm{P}\)」 | 方向用反了。容易往左傳、困難往右傳。 |
| 「歸約時可以呼叫 \(Y\) 求解器很多次、還可以把答案反過來」 | 那是圖靈歸約。\(\le_p\)/\(\le_m\) 只准呼叫一次且答案照抄——正因限制更嚴,它能證明更細緻的結論(如非 C.E.,見第 4 章)。 |
| 「NP-hard \(=\) NP-complete」 | NP-hard 不要求自己在 NP 內(例如停機問題是 NP-hard 卻不可判定);NP-complete \(=\) NP-hard \(\cap\) NP。 |
2019 年 1 月 Q2:Cook–Levin 定理說什麼?——「\(\textsc{Sat}\) 是 NP-complete」(答案 D)。干擾項 A「每個圖靈機問題都可歸約到 SAT」錯在範圍:只有 NP 中的問題保證可歸約到 SAT。
2019 年 1 月 Q13(a):「\(\textsc{Sat}\) 可多項式歸約到 \(\textsc{Clique}\) 是什麼意思?」——照定義 2 寫出:存在多項式時間可計算的 \(f\),使 \(\varphi\) 可滿足 \(\iff f(\varphi)\) 有 \(k\)-團;並補一句意義(若 CLIQUE 有快演算法則 SAT 也有)。4 分到手。
2019 年 1 月 Q12(c):\(\textsc{Sat}\le_p3\textsc{Sat}\)——描述子句切割、論證等可滿足性(雙向!)與多項式時間、終止性。
2020 年 1 月 Q2:直接考歸約定義的條件挑選(可計算+雙向 \(\iff\);答案 B、D)——注意那題問的是一般映射歸約,「\(f\) 是多項式」反而是不必勾的選項。這正是下一章的主題。
Week 11:映射歸約 \(A\le_mB\),與 \(\le_p\) 的對照
定義:把 \(\le_p\) 的「多項式」放寬成「可計算」
定義 5 (映射歸約). 從問題 \(A\) 到問題 \(B\) 的映射歸約(mapping reduction)是一個可計算函數 \(f:\Sigma^*\to\Sigma^*\)(存在必停機的圖靈機,對每個 \(w\) 算出 \(f(w)\)),使得對所有 \(w\): \[w\in A \iff f(w)\in B.\] 記作 \(A\le_mB\)。
跟定義 2 逐字比對,唯一的差別是對 \(f\) 的資源要求:\(\le_p\) 要求多項式時間,\(\le_m\) 只要求「算得出來」(有限時間即可,多慢都行)。為什麼可以放寬?因為兩套理論關心的貨幣不同:
| 多項式歸約 \(\le_p\)(Week 2) | 映射歸約 \(\le_m\)(Week 11) | |
|---|---|---|
| 所屬理論 | 複雜度理論:能不能快速解 | 可計算性理論:能不能在有限時間解 |
| 對 \(f\) 的要求 | 多項式時間可計算 | 可計算(不限時間) |
| 傳遞的「容易」 | \(B\in\mathrm{P}\Rightarrow A\in\mathrm{P}\) | \(B\) 可判定 \(\Rightarrow A\) 可判定;\(B\) 是 C.E. \(\Rightarrow A\) 是 C.E. |
| 反用傳遞的「困難」 | \(A\) NP-hard \(\Rightarrow B\) NP-hard | \(A\) 不可判定 \(\Rightarrow B\) 不可判定;\(A\) 非 C.E. \(\Rightarrow B\) 非 C.E. |
| 基準難題 | \(\textsc{Sat}\)(Cook–Levin) | \(\textsc{Halt}_{\mathrm{TM}}\)、\(A_{\mathrm{TM}}\)(對角線論證) |
| 共同點 | 雙向 \(\iff\);呼叫求解器恰一次、答案照抄;具傳遞性 | |
在可計算性的世界裡,「多項式 vs 指數」的差別根本不入帳——那裡的敵人是無限(不停機),不是很慢。所以把 \(f\) 的門檻降到可計算即可;相對地,結論也從「P 裡外」升級成「可判定與否、C.E. 與否」。
基本定理與實戰形式
定理 6 (Week 11 定理). 若 \(A\le_mB\) 且 \(B\) 可判定,則 \(A\) 可判定。
證明(就是那條管線). 設 \(M_B\) 是 \(B\) 的判定器(S\(+\)C\(+\)T)。定義 \(M_A(w) =\)「算 \(f(w)\),執行 \(M_B(f(w))\),照抄答案」。\(f\) 可計算(必停)、\(M_B\) 必停,故 \(M_A\) 必停;且 \(M_A(w)=\text{Yes} \iff f(w)\in B \iff w\in A\)。三屬性齊備。 ◻
推論 7 (實戰形式(逆否)). 若 \(A\le_mB\) 且 \(A\) 不可判定,則 \(B\) 不可判定。
遞移性:\(A\le_mB\)、\(B\le_mC\) \(\Rightarrow\) \(A\le_mC\)。
保 C.E.:\(A\le_mB\) 且 \(B\) 是 C.E. \(\Rightarrow\) \(A\) 是 C.E.。逆否:\(A\) 非 C.E. \(\Rightarrow\) \(B\) 非 C.E.——這是證明「連半個演算法都沒有」的唯一常規武器。
補集:\(A\le_mB \iff \overline{A}\le_m\overline{B}\)(同一個 \(f\),等價式取逆否)。只能兩邊同時取補,不能單邊!(單邊取補等於要翻轉答案,映射歸約不允許。)
方向莫反:要證 \(B\) 難,需要「難題 \(\le_mB\)」,不是「\(B\le_m\) 難題」。(與 \(\le_p\) 的方向心法完全相同。)
實戰一:\(\textsc{Halt}_{\mathrm{TM}}\le_mA_{\mathrm{TM}}\)(「拒絕改接受」)
目標:已知 \(\textsc{Halt}_{\mathrm{TM}}\) 不可判定,證明接受問題 \(A_{\mathrm{TM}}=\{\langle\mathrm{code}(M),w\rangle : M \text{ 接受 } w\}\) 不可判定。要造可計算的 \(f\) 使 \(\langle\mathrm{code}(M),w\rangle\in\textsc{Halt}_{\mathrm{TM}}\iff f(\langle\mathrm{code}(M),w\rangle)\in A_{\mathrm{TM}}\)。
改造機器:對任意 \(M\),建構 \(M'\)——把 \(M\) 的拒絕出口改接到接受:
於是 \(M'\) 接受 \(w\) \(\iff\) \(M\) 在 \(w\) 上停機(不論停成接受還是拒絕);\(M\) 不停則 \(M'\) 也不停(不接受)。
歸約函數:\(f(\langle\mathrm{code}(M),w\rangle) = \langle\mathrm{code}(M'),w\rangle\)。\(f\) 只做語法改寫(把轉移表中指向 \(q_{\mathrm{reject}}\) 的箭頭改指 \(q_{\mathrm{accept}}\)),顯然可計算。雙向等價: \[\langle\mathrm{code}(M),w\rangle\in\textsc{Halt}_{\mathrm{TM}}\iff M' \text{ 接受 } w \iff \langle\mathrm{code}(M'),w\rangle\in A_{\mathrm{TM}}.\] 由推論 7,\(A_{\mathrm{TM}}\) 不可判定。\(\blacksquare\)
實戰二:\(A_{\mathrm{TM}}\le_m\overline{E}_{\mathrm{TM}}\)(「寫死輸入」——歸約的萬用招)
目標:證明非空問題 \(\overline{E}_{\mathrm{TM}}=\{\mathrm{code}(M) : L(M)\ne\emptyset\}\) 不可判定。注意兩邊的實例形狀不同:\(A_{\mathrm{TM}}\) 的實例是「一對」\(\langle\mathrm{code}(M),w\rangle\),\(\overline{E}_{\mathrm{TM}}\) 的實例是「一台機器」。\(f\) 要把一對變一台——方法是把 \(w\) 燒進程式:
\(M_w\) 無視自己的輸入 \(u\),永遠模擬同一件事 \(M(w)\)。所以它的語言只有兩個極端: \[L(M_w)= \begin{cases} \Sigma^{*} & \text{若 } M \text{ 接受 } w \quad(\text{每個 } u \text{ 都被接受})\\ \emptyset & \text{否則} \quad(\text{沒有任何 } u \text{ 被接受}) \end{cases} \qquad\Longrightarrow\qquad L(M_w)\ne\emptyset \iff M \text{ 接受 } w.\]
歸約函數:\(f(\langle\mathrm{code}(M),w\rangle)=\mathrm{code}(M_w)\)。\(f\) 可計算:把「清空磁帶、抄入常數 \(w\)」這段固定程式接在 \(M\) 的程式前面——純語法組裝,不需執行 \(M\)。雙向等價如上。由推論 7,\(\overline{E}_{\mathrm{TM}}\) 不可判定;再由「可判定性對補集封閉」,\(E_{\mathrm{TM}}\) 也不可判定。\(\blacksquare\)
備註 8 (這一招的威力). 「寫死輸入」把「一對 \(\langle\)機器, 輸入\(\rangle\) 的問題」轉成「單一機器的語意性質問題」,是連接 \(A_{\mathrm{TM}}\) 與空性、全性、正規性、等價性等所有語意性質的橋樑(Rice 定理的核心)。2020 年 1 月 Q11(a) 考的就是一模一樣的建構(該卷把 \(\overline{E}_{\mathrm{TM}}\) 記作 \(E_{TM}=\{\langle M\rangle : L(M)\ne\emptyset\}\))。
考場上的歸約題怎麼寫:五步驟
宣告目標:「已知 \(A\) 不可判定。建構可計算的 \(f\) 使 \(w\in A \iff f(w)\in B\),即 \(A\le_mB\)。」
描述改造機器(\(f\) 的輸出):文字或流程圖皆可;點名用到的元件(萬能模擬、寫死輸入、改接出口……)。
論證 \(f\) 可計算(\(\le_p\) 則論證多項式):強調 \(f\) 只做語法組裝、不執行被改造的機器——這是「\(f\) 必停」的理由。
驗證雙向:Yes 方向與 No 方向分開寫,各一兩句。(No 方向常被忘記——扣分重災區。)
收尾引用逆否:「若 \(B\) 可判定,管線 \(M_B\circ f\) 就判定了 \(A\),矛盾;故 \(B\) 不可判定。」
Exercises 第二部分 Q1/Q3/Q11:三個可遷移的作答模板
這三題卡住的感覺通常不是「算不出來」,而是「不知道這種題目標準答案長什麼樣子」。好消息:它們分別代表三種題型,每種都有固定的作答骨架,而且 2019/2020 年真題各有一題可以直接套。共同心法先講在前面:
這三種題型的標準答案,都是一句「量詞句」:
存在(某個演算法/某條分支/某個團) \(+\) 保證什麼 \(+\) 對所有(輸入/子句/實例)。
失分幾乎都發生在漏掉量詞:忘了說「存在」、忘了說「對所有實例」、忘了把「每個子句」都顧到。寫答案前先問自己:我的句子裡「存在」跟「對所有」都出現了嗎?
模板 A(Q1 型):證明問題屬於 NP——「猜、驗、對、快」
題目長相:「Show that \(X\) belongs to NP by describing a non-deterministic algorithm that runs in polynomial time.」或「證明 \(X\in\) NP」。——Exercises 第二部分 Q1(\(\textsc{Subset-Sum}\))、2019 年 1 月 Q13(d)(\(\textsc{Clique}\))、2020 年 1 月 Q13(a)(\(\textsc{HamCycle}\))全是這一型。
四步骨架。
猜(Guess,非確定性步驟):非確定性地產生一個「候選解」(=證書)。說清楚猜的物件是什麼、長度為何是輸入的多項式。
驗(Verify,確定性步驟):在單一分支內,用普通的確定性程序檢查候選解是否真的是解。列出檢查的每一項。
對(正確性,兩句話):Yes 實例 \(\Rightarrow\) 存在某分支猜中真的解並通過驗證(完備);No 實例 \(\Rightarrow\) 沒有任何候選解能通過驗證,所有分支拒絕(健全)。
快(時間分析):只需論證「每一條分支」是多項式時間——猜的步數 \(+\) 驗的步數。分支總數可以是指數(\(2^n\) 條),完全沒關係;NP 的定義只管單一分支的深度,不管樹有多寬。
直覺上「要檢查 \(2^n\) 個子集」怎麼會是多項式?——因為沒有任何一條分支檢查 \(2^n\) 個子集。非確定性機器把 \(2^n\) 個候選「攤平」到 \(2^n\) 條平行的分支上,每條分支只處理自己那一個候選(\(n\) 次加法)。官方參考答案的原話:「有 \(2^n\) 個可能子集,這不是多項式;但非決定性機器可以平行地檢查每個子集,每個平行處理器最多只需做 \(n\) 次加法,花多項式時間。」——把「猜」想成「免費拿到一個候選」,把「驗」想成「只驗這一個」,心結就開了。
示範作答(Q1 原題:\(\textsc{Subset-Sum}\in\) NP)。
輸入:整數集 \(S=\{a_1,\dots,a_n\}\) 與目標 \(k\)。
猜:對每個 \(i=1,\dots,n\) 非確定性地決定「\(a_i\) 放不放進 \(S'\)」——\(n\) 個二選一,產生候選子集 \(S'\)(證書長度 \(n\) 位元)。
驗:計算 \(\sum_{a\in S'}a\)(至多 \(n\) 次加法),檢查是否等於 \(k\);相等則接受,否則本分支拒絕。
對:若存在和為 \(k\) 的子集,「恰好猜中它」的那條分支會接受(完備);若不存在,每條分支的和都 \(\ne k\),全部拒絕(健全)。
快:每條分支做 \(n\) 次選擇、\(n\) 次加法、一次比較;整數以 \(m\) 位元計,單分支 \(O(nm)\)——輸入長度的多項式。\(\blacksquare\)
遷移到真題。
同一骨架,只換「猜什麼、驗什麼」:
| 問題 | 猜什麼(證書) | 驗什麼 | 單分支時間 |
|---|---|---|---|
| \(\textsc{Subset-Sum}\)(Ex. Q1) | 子集 \(S'\subseteq S\) | \(\sum_{a\in S'} a = k\) | \(O(nm)\) |
| \(\textsc{Clique}\)(2019 Q13d) | \(k\) 個頂點 \(C\subseteq V\) | \(C\) 中每一對頂點都相鄰 | \(\binom{k}{2}\le O(n^2)\) 次查邊 |
| \(\textsc{HamCycle}\)(2020 Q13a) | 頂點排列 \(v_1,\dots,v_n\) | 相鄰者(含 \(v_n v_1\))都有邊、無重複 | \(O(n^2)\) |
| \(\textsc{Sat}\) | 真值指派 | 逐子句代入求值 | \(O(|F|)\) |
「猜」與「驗」要分成兩個階段寫清楚——驗證階段裡不准再有非確定性。
正確性兩個方向都要寫(Yes 有分支接受;No 全分支拒絕)。
時間分析點明「每一條分支多項式」,並且(加分)補一句「分支總數與 NP 定義無關」。
等價寫法:用「證書 \(+\) 驗證器」語言作答同樣滿分——證書=猜的東西,驗證器=驗的程序;兩種觀點考官都接受(Ex. Q1 詳解的背景欄有此對照)。
模板 B(Q3 型):解釋歸約為什麼正確——「恰取一、不矛盾、可指派、全滿足」
題目長相:「Explain why the existence of a clique of size \(k\) guarantees that there is a satisfying assignment.」——Exercises 第二部分 Q3、2019 年 1 月 Q13(c)(幾乎逐字相同);HAM 版本的兄弟題是 2020 年 1 月 Q13(c)(d)。本質:驗證歸約定義裡「\(\iff\)」的某一個方向。
背景(三十秒回顧建圖規則)。
\(\textsc{Sat}\le_p\textsc{Clique}\) 的圖 \(G_F\):每個子句的每個文字出現=一個頂點;連邊 \(\iff\)(i)不同子句且(ii)不互為否定。\(k=\) 子句數。兩條「禁止連邊」的規則,等一下每條各變成論證的一步——這是這類題的通用心法:把建構規則逐條翻譯成論證步驟。
四步骨架(「\(k\)-團 \(\Rightarrow\) 滿足指派」方向)。
恰取一:同子句內部無邊(規則 i),而團要求兩兩相鄰 \(\Rightarrow\) 團中沒有兩個頂點同子句;團有 \(k\) 個頂點、圖恰有 \(k\) 個子句 \(\Rightarrow\) 由鴿籠原理,每個子句恰貢獻一個頂點。
不矛盾:互為否定的文字之間無邊(規則 ii)\(\Rightarrow\) 團中不可能同時出現 \(X\) 與 \(\lnot X\)。
可指派:把團中文字統統設為真——\(X\in C\) 令 \(X=\)True、\(\lnot X\in C\) 令 \(X=\)False,未提及的變數任意。由第 2 步,同一變數不會收到矛盾指令 \(\Rightarrow\) 指派良定義。
全滿足:由第 1 步,每個子句都有一個文字被設為真;子句是析取(or),一真則句真 \(\Rightarrow\) \(k\) 個子句全真 \(\Rightarrow\) \(F\) 為真。\(\blacksquare\)
把骨架「看」出來。
下圖是 Exercises Q2/Q3 的九頂點圖(\(F=(P\lor\lnot Q\lor R)\land(P\lor Q\lor\lnot R)\land(\lnot P\lor Q\lor R)\)),紅色粗邊是一個 3-團 \(\{P_{c_1},\,Q_{c_2},\,R_{c_3}\}\):
紅色團一子句一頂點(恰取一 )、沒有互否對(不矛盾 )\(\Rightarrow\) 指派 \(P=Q=R=\)True(可指派 )\(\Rightarrow\) 三個子句分別靠 \(P\)、\(Q\)、\(R\) 為真(全滿足 )。四步在圖上一眼看完。
反方向(「可滿足 \(\Rightarrow\) 有 \(k\)-團」)也備著。
考題若問另一個方向(歸約完整證明需要雙向):設 \(\sigma\) 是滿足指派,每個子句至少有一個真文字,各挑一個,得 \(k\) 個頂點。它們兩兩相鄰:跨不同子句(規則 i 通過);且同時為真的文字不可能互為否定(規則 ii 通過)。故構成 \(k\)-團。——注意論證恰好把兩條建圖規則再各用一次。
官方參考答案只點名前兩步(恰取一、不矛盾),但完整拿分建議把四步寫全——「指派良定義」與「每個子句被滿足」是把圖的語言翻回邏輯的語言的關鍵句。
2019 Q13(c) 可直接套用本模板全文。2020 Q13(c)(d)(HAM 版)的對應詞典:「每個子句恰取一文字」\(\leftrightarrow\)「每個菱形鏈只能整條同向走完」;「文字不矛盾」\(\leftrightarrow\)「繞道方向與鏈方向相容」;本質仍是「結構條件 \(\leftrightarrow\) 邏輯條件」的雙向翻譯。
通用心法:建構規則有幾條「禁止」,論證就有幾步「因此不可能」。寫論證前先把建圖規則列出來,再逐條轉寫。
模板 C(Q11 型):近似性定義題——「存在、上界、對所有」
題目長相:「What does it mean to say that \(X\) is \(r\)-approximable / 2-approximable / unapproximable?」——Exercises 第二部分 Q11、2019 年 1 月 Q8(\(r\)-approximable 選擇題)、2020 年 1 月 Q6(unapproximable 選擇題)。
定義三件套。
以最小化問題為例,「\(X\) 是 \(r\)-approximable(\(r\ge 1\))」的標準答案由三個零件組成,一件都不能少:
| 零件 | 防的錯 | |
|---|---|---|
| 存在一個多項式時間演算法 \(\mathcal{A}\) | 不是「每個演算法都達標」;漏掉「多項式時間」則窮舉也算——定義失效 | |
| 回傳可行解,品質上界:\(\mathcal{A}(I)\le r\cdot\mathrm{OPT}(I)\) | \(r\) 是解品質的倍率,不是疊代次數;比較對象是全域最佳解,不是其他演算法 | |
| 對所有實例 \(I\) 成立 | 是最壞情況保證——不能只對某些輸入、也不是平均而言 |
示範作答(Q11 原題:Metric TSP 是 2-approximable)。
「存在一個多項式時間的演算法 \(\mathcal{A}\),使得對 Metric TSP 的每一個實例 \(I\),\(\mathcal{A}\) 回傳一條合法路線,其長度至多是該實例最佳路線長度的兩倍:\(\mathrm{cost}(\mathcal{A}(I))\le 2\cdot\mathrm{OPT}(I)\)。」
三件套逐一到位: 存在+多項式時間、 \(\le 2\cdot\mathrm{OPT}\)、 每一個實例。若題目再問「為什麼做得到」,補 MST 三步(MST \(\le\mathrm{OPT}\);沿樹來回走 \(\le 2\cdot\)MST;三角不等式保證抄捷徑不變長)。
變體一(2019 Q8,\(r\)-approximable 選擇題)。
四個選項各踩壞一個零件:A「不存在多項式精確演算法」——答非所問(那是難度敘述,不是近似保證);B「\(r\) 次疊代後回傳最佳解」——把 \(r\) 誤當疊代次數,踩壞 ;C「每個演算法的近似比都 \(\ge r\)」——量詞方向全反(那是不可近似下界),踩壞 ;D 正確。用三件套當檢查表,選擇題變成核對題。
變體二(2020 Q6,unapproximable)。
「不可近似」就是對定義做全稱否定: \[\text{對\emph{每一個}固定 } r\ge 1\text{:都\emph{不存在}近似比 } r \text{ 的多項式時間演算法(假設 P}\ne\text{NP)。}\] 注意否定後量詞翻轉:「存在一個 \(r\) 使……」是不夠格的答案。經典例子:一般(非 Metric)TSP unapproximable——若有任何常數比近似,就能多項式時間解 \(\textsc{HamCycle}\),逼出 P\(=\)NP。
官方答案點名的三個關鍵字正是三件套:存在這樣的演算法、兩倍最佳解的上界、對所有可能輸入實例皆成立。
多寫一句「隱含要求多項式時間,否則窮舉可得最佳解、近似失去意義」通常有加分效果。
最大化問題的版本要會鏡射:\(\mathcal{A}(I)\ge \mathrm{OPT}(I)/r\)(品質下界)。
三個模板的合影
| 模板 A:\(X\in\) NP | 模板 B:歸約正確性 | 模板 C:近似性定義 | |
|---|---|---|---|
| 考的能力 | 寫非確定性演算法 | 把建構規則翻成論證 | 精準複述量詞定義 |
| 骨架 | 猜、驗、對、快 | 恰取一、不矛盾、可指派、全滿足 | 存在、上界、對所有 |
| 關鍵量詞 | 存在分支接受;所有分支多項式 | 每個子句恰取一 | 存在演算法;對所有實例 |
| 本卷出處 | Ex. II-Q1 | Ex. II-Q3 | Ex. II-Q11 |
| 真題對應 | 2019 Q13d、2020 Q13a | 2019 Q13c、2020 Q13cd | 2019 Q8、2020 Q6 |
速查表與自我測驗
一頁速查表
| 主題 | 一句話 |
|---|---|
| S / C / T 的文法 | 三個屬性形容演算法;問題的分類由「存在怎樣的演算法」定義。 |
| 可判定 | 存在 sound \(+\) complete \(+\) terminating 的演算法。 |
| r.e.(C.E./可辨識) | 存在 sound \(+\) complete 的演算法(可不 terminating)。 |
| 停機問題的定位 | 是 C.E.(模擬給 Yes 端有限證據)、不可判定(對角線);補問題連 C.E. 都不是。 |
| 兩層停機 | 內層=被問的 \(M\) 停不停(題目內容);外層=解題演算法停不停(terminating 屬性)。 |
| 多項式歸約 \(X\le_pY\) | 多項式時間可計算的 \(f\),\(w\in X\iff f(w)\in Y\);「\(X\) 不比 \(Y\) 難」。 |
| 映射歸約 \(A\le_mB\) | 同上但 \(f\) 只需可計算;用於不可判定性/非 C.E.。 |
| 方向心法 | 容易往左流、困難往右流;要證 \(B\) 難:難題 \(\le_mB\)。 |
| 雙向 \(\iff\) | Yes\(\mapsto\)Yes 且 No\(\mapsto\)No,分開驗證;單向的 \(f\) 沒有資訊量。 |
| 多項式限制的用意 | 防止 \(f\)「先解再翻」作弊;且保證管線合成後仍多項式。 |
| 寫死輸入 | 把 \(w\) 燒進程式得 \(M_w\),\(L(M_w)\in\{\Sigma^*,\emptyset\}\)——連接 \(A_{\mathrm{TM}}\) 與語意性質。 |
| NP 證明(模板 A) | 猜(多項式長證書)、驗(確定性多項式)、對(雙向)、快(每分支多項式)。 |
| 歸約正確性(模板 B) | 建構規則逐條翻譯:恰取一、不矛盾、可指派、全滿足。 |
| 近似性定義(模板 C) | 存在多項式演算法、\(\le r\cdot\mathrm{OPT}\)、對所有實例;unapproximable=全稱否定。 |
自我測驗(八題)
「停機問題是 terminating 的」這句話哪裡有毛病?把它改寫成一個合法且答案為「否」的問題、以及一個合法且答案為「是」的問題。
為什麼「用萬能圖靈機模擬 \(M(w)\)」證明了 \(\textsc{Halt}_{\mathrm{TM}}\) 是 C.E.,卻證明不了 \(\textsc{Halt}_{\mathrm{TM}}\) 可判定?
定義 \(X\le_pY\) 的三個零件是什麼?各防什麼弊?
你的同學寫道:「\(B\le_p\textsc{Sat}\),而 \(\textsc{Sat}\) 是 NP-complete,所以 \(B\) 是 NP-hard。」哪裡錯了?
\(\le_m\) 與 \(\le_p\) 唯一的定義差別是什麼?為什麼可計算性理論不需要「多項式」?
用「寫死輸入」造出的 \(M_w\),它的語言為什麼只有 \(\Sigma^*\) 與 \(\emptyset\) 兩種可能?這件事在 \(A_{\mathrm{TM}}\le_m\overline{E}_{\mathrm{TM}}\) 中扮演什麼角色?
用模板 A 證明 \(\textsc{Clique}\in\) NP(四步都要寫)。
「Metric TSP 是 2-approximable」與「一般 TSP 是 unapproximable」,兩句話的量詞結構各是什麼?
參考解答提示
類別錯誤:terminating 形容演算法。合法問題(答案否):「存在 S\(+\)C\(+\)T 的演算法判定 \(\textsc{Halt}_{\mathrm{TM}}\) 嗎?」(不可判定)。合法問題(答案是):「存在 S\(+\)C 的演算法辨識 \(\textsc{Halt}_{\mathrm{TM}}\) 嗎?」(模擬;C.E.)。
模擬對 Yes 實例有限步內回答,故 sound \(+\) complete;但對「\(M\) 不停」的輸入自己也不停,不 terminating——而可判定需要三者兼備。
\(f\) 是翻譯器(不解題);雙向 \(\iff\)(單向無資訊量,見固定 Yes 實例反例);\(f\) 多項式(防「先解再翻」、保證合成封閉)。
方向反了。\(B\le_p\textsc{Sat}\) 只說明 \(B\) 不比 \(\textsc{Sat}\) 難(NP 中人人如此)。要證 \(B\) 是 NP-hard 需要 \(\textsc{Sat}\le_pB\)。
\(\le_p\) 要求 \(f\) 多項式時間、\(\le_m\) 只要求可計算。可計算性理論的敵人是「不停機」而非「很慢」,故資源門檻只需「有限時間」。
\(M_w\) 無視輸入,行為與輸入無關:要嘛全接受(\(M\) 接受 \(w\))要嘛全不接受。於是「\(L(M_w)\ne\emptyset\)」與「\(M\) 接受 \(w\)」畫上等號——把「一對」的問題翻譯成「一台機器」的問題。
猜:非確定性選 \(k\) 個頂點(證書 \(O(k\log n)\) 位元);驗:檢查 \(\binom{k}{2}\) 對是否皆相鄰;對:有 \(k\)-團則猜中的分支接受、無則全拒絕;快:單分支 \(O(n^2)\) 次查邊。
前者:存在一個多項式演算法,對所有實例回傳 \(\le 2\cdot\mathrm{OPT}\)。後者(全稱否定):對每個固定 \(r\ge1\),不存在多項式 \(r\)-近似演算法(假設 P\(\ne\)NP)。
參考資料
本課程教材:Week 2〈P 與 NP〉(定義 5.1–5.2、引理 5.3)、Week 10〈學習教材〉第 3、6 節、Week 11〈可計算枚舉與映射歸約〉。
本課程 Exercises 詳解:第二部分 Q1、Q2、Q3、Q11。
歷屆試題:5CCS2FC2 January 2019(Q1, Q2, Q8, Q11, Q12c, Q13)、January 2020(Q1, Q2, Q6, Q11, Q13)及本資料夾內對應詳解。
M. Sipser, Introduction to the Theory of Computation, 3rd ed.(第 4、5、7 章)。
J. Kleinberg, É. Tardos, Algorithm Design(第 8 章:多項式歸約)。