パズルの答えを自力で見つけるのは大変でも、誰かが答えを持ってきたときに「合っているか」を確かめるのは簡単なことがあります。この記事は、この「探す大変さ」と「確かめる手軽さ」の差が本質的なものなのか、という未解決の問いを扱います。読み終えると、P と NP という 2 つの問題の集まりの違い、ある問題が「最も難しい」と言える理由、そしてこの問いが暗号や最適化にどう関わるかを説明できるようになります。
P \mathrm{P} P は「多項式時間 (入力の長さの多項式で抑えられる時間)で答えを出せる 問題」、N P \mathrm{NP} NP は「答えが yes のとき、その根拠(証明書)を多項式時間で検算できる 問題」のクラスです。NP の N は non-deterministic(非決定性)の頭文字であって、non-polynomial ではありません。
P ⊆ N P \mathrm{P} \subseteq \mathrm{NP} P ⊆ NP は数行で証明できます。逆向きの包含 N P ⊆ P \mathrm{NP} \subseteq \mathrm{P} NP ⊆ P が成り立つかどうかが未解決で、これが P≠NP 予想です。
多項式時間帰着 A ≤ p B A \le_{\mathrm{p}} B A ≤ p B は「B B B が解ければ A A A も解ける」を精密にした道具です。これを使うと「NP の中で最も難しい問題」= NP 完全問題 を定義できます。SAT・3SAT・独立集合・巡回セールスマン(決定版)はすべて NP 完全です。
NP 完全問題がひとつでも多項式時間で解ければ P = N P \mathrm{P} = \mathrm{NP} P = NP が従い、NP に属するすべての問題が一斉に多項式時間で解けます。逆に P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP なら、NP 完全問題は 1 つも多項式時間では解けません。
P = N P \mathrm{P} = \mathrm{NP} P = NP なら公開鍵暗号は成立せず、組合せ最適化と(長さに上限を付けた)定理証明が自動化されます。この帰結があまりに強すぎることが、多くの研究者が P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP を予想する理由のひとつです。
相対化・自然証明・代数化という 3 つの「障壁」が知られており、既存の証明技法の自然な範囲では決着しないことが定理として示されています。
この記事で使う事前知識
多項式時間 : 入力の長さを n n n として、計算時間が n 2 n^2 n 2 や n 3 n^3 n 3 のような多項式で抑えられること。→ 多項式時間アルゴリズム
指数時間 : 2 n 2^n 2 n のように、n n n が増えると爆発的に増える計算時間のこと。多項式時間と対比されます。
動的計画法 : 部分問題の答えを使い回して、指数時間を多項式時間に落とす設計法。→ 動的計画法
チューリング機械 : 「手順に従って計算する」ことを数学的に表した模型。この記事では、多項式時間で動く計算機の代表として使います。
対偶 : 「A ならば B」と「B でないならば A でない」は同値である、という論理の基本。
1930 年代にチューリングとチャーチが確立した計算可能性の理論は、「原理的に解ける問題」と「どんなアルゴリズムでも解けない問題」を分けました。しかし実務家にとって重要なのは、その内側にあるもう 1 本の線です。停止することは分かっていても、答えが返るのが宇宙の年齢より先なら、解けていないのと同じだからです。
この「もう 1 本の線」を最初にはっきり書いたのは、1956 年にゲーデルがフォン・ノイマンに宛てた手紙だと言われています。ゲーデルはそこで、「ある論理式が長さ n n n 以下の証明を持つかどうか」を機械が判定するのに必要なステップ数 φ ( n ) \varphi(n) φ ( n ) を問題にし、それが n n n や n 2 n^2 n 2 のオーダーで済むのか、それとも本質的に指数的なのかと尋ねました。もし多項式で済むなら数学者の仕事の相当部分が機械に置き換わる、と彼は書いています。これが現在の P vs NP 問題とほぼ同じ問いです。
1960 年代に入ると、エドモンズが最大マッチングの論文で「良いアルゴリズム=入力サイズの多項式時間で動くアルゴリズム」という基準を明示し、コバムが同様の提案を独立に行いました。多項式時間を効率性の代理指標に選ぶ理由は 2 つあります。第 1 に、多項式は合成と加算について閉じている ので、「多項式時間の部品を多項式回呼ぶ」プログラムがまた多項式時間になります。第 2 に、計算モデルを取り替えても多項式時間という枠は変わりません (注意 3.2 )。O O O 記法とスケーラビリティの一般論は 計算量と O 記法 を、多項式時間アルゴリズムという枠組みそのものについては 多項式時間アルゴリズムの定義(定義 7.1)[計算量と O 記法] を参照してください。
指数と多項式の差がどれくらい残酷かを数字で見ておきます。n n n 個の真偽値の組合せをすべて試すと 2 n 2^n 2 n 通りです。n = 100 n = 100 n = 100 なら 2 100 ≈ 1.27 × 10 30 2^{100} \approx 1.27 \times 10^{30} 2 100 ≈ 1.27 × 1 0 30 通りで、1 秒あたり 10 9 10^9 1 0 9 通り調べられる計算機でも約 4.0 × 10 13 4.0 \times 10^{13} 4.0 × 1 0 13 年、宇宙の年齢(およそ 1.38 × 10 10 1.38 \times 10^{10} 1.38 × 1 0 10 年)の約 2900 倍かかります。一方 n 3 n^3 n 3 なら 10 6 10^6 1 0 6 回、つまり 1 ミリ秒です。マシンを 1000 倍速くしても 2 n 2^n 2 n の側は n n n が 10 増えるだけで元に戻ります(例 5.4[計算量と O 記法] )。指数時間の問題は「もっと速い計算機を買う」では解決しません。
巡回セールスマン問題(TSP)はこの落差の代表例です。n n n 都市の巡回路をすべて数え上げると ( n − 1 ) ! / 2 (n-1)!/2 ( n − 1 )! /2 通りで、n = 30 n = 30 n = 30 では約 4.4 × 10 30 4.4 \times 10^{30} 4.4 × 1 0 30 通りになります。ところが 動的計画法 の考え方(定理 3.2[動的計画法] )に基づく Held–Karp のアルゴリズムを使えば O ( n 2 2 n ) O(n^2 2^n) O ( n 2 2 n ) 、n = 30 n = 30 n = 30 なら約 9.7 × 10 11 9.7 \times 10^{11} 9.7 × 1 0 11 回の演算で済み、これは現実の計算機で数十分の仕事です。10 30 10^{30} 1 0 30 が 10 12 10^{12} 1 0 12 になったのは大進歩ですが、n = 100 n = 100 n = 100 では 100 2 ⋅ 2 100 ≈ 1.3 × 10 34 100^2 \cdot 2^{100} \approx 1.3 \times 10^{34} 10 0 2 ⋅ 2 100 ≈ 1.3 × 1 0 34 となり、やはり手が出ません。指数の底や係数を改善しても、指数であるかぎり壁は残ります。
では TSP に多項式時間アルゴリズムは存在しないのでしょうか。50 年以上探しても見つかっていませんが、「見つかっていない」と「存在しない」は別のことです。この記事の目的は、この差を数学の言葉で書き下し、「TSP が難しい」という直観を「TSP が多項式時間で解けるなら、NP に属するすべての問題が多項式時間で解ける」という定理に変えることです。
計算量を測るには、まず「問題」を数学的対象として固定する必要があります。標準的なやり方は、判定結果が yes/no の問題(決定問題)だけを扱い、それを文字列の集合と同一視することです。
定義 2.1 (決定問題と言語 ) ↗
アルファベットを Σ = { 0 , 1 } \Sigma = \{0, 1\} Σ = { 0 , 1 } とし、Σ ∗ \Sigma^{*} Σ ∗ で有限長のビット列全体を表します。Σ ∗ \Sigma^{*} Σ ∗ の部分集合 L L L を言語 と呼びます。決定問題とは、入力 x ∈ Σ ∗ x \in \Sigma^{*} x ∈ Σ ∗ に対して「x ∈ L x \in L x ∈ L か」を答える問題のことであり、決定問題と言語を同一視します。数学的対象 O O O (グラフ、論理式、整数の列など)をビット列に符号化したものを ⟨ O ⟩ \langle O \rangle ⟨ O ⟩ と書きます。入力サイズ n n n とは、入力ビット列の長さ ∣ x ∣ |x| ∣ x ∣ のことです。
決定問題に限るのは一見不自由ですが、最適化問題は閾値を付けて決定問題に翻訳できます。「最短の巡回路の長さを求めよ」は「長さ k k k 以下の巡回路が存在するか」という決定問題の族に置き換えられ、後者が多項式時間で解ければ二分探索で前者も多項式時間で解けます(命題 7.1 の後で詳しく述べます)。決定問題の難しさを調べれば最適化問題の難しさも分かる、ということです。
定義 3.1 (クラス P ) ↗
言語 L ⊆ Σ ∗ L \subseteq \Sigma^{*} L ⊆ Σ ∗ が P \mathrm{P} P に属する とは、決定性チューリング機械 M M M と多項式 p p p が存在して、次の 2 条件がともに成り立つことをいいます。
すべての入力 x ∈ Σ ∗ x \in \Sigma^{*} x ∈ Σ ∗ に対し、M M M は高々 p ( ∣ x ∣ ) p(|x|) p ( ∣ x ∣ ) ステップで停止する。
すべての x ∈ Σ ∗ x \in \Sigma^{*} x ∈ Σ ∗ に対し、M M M が x x x を受理することと x ∈ L x \in L x ∈ L であることが同値である。
このような L L L の全体を P \mathrm{P} P と書きます。
条件 1 が「すべての入力に対して」であることに注意してください。平均的に速いだけでは足りず、最悪の入力でも 多項式時間で止まることを要求します。
例 3.3 (P に属する問題 )
次の問題はすべて P \mathrm{P} P に属します。括弧内は代表的な計算量です。
ソート済みかどうかの判定、比較ソート(O ( n log n ) O(n \log n) O ( n log n ) 、定理 4.2[ソートアルゴリズム] )。ソートアルゴリズム を参照してください。
グラフの連結性、幅優先探索・深さ優先探索(O ( ∣ V ∣ + ∣ E ∣ ) O(\lvert V \rvert + \lvert E \rvert) O (∣ V ∣ + ∣ E ∣) 、命題 3.3[グラフアルゴリズム] )、単一始点最短経路(ダイクストラ法で O ( ∣ E ∣ log ∣ V ∣ ) O(\lvert E \rvert \log \lvert V \rvert) O (∣ E ∣ log ∣ V ∣) 、命題 5.4[グラフアルゴリズム] )、最大流、二部グラフの最大マッチング。グラフアルゴリズム を参照してください。
線形計画法の実行可能性判定。単体法は最悪指数時間ですが、ハチヤンの楕円体法が 1979 年に多項式時間であることを示しました。
素数判定。「整数 N N N は素数か」は入力サイズ n = ⌈ log 2 N ⌉ n = \lceil \log_2 N \rceil n = ⌈ log 2 N ⌉ の多項式時間で解けます(Agrawal–Kayal–Saxena, 2004)。試し割りは N = 2 n / 2 \sqrt{N} = 2^{n/2} N = 2 n /2 回の割り算を要するので多項式時間ではない点に注意してください。
素数判定は、P \mathrm{P} P への所属が自明でない例です。この問題が N P ∩ c o N P \mathrm{NP} \cap \mathrm{coNP} NP ∩ coNP に属することは 1970 年代から知られていましたが、P \mathrm{P} P に属すると証明されたのは 2002 年でした。「まだ多項式時間アルゴリズムが見つかっていない」ことは「存在しない」ことの証拠になりません。
TSP の巡回路を「見つける」のは大変ですが、誰かが巡回路を持ってきたときにそれが本当に長さ k k k 以下かを「確かめる」のは簡単です。都市の並びに沿って重みを足して k k k と比べるだけだからです。この非対称性、すなわち発見と検算の計算量の差 を切り出したものが N P \mathrm{NP} NP です。
次の定義の読み方を先に述べておきます。x x x は問題の入力(たとえば TSP の都市と重みの表)、y y y は「答えが yes だという根拠」(たとえば巡回路そのもの)、V V V はその根拠を検算する手順です。式は「x x x が yes であることと、短い根拠 y y y で検算に通るものが存在することは同じ」と読みます。
探す(解を見つける) 検算する(証明書を確かめる) 2ⁿ 通りの割当を片端から試す n = 100 で、1 秒に 10 億通り試せても宇宙年齢の約 2900 倍 渡された 1 つの割当を各節に代入 論理式の長さに比例する時間
探す側と検算する側の対比(SAT で n 個の変数の場合)
定義 4.1 (クラス NP(検証器による定義) ) ↗
言語 L ⊆ Σ ∗ L \subseteq \Sigma^{*} L ⊆ Σ ∗ が N P \mathrm{NP} NP に属する とは、多項式 p p p と、多項式時間で動く決定性チューリング機械 V V V (検証器 と呼びます)が存在して、すべての x ∈ Σ ∗ x \in \Sigma^{*} x ∈ Σ ∗ に対して
x ∈ L ⟺ ∃ y ∈ Σ ∗ [ ∣ y ∣ ≤ p ( ∣ x ∣ ) かつ V ( x , y ) = 1 ] x \in L \iff \exists y \in \Sigma^{*} \ \bigl[\, |y| \le p(|x|) \ \text{かつ} \ V(x, y) = 1 \,\bigr] x ∈ L ⟺ ∃ y ∈ Σ ∗ [ ∣ y ∣ ≤ p ( ∣ x ∣ ) かつ V ( x , y ) = 1 ] が成り立つことをいいます。この y y y を x x x に対する証明書 (certificate、witness)と呼びます。ここで「V V V が多項式時間」とは、V V V が入力 ( x , y ) (x, y) ( x , y ) に対して ∣ x ∣ + ∣ y ∣ |x| + |y| ∣ x ∣ + ∣ y ∣ の多項式時間で停止することを意味します。
定義の 3 つの要素をそれぞれ確認してください。第 1 に、証明書は yes の側にしか要求されません 。x ∉ L x \notin L x ∈ / L のときは、どんな y y y を持ってきても V ( x , y ) = 0 V(x,y) = 0 V ( x , y ) = 0 になることが求められます。第 2 に、証明書の長さに多項式の上限 があります。この制限がないと、答えそのものを長々と書き下したものを証明書にできてしまい、定義が無意味になります。第 3 に、検証は決定性 の多項式時間です。V V V は y y y を推測してはならず、渡された y y y を検算するだけです。
定義 4.3 (充足可能性問題 SAT と 3SAT ) ↗
命題変数 x 1 , … , x n x_1, \ldots, x_n x 1 , … , x n に対し、x i x_i x i または ¬ x i \lnot x_i ¬ x i の形の式をリテラル 、リテラルの論理和 ( ℓ 1 ∨ ⋯ ∨ ℓ k ) (\ell_1 \lor \cdots \lor \ell_k) ( ℓ 1 ∨ ⋯ ∨ ℓ k ) を節 、節の論理積 C 1 ∧ ⋯ ∧ C m C_1 \land \cdots \land C_m C 1 ∧ ⋯ ∧ C m を CNF 論理式 (連言標準形)といいます。真理値割当 α : { x 1 , … , x n } → { 真 , 偽 } \alpha : \{x_1,\ldots,x_n\} \to \{\text{真}, \text{偽}\} α : { x 1 , … , x n } → { 真 , 偽 } が CNF 論理式 φ \varphi φ を真にするとき、α \alpha α は φ \varphi φ を充足する といい、そのような α \alpha α が存在する φ \varphi φ を充足可能 といいます。
S A T = { ⟨ φ ⟩ : φ は充足可能な CNF 論理式 } \mathrm{SAT} = \{\, \langle \varphi \rangle : \varphi \ \text{は充足可能な CNF 論理式} \,\} SAT = { ⟨ φ ⟩ : φ は充足可能な CNF 論理式 } とおきます。さらに、すべての節がちょうど 3 個のリテラルからなる CNF 論理式に制限したものを 3 S A T \mathrm{3SAT} 3SAT と書きます。
例 4.4 (SAT の証明書を実際に検算する )
φ = ( x 1 ∨ ¬ x 2 ∨ x 3 ) ∧ ( ¬ x 1 ∨ x 2 ) ∧ ( ¬ x 2 ∨ ¬ x 3 ) ∧ ( x 1 ∨ x 3 ) \varphi = (x_1 \lor \lnot x_2 \lor x_3) \land (\lnot x_1 \lor x_2) \land (\lnot x_2 \lor \lnot x_3) \land (x_1 \lor x_3) φ = ( x 1 ∨ ¬ x 2 ∨ x 3 ) ∧ ( ¬ x 1 ∨ x 2 ) ∧ ( ¬ x 2 ∨ ¬ x 3 ) ∧ ( x 1 ∨ x 3 ) に対し、証明書として割当 α = ( x 1 , x 2 , x 3 ) = ( 真 , 真 , 偽 ) \alpha = (x_1, x_2, x_3) = (\text{真}, \text{真}, \text{偽}) α = ( x 1 , x 2 , x 3 ) = ( 真 , 真 , 偽 ) を渡されたとします。検証器は各節を順に評価します。
第 1 節 ( x 1 ∨ ¬ x 2 ∨ x 3 ) (x_1 \lor \lnot x_2 \lor x_3) ( x 1 ∨ ¬ x 2 ∨ x 3 ) :x 1 = x_1 = x 1 = 真なので真。
第 2 節 ( ¬ x 1 ∨ x 2 ) (\lnot x_1 \lor x_2) ( ¬ x 1 ∨ x 2 ) :¬ x 1 = \lnot x_1 = ¬ x 1 = 偽ですが x 2 = x_2 = x 2 = 真なので真。
第 3 節 ( ¬ x 2 ∨ ¬ x 3 ) (\lnot x_2 \lor \lnot x_3) ( ¬ x 2 ∨ ¬ x 3 ) :¬ x 2 = \lnot x_2 = ¬ x 2 = 偽ですが ¬ x 3 = \lnot x_3 = ¬ x 3 = 真なので真。
第 4 節 ( x 1 ∨ x 3 ) (x_1 \lor x_3) ( x 1 ∨ x 3 ) :x 1 = x_1 = x 1 = 真なので真。
4 節すべてが真なので α \alpha α は φ \varphi φ を充足し、⟨ φ ⟩ ∈ S A T \langle \varphi \rangle \in \mathrm{SAT} ⟨ φ ⟩ ∈ SAT が確かめられました。評価したリテラルは全部で 9 個、演算量は論理式の長さに比例します。証明書の長さは変数の個数 n n n ビットで、明らかに論理式の長さ以下です。したがって S A T ∈ N P \mathrm{SAT} \in \mathrm{NP} SAT ∈ NP です。
一方、割当を探す 側は 2 n 2^n 2 n 通りの候補を持ちます。この例では 2 3 = 8 2^3 = 8 2 3 = 8 通りなので総当たりでも一瞬ですが、n = 100 n = 100 n = 100 なら §1 で見たとおり宇宙年齢の 2900 倍かかります。検算が O ( n ) O(n) O ( n ) 、探索が 2 n 2^n 2 n 。この落差が P vs NP 問題の正体です。
例 4.6 (巡回セールスマン問題(決定版) )
入力は n n n 都市の完全グラフ、各辺 { i , j } \{i,j\} { i , j } の非負整数重み w ( i , j ) w(i,j) w ( i , j ) 、および閾値 k k k です。問いは「全都市をちょうど 1 回ずつ訪れて出発点に戻る閉路で、重みの総和が k k k 以下のものが存在するか」です。この言語を T S P \mathrm{TSP} TSP と書きます。
4 都市 A , B , C , D A, B, C, D A , B , C , D で w ( A , B ) = 3 w(A,B) = 3 w ( A , B ) = 3 、w ( A , C ) = 8 w(A,C) = 8 w ( A , C ) = 8 、w ( A , D ) = 5 w(A,D) = 5 w ( A , D ) = 5 、w ( B , C ) = 4 w(B,C) = 4 w ( B , C ) = 4 、w ( B , D ) = 9 w(B,D) = 9 w ( B , D ) = 9 、w ( C , D ) = 6 w(C,D) = 6 w ( C , D ) = 6 とします。巡回路は回転と反転を同一視すると ( 4 − 1 ) ! / 2 = 3 (4-1)!/2 = 3 ( 4 − 1 )! /2 = 3 通りで、それぞれの長さは次のとおりです。
A → B → C → D → A A \to B \to C \to D \to A A → B → C → D → A :3 + 4 + 6 + 5 = 18 3 + 4 + 6 + 5 = 18 3 + 4 + 6 + 5 = 18
A → B → D → C → A A \to B \to D \to C \to A A → B → D → C → A :3 + 9 + 6 + 8 = 26 3 + 9 + 6 + 8 = 26 3 + 9 + 6 + 8 = 26
A → C → B → D → A A \to C \to B \to D \to A A → C → B → D → A :8 + 4 + 9 + 5 = 26 8 + 4 + 9 + 5 = 26 8 + 4 + 9 + 5 = 26
したがって最短巡回路の長さは 18 18 18 で、k = 18 k = 18 k = 18 なら答えは yes、k = 17 k = 17 k = 17 なら no です。k = 18 k = 18 k = 18 の場合の証明書は都市の並び ( A , B , C , D ) (A, B, C, D) ( A , B , C , D ) で、これは各都市の番号を ⌈ log 2 n ⌉ \lceil \log_2 n \rceil ⌈ log 2 n ⌉ ビットで書けば O ( n log n ) O(n \log n) O ( n log n ) ビットに収まります。検証器は「並びが全都市の順列であること」を O ( n ) O(n) O ( n ) で確かめ、n n n 回の加算で総和を求め、k k k と 1 回比較します。以上より T S P ∈ N P \mathrm{TSP} \in \mathrm{NP} TSP ∈ NP です。
検証は 4 辺の重みの和(3 回の加算)と 1 回の比較で終わりましたが、最小値を出すには 3 通りを全部調べる必要がありました。n = 30 n = 30 n = 30 ならこの「3 通り」が 4.4 × 10 30 4.4 \times 10^{30} 4.4 × 1 0 30 通りになります。
命題 4.7
P ⊆ N P \mathrm{P} \subseteq \mathrm{NP} P ⊆ NP が成り立ちます。
証明(命題 4.7) L ∈ P L \in \mathrm{P} L ∈ P とし、定義 3.1 により L L L を多項式時間で判定する決定性機械 M M M を取ります。検証器を V ( x , y ) : = M ( x ) V(x, y) := M(x) V ( x , y ) := M ( x ) 、すなわち第 2 引数を無視して M M M を走らせる機械と定め、証明書長の上限多項式を定数多項式 p ( n ) = 0 p(n) = 0 p ( n ) = 0 とします。
∣ y ∣ ≤ 0 |y| \le 0 ∣ y ∣ ≤ 0 を満たす y y y は空列 ε \varepsilon ε のみです。したがって
∃ y [ ∣ y ∣ ≤ p ( ∣ x ∣ ) かつ V ( x , y ) = 1 ] ⟺ V ( x , ε ) = 1 ⟺ M ( x ) = 1 ⟺ x ∈ L \exists y \ \bigl[\, |y| \le p(|x|) \ \text{かつ} \ V(x,y) = 1 \,\bigr] \iff V(x, \varepsilon) = 1 \iff M(x) = 1 \iff x \in L ∃ y [ ∣ y ∣ ≤ p ( ∣ x ∣ ) かつ V ( x , y ) = 1 ] ⟺ V ( x , ε ) = 1 ⟺ M ( x ) = 1 ⟺ x ∈ L となり、定義 4.1 の条件が満たされます。V V V は M M M と同じ多項式時間で停止します。よって L ∈ N P L \in \mathrm{NP} L ∈ NP です。
∎
命題 4.8
E X P = ⋃ c ≥ 1 T I M E ( 2 n c ) \mathrm{EXP} = \bigcup_{c \ge 1} \mathrm{TIME}(2^{n^{c}}) EXP = ⋃ c ≥ 1 TIME ( 2 n c ) とおきます。このとき N P ⊆ E X P \mathrm{NP} \subseteq \mathrm{EXP} NP ⊆ EXP が成り立ちます。
証明(命題 4.8) L ∈ N P L \in \mathrm{NP} L ∈ NP とし、定義 4.1 の検証器 V V V と多項式 p p p を取ります。V V V の実行時間を多項式 r r r で抑えます。次の決定性アルゴリズムを考えます。入力 x x x (長さ n n n )に対し、長さ 0 , 1 , … , p ( n ) 0, 1, \ldots, p(n) 0 , 1 , … , p ( n ) のビット列 y y y をすべて列挙し、各 y y y について V ( x , y ) V(x, y) V ( x , y ) を計算する。1 つでも 1 1 1 を返せば受理、すべて 0 0 0 なら拒否する。
正しさは 定義 4.1 の同値式そのものです。証明書が存在すればこの列挙が必ずそれを含み、存在しなければどの y y y も V ( x , y ) = 1 V(x,y) = 1 V ( x , y ) = 1 を与えません。
実行時間を数えます。列挙する y y y の個数は
∑ i = 0 p ( n ) 2 i = 2 p ( n ) + 1 − 1 \sum_{i=0}^{p(n)} 2^{i} = 2^{p(n)+1} - 1 i = 0 ∑ p ( n ) 2 i = 2 p ( n ) + 1 − 1 個です。各 y y y について V ( x , y ) V(x,y) V ( x , y ) の計算に高々 r ( n + p ( n ) ) r(n + p(n)) r ( n + p ( n )) ステップかかるので、総時間は ( 2 p ( n ) + 1 − 1 ) ⋅ r ( n + p ( n ) ) \bigl(2^{p(n)+1} - 1\bigr) \cdot r\bigl(n + p(n)\bigr) ( 2 p ( n ) + 1 − 1 ) ⋅ r ( n + p ( n ) ) 以下です。r ( n + p ( n ) ) r(n + p(n)) r ( n + p ( n )) は n n n の多項式なので、この総時間はある定数 c c c に対し 2 n c 2^{n^{c}} 2 n c で抑えられます。よって L ∈ E X P L \in \mathrm{EXP} L ∈ EXP です。
∎
次の系のねらいは、P と NP の間か、NP とその上のクラス EXP(指数時間で解ける問題の全体)の間のどちらかには、必ず隙間があると言うことです。P と EXP が違うことは時間階層定理(計算時間を十分に増やすと解ける問題が本当に増える、という定理)から分かっているので、間にある NP は両側とくっつくことはできません。
系 4.9
P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP と N P ≠ E X P \mathrm{NP} \ne \mathrm{EXP} NP = EXP の少なくとも一方が成り立ちます。
証明(系 4.9) 時間階層定理により P ⊊ E X P \mathrm{P} \subsetneq \mathrm{EXP} P ⊊ EXP 、特に P ≠ E X P \mathrm{P} \ne \mathrm{EXP} P = EXP です(この定理は対角線論法で証明されます。証明は Sipser『Introduction to the Theory of Computation』第 9 章、または Arora–Barak 第 3 章を参照してください)。
いま仮に P = N P \mathrm{P} = \mathrm{NP} P = NP かつ N P = E X P \mathrm{NP} = \mathrm{EXP} NP = EXP だったとすると、P = E X P \mathrm{P} = \mathrm{EXP} P = EXP となって矛盾します。命題 4.7 と 命題 4.8 より P ⊆ N P ⊆ E X P \mathrm{P} \subseteq \mathrm{NP} \subseteq \mathrm{EXP} P ⊆ NP ⊆ EXP なので、2 つの包含のうち少なくとも一方は真の包含です。
∎
つまり「N P \mathrm{NP} NP は P \mathrm{P} P より真に大きい」か「N P \mathrm{NP} NP は E X P \mathrm{EXP} EXP より真に小さい」かのどちらかは確実に正しく、私たちはどちらか分からない、というのが現状です。分離が 1 つも証明できないわけではありません。証明できないのは、この特定の場所での分離です。
N P \mathrm{NP} NP の中で「最も難しい問題」を定義するには、2 つの問題の難しさを比べる物差しが要ります。その物差しが帰着です。考え方は素朴で、「問題 A A A の入力を、答えが変わらないように問題 B B B の入力へ翻訳できるなら、B B B を解く道具は A A A を解く道具にもなる」というものです。
定義 5.1 (多項式時間多対一帰着(カープ帰着) ) ↗
言語 A , B ⊆ Σ ∗ A, B \subseteq \Sigma^{*} A , B ⊆ Σ ∗ について、関数 f : Σ ∗ → Σ ∗ f : \Sigma^{*} \to \Sigma^{*} f : Σ ∗ → Σ ∗ が次の 2 条件を満たすとき、f f f を A A A から B B B への多項式時間多対一帰着 といい、A ≤ p B A \le_{\mathrm{p}} B A ≤ p B と書きます。
f f f は決定性チューリング機械により、入力 x x x の長さの多項式時間で計算できる。
すべての x ∈ Σ ∗ x \in \Sigma^{*} x ∈ Σ ∗ に対して、x ∈ A ⟺ f ( x ) ∈ B x \in A \iff f(x) \in B x ∈ A ⟺ f ( x ) ∈ B が成り立つ。
条件 2 は両方向 であることに注意してください。f f f は yes の入力を yes の入力へ、no の入力を no の入力へ移さなければなりません。また条件 1 により、f f f 自身が A A A を解いてしまうことはできません(A A A が難しければ多項式時間では解けないからです)。f f f にできるのは、あくまで問題の言い換え です。
向きの読み方も重要です。A ≤ p B A \le_{\mathrm{p}} B A ≤ p B は「A A A は B B B より難しくない」を意味します。不等号の向きと「難しさ」の向きが一致するように記号が選ばれています。
その yes / no をそのまま A の答えにする
帰着 A ≤p B を使って A を解く手順
次の定理は、帰着が「難しさを運ぶ」道具として使えることを保証します。証明は、変換 f f f と B B B の解法を続けて走らせたときの時間を数えるだけです。冒頭の「多項式は単調非減少としてよい」という準備は、時間の見積もりを書きやすくするための技術的な下ごしらえなので、初めは読み飛ばして構いません。
定理 5.2 (帰着の基本性質 ) ✓
A , B , C ⊆ Σ ∗ A, B, C \subseteq \Sigma^{*} A , B , C ⊆ Σ ∗ とし、A ≤ p B A \le_{\mathrm{p}} B A ≤ p B が成り立つとします。このとき次が成り立ちます。
B ∈ P B \in \mathrm{P} B ∈ P ならば A ∈ P A \in \mathrm{P} A ∈ P 。
B ∈ N P B \in \mathrm{NP} B ∈ NP ならば A ∈ N P A \in \mathrm{NP} A ∈ NP 。
さらに B ≤ p C B \le_{\mathrm{p}} C B ≤ p C ならば A ≤ p C A \le_{\mathrm{p}} C A ≤ p C (推移律)。
証明(定理 5.2) A ≤ p B A \le_{\mathrm{p}} B A ≤ p B を与える帰着関数を f f f とし、定義 5.1 の条件 1 により f f f の計算時間を多項式 q q q で抑えます。まず全体で使う不等式を 1 つ用意します。チューリング機械は 1 ステップで高々 1 文字しか書き込めないので、q ( n ) q(n) q ( n ) ステップで出力できる文字列の長さも高々 q ( n ) q(n) q ( n ) です。すなわち
∣ f ( x ) ∣ ≤ q ( ∣ x ∣ ) ( ∀ x ∈ Σ ∗ ) . |f(x)| \le q(|x|) \quad (\forall x \in \Sigma^{*}). ∣ f ( x ) ∣ ≤ q ( ∣ x ∣ ) ( ∀ x ∈ Σ ∗ ) . また、以下では時間や長さの上界に使う多項式 r r r を単調非減少と仮定してよいことを使います。r ( m ) = ∑ i a i m i r(m) = \sum_{i} a_i m^i r ( m ) = ∑ i a i m i の係数を絶対値に置き換えた r ′ ( m ) = ∑ i ∣ a i ∣ m i r'(m) = \sum_i \lvert a_i \rvert m^i r ′ ( m ) = ∑ i ∣ a i ∣ m i を取れば、r ′ r' r ′ は同じ次数の多項式で m ≥ 0 m \ge 0 m ≥ 0 において単調非減少、かつ r ( m ) ≤ r ′ ( m ) r(m) \le r'(m) r ( m ) ≤ r ′ ( m ) を満たすので、上界としては r r r を r ′ r' r ′ で置き換えられるからです。
(1) の証明。 B ∈ P B \in \mathrm{P} B ∈ P とし、定義 3.1 により B B B を時間 r r r で判定する機械 M B M_B M B を取ります(r r r は単調非減少としてよい)。次のアルゴリズム M A M_A M A を作ります。入力 x x x に対し f ( x ) f(x) f ( x ) を計算し、M B ( f ( x ) ) M_B(f(x)) M B ( f ( x )) の出力をそのまま返す。
正しさ:定義 5.1 の条件 2 より x ∈ A ⟺ f ( x ) ∈ B x \in A \iff f(x) \in B x ∈ A ⟺ f ( x ) ∈ B であり、M B M_B M B は f ( x ) ∈ B f(x) \in B f ( x ) ∈ B を正しく判定するので、M A M_A M A は x ∈ A x \in A x ∈ A を正しく判定します。
時間:f ( x ) f(x) f ( x ) の計算に q ( n ) q(n) q ( n ) ステップ、M B M_B M B の実行に r ( ∣ f ( x ) ∣ ) ≤ r ( q ( n ) ) r(|f(x)|) \le r(q(n)) r ( ∣ f ( x ) ∣ ) ≤ r ( q ( n )) ステップ(r r r の単調性と上の不等式を使いました)。合計は q ( n ) + r ( q ( n ) ) q(n) + r(q(n)) q ( n ) + r ( q ( n )) で、多項式の合成と和はまた多項式なので、M A M_A M A は多項式時間です。よって A ∈ P A \in \mathrm{P} A ∈ P です。
(2) の証明。 B ∈ N P B \in \mathrm{NP} B ∈ NP とし、定義 4.1 により B B B の検証器 V B V_B V B と証明書長の多項式 p B p_B p B (単調非減少としてよい)を取ります。A A A の検証器を
V A ( x , y ) : = V B ( f ( x ) , y ) V_A(x, y) := V_B\bigl(f(x),\, y\bigr) V A ( x , y ) := V B ( f ( x ) , y ) と定め、証明書長の多項式を p A ( n ) : = p B ( q ( n ) ) p_A(n) := p_B(q(n)) p A ( n ) := p B ( q ( n )) とします。
正しさ:x ∈ A x \in A x ∈ A とすると条件 2 より f ( x ) ∈ B f(x) \in B f ( x ) ∈ B なので、∣ y ∣ ≤ p B ( ∣ f ( x ) ∣ ) |y| \le p_B(|f(x)|) ∣ y ∣ ≤ p B ( ∣ f ( x ) ∣ ) かつ V B ( f ( x ) , y ) = 1 V_B(f(x), y) = 1 V B ( f ( x ) , y ) = 1 となる y y y が存在します。∣ f ( x ) ∣ ≤ q ( n ) |f(x)| \le q(n) ∣ f ( x ) ∣ ≤ q ( n ) と p B p_B p B の単調性から p B ( ∣ f ( x ) ∣ ) ≤ p B ( q ( n ) ) = p A ( n ) p_B(|f(x)|) \le p_B(q(n)) = p_A(n) p B ( ∣ f ( x ) ∣ ) ≤ p B ( q ( n )) = p A ( n ) なので、この y y y は ∣ y ∣ ≤ p A ( ∣ x ∣ ) |y| \le p_A(|x|) ∣ y ∣ ≤ p A ( ∣ x ∣ ) を満たし、V A ( x , y ) = 1 V_A(x,y) = 1 V A ( x , y ) = 1 です。逆に ∣ y ∣ ≤ p A ( ∣ x ∣ ) |y| \le p_A(|x|) ∣ y ∣ ≤ p A ( ∣ x ∣ ) かつ V A ( x , y ) = 1 V_A(x,y) = 1 V A ( x , y ) = 1 となる y y y があれば V B ( f ( x ) , y ) = 1 V_B(f(x), y) = 1 V B ( f ( x ) , y ) = 1 なので f ( x ) ∈ B f(x) \in B f ( x ) ∈ B 、条件 2 より x ∈ A x \in A x ∈ A です。
時間:V A V_A V A は f ( x ) f(x) f ( x ) の計算に q ( n ) q(n) q ( n ) ステップ、続いて V B V_B V B の実行に ( ∣ f ( x ) ∣ + ∣ y ∣ ) (|f(x)| + |y|) ( ∣ f ( x ) ∣ + ∣ y ∣ ) の多項式時間を要し、∣ f ( x ) ∣ ≤ q ( n ) |f(x)| \le q(n) ∣ f ( x ) ∣ ≤ q ( n ) 、∣ y ∣ ≤ p A ( n ) |y| \le p_A(n) ∣ y ∣ ≤ p A ( n ) はいずれも n n n の多項式で抑えられるので、全体で n n n の多項式時間です。よって A ∈ N P A \in \mathrm{NP} A ∈ NP です。
(3) の証明。 B ≤ p C B \le_{\mathrm{p}} C B ≤ p C を与える帰着関数を g g g 、その計算時間の上界を多項式 s s s (単調非減少)とします。合成 h ( x ) : = g ( f ( x ) ) h(x) := g(f(x)) h ( x ) := g ( f ( x )) を考えます。
正しさ:x ∈ A ⟺ f ( x ) ∈ B x \in A \iff f(x) \in B x ∈ A ⟺ f ( x ) ∈ B (f f f の性質) ⟺ g ( f ( x ) ) ∈ C \iff g(f(x)) \in C ⟺ g ( f ( x )) ∈ C (g g g の性質)です。
時間:f ( x ) f(x) f ( x ) の計算に q ( n ) q(n) q ( n ) 、g g g の計算に s ( ∣ f ( x ) ∣ ) ≤ s ( q ( n ) ) s(|f(x)|) \le s(q(n)) s ( ∣ f ( x ) ∣ ) ≤ s ( q ( n )) ステップで、合計 q ( n ) + s ( q ( n ) ) q(n) + s(q(n)) q ( n ) + s ( q ( n )) は多項式です。よって h h h は多項式時間で計算でき、A ≤ p C A \le_{\mathrm{p}} C A ≤ p C が成り立ちます。
∎
定理 5.2 の 1 は日常的には対偶 の形で使われます。すなわち「A A A が多項式時間で解けないなら、B B B も多項式時間で解けない」。難しさは帰着の矢印を逆向きに伝わります。
定義 6.1 (NP 困難と NP 完全 ) ↗
言語 B ⊆ Σ ∗ B \subseteq \Sigma^{*} B ⊆ Σ ∗ が NP 困難 であるとは、すべての L ∈ N P L \in \mathrm{NP} L ∈ NP に対して L ≤ p B L \le_{\mathrm{p}} B L ≤ p B が成り立つことをいいます。B B B が NP 困難であり、かつ B ∈ N P B \in \mathrm{NP} B ∈ NP でもあるとき、B B B は NP 完全 であるといいます。
NP 困難とは「N P \mathrm{NP} NP のすべての問題より難しい」ということです。N P \mathrm{NP} NP には無限個の言語があるので、この条件は一見して満たしようがないほど強く見えます。ところが実際には満たす問題が存在し、しかも大量にあります。
系 6.2
B B B を NP 完全な言語とします。このとき次が成り立ちます。
B ∈ P B \in \mathrm{P} B ∈ P ならば P = N P \mathrm{P} = \mathrm{NP} P = NP 。
P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP ならば B ∉ P B \notin \mathrm{P} B ∈ / P 、すなわちいかなる NP 完全問題も多項式時間では解けない。
証明(系 6.2) 1 を示します。B ∈ P B \in \mathrm{P} B ∈ P と仮定し、任意に L ∈ N P L \in \mathrm{NP} L ∈ NP を取ります。B B B は NP 困難なので 定義 6.1 より L ≤ p B L \le_{\mathrm{p}} B L ≤ p B です。B ∈ P B \in \mathrm{P} B ∈ P なので 定理 5.2 の 1 を適用して L ∈ P L \in \mathrm{P} L ∈ P を得ます。L L L は任意だったので N P ⊆ P \mathrm{NP} \subseteq \mathrm{P} NP ⊆ P です。他方 命題 4.7 より P ⊆ N P \mathrm{P} \subseteq \mathrm{NP} P ⊆ NP なので、P = N P \mathrm{P} = \mathrm{NP} P = NP が従います。
2 は 1 の対偶です。B ∈ P B \in \mathrm{P} B ∈ P だったとすると 1 により P = N P \mathrm{P} = \mathrm{NP} P = NP となり、仮定 P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP に反します。
∎
これが NP 完全性の威力です。NP 完全問題は N P \mathrm{NP} NP 全体の運命を背負っており、そのうちどれか 1 つでも多項式時間で解ければ、残り全部が一斉に多項式時間で解けます 。逆にいえば、ある問題が NP 完全だと分かれば、その問題に対する多項式時間アルゴリズムを探すのは、P vs NP 問題を解くのと同じ難しさの仕事だと分かります。実務でこれは「探すのをやめて別の戦略に切り替えろ」という強い信号になります。
次の定理は、NP 完全な問題が実際に 1 つ存在することを示します。考え方は、NP の問題を解く機械の動きを「時刻ごとのテープの様子を並べた表」として書き、その表が正しい計算になっていることを論理式で表す、というものです。表の各マスは前の行の近くのマスだけで決まるので、「正しい計算である」という条件を小さな節の集まりで書けます。
定理 6.3 (Cook–Levin の定理 ) ✓
S A T \mathrm{SAT} SAT は NP 完全です。すなわち S A T ∈ N P \mathrm{SAT} \in \mathrm{NP} SAT ∈ NP であり、かつすべての L ∈ N P L \in \mathrm{NP} L ∈ NP に対して L ≤ p S A T L \le_{\mathrm{p}} \mathrm{SAT} L ≤ p SAT が成り立ちます。
証明(定理 6.3) S A T ∈ N P \mathrm{SAT} \in \mathrm{NP} SAT ∈ NP は 例 4.4 で確かめました。証明書として真理値割当を渡し、各節を順に評価すれば、論理式の長さに比例する時間で検証できます。
NP 困難性の骨子だけをここに述べ、詳細は本記事末尾の Appendix に回します。L ∈ N P L \in \mathrm{NP} L ∈ NP を任意に取り、注意 4.2 の同値性により L L L を時間 T ( n ) T(n) T ( n ) (T T T は多項式)で受理する非決定性チューリング機械 N N N を取ります。入力 x x x に対する N N N の計算の様子は、時刻を行、テープの位置を列とする ( T ( n ) + 1 ) (T(n)+1) ( T ( n ) + 1 ) 行の計算表 として書けます。この表の各マスに「どの記号が入っているか」を表す命題変数を用意し、「表の各マスの中身がちょうど 1 つに決まる」「第 0 行が入力 x x x の初期状態を表す」「隣り合う 2 行が N N N の遷移規則と整合する」「どこかに受理状態が現れる」という 4 種類の条件を CNF 論理式 φ x \varphi_x φ x に書き下します。変数も節も O ( T ( n ) 2 ) O(T(n)^2) O ( T ( n ) 2 ) 個で済み、φ x \varphi_x φ x は x x x から多項式時間で構成できます。構成から、φ x \varphi_x φ x の充足割当と N N N の x x x に対する受理計算とが 1 対 1 に対応するので、x ∈ L ⟺ ⟨ φ x ⟩ ∈ S A T x \in L \iff \langle \varphi_x \rangle \in \mathrm{SAT} x ∈ L ⟺ ⟨ φ x ⟩ ∈ SAT が成り立ちます。これが求める帰着です。
∎
次の系の証明の中心は、長い節を 3 リテラルの節の鎖に分ける変換です。たとえば k = 5 k = 5 k = 5 の節 ( ℓ 1 ∨ ℓ 2 ∨ ℓ 3 ∨ ℓ 4 ∨ ℓ 5 ) (\ell_1 \lor \ell_2 \lor \ell_3 \lor \ell_4 \lor \ell_5) ( ℓ 1 ∨ ℓ 2 ∨ ℓ 3 ∨ ℓ 4 ∨ ℓ 5 ) は、新変数 z 1 , z 2 z_1, z_2 z 1 , z 2 を使って ( ℓ 1 ∨ ℓ 2 ∨ z 1 ) ∧ ( ¬ z 1 ∨ ℓ 3 ∨ z 2 ) ∧ ( ¬ z 2 ∨ ℓ 4 ∨ ℓ 5 ) (\ell_1 \lor \ell_2 \lor z_1) \land (\lnot z_1 \lor \ell_3 \lor z_2) \land (\lnot z_2 \lor \ell_4 \lor \ell_5) ( ℓ 1 ∨ ℓ 2 ∨ z 1 ) ∧ ( ¬ z 1 ∨ ℓ 3 ∨ z 2 ) ∧ ( ¬ z 2 ∨ ℓ 4 ∨ ℓ 5 ) に置き換わります。ℓ 3 \ell_3 ℓ 3 だけが真なら z 1 z_1 z 1 を真、z 2 z_2 z 2 を偽にすると、3 つの節は順に z 1 z_1 z 1 、ℓ 3 \ell_3 ℓ 3 、¬ z 2 \lnot z_2 ¬ z 2 で真になります。ℓ 4 \ell_4 ℓ 4 だけが真なら z 1 , z 2 z_1, z_2 z 1 , z 2 をともに真にすると、順に z 1 z_1 z 1 、z 2 z_2 z 2 、ℓ 4 \ell_4 ℓ 4 で真になります。5 個のリテラルがすべて偽だと、第 1 節から z 1 z_1 z 1 が真、第 2 節から z 2 z_2 z 2 が真となり、第 3 節が偽になってしまいます。
系 6.5
3 S A T \mathrm{3SAT} 3SAT は NP 完全です。
証明(系 6.5) 3 S A T ∈ N P \mathrm{3SAT} \in \mathrm{NP} 3SAT ∈ NP は S A T \mathrm{SAT} SAT と同じ理由(証明書は真理値割当)で成り立ちます。NP 困難性を示すには、定理 6.3 と 定理 5.2 の 3(推移律)により、S A T ≤ p 3 S A T \mathrm{SAT} \le_{\mathrm{p}} \mathrm{3SAT} SAT ≤ p 3SAT を示せば十分です。実際、任意の L ∈ N P L \in \mathrm{NP} L ∈ NP に対し L ≤ p S A T ≤ p 3 S A T L \le_{\mathrm{p}} \mathrm{SAT} \le_{\mathrm{p}} \mathrm{3SAT} L ≤ p SAT ≤ p 3SAT から L ≤ p 3 S A T L \le_{\mathrm{p}} \mathrm{3SAT} L ≤ p 3SAT が従います。
CNF 論理式 φ \varphi φ の各節 C = ( ℓ 1 ∨ ⋯ ∨ ℓ k ) C = (\ell_1 \lor \cdots \lor \ell_k) C = ( ℓ 1 ∨ ⋯ ∨ ℓ k ) を、リテラル数がちょうど 3 の節の集まりに置き換えます。節ごとに新しい変数 を使い、他の節とは共有しません。
k = 1 k = 1 k = 1 のとき:新変数 y 1 , y 2 y_1, y_2 y 1 , y 2 を使い、( ℓ 1 ∨ y 1 ∨ y 2 ) ∧ ( ℓ 1 ∨ ¬ y 1 ∨ y 2 ) ∧ ( ℓ 1 ∨ y 1 ∨ ¬ y 2 ) ∧ ( ℓ 1 ∨ ¬ y 1 ∨ ¬ y 2 ) (\ell_1 \lor y_1 \lor y_2) \land (\ell_1 \lor \lnot y_1 \lor y_2) \land (\ell_1 \lor y_1 \lor \lnot y_2) \land (\ell_1 \lor \lnot y_1 \lor \lnot y_2) ( ℓ 1 ∨ y 1 ∨ y 2 ) ∧ ( ℓ 1 ∨ ¬ y 1 ∨ y 2 ) ∧ ( ℓ 1 ∨ y 1 ∨ ¬ y 2 ) ∧ ( ℓ 1 ∨ ¬ y 1 ∨ ¬ y 2 ) に置き換えます。y 1 , y 2 y_1, y_2 y 1 , y 2 の 4 通りの値すべてを潰しているので、この 4 節が同時に真になるのは ℓ 1 \ell_1 ℓ 1 が真のとき、かつそのときに限ります。
k = 2 k = 2 k = 2 のとき:新変数 y y y を使い、( ℓ 1 ∨ ℓ 2 ∨ y ) ∧ ( ℓ 1 ∨ ℓ 2 ∨ ¬ y ) (\ell_1 \lor \ell_2 \lor y) \land (\ell_1 \lor \ell_2 \lor \lnot y) ( ℓ 1 ∨ ℓ 2 ∨ y ) ∧ ( ℓ 1 ∨ ℓ 2 ∨ ¬ y ) とします。同様に、ℓ 1 ∨ ℓ 2 \ell_1 \lor \ell_2 ℓ 1 ∨ ℓ 2 が真であることと同値です。
k = 3 k = 3 k = 3 のとき:そのまま残します。
k ≥ 4 k \ge 4 k ≥ 4 のとき:新変数 z 1 , … , z k − 3 z_1, \ldots, z_{k-3} z 1 , … , z k − 3 を使い、次の k − 2 k-2 k − 2 個の節に置き換えます。
( ℓ 1 ∨ ℓ 2 ∨ z 1 ) ∧ ⋀ i = 2 k − 3 ( ¬ z i − 1 ∨ ℓ i + 1 ∨ z i ) ∧ ( ¬ z k − 3 ∨ ℓ k − 1 ∨ ℓ k ) (\ell_1 \lor \ell_2 \lor z_1) \ \land \ \bigwedge_{i=2}^{k-3} (\lnot z_{i-1} \lor \ell_{i+1} \lor z_i) \ \land \ (\lnot z_{k-3} \lor \ell_{k-1} \lor \ell_k) ( ℓ 1 ∨ ℓ 2 ∨ z 1 ) ∧ i = 2 ⋀ k − 3 ( ¬ z i − 1 ∨ ℓ i + 1 ∨ z i ) ∧ ( ¬ z k − 3 ∨ ℓ k − 1 ∨ ℓ k ) k ≥ 4 k \ge 4 k ≥ 4 の場合の同値性を確かめます。まず、ある ℓ t \ell_t ℓ t が真だとします。z i z_i z i を i ≤ t − 2 i \le t-2 i ≤ t − 2 のとき真、i > t − 2 i > t-2 i > t − 2 のとき偽と定めます。第 1 節は、t ≤ 2 t \le 2 t ≤ 2 なら ℓ t \ell_t ℓ t が真で、t ≥ 3 t \ge 3 t ≥ 3 なら z 1 z_1 z 1 が真なので充足されます。中間の第 i i i 節 ( ¬ z i − 1 ∨ ℓ i + 1 ∨ z i ) (\lnot z_{i-1} \lor \ell_{i+1} \lor z_i) ( ¬ z i − 1 ∨ ℓ i + 1 ∨ z i ) は、i ≤ t − 2 i \le t-2 i ≤ t − 2 なら z i z_i z i が真、i = t − 1 i = t-1 i = t − 1 なら ℓ i + 1 = ℓ t \ell_{i+1} = \ell_t ℓ i + 1 = ℓ t が真、i ≥ t i \ge t i ≥ t なら z i − 1 z_{i-1} z i − 1 が偽なので ¬ z i − 1 \lnot z_{i-1} ¬ z i − 1 が真で、いずれの場合も充足されます。最後の節は、t ≥ k − 1 t \ge k-1 t ≥ k − 1 なら ℓ t \ell_t ℓ t が真、t ≤ k − 2 t \le k-2 t ≤ k − 2 なら z k − 3 z_{k-3} z k − 3 が偽なので ¬ z k − 3 \lnot z_{k-3} ¬ z k − 3 が真となり充足されます。
逆に ℓ 1 , … , ℓ k \ell_1, \ldots, \ell_k ℓ 1 , … , ℓ k がすべて偽だとします。第 1 節から z 1 z_1 z 1 は真でなければなりません。z i − 1 z_{i-1} z i − 1 が真だと分かっているとき、第 i i i 節では ¬ z i − 1 \lnot z_{i-1} ¬ z i − 1 が偽、ℓ i + 1 \ell_{i+1} ℓ i + 1 も偽なので z i z_i z i が真でなければなりません。これを i = 2 , … , k − 3 i = 2, \ldots, k-3 i = 2 , … , k − 3 と繰り返すと z k − 3 z_{k-3} z k − 3 が真です。すると最後の節 ( ¬ z k − 3 ∨ ℓ k − 1 ∨ ℓ k ) (\lnot z_{k-3} \lor \ell_{k-1} \lor \ell_k) ( ¬ z k − 3 ∨ ℓ k − 1 ∨ ℓ k ) は 3 つのリテラルすべてが偽になり、充足できません。したがって、置き換え後の論理式が充足可能であることと、もとの節が充足可能であることは同値です。
新変数は節ごとに独立なので、φ \varphi φ 全体としても「φ \varphi φ が充足可能 ⟺ \iff ⟺ 置き換え後の 3-CNF が充足可能」が成り立ちます。生成される節の総数は、節 C C C あたり高々 max ( k − 2 , 4 ) \max(k-2, 4) max ( k − 2 , 4 ) 個なので φ \varphi φ の長さの定数倍で抑えられ、変換は入力の長さに対して線形時間(特に多項式時間)で実行できます。以上より S A T ≤ p 3 S A T \mathrm{SAT} \le_{\mathrm{p}} \mathrm{3SAT} SAT ≤ p 3SAT です。
∎
論理式の問題からグラフの問題へも、同じやり方で難しさを運べます。次の帰着は最も美しいものの 1 つで、証明を完全に追えます。
定理 6.6 (独立集合問題の NP 完全性 ) ✓
無向グラフ G = ( V , E ) G = (V, E) G = ( V , E ) の頂点部分集合 S ⊆ V S \subseteq V S ⊆ V が独立集合 であるとは、S S S のどの相異なる 2 頂点も E E E で結ばれていないことをいいます。言語
I N D S E T = { ⟨ G , k ⟩ : G は大きさ k の独立集合を持つ無向グラフ } \mathrm{INDSET} = \{\, \langle G, k \rangle : G \ \text{は大きさ} \ k \ \text{の独立集合を持つ無向グラフ} \,\} INDSET = { ⟨ G , k ⟩ : G は大きさ k の独立集合を持つ無向グラフ } について、3 S A T ≤ p I N D S E T \mathrm{3SAT} \le_{\mathrm{p}} \mathrm{INDSET} 3SAT ≤ p INDSET が成り立ちます。特に I N D S E T \mathrm{INDSET} INDSET は NP 完全です。
証明(定理 6.6) まず I N D S E T ∈ N P \mathrm{INDSET} \in \mathrm{NP} INDSET ∈ NP です。証明書として頂点集合 S S S を渡せば、∣ S ∣ = k |S| = k ∣ S ∣ = k の確認と、S S S の全頂点対が非隣接であることの確認が O ( k 2 ) O(k^2) O ( k 2 ) 回の辺の有無の判定で済み、入力サイズの多項式時間です。
帰着を構成します。3-CNF 論理式 φ = C 1 ∧ ⋯ ∧ C m \varphi = C_1 \land \cdots \land C_m φ = C 1 ∧ ⋯ ∧ C m 、C i = ( ℓ i , 1 ∨ ℓ i , 2 ∨ ℓ i , 3 ) C_i = (\ell_{i,1} \lor \ell_{i,2} \lor \ell_{i,3}) C i = ( ℓ i , 1 ∨ ℓ i , 2 ∨ ℓ i , 3 ) が与えられたとき、グラフ G φ G_\varphi G φ を次のように作ります。
頂点:各 i ∈ { 1 , … , m } i \in \{1,\ldots,m\} i ∈ { 1 , … , m } 、j ∈ { 1 , 2 , 3 } j \in \{1,2,3\} j ∈ { 1 , 2 , 3 } に対して頂点 v i , j v_{i,j} v i , j を 1 つ置きます。頂点 v i , j v_{i,j} v i , j は「第 i i i 節の j j j 番目のリテラルの出現」に対応します。頂点数は 3 m 3m 3 m です。
節内の辺 :同じ i i i について j ≠ j ′ j \ne j' j = j ′ なら v i , j v_{i,j} v i , j と v i , j ′ v_{i,j'} v i , j ′ を結びます。各節が三角形になります。
矛盾辺 :i ≠ i ′ i \ne i' i = i ′ で、ℓ i , j \ell_{i,j} ℓ i , j と ℓ i ′ , j ′ \ell_{i',j'} ℓ i ′ , j ′ が互いに否定(一方が x x x 、他方が ¬ x \lnot x ¬ x )であるとき、v i , j v_{i,j} v i , j と v i ′ , j ′ v_{i',j'} v i ′ , j ′ を結びます。
そして f ( ⟨ φ ⟩ ) : = ⟨ G φ , m ⟩ f(\langle \varphi \rangle) := \langle G_\varphi, m \rangle f (⟨ φ ⟩) := ⟨ G φ , m ⟩ と定めます。G φ G_\varphi G φ の頂点は 3 m 3m 3 m 個、辺は高々 ( 3 m 2 ) = O ( m 2 ) \binom{3m}{2} = O(m^2) ( 2 3 m ) = O ( m 2 ) 本で、どの 2 頂点を結ぶかは対応するリテラルを見るだけで判定できるので、f f f は O ( m 2 ) O(m^2) O ( m 2 ) 時間、特に多項式時間で計算できます。
(⇒ \Rightarrow ⇒ ) φ \varphi φ が充足可能ならば G φ G_\varphi G φ は大きさ m m m の独立集合を持つ。 充足割当 α \alpha α を取ります。各節 C i C_i C i は α \alpha α の下で真なので、真になるリテラルが少なくとも 1 つあります。その 1 つを選んで添字を j ( i ) j(i) j ( i ) とし、S = { v i , j ( i ) : i = 1 , … , m } S = \{\, v_{i,j(i)} : i = 1,\ldots,m \,\} S = { v i , j ( i ) : i = 1 , … , m } とおきます。節ごとに 1 頂点ずつ選んだので ∣ S ∣ = m |S| = m ∣ S ∣ = m です。S S S が独立集合であることを見ます。節内の辺は同じ i i i の頂点どうしを結びますが、S S S には各 i i i につき 1 頂点しかないので、節内の辺の両端が S S S に入ることはありません。矛盾辺については、v i , j ( i ) v_{i,j(i)} v i , j ( i ) と v i ′ , j ( i ′ ) v_{i',j(i')} v i ′ , j ( i ′ ) が矛盾辺で結ばれているとすると ℓ i , j ( i ) \ell_{i,j(i)} ℓ i , j ( i ) と ℓ i ′ , j ( i ′ ) \ell_{i',j(i')} ℓ i ′ , j ( i ′ ) は互いに否定ですが、α \alpha α の下で両方とも真であることになり、α \alpha α が写像であることに矛盾します。よって S S S は独立集合です。
(⇐ \Leftarrow ⇐ ) G φ G_\varphi G φ が大きさ m m m の独立集合を持つならば φ \varphi φ は充足可能。 独立集合 S S S 、∣ S ∣ = m |S| = m ∣ S ∣ = m を取ります。節内の辺により、各 i i i について S ∩ { v i , 1 , v i , 2 , v i , 3 } S \cap \{v_{i,1}, v_{i,2}, v_{i,3}\} S ∩ { v i , 1 , v i , 2 , v i , 3 } は高々 1 個です(2 個入れば節内の辺で結ばれてしまいます)。この上限が m m m 個の i i i について成り立ち、かつ ∣ S ∣ = m |S| = m ∣ S ∣ = m なので、各 i i i についてちょうど 1 個です。その頂点を v i , j ( i ) v_{i,j(i)} v i , j ( i ) と書きます。
割当 α \alpha α を次のように定めます。各 i i i について、ℓ i , j ( i ) \ell_{i,j(i)} ℓ i , j ( i ) が真になるように、対応する変数の値を決めます(ℓ i , j ( i ) = x \ell_{i,j(i)} = x ℓ i , j ( i ) = x なら x x x を真、ℓ i , j ( i ) = ¬ x \ell_{i,j(i)} = \lnot x ℓ i , j ( i ) = ¬ x なら x x x を偽)。この指定に矛盾が起きないことを確かめます。もし 2 つの添字 i ≠ i ′ i \ne i' i = i ′ が同じ変数 x x x に相反する値を要求したとすると、ℓ i , j ( i ) \ell_{i,j(i)} ℓ i , j ( i ) と ℓ i ′ , j ( i ′ ) \ell_{i',j(i')} ℓ i ′ , j ( i ′ ) は互いに否定であり、構成により v i , j ( i ) v_{i,j(i)} v i , j ( i ) と v i ′ , j ( i ′ ) v_{i',j(i')} v i ′ , j ( i ′ ) は矛盾辺で結ばれています。これは S S S が独立集合であることに反します。どの i i i からも指定されなかった変数には偽を割り当てます。
こうして得た α \alpha α の下で、各節 C i C_i C i はリテラル ℓ i , j ( i ) \ell_{i,j(i)} ℓ i , j ( i ) が真なので真です。よって α \alpha α は φ \varphi φ を充足します。
以上で ⟨ φ ⟩ ∈ 3 S A T ⟺ f ( ⟨ φ ⟩ ) ∈ I N D S E T \langle \varphi \rangle \in \mathrm{3SAT} \iff f(\langle \varphi \rangle) \in \mathrm{INDSET} ⟨ φ ⟩ ∈ 3SAT ⟺ f (⟨ φ ⟩) ∈ INDSET が示され、3 S A T ≤ p I N D S E T \mathrm{3SAT} \le_{\mathrm{p}} \mathrm{INDSET} 3SAT ≤ p INDSET が成り立ちます。NP 完全性は、系 6.5 で 3 S A T \mathrm{3SAT} 3SAT が NP 困難であることと、定理 5.2 の 3 による推移律から従います。
∎
例 6.7 (帰着を具体的に走らせる )
φ = ( x 1 ∨ ¬ x 2 ∨ ¬ x 3 ) ∧ ( ¬ x 1 ∨ x 2 ∨ x 3 ) ∧ ( x 1 ∨ x 2 ∨ x 3 ) \varphi = (x_1 \lor \lnot x_2 \lor \lnot x_3) \land (\lnot x_1 \lor x_2 \lor x_3) \land (x_1 \lor x_2 \lor x_3) φ = ( x 1 ∨ ¬ x 2 ∨ ¬ x 3 ) ∧ ( ¬ x 1 ∨ x 2 ∨ x 3 ) ∧ ( x 1 ∨ x 2 ∨ x 3 ) に 定理 6.6 の構成を適用します。m = 3 m = 3 m = 3 なので頂点は 9 個で、対応は次のとおりです。
頂点 v 1 , 1 v_{1,1} v 1 , 1 v 1 , 2 v_{1,2} v 1 , 2 v 1 , 3 v_{1,3} v 1 , 3 v 2 , 1 v_{2,1} v 2 , 1 v 2 , 2 v_{2,2} v 2 , 2 v 2 , 3 v_{2,3} v 2 , 3 v 3 , 1 v_{3,1} v 3 , 1 v 3 , 2 v_{3,2} v 3 , 2 v 3 , 3 v_{3,3} v 3 , 3 リテラル x 1 x_1 x 1 ¬ x 2 \lnot x_2 ¬ x 2 ¬ x 3 \lnot x_3 ¬ x 3 ¬ x 1 \lnot x_1 ¬ x 1 x 2 x_2 x 2 x 3 x_3 x 3 x 1 x_1 x 1 x 2 x_2 x 2 x 3 x_3 x 3
辺を数えます。節内の辺は三角形 3 個で 3 × 3 = 9 3 \times 3 = 9 3 × 3 = 9 本です。矛盾辺は、x 1 x_1 x 1 を含む v 1 , 1 , v 3 , 1 v_{1,1}, v_{3,1} v 1 , 1 , v 3 , 1 と ¬ x 1 \lnot x_1 ¬ x 1 の v 2 , 1 v_{2,1} v 2 , 1 の間で 2 本、¬ x 2 \lnot x_2 ¬ x 2 の v 1 , 2 v_{1,2} v 1 , 2 と x 2 x_2 x 2 を含む v 2 , 2 , v 3 , 2 v_{2,2}, v_{3,2} v 2 , 2 , v 3 , 2 の間で 2 本、¬ x 3 \lnot x_3 ¬ x 3 の v 1 , 3 v_{1,3} v 1 , 3 と x 3 x_3 x 3 を含む v 2 , 3 , v 3 , 3 v_{2,3}, v_{3,3} v 2 , 3 , v 3 , 3 の間で 2 本、合計 6 本です。全部で 15 本の辺を持つ 9 頂点のグラフができました。
S = { v 1 , 1 , v 2 , 2 , v 3 , 1 } S = \{v_{1,1},\, v_{2,2},\, v_{3,1}\} S = { v 1 , 1 , v 2 , 2 , v 3 , 1 } が独立集合かどうかを確かめます。3 頂点はそれぞれ別の節に属するので節内の辺はありません。矛盾辺については、v 1 , 1 v_{1,1} v 1 , 1 と v 3 , 1 v_{3,1} v 3 , 1 はどちらも x 1 x_1 x 1 (互いに否定ではない)、v 1 , 1 v_{1,1} v 1 , 1 と v 2 , 2 v_{2,2} v 2 , 2 は x 1 x_1 x 1 と x 2 x_2 x 2 、v 2 , 2 v_{2,2} v 2 , 2 と v 3 , 1 v_{3,1} v 3 , 1 は x 2 x_2 x 2 と x 1 x_1 x 1 で、いずれも矛盾していません。よって S S S は大きさ 3 の独立集合です。
証明の (⇐ \Leftarrow ⇐ ) 方向の手続きに従って割当を復元します。v 1 , 1 = x 1 v_{1,1} = x_1 v 1 , 1 = x 1 から x 1 x_1 x 1 は真、v 2 , 2 = x 2 v_{2,2} = x_2 v 2 , 2 = x 2 から x 2 x_2 x 2 は真、v 3 , 1 = x 1 v_{3,1} = x_1 v 3 , 1 = x 1 からも x 1 x_1 x 1 は真(矛盾なし)。x 3 x_3 x 3 はどこからも指定されないので偽とします。α = ( x 1 , x 2 , x 3 ) = ( 真 , 真 , 偽 ) \alpha = (x_1, x_2, x_3) = (\text{真}, \text{真}, \text{偽}) α = ( x 1 , x 2 , x 3 ) = ( 真 , 真 , 偽 ) を φ \varphi φ に代入すると、第 1 節は ( 真 ∨ 偽 ∨ 真 ) = (\text{真} \lor \text{偽} \lor \text{真}) = ( 真 ∨ 偽 ∨ 真 ) = 真、第 2 節は ( 偽 ∨ 真 ∨ 偽 ) = (\text{偽} \lor \text{真} \lor \text{偽}) = ( 偽 ∨ 真 ∨ 偽 ) = 真、第 3 節は ( 真 ∨ 真 ∨ 偽 ) = (\text{真} \lor \text{真} \lor \text{偽}) = ( 真 ∨ 真 ∨ 偽 ) = 真で、確かに φ \varphi φ を充足しています。
なお、このグラフに大きさ 4 の独立集合は存在しません。3 つの三角形から高々 1 頂点ずつしか取れないので、独立集合の大きさは 3 が上限だからです。
x1 ¬x2 ¬x3 ¬x1 x2 x3 x1 x2 x3 第 1 節 第 2 節 第 3 節 上の例の 3SAT 論理式から、独立集合への帰着で作られるグラフ。実線の三角形が節内の辺、曲がった線が矛盾辺で、塗りつぶした 3 頂点が大きさ 3 の独立集合。
P ≠ NP の世界 P = NP の世界 NP 完全 P P = NP SAT · 3SAT · TSP · 独立集合 NP 中間?(整数分解・グラフ同型) ソート · 最短経路 · 最大流 NP 完全問題も含めすべて多項式時間 公開鍵暗号は成立しない 最適化と定理探索が自動化される NP
P ≠ NP が正しい世界(左)と P = NP の世界(右)
左の図の「NP 中間」の帯が空でないことは、P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP を仮定すれば Ladner の定理(1975)から従います。すなわち P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP ならば、N P \mathrm{NP} NP に属し、P \mathrm{P} P にも属さず NP 完全でもない言語が存在します。整数分解の決定版とグラフ同型判定は、この帯にいるのではないかと予想されている代表例です。どちらも NP 完全であることは示されておらず、P \mathrm{P} P に属することも示されていません。
P = N P \mathrm{P} = \mathrm{NP} P = NP の帰結を語る前に、1 つ技術的なギャップを埋めておきます。ここまで扱ってきたのは「解が存在するか」という決定問題だけですが、実務で欲しいのは解そのものです。S A T \mathrm{SAT} SAT については、決定できれば解も構成できます。
命題 7.1 (SAT の自己帰着性 ) ✓
S A T \mathrm{SAT} SAT を多項式時間で判定するアルゴリズム D D D が存在すると仮定します。このとき、CNF 論理式 φ \varphi φ を入力として、φ \varphi φ が充足可能ならばその充足割当を 1 つ出力し、充足不能ならばその旨を出力する多項式時間アルゴリズムが存在します。
証明(命題 7.1) φ \varphi φ の変数を x 1 , … , x n x_1, \ldots, x_n x 1 , … , x n とします。次のアルゴリズムを考えます。
D ( φ ) D(\varphi) D ( φ ) を呼ぶ。答えが no なら「充足不能」を出力して終了する。
ψ ← φ \psi \leftarrow \varphi ψ ← φ とおく。i = 1 , 2 , … , n i = 1, 2, \ldots, n i = 1 , 2 , … , n について次を繰り返す。
ψ \psi ψ の中の x i x_i x i をすべて「真」に置き換えて簡約した論理式を ψ + \psi^{+} ψ + とする(真になったリテラルを含む節は削除し、偽になったリテラルは節から取り除く)。
D ( ψ + ) D(\psi^{+}) D ( ψ + ) が yes なら a i ← a_i \leftarrow a i ← 真、ψ ← ψ + \psi \leftarrow \psi^{+} ψ ← ψ + とする。そうでなければ a i ← a_i \leftarrow a i ← 偽とし、ψ \psi ψ の中の x i x_i x i をすべて「偽」に置き換えて簡約したものを新たな ψ \psi ψ とする。
( a 1 , … , a n ) (a_1, \ldots, a_n) ( a 1 , … , a n ) を出力する。
正しさを示します。不変条件「ループの各回の開始時点で ψ \psi ψ は充足可能」を i i i に関する帰納法で確かめます。i = 1 i = 1 i = 1 の開始時は手順 1 により ψ = φ \psi = \varphi ψ = φ が充足可能です。i i i の回の開始時に ψ \psi ψ が充足可能だとします。ψ \psi ψ の充足割当 β \beta β を 1 つ取ると、β ( x i ) \beta(x_i) β ( x i ) は真か偽のいずれかで、その値に x i x_i x i を固定した論理式も β \beta β で充足されます。したがって ψ + \psi^{+} ψ + と「x i x_i x i を偽にした ψ \psi ψ 」の少なくとも一方は充足可能です。アルゴリズムは D D D を使ってまず ψ + \psi^{+} ψ + を試し、それが充足可能でなければ偽の側を選びます。ψ + \psi^{+} ψ + が充足不能なら偽の側が充足可能でなければならないので、いずれの分岐でも新しい ψ \psi ψ は充足可能です。
ループ終了時、ψ \psi ψ にはもう変数が残っていないので、簡約後の ψ \psi ψ は定数「真」です(充足可能で変数を持たないのですから)。よって ( a 1 , … , a n ) (a_1,\ldots,a_n) ( a 1 , … , a n ) は φ \varphi φ を充足します。
計算時間は、D D D の呼び出しが n + 1 n + 1 n + 1 回、各回の置き換えと簡約が O ( ∣ φ ∣ ) O(|\varphi|) O ( ∣ φ ∣ ) で、D D D が多項式時間なので全体も多項式時間です。
∎
現代の暗号は「計算が難しい」ことに安全性を預けています。RSA は合成数の素因数分解、ディフィー–ヘルマンや楕円曲線暗号は離散対数、格子暗号は最短ベクトル問題の難しさを仮定しています。
P = N P \mathrm{P} = \mathrm{NP} P = NP ならこれらは一斉に崩れます。理由は一般的です。多項式時間で計算できる関数 f f f と多項式 p p p (逆像の長さの上限。暗号で使う関数は入力長と出力長が多項式で結ばれているので、この p p p は取れます)について、言語
A f = { ⟨ y , u ⟩ : ∃ z [ ∣ z ∣ ≤ p ( ∣ y ∣ ) かつ f ( z ) = y かつ z の先頭部分が u ] } A_f = \{\, \langle y, u \rangle : \exists z \ \bigl[\, |z| \le p(|y|) \ \text{かつ} \ f(z) = y \ \text{かつ} \ z \ \text{の先頭部分が} \ u \,\bigr] \,\} A f = { ⟨ y , u ⟩ : ∃ z [ ∣ z ∣ ≤ p ( ∣ y ∣ ) かつ f ( z ) = y かつ z の先頭部分が u ] }
は N P \mathrm{NP} NP に属します(証明書は z z z そのもので、検証は f ( z ) f(z) f ( z ) を計算して y y y と比べ、先頭を照合するだけです)。P = N P \mathrm{P} = \mathrm{NP} P = NP ならば A f ∈ P A_f \in \mathrm{P} A f ∈ P なので、u u u を 1 ビットずつ伸ばしながら A f A_f A f を問い合わせることで、f f f の逆像 z z z を多項式時間で 1 ビットずつ確定できます。つまり一方向関数は存在しません 。一方向関数がなければ、擬似乱数生成器も、それに立脚する現代的な共通鍵暗号の安全性証明も成り立ちません。共通鍵暗号を直接攻撃することもできます。平文と暗号文の対 ( m 1 , c 1 ) , … , ( m t , c t ) (m_1, c_1), \ldots, (m_t, c_t) ( m 1 , c 1 ) , … , ( m t , c t ) が与えられたとき、「すべての i i i で E k ( m i ) = c i E_k(m_i) = c_i E k ( m i ) = c i となる鍵 k k k が存在するか」は N P \mathrm{NP} NP に属する(証明書は k k k )ので、P = N P \mathrm{P} = \mathrm{NP} P = NP なら鍵を多項式時間で復元できます。
例 4.6 の T S P \mathrm{TSP} TSP で考えます。P = N P \mathrm{P} = \mathrm{NP} P = NP なら T S P ∈ P \mathrm{TSP} \in \mathrm{P} TSP ∈ P なので、閾値 k k k を変えながら二分探索できます。辺重みが非負整数で最大値を W W W とすると最適値は 0 0 0 以上 n W nW nW 以下なので、⌈ log 2 ( n W + 1 ) ⌉ \lceil \log_2 (nW + 1) \rceil ⌈ log 2 ( nW + 1 )⌉ 回の問い合わせで最適値が確定します。W W W は入力に 2 進法で書かれているので log 2 W \log_2 W log 2 W は入力サイズ以下であり、問い合わせ回数は入力サイズの多項式(実際は線形)です。最適な巡回路そのものも、辺を 1 本ずつ「使う/使わない」と固定しながら同じ問い合わせを繰り返せば構成できます(命題 7.1 と同じ論法です)。
同じことが、物流の配送計画、工場のスケジューリング、集積回路の配置配線、時間割編成、無線周波数の割当、格子モデル上のタンパク質の折り畳みなど、NP 困難と分かっている膨大な数の最適化問題について一斉に起こります。これらは現在、近似アルゴリズムやヒューリスティクスで「そこそこの解」を出して運用されている領域です。P = N P \mathrm{P} = \mathrm{NP} P = NP ならすべて厳密最適解が得られます。
固定した形式体系(たとえば ZFC 集合論)で、命題 φ \varphi φ の証明とは有限個の記号列であり、それが正しい証明かどうかは機械的に、証明の長さの多項式時間で検査できます。したがって言語
{ ⟨ φ , 1 n ⟩ : φ は長さ n 以下の証明を持つ } \{\, \langle \varphi, 1^{n} \rangle : \varphi \ \text{は長さ} \ n \ \text{以下の証明を持つ} \,\} { ⟨ φ , 1 n ⟩ : φ は長さ n 以下の証明を持つ }
は N P \mathrm{NP} NP に属します(証明書は証明そのもの。証明の長さの上限 n n n を単進法 1 n 1^n 1 n で書いてあるのは、入力サイズを n n n 以上にして証明書長の多項式上限を成立させるための技術的な工夫です)。P = N P \mathrm{P} = \mathrm{NP} P = NP ならこれは多項式時間で判定でき、命題 7.1 と同様の論法で証明そのものも構成できます。つまり「長さ 10 6 10^6 1 0 6 以内の証明を持つ未解決問題」は、すべて機械的に解決されます。これはまさにゲーデルが 1956 年の手紙で予見した帰結です。
P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP を示すには、S A T \mathrm{SAT} SAT のような 1 つの問題について「いかなる アルゴリズムも多項式時間では解けない」を証明しなければなりません。上界(速いアルゴリズムがあること)は 1 つ作れば済みますが、下界はあらゆるアルゴリズムを同時に否定する必要があります。ここが難所です。
下界がまったく証明できないわけではありません。たとえば比較ソートに Ω ( n log n ) \Omega(n \log n) Ω ( n log n ) 回の比較が必要なことは、決定木の葉が n ! n! n ! 個以上必要という数え上げで示せます(定理 6.1[ソートアルゴリズム] 。詳しくは ソートアルゴリズム を参照してください)。ただしこの証明は「比較しか使わない」というモデルの制限に強く依存しています。P \mathrm{P} P vs N P \mathrm{NP} NP ではアルゴリズムに一切の制限を置けないので、同じ手は使えません。
さらに、既存の証明技法が原理的に届かないことを示す「障壁」が 3 つ知られています。
相対化の壁(Baker–Gill–Solovay, 1975)。 ここでオラクルとは、ある問題の答えを 1 ステップで教えてくれる仮想的な「神託の箱」のことです。オラクル A A A を与えて P A = N P A \mathrm{P}^{A} = \mathrm{NP}^{A} P A = NP A となるものと、オラクル B B B を与えて P B ≠ N P B \mathrm{P}^{B} \ne \mathrm{NP}^{B} P B = NP B となるものがともに存在します。対角線論法や機械のシミュレーションといった技法は、オラクルを付けてもそのまま通用する(相対化する)性質を持ちます。したがってそれらの技法だけでは、P \mathrm{P} P と N P \mathrm{NP} NP の関係をどちらにも決められません。停止問題の決定不能性の証明をそのまま流用しても届かない、ということです。
自然証明の壁(Razborov–Rudich, 1997)。 回路計算量の下界証明の多くは、「難しい関数」を特徴づける性質を作り、それが構成可能かつ多くの関数に当てはまる、という形をしています。この形(自然な証明)で N P \mathrm{NP} NP の回路下界を示せてしまうと、十分に強い擬似乱数関数が存在しないことになり、暗号の標準的な仮定と矛盾します。つまり、既存の回路下界技法の自然な拡張では届きません。
代数化の壁(Aaronson–Wigderson, 2009)。 相対化の壁を破った技法として、論理式を多項式に持ち上げる算術化があります(I P = P S P A C E \mathrm{IP} = \mathrm{PSPACE} IP = PSPACE の証明などで使われました)。しかし算術化を含むように相対化の概念を一般化した「代数化」の下でも、同じ型の障壁が成り立ちます。
現在の見通しについて、Gasarch が 3 度(2002 年、2012 年、2019 年)行った研究者アンケートでは、回を追うごとに P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP 支持が増え、2019 年には回答者の約 9 割が P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP と予想しています。この問題は 2000 年にクレイ数学研究所のミレニアム懸賞問題に選ばれ、解決には 100 万ドルの賞金が懸けられています。
演習 9.1 易
言語 L L L の補集合を L ‾ = Σ ∗ ∖ L \overline{L} = \Sigma^{*} \setminus L L = Σ ∗ ∖ L と書きます。
L ∈ P L \in \mathrm{P} L ∈ P ならば L ‾ ∈ P \overline{L} \in \mathrm{P} L ∈ P であることを示してください。
同じ議論を 定義 4.1 に適用しようとすると、どこで破綻するかを説明してください。
P ⊆ N P ∩ c o N P \mathrm{P} \subseteq \mathrm{NP} \cap \mathrm{coNP} P ⊆ NP ∩ coNP を示してください。
解答 1. L ∈ P L \in \mathrm{P} L ∈ P とし、定義 3.1 の機械 M M M と多項式 p p p を取ります。M M M の受理状態と拒否状態を入れ替えた機械を M ′ M' M ′ とします。M M M はすべての入力で p ( ∣ x ∣ ) p(|x|) p ( ∣ x ∣ ) ステップ以内に停止する(M M M が無限ループしない)ので、M ′ M' M ′ もすべての入力で p ( ∣ x ∣ ) p(|x|) p ( ∣ x ∣ ) ステップ以内に停止し、M ′ M' M ′ が x x x を受理する ⟺ \iff ⟺ M M M が x x x を拒否する ⟺ \iff ⟺ x ∉ L x \notin L x ∈ / L ⟺ \iff ⟺ x ∈ L ‾ x \in \overline{L} x ∈ L です。よって L ‾ ∈ P \overline{L} \in \mathrm{P} L ∈ P です。停止性の仮定が本質的である点に注意してください。
2. 定義 4.1 は yes 側と no 側で非対称です。V V V の出力を反転した V ′ V' V ′ を作っても、∃ y [ V ′ ( x , y ) = 1 ] \exists y\, [V'(x,y) = 1] ∃ y [ V ′ ( x , y ) = 1 ] は「V ( x , y ) = 0 V(x,y) = 0 V ( x , y ) = 0 となる y y y が 1 つでもある」を意味するだけで、「すべての y y y について V ( x , y ) = 0 V(x,y) = 0 V ( x , y ) = 0 」(これが x ∉ L x \notin L x ∈ / L の内容)とは全く別の条件です。存在量化子を否定すると全称量化子になるので、証明書という道具がそのままでは使えません。実際、N P = c o N P \mathrm{NP} = \mathrm{coNP} NP = coNP かどうかは未解決です。
3. L ∈ P L \in \mathrm{P} L ∈ P とします。命題 4.7 より L ∈ N P L \in \mathrm{NP} L ∈ NP です。また 1 より L ‾ ∈ P \overline{L} \in \mathrm{P} L ∈ P で、再び 命題 4.7 より L ‾ ∈ N P \overline{L} \in \mathrm{NP} L ∈ NP なので、注意 4.5 の定義により L ∈ c o N P L \in \mathrm{coNP} L ∈ coNP です。よって L ∈ N P ∩ c o N P L \in \mathrm{NP} \cap \mathrm{coNP} L ∈ NP ∩ coNP です。
演習 9.2 標準
部分和問題を S U B S E T - S U M = { ⟨ a 1 , … , a n , t ⟩ : ∃ S ⊆ { 1 , … , n } , ∑ i ∈ S a i = t } \mathrm{SUBSET\text{-}SUM} = \{\, \langle a_1, \ldots, a_n, t \rangle : \exists S \subseteq \{1,\ldots,n\},\ \sum_{i \in S} a_i = t \,\} SUBSET - SUM = { ⟨ a 1 , … , a n , t ⟩ : ∃ S ⊆ { 1 , … , n } , ∑ i ∈ S a i = t } とします。ここで a i a_i a i と t t t はいずれも 2 進法で書かれた正整数です。
S U B S E T - S U M ∈ N P \mathrm{SUBSET\text{-}SUM} \in \mathrm{NP} SUBSET - SUM ∈ NP を、証明書と検証器を明示して示してください。
動的計画法 で学んだナップサック問題と同型の O ( n t ) O(nt) O ( n t ) 時間の動的計画法(系 6.4[動的計画法] )は、なぜこの問題が P \mathrm{P} P に属することの証明にならないのでしょうか。
解答 1. 証明書として、部分集合 S S S を表す長さ n n n のビット列 y y y (第 i i i ビットが 1 なら i ∈ S i \in S i ∈ S )を取ります。∣ y ∣ = n |y| = n ∣ y ∣ = n であり、入力には n n n 個の整数が書かれているので n ≤ ∣ x ∣ n \le |x| n ≤ ∣ x ∣ 、したがって p ( m ) = m p(m) = m p ( m ) = m とすれば証明書長の上限を満たします。検証器 V ( x , y ) V(x,y) V ( x , y ) は、y y y の 1 のビットに対応する a i a_i a i を順に足し、その和を t t t と比較して一致すれば 1 を返します。各 a i a_i a i のビット長を高々 L L L とすると、和は高々 L + ⌈ log 2 n ⌉ L + \lceil \log_2 n \rceil L + ⌈ log 2 n ⌉ ビットに収まるので、加算 n n n 回の総コストは O ( n ( L + log n ) ) O(n(L + \log n)) O ( n ( L + log n )) ビット演算です。入力サイズは n n n 以上であり、かつ L L L 以上でもあるので、この総コストは入力サイズの多項式で抑えられます。定義 4.1 の条件が満たされるので S U B S E T - S U M ∈ N P \mathrm{SUBSET\text{-}SUM} \in \mathrm{NP} SUBSET - SUM ∈ NP です。
2. 計算量 O ( n t ) O(nt) O ( n t ) の t t t は値 であって入力サイズではないからです。注意 2.2 のとおり t t t は 2 進法で書かれるので、その入力サイズは ⌈ log 2 ( t + 1 ) ⌉ \lceil \log_2 (t+1) \rceil ⌈ log 2 ( t + 1 )⌉ ビットにすぎません。入力サイズを m m m とすると t t t は 2 m 2^{m} 2 m 程度まで大きくでき、O ( n t ) O(nt) O ( n t ) は O ( n 2 m ) O(n 2^{m}) O ( n 2 m ) 、つまり入力サイズの指数時間になり得ます。このような計算量を擬多項式時間 と呼びます。もし t t t を単進法で書けば入力サイズが t t t 以上になるので同じアルゴリズムが多項式時間になりますが、それは 注意 2.2 で禁じた水増しです。事実、S U B S E T - S U M \mathrm{SUBSET\text{-}SUM} SUBSET - SUM は NP 完全であることが知られているので、系 6.2 により、P ≠ N P \mathrm{P} \ne \mathrm{NP} P = NP ならば真の多項式時間アルゴリズムは存在しません。
演習 9.3 標準
無向グラフ G = ( V , E ) G = (V, E) G = ( V , E ) について、C ⊆ V C \subseteq V C ⊆ V が頂点被覆 であるとは、E E E のどの辺も少なくとも一方の端点を C C C に持つことをいいます。また K ⊆ V K \subseteq V K ⊆ V がクリーク であるとは、K K K のどの相異なる 2 頂点も E E E で結ばれていることをいいます。次の 2 つの言語を考えます。
V C = { ⟨ G , k ⟩ : G は大きさ k の頂点被覆を持つ無向グラフ } C L I Q U E = { ⟨ G , k ⟩ : G は大きさ k のクリークを持つ無向グラフ } \begin{aligned}
\mathrm{VC} &= \{\, \langle G, k \rangle : G \ \text{は大きさ} \ k \ \text{の頂点被覆を持つ無向グラフ} \,\} \\
\mathrm{CLIQUE} &= \{\, \langle G, k \rangle : G \ \text{は大きさ} \ k \ \text{のクリークを持つ無向グラフ} \,\}
\end{aligned} VC CLIQUE = { ⟨ G , k ⟩ : G は大きさ k の頂点被覆を持つ無向グラフ } = { ⟨ G , k ⟩ : G は大きさ k のクリークを持つ無向グラフ }
I N D S E T ≤ p V C \mathrm{INDSET} \le_{\mathrm{p}} \mathrm{VC} INDSET ≤ p VC を示してください。
I N D S E T ≤ p C L I Q U E \mathrm{INDSET} \le_{\mathrm{p}} \mathrm{CLIQUE} INDSET ≤ p CLIQUE を示してください。
これらから V C \mathrm{VC} VC と C L I Q U E \mathrm{CLIQUE} CLIQUE が NP 完全であることを結論してください(N P \mathrm{NP} NP への所属は認めてよいものとします)。
解答 1. 鍵になる観察は「S S S が独立集合 ⟺ \iff ⟺ V ∖ S V \setminus S V ∖ S が頂点被覆」です。実際、S S S が独立集合であることは「両端点がともに S S S に入る辺が存在しない」ことで、これは「どの辺も少なくとも一方の端点が V ∖ S V \setminus S V ∖ S に入る」ことと同値であり、後者は V ∖ S V \setminus S V ∖ S が頂点被覆であることにほかなりません。
帰着関数を、k ≤ ∣ V ∣ k \le |V| k ≤ ∣ V ∣ のとき f ( ⟨ G , k ⟩ ) = ⟨ G , ∣ V ∣ − k ⟩ f(\langle G, k\rangle) = \langle G, |V| - k \rangle f (⟨ G , k ⟩) = ⟨ G , ∣ V ∣ − k ⟩ 、k > ∣ V ∣ k > |V| k > ∣ V ∣ のときは固定した no インスタンス(たとえば辺のない 1 頂点グラフと k = 2 k = 2 k = 2 )と定めます。k ≤ ∣ V ∣ k \le |V| k ≤ ∣ V ∣ の場合、G G G が大きさ k k k の独立集合 S S S を持つ ⟺ \iff ⟺ G G G が大きさ ∣ V ∣ − k |V| - k ∣ V ∣ − k の頂点被覆 V ∖ S V \setminus S V ∖ S を持つ、が上の観察から従います。k > ∣ V ∣ k > |V| k > ∣ V ∣ の場合は大きさ k k k の頂点部分集合自体が存在しないので、どちらも no です。f f f は頂点数を数えて引き算するだけなので多項式時間です。
2. 補グラフ G ‾ = ( V , E ‾ ) \overline{G} = (V, \overline{E}) G = ( V , E ) を、E ‾ = { { u , v } : u ≠ v , { u , v } ∉ E } \overline{E} = \{\{u,v\} : u \ne v,\ \{u,v\} \notin E\} E = {{ u , v } : u = v , { u , v } ∈ / E } で定めます。S S S が G G G の独立集合である ⟺ \iff ⟺ S S S の相異なる 2 頂点はすべて E E E で結ばれていない ⟺ \iff ⟺ S S S の相異なる 2 頂点はすべて E ‾ \overline{E} E で結ばれている ⟺ \iff ⟺ S S S が G ‾ \overline{G} G のクリークである、が定義から直ちに従います。よって f ( ⟨ G , k ⟩ ) = ⟨ G ‾ , k ⟩ f(\langle G, k\rangle) = \langle \overline{G}, k \rangle f (⟨ G , k ⟩) = ⟨ G , k ⟩ が帰着です。補グラフの構成は隣接行列の 0 0 0 と 1 1 1 を(対角成分を除いて)反転するだけなので O ( ∣ V ∣ 2 ) O(|V|^{2}) O ( ∣ V ∣ 2 ) 時間、特に多項式時間です。
3. 定理 6.6 より I N D S E T \mathrm{INDSET} INDSET は NP 困難、すなわち任意の L ∈ N P L \in \mathrm{NP} L ∈ NP について L ≤ p I N D S E T L \le_{\mathrm{p}} \mathrm{INDSET} L ≤ p INDSET です。これと 1、2 および 定理 5.2 の 3(推移律)を合わせると、L ≤ p V C L \le_{\mathrm{p}} \mathrm{VC} L ≤ p VC および L ≤ p C L I Q U E L \le_{\mathrm{p}} \mathrm{CLIQUE} L ≤ p CLIQUE が任意の L ∈ N P L \in \mathrm{NP} L ∈ NP について成り立ちます。よって両者は NP 困難で、N P \mathrm{NP} NP に属するので 定義 6.1 により NP 完全です。
演習 9.4 難
ある NP 完全な言語 B B B が c o N P \mathrm{coNP} coNP にも属するならば、N P = c o N P \mathrm{NP} = \mathrm{coNP} NP = coNP であることを示してください。この結果は「S A T \mathrm{SAT} SAT の充足不能性に短い証明書がある」という主張がどれほど強いかを教えてくれます。
解答 まず補題として、c o N P \mathrm{coNP} coNP が ≤ p \le_{\mathrm{p}} ≤ p について閉じていること、すなわち「A ≤ p B A \le_{\mathrm{p}} B A ≤ p B かつ B ∈ c o N P B \in \mathrm{coNP} B ∈ coNP ならば A ∈ c o N P A \in \mathrm{coNP} A ∈ coNP 」を示します。f f f を A ≤ p B A \le_{\mathrm{p}} B A ≤ p B の帰着関数とすると、定義 5.1 の条件 2 は x ∈ A ⟺ f ( x ) ∈ B x \in A \iff f(x) \in B x ∈ A ⟺ f ( x ) ∈ B なので、その否定を取って x ∈ A ‾ ⟺ f ( x ) ∈ B ‾ x \in \overline{A} \iff f(x) \in \overline{B} x ∈ A ⟺ f ( x ) ∈ B が成り立ちます。すなわち同じ f f f が A ‾ ≤ p B ‾ \overline{A} \le_{\mathrm{p}} \overline{B} A ≤ p B を与えます。B ∈ c o N P B \in \mathrm{coNP} B ∈ coNP は 注意 4.5 により B ‾ ∈ N P \overline{B} \in \mathrm{NP} B ∈ NP を意味するので、定理 5.2 の 2 を A ‾ ≤ p B ‾ \overline{A} \le_{\mathrm{p}} \overline{B} A ≤ p B に適用して A ‾ ∈ N P \overline{A} \in \mathrm{NP} A ∈ NP 、すなわち A ∈ c o N P A \in \mathrm{coNP} A ∈ coNP を得ます。
本題に入ります。B B B を NP 完全かつ B ∈ c o N P B \in \mathrm{coNP} B ∈ coNP とします。
N P ⊆ c o N P \mathrm{NP} \subseteq \mathrm{coNP} NP ⊆ coNP :任意に L ∈ N P L \in \mathrm{NP} L ∈ NP を取ります。B B B は NP 困難なので 定義 6.1 より L ≤ p B L \le_{\mathrm{p}} B L ≤ p B です。B ∈ c o N P B \in \mathrm{coNP} B ∈ coNP と上の補題より L ∈ c o N P L \in \mathrm{coNP} L ∈ coNP です。
c o N P ⊆ N P \mathrm{coNP} \subseteq \mathrm{NP} coNP ⊆ NP :任意に L ∈ c o N P L \in \mathrm{coNP} L ∈ coNP を取ります。定義より L ‾ ∈ N P \overline{L} \in \mathrm{NP} L ∈ NP で、いま示した包含より L ‾ ∈ c o N P \overline{L} \in \mathrm{coNP} L ∈ coNP 、すなわち L ‾ ‾ = L ∈ N P \overline{\overline{L}} = L \in \mathrm{NP} L = L ∈ NP です。
以上より N P = c o N P \mathrm{NP} = \mathrm{coNP} NP = coNP です。
補足:S A T \mathrm{SAT} SAT は NP 完全なので、もし「充足不能な CNF 論理式であることの多項式長の証明書」が見つかれば S A T ∈ c o N P \mathrm{SAT} \in \mathrm{coNP} SAT ∈ coNP となり、N P = c o N P \mathrm{NP} = \mathrm{coNP} NP = coNP が従います。命題論理の証明体系(導出原理など)に対する指数下界の研究は、まさにこの可能性を否定しにいく試みです。
Michael Sipser, Introduction to the Theory of Computation , 3rd ed., Cengage Learning, 2013 — 第 7 章(時間計算量、P \mathrm{P} P 、N P \mathrm{NP} NP 、NP 完全性)、第 9 章(時間階層定理)。学部向けの標準的な入口です。
Sanjeev Arora and Boaz Barak, Computational Complexity: A Modern Approach , Cambridge University Press, 2009 — 第 2 章(N P \mathrm{NP} NP と NP 完全性)、第 3 章(対角線論法と相対化の壁)、第 23 章(自然証明)。証明の障壁まで扱う定番の大学院教科書です。
Michael R. Garey and David S. Johnson, Computers and Intractability: A Guide to the Theory of NP-Completeness , W. H. Freeman, 1979 — 巻末に約 300 個の NP 完全問題の一覧があります。
Stephen A. Cook, “The complexity of theorem-proving procedures”, Proceedings of the 3rd Annual ACM Symposium on Theory of Computing (STOC ‘71) , 1971, pp. 151–158.
Richard M. Karp, “Reducibility among combinatorial problems”, in Complexity of Computer Computations , Plenum Press, 1972, pp. 85–103.
Theodore Baker, John Gill and Robert Solovay, “Relativizations of the P =? NP question”, SIAM Journal on Computing 4(4) (1975), 431–442.
Clay Mathematics Institute, P vs NP Problem — ミレニアム懸賞問題の公式ページ。Cook による問題の公式記述が置かれています。
定理 6.3 の NP 困難性の部分について、定理 6.3 の証明で述べた計算表の構成をもう少し詳しく書きます。完全な証明は Sipser 第 7 章または Arora–Barak 第 2 章にあります。
設定。 L ∈ N P L \in \mathrm{NP} L ∈ NP とし、注意 4.2 の同値性により、L L L を受理する非決定性 1 テープチューリング機械 N N N と多項式 T T T を取ります。N N N は長さ n n n の入力に対し、どの計算枝でも高々 T ( n ) T(n) T ( n ) ステップで停止するとしてよく、また T ( n ) ≥ n T(n) \ge n T ( n ) ≥ n としてよいものとします。N N N の状態集合を Q Q Q 、テープ記号の集合を Γ \Gamma Γ とします。これらは有限で、n n n に依存しません。
計算表。 入力 x x x (長さ n n n )に対する N N N の 1 つの計算枝を、( T ( n ) + 1 ) (T(n)+1) ( T ( n ) + 1 ) 行 × \times × ( T ( n ) + 3 ) (T(n)+3) ( T ( n ) + 3 ) 列の表として書きます。第 i i i 行は時刻 i i i における「テープの内容と、ヘッド位置に状態記号を挿入したもの」を表し、両端には番兵記号を置きます。各マスに入る記号は Γ ∪ Q \Gamma \cup Q Γ ∪ Q と番兵からなる有限集合 Δ \Delta Δ の元です。時刻 T ( n ) T(n) T ( n ) までしか動かないので、ヘッドが訪れるマスは初期位置から高々 T ( n ) T(n) T ( n ) 個分に収まり、表の幅は T ( n ) T(n) T ( n ) の 1 次式で足ります。
変数。 各マス ( i , j ) (i, j) ( i , j ) と各記号 s ∈ Δ s \in \Delta s ∈ Δ に対して命題変数 x i , j , s x_{i,j,s} x i , j , s を用意し、「マス ( i , j ) (i,j) ( i , j ) の中身が s s s である」という意味を持たせます。変数の個数は ( T ( n ) + 1 ) ( T ( n ) + 3 ) ∣ Δ ∣ = O ( T ( n ) 2 ) (T(n)+1)(T(n)+3)|\Delta| = O(T(n)^2) ( T ( n ) + 1 ) ( T ( n ) + 3 ) ∣Δ∣ = O ( T ( n ) 2 ) 個です(∣ Δ ∣ |\Delta| ∣Δ∣ は定数)。
4 種類の節。 求める論理式 φ x \varphi_x φ x を、次の 4 群の節の論理積として定めます。
第 1 群(一意性)は、各マスの中身がちょうど 1 つに決まることを述べます。各 ( i , j ) (i,j) ( i , j ) について ⋁ s ∈ Δ x i , j , s \bigvee_{s \in \Delta} x_{i,j,s} ⋁ s ∈ Δ x i , j , s という節を 1 つと、s ≠ s ′ s \ne s' s = s ′ なる各対について ( ¬ x i , j , s ∨ ¬ x i , j , s ′ ) (\lnot x_{i,j,s} \lor \lnot x_{i,j,s'}) ( ¬ x i , j , s ∨ ¬ x i , j , s ′ ) を置きます。マスあたり 1 + ( ∣ Δ ∣ 2 ) 1 + \binom{|\Delta|}{2} 1 + ( 2 ∣Δ∣ ) 個、つまり定数個の節です。
第 2 群(開始)は、第 0 行が初期状況、すなわち番兵、初期状態 q 0 q_0 q 0 、入力 x x x の各文字、空白記号、番兵の順に並ぶことを、該当する変数を単一リテラルの節として並べることで述べます。O ( T ( n ) ) O(T(n)) O ( T ( n )) 個の節です。
第 3 群(遷移)は、連続する 2 行が N N N の遷移規則と整合することを述べます。ここで効くのが「1 ステップで変化するのはヘッドの周囲だけ」という局所性です。第 i i i 行の第 j − 1 , j , j + 1 j-1, j, j+1 j − 1 , j , j + 1 列の 3 マスが決まれば、第 i + 1 i+1 i + 1 行の第 j j j 列に入り得る記号は N N N の遷移規則から定まります。そこで各 ( i , j ) (i,j) ( i , j ) について、上段 3 マスと下段 3 マスからなる 2 × 3 2 \times 3 2 × 3 の窓の中身が「合法な窓」のいずれかに一致することを要求します。窓の中身の組合せは ∣ Δ ∣ 6 |\Delta|^{6} ∣Δ ∣ 6 通りという定数個なので、合法でない組合せを禁止する節を定数個並べれば書けます。窓は O ( T ( n ) 2 ) O(T(n)^2) O ( T ( n ) 2 ) 個なので、この群も O ( T ( n ) 2 ) O(T(n)^2) O ( T ( n ) 2 ) 個の節です。
第 4 群(受理)は、表のどこかに受理状態が現れることを述べます。N N N は受理したらその状況を保つように整えておけば、最終行を見るだけで済み、⋁ j x T ( n ) , j , q a c c e p t \bigvee_{j} x_{T(n),j,q_{\mathrm{accept}}} ⋁ j x T ( n ) , j , q accept という 1 個の節で書けます。
サイズと構成時間。 節の総数は O ( T ( n ) 2 ) O(T(n)^2) O ( T ( n ) 2 ) です。第 1〜第 3 群の節はいずれも定数個のリテラルからなり、第 4 群の節だけが O ( T ( n ) ) O(T(n)) O ( T ( n )) 個のリテラルを持つので、リテラルの延べ個数も O ( T ( n ) 2 ) O(T(n)^2) O ( T ( n ) 2 ) です。したがって φ x \varphi_x φ x の記述長は O ( T ( n ) 2 log T ( n ) ) O(T(n)^2 \log T(n)) O ( T ( n ) 2 log T ( n )) 程度(変数の添字を書くビット数を含む)で、n n n の多項式です。しかも各節は x x x と N N N の定義を見れば直接書き下せるので、φ x \varphi_x φ x は x x x から多項式時間で構成できます。
同値性。 φ x \varphi_x φ x の充足割当は、第 1 群により表の各マスに記号を 1 つ割り当てるものと同一視でき、第 2・第 3 群によりその表は N N N の x x x に対する正しい計算の記録であり、第 4 群によりその計算は受理計算です。逆に、N N N の x x x に対する受理計算があれば、その計算表を読み取って作った割当は 4 群すべての節を満たします。したがって
x ∈ L ⟺ N が x を受理する ⟺ φ x は充足可能 ⟺ ⟨ φ x ⟩ ∈ S A T x \in L \iff N \ \text{が} \ x \ \text{を受理する} \iff \varphi_x \ \text{は充足可能} \iff \langle \varphi_x \rangle \in \mathrm{SAT} x ∈ L ⟺ N が x を受理する ⟺ φ x は充足可能 ⟺ ⟨ φ x ⟩ ∈ SAT
となり、x ↦ ⟨ φ x ⟩ x \mapsto \langle \varphi_x \rangle x ↦ ⟨ φ x ⟩ が求める帰着です。L L L は N P \mathrm{NP} NP の任意の元だったので、S A T \mathrm{SAT} SAT は NP 困難であり、例 4.4 の S A T ∈ N P \mathrm{SAT} \in \mathrm{NP} SAT ∈ NP と合わせて NP 完全です。
なぜ SAT だったのか。 この証明を振り返ると、S A T \mathrm{SAT} SAT が特別なのは「計算という動的な過程を、局所的な整合条件の連言として静的に書き下せる」からだと分かります。命題論理は計算のシミュレーションを表現するのにちょうど十分な表現力を持っており、しかも検証は多項式時間で終わります。この「表現力と検証容易性のつり合い」が、S A T \mathrm{SAT} SAT を N P \mathrm{NP} NP の中で最も難しい問題にしています。