歸約方向(reduction direction)
方向是每個「難度證明」成敗的關鍵細節,也是仔細的學生仍會出錯的地方。口號是:要證明你的問題 B 很難,就把一個已知很難的問題 A 歸約到 B,而不是把 B 歸約到 A。可以想成借力。如果一位強壯的朋友(已知很難的問題)唯有把槓鈴交給你才能舉起任何重量,那你至少得和他一樣強。是你在舉;他的力量流經了你。
把邏輯攤開來看。假設 A 已知不可判定,而你建造了一個歸約 A <= B。這個歸約意味著:一個 B 的解法將產生一個 A 的解法。但 A 沒有解法。因此 B 也不可能有解法,所以 B 不可判定。已知很難的問題 A 是源頭,你的目標問題 B 是終點,難度由 A 流入 B。現在把它反過來,看看為何錯誤方向什麼也證不出:若你改成證明 B <= A,你只證明了 A 能解 B,而既然 A 不可解,這對 B 完全沒說明任何事。你只得知 B 不比某個不可能的東西更難——一句空話。
可靠的口訣:從你已知很難的問題出發(FROM),歸約到你想定罪的新問題(TO)。被翻譯掉的永遠是那個已知很難的問題;新嫌疑犯永遠是終點。用 <= 符號表達,你要的是 A <= B,其中 A 是已確立為難的問題。之後的 NP 完全也受同樣的紀律支配:你把一個已知的 NP 完全問題(如 3-SAT)歸約到新候選者,以證明候選者是 NP 困難;改變的只是被追蹤的資源。
要證明空集問題 E_TM(機器 M 是否什麼都不接受?)不可判定,你把已知不可判定的 A_TM 歸約到它:A_TM <= E_TM。你不會去做 E_TM <= A_TM,那只會顯示 E_TM 不比一個不可解問題更難,對 E_TM 什麼也證不出。
難度由已知很難的源頭流入你的新目標:把 A(難)歸約到 B。
搞錯方向是頭號錯誤。永遠自問:我是不是把已知很難的問題翻譯成我的新問題?若你把新問題翻譯成那個難問題,對新問題你什麼也沒證明。