Proving NP-Completeness

Proving NP-Completeness的重點整理。

1. Polynomial-Time Reduction

定義 (\(A \le_p B\))

若我們說語言 (Language) \(A\) 可以 Reduction 到語言 \(B\) (\(A \le_p B\)),必須滿足以下條件:

  1. 轉換函數 (Transformation):

    存在一個函數 \(f : \Sigma^* \to \Sigma^*\)。

  2. 效率 (Efficiency):

    \(f\) 必須是 多項式時間可計算的 (Polynomial-time computable)。

  3. 若且唯若 (If and only if):

    對於所有的輸入 \(w\):

    \[w \in A \iff f(w) \in B\]

    • 如果 \(w\) 是問題 \(A\) 的 Yes 實例,則轉換後的 \(f(w)\) 必須是問題 \(B\) 的 Yes 實例。

    • 如果 \(w\) 是問題 \(A\) 的 No 實例,則轉換後的 \(f(w)\) 必須是問題 \(B\) 的 No 實例。


2. Steps to Prove NP-Completeness

01-2. Steps to Prove NP-Completeness

重要前提 (Premise)

在證明開始前,我們必須確立證明的核心邏輯:

如果我們能證明一個已知的 NPC 問題 \(C\) 可以 Reduction 到新問題 \(L\) (\(C \le_p L\)),且 \(L\) 本身屬於 NP,那麼 \(L\) 也是 NPC。

邏輯:\(L\) 至少跟 \(C\) 一樣難。

02-重要前提 (Premise)

\(L \in \text{NP-Complete} \iff (L \in \text{NP}) \text{ 且 } (L \in \text{NP-hard})\)

意思:要證明 \(L\) 是 NP-Complete,必須同時做到「\(L\) 在 NP」與「\(L\) 是 NP-hard」。

證明 \(L\) 屬於 NPC 的步驟如下:

Prove \(L \in \text{NP}\)

  • 目標:證明存在 certificate \(y\) 與 verification algorithm \(V\),使得對所有輸入 \(x\):

    • 若 \(x \in L\)(YES instance),則存在某個 \(y\) 讓 \(V(x,y)=1\)。

    • \(V(x,y)\) 的執行時間是 polynomial time(多項式時間)。

  • 直覺:

    • \(y\) 是「證據/候選解」(例如 SAT 的 assignment、HAM-CYCLE 的一條迴圈)。

    • \(V\) 是「檢查器」,只負責快速檢查這個證據是否真的讓答案為 YES。

  • 你在寫證明時通常要交代:

    • \(y\) 的格式是什麼、長度如何被 \(|x|\) 的多項式上界住。

    • \(V\) 怎麼檢查、為什麼是多項式時間。

Prove \(L \in \text{NP-hard}\) (\(C \le_p L\))

  • 核心:從一個已知 NP-Complete 的問題 \(C\) 出發,證明你能把 \(C\) 的任意 instance 在 polynomial time 內轉成 \(L\) 的 instance,且答案不變。
  1. Select a known NPC problem \(C\)

    選擇一個已知 NP-Complete 的問題當起點(例如 CIRCUIT-SAT、3-CNF-SAT、CLIQUE、VERTEX-COVER)。

  2. Construct a reduction \(f\) transforming every instance of \(C\) to an instance of \(L\)

    建構一個轉換函數 \(f\):輸入 \(x\)(屬於 \(C\) 的 instance),輸出 \(f(x)\)(屬於 \(L\) 的 instance)。

    直覺:\(f\) 就是一個「翻譯器」,把 \(C\) 的題目翻成 \(L\) 的題目。

  3. Prove that \(x \in C\) if and only if \(f(x) \in L\) for all \(x \in \{0,1\}^*\)

    這一步是 reduction 正確性的核心(答案保持一致):

    • \((\Rightarrow)\) 若 \(x \in C\)(原題 YES),則 \(f(x) \in L\)(翻譯後也 YES)。

    • \((\Leftarrow)\) 若 \(f(x) \in L\)(翻譯後 YES),則 \(x \in C\)(原題也 YES)。

    • 簡單講:翻譯前後的 YES/NO 不能被你翻到走鐘。

  4. Prove that \(f\) is a polynomial-time transformation

    證明 \(f\) 的計算時間是 \(\text{poly}(|x|)\)。

    常見寫法:說明 \(f(x)\) 的輸出大小是 \(\text{poly}(|x|)\),且建構每個部件只花多項式時間,因此總時間是多項式。

結論

若第 3 點完成(\(L \in \text{NP}\)),且第 4 點完成(\(C \le_p L \Rightarrow L\) NP-hard),則可推出 \(L\) 是 NP-Complete。


3. 證明方向圖解

在證明 \(B\) 是 NPC 時,Reduction 的方向至關重要,絕對不能搞反。

\[Known\ NPC\ Problem\ (A) \xrightarrow{Reduction\ f} New\ Problem\ (B)\]

  • 正確:\(A \le_p B\) (證明 \(B\) 至少跟 \(A\) 一樣難 \(\to\) \(B\) 是 NPC)。

  • 錯誤:\(B \le_p A\) (這只能證明 \(B\) 屬於 NP,無法證明 \(B\) 很難)。

4. 一些經典問題的 reduction 方向

03-4. 一些經典問題的 reduction 方向