1. 時間計算量から考える問題の難しさ
前章(第11章)では、与えられた問題が「計算できるかできないか」について議論しました。この章では、ある問題が計算可能であっても、それはどのくらい難しいのかという点に着目します。第10章では整列問題という1つの問題を題材にアルゴリズムを考えました。この章では、いくつかの問題を題材にして、コンピューター科学で問題の難しさについてどのように考えるのかを見てゆきます。
|
「問題の難しさ」とは何でしょうか? 日常生活でも「この問題は難しい」「あの問題は簡単」と言いますが、コンピューター科学では「問題の難しさ」を数学的に定義します。具体的には、入力サイズが大きくなったときに、その問題を解く最良のアルゴリズムでも計算時間がどのように増加するかによって難しさを測ります。ここでの計算時間は、第10章で学んだ「最悪時間計算量」(同じサイズの入力のうち最も時間がかかる場合の計算時間)で考えます。 |
1.1. 「全線巡り」と「全都市巡り」問題
以下の図をみてください。次のような点と線から構成される構造を、数学ではグラフといい、様々な構造を抽象化した表現に用いられます。点を頂点(node, vertex)、頂点と頂点の間の線を辺(edge)といいます。
ここでは頂点を駅、辺を路線と考えてみましょう。
|
グラフとは? 「グラフ」という言葉を聞くと、多くの人は棒グラフや折れ線グラフを思い浮かべるかもしれません。しかし、ここでの「グラフ」は数学的な概念で、点(頂点)と線(辺)の集合です。ネットワーク構造を表現するのに非常に便利な道具で、交通網、人間関係、インターネットの構造など、さまざまなものを表現できます。 |
「同じ駅は2度通らずに(つまり各駅をただ1度だけ通って)、すべての駅を巡る経路を見つける問題」を考えてみます。このような経路は複数考えられます。
「各頂点をただ1度だけ通って、すべての頂点をめぐる経路」のことを、この問題について研究した数学者の名前からハミルトン路といいます。
|
ハミルトンとは? ウィリアム・ローワン・ハミルトン(1805-1865)はアイルランドの数学者・物理学者です。四元数の発見者としても知られ、物理学の「ハミルトニアン」にもその名が残っています。グラフ理論におけるハミルトン路の名は、彼が考案した「イコシアンゲーム」に由来します。これは正十二面体の辺をたどって、20個の頂点すべてを1度ずつ巡り、出発点に戻るパズルです。 |
以下にハミルトン路の1つの例を赤線で示しています。a → b → d → f → e → c の順に、どの駅もちょうど1度ずつ通っています。
また、旅だとすると出発地点に戻りたいので、出発駅を除いて同じ駅は2度通らずに、すべての駅を巡って出発点に戻る経路を見つける問題もあります。
経路が輪っかのようにつながっているとき、閉路といいます。 「出発点と終点が同じであることを除いて、同じ頂点は2度通らずに、すべての頂点を巡る閉路」のことを、ハミルトン閉路といいます。ハミルトン閉路から辺を1本取り除くと、ハミルトン路が得られます。つまり、ハミルトン閉路を持つグラフは必ずハミルトン路も持ちます(逆は成り立ちません)。
ハミルトン閉路の例を以下に示しました。先ほどのハミルトン路の終点 c から出発点 a へ戻る辺を加えたものです。
さて、鉄道マニアの中にはすべての駅ではなくて、すべての路線を制覇したいという場合もあると思います。この場合は、「同じ路線は1度だけしか通らずに、すべての路線を巡る経路を見つける問題」を解くことになります。駅は何度通過しても構いません。
「同じ辺は1度だけしか通らずに、すべての辺を巡る経路」のことを、この問題を解決した数学者の名前からオイラー路といいます。この問題は、一筆書きとして広く知られている問題と同じです。また、先程と同様に、出発点と終点が同じオイラー路をオイラー閉路といいます。
|
オイラーとは? レオンハルト・オイラー(1707-1783)はスイス生まれの数学者で、数学史上最も多産な数学者の一人とされています。グラフ理論の父とも呼ばれ、ケーニヒスベルク(現在のロシア領カリーニングラード)の橋の問題(7つの橋をすべて1度ずつ渡ることはできるか?)に取り組み、1736年にそれが不可能であることを示しました(章末の練習問題で確かめます)。この研究がオイラー路の概念とグラフ理論の出発点であり、一筆書き問題の原型でもあります。 |
以下にオイラー路の例を示しています。ハミルトン路のように単純に経路を示すことが難しいので、辺に番号と矢印をつけて経路を巡る順番を示しています。辺の番号の順番にたどると一筆書きできることがわかると思います。駅 b, c, e は2度ずつ通っていますが、どの路線もちょうど1度だけ通っています。
ハミルトン路とオイラー路の違いを表にまとめておきます。
| ハミルトン路 | オイラー路 | |
|---|---|---|
1度ずつ通るもの |
すべての頂点(駅) |
すべての辺(路線) |
2度以上通ってよいもの |
なし(辺は通らないものがあってよい) |
頂点 |
出発点に戻る場合 |
ハミルトン閉路 |
オイラー閉路 |
ここで、練習問題です。以下の3つのグラフについて、ハミルトン路とオイラー路があるかどうかを、それぞれ調べてみてください。あるなら実際に1つ見つけてください。
解答
| グラフ | ハミルトン路 | オイラー路 |
|---|---|---|
1 |
あり |
なし |
2 |
なし |
あり |
3 |
なし |
なし |
-
グラフ1: a → b → c → d → e がハミルトン路です。オイラー路がないことは、次の節で説明する次数の条件(次数が奇数の頂点が a, b, c, e の4つある)から分かります。
-
グラフ2: a → b → d → c → b → e → d → f がオイラー路です(次の節で求め方を説明します)。ハミルトン路はありません。a と f は辺が1本しかないので、ハミルトン路の両端になるしかありません。すると経路は a → b で始まり d → f で終わり、その間で c と e の両方を通る必要があります。しかし c と e はどちらも b と d にしかつながっておらず、c と e の間に辺もないので、b と d の間に両方を並べることはできません。
-
グラフ3: ハミルトン路はグラフ2と同じ理由でありません(グラフ3はグラフ2から辺を1本除いたものです)。オイラー路は、次数が奇数の頂点が a, b, d, f の4つあるのでありません。
1.2. どちらが難しい?
グラフが与えられたとき、
-
ハミルトン路を見つける問題
-
オイラー路を見つける問題
最悪時間計算量の観点からは、どちらが計算量の大きい問題でしょう。少し立ち止まって考えてみてください。入力のサイズとして、頂点の数や辺の数を用います。先程の例のような小さな規模の問題では、ハミルトン路もオイラー路も見つける手間はほとんど変わらなかったかもしれません。
|
直感は時として間違う 小さな例では同じように見える2つの問題が、実際には計算量の観点で大きく異なることがあります。これがコンピューター科学の面白さであり、また難しさでもあります。人間の直感だけでは判断できない問題の本質的な違いを、数学的な分析によって明らかにしていくのです。 |
オイラー路問題
オイラー路、つまり一筆書きの存在確認の方法は知っている人が多いかもしれません。先ほどのグラフ2をもう一度考えてみましょう。
まず、頂点に接している辺の数を数えます。この数のことを頂点の次数といいます。
グラフ2の例では、頂点 \(a\) の次数は1、頂点 \(b\) の次数は4です。
|
次数とは? 次数(degree)とは、ある頂点に接続している辺の数のことです。人間関係のネットワークで考えると、「友達の数」のようなものです。この概念は、グラフの性質を理解する上で非常に重要です。 |
以下では、辺をもつ頂点どうしがすべて行き来できる(連結である)ことを前提とします。ばらばらに分かれたグラフでは、そもそも1本の経路ですべての辺をたどることはできません。
-
すべての頂点の次数が偶数のとき、オイラー閉路が存在します。
-
次数が奇数の頂点が2つだけ存在するとき(他にも頂点があれば、その次数はすべて偶数であるとき)、オイラー路が存在して、出発点と終点は、奇数の次数をもつ頂点になります。
-
上記の2つの場合に当てはまらない場合は、オイラー路は存在しません(つまり、オイラー閉路も存在しません)。
なぜ、このことが成り立つか考えてみてください(ここでは証明は示しませんが、とてもシンプルです)。
|
なぜこの判定法が成り立つのか? 直感的に考えてみましょう。一筆書きでは、各頂点で「入ってくる」辺と「出ていく」辺が対になっている必要があります。途中の頂点では、入る回数と出る回数が同じなので、接続する辺の数(次数)は偶数でなければなりません。例外は始点と終点だけで、これらでは辺が1本ずつ「余る」ので次数が奇数になります(始点と終点が同じなら、余った2本が対になって偶数になります)。 これで分かるのは「一筆書きできるなら次数はこの条件を満たす」という向きです。逆向きの「条件を満たせば必ず一筆書きできる」ことも正しく、ヒールホルツァー(Hierholzer)の1873年の論文で証明されました。 |
一筆書きを見つける場合には、次数が奇数の頂点が2つだけ存在するときには、その一方を出発点とします。すべて次数が偶数のときには、どこから出発してもかまいません。
グラフ2の例では、次数が奇数の頂点は \(a\) と \(f\) で、次数はそれぞれ1です。\(a\) から出発してみます。その後は、仕方ない場合を除いて、できるだけ多くの頂点に辺を経由して到達できるように保ちながら、通った辺を削除していきます。
-
\(a\rightarrow b\) を通って、辺を削除します。すると、頂点 \(a\) は孤立してしまいますが、この場合はこれしか選択肢がないので、仕方ありません。
現在の経路: \(a \rightarrow b\) -
次に通過できる辺は \(b\rightarrow c\), \(b\rightarrow d\), \(b\rightarrow e\) の3つがあります。どの辺を選んで削除しても、\(a\) 以外にあらたに到達できない頂点を増やすことはないので、適当に選んでかまいません。ここでは、\(b\rightarrow d\) を選んで消してみます。
現在の経路: \(a \rightarrow b \rightarrow d\) -
\(d\) から出ている辺は \(d\rightarrow c\), \(d\rightarrow e\), \(d\rightarrow f\) の3つです。ただし \(d\rightarrow f\) を通ると、行き止まりの \(f\) に閉じ込められ、残りの辺を通れなくなるので、まだ選択しません。残る \(d\rightarrow c\) か \(d\rightarrow e\) のうち、ここでは \(d\rightarrow c\) を選びます。
現在の経路: \(a \rightarrow b \rightarrow d \rightarrow c\) -
\(c\rightarrow b\) しか選択肢がありませんので、この辺を通過して削除します。
現在の経路: \(a \rightarrow b \rightarrow d \rightarrow c \rightarrow b\) -
同様に辺を選択してゆくと結果的に \(a \rightarrow b \rightarrow d \rightarrow c \rightarrow b \rightarrow e \rightarrow d \rightarrow f\) となり、オイラー路が得られます。
これはFleuryのアルゴリズム(フルーリーのアルゴリズム、1883年)として知られている方法です。時間がかかるのは、辺を通って削除するたびに「その辺を消しても、残りの辺がばらばらにならないか」を確かめる部分で、この確認を素直に毎回やり直すと、最悪時間計算量は辺の数を \(m\) として \(\text O(m^2)\) になります。これより前、1873年の論文に基づくHierholzer(ヒールホルツァー)のアルゴリズムを使うと、オイラー路は \(\text O(m)\) 時間で求められます。答えとして \(m\) 本の辺を並べて出力するだけでも \(m\) に比例する時間がかかるので、これ以上は本質的に速くできません。ここでFleuryのアルゴリズムを紹介したのは、考え方が単純だからです。
|
線形時間 \(\text O(m)\) の意味 \(\text O(m)\) は「辺の数に比例する時間」という意味です。これは非常に効率的で、グラフが大きくなっても辺の数が2倍になれば計算時間も約2倍になるだけです。このような「線形時間」のアルゴリズムは実用上とても重要です。 |
ハミルトン路問題
ハミルトン路を見つける問題については、オイラー路を見つける問題よりもはるかに大きな上界しか知られていません。つまり、知られている最速のアルゴリズムでも、最悪の場合にはオイラー路よりはるかに時間がかかります。ハミルトン路は、すべての頂点をちょうど1度ずつ通る経路を見つける問題でした。すぐに思いつく方法は、次のような方法でしょう。
-
すべての頂点の順列を列挙する
グラフ2の例では、\(abcdef, abcdfe, abcedf, abcefd, \dots\) と6つの頂点のすべての順列を列挙する -
列挙された頂点の並びを順に1つ1つチェックし、頂点の並びを結ぶ辺が実際に存在するかどうかを判定する
-
存在すれば、それがハミルトン路となる
-
存在しなければ、次の順列をチェックする
-
|
順列の爆発的増加 \(n\) 個の頂点の順列の数は \(n!\)(\(n\) の階乗)個あります。これがどれほど大きな数か実感してみましょう。
20個でも約240京通りという天文学的な数になります! |
グラフ2の例では、まず \(abcdef\) をチェックすると、\(a\rightarrow b \rightarrow c \rightarrow d \rightarrow e\) までは辺が存在するが、\(e\rightarrow f\) が存在しないので、次の順列 \(abcdfe\) をチェックします。これをハミルトン路が見つかるまで、すべての順列について繰返します。
すべての順列をチェックしても、順列の各頂点を結ぶ辺が見つからなければ、ハミルトン路は存在しないことになります。この方法はとてもシンプルで直感的にもわかりやすい方法です。しかし、時間計算量は、各順列について隣接関係をすべて確認する単純な実装では、頂点数を \(n\) とすると \(\text O(n\cdot n!)\) となってしまいます。1962年に動的計画法というアルゴリズムの手法を用いたBellman–Held–Karpアルゴリズムが考案され、上界は \(\text O(n^2 2^n)\) にまで改善されました。
|
動的計画法による改善 Bellman–Held–Karpアルゴリズムは「動的計画法」という手法を使います。これは「同じ部分問題を何度も解く無駄を省く」アイデアです。ハミルトン路の場合は、「訪れた頂点の集合」と「最後にいる頂点」の組ごとに、そこまでたどり着けるかどうかを表に記録します。途中までの順番が違っても、訪れた頂点の集合と最後の頂点が同じなら、その先の可能性は同じだからです。 \(\text O(n^2 2^n)\) は \(\text O(n \cdot n!)\) よりはずっと小さいですが、それでも指数時間であることに変わりはありません。その後も改良は続いており、たとえば無向グラフについては2010年にBjörklundが \(\text O(1.657^n)\) 程度の時間で(ごく小さな確率で誤る可能性を許す乱択アルゴリズムとして)判定する方法を示しましたが、これも指数時間です。 |
頂点間に距離(重み)を与えて、すべての頂点をちょうど1度ずつ巡って出発点に戻る経路のうち最短のものを求める問題、つまりハミルトン閉路問題の重み付き版に相当する問題を考えると、日常的にも役に立ちそうな問題設定であることがわかると思います。この問題は、巡回セールスマン問題(Traveling Salesman Problem: TSP)として知られています。
|
巡回セールスマン問題の実用性 TSP(巡回セールスマン問題)は理論的な問題に見えますが、実は非常に実用的です。
多くの現実問題がTSPとして定式化できるため、最短であることが保証された解(厳密解)が求められない規模でも、十分に短い経路(近似解)を求める研究が盛んに行われています。 |
1.3. ゲノムアセンブリとオイラー路問題
生物の遺伝情報であるゲノム配列を解読する作業は、問題の定式化のしかたによって、ハミルトン路問題にもオイラー路問題にもなります。短い断片(数百文字程度)を大量に読み取るシーケンサーのデータでは、オイラー路問題として解く定式化が広く使われています。
ここでは、非常に単純化した形でこの問題を説明します(生命科学科の学生には単純化しすぎ!と怒られそうですが、ご容赦ください)。
|
ゲノムアセンブリとは? ゲノムアセンブリは、DNA配列解読の重要なステップです。現在の技術では、長いDNA配列を一度に読み取ることができないため、短い断片に分けて読み取り、後でパズルのように組み立て直す必要があります。これがアセンブリ(組み立て)です。 |
「めかぶどうめだか」という文字列が解読したいゲノム配列だとします(実際のDNAの配列は、A, C, G, Tの4種類の文字からなる非常に長い記号列です)。ゲノム配列は実際にはとても長い配列なので一度に解読することはできません。そこでまず元のゲノム配列を複数本に複製して、そのゲノム配列を短い断片に切りわけます。
ぶつ切りにした結果、以下のような文字の断片が得られたとします。1行が複製1本分で、空白は断片が得られなかった部分です。
めかぶ うめ ぶどう めかぶ めだか
この断片から前後が重なっている文字を見つけ出してつなぎ合わせて、元の長い文字列を再構成する作業をゲノムアセンブリといいます。同じ断片(ここでは「めかぶ」)が複数得られることもありますが、1つにまとめて考えます。たとえば、「めかぶ」と「ぶどう」の「ぶ」が重なっているので、この2つをつなげて「めかぶどう」のようにつなげます。
ここでは、説明を簡単にするために前後が重なっている部分は1文字だけにしています。(実用的にはこれでは関係ないものまでつながってしまう可能性があるため、実際には複数の連続した文字列がオーバーラップする部分をつなげます。)
ここでは話を単純にするために重なりを1文字にしたので、すべての単語を1度ずつ用いてしりとりを完成させる問題になります(「ん」で終わると負け、といったルールは考えません)。この問題は頂点(ノード)に単語を配置して、しりとりとして繋がる可能性のある頂点間を矢印のついた辺でつなぐと下図のようなグラフができます。このグラフからハミルトン路を見つけることができれば、全単語をもちいたしりとり問題を解いたことになります。ただし、辺には矢印がついていて一方通行です。一般の有向ハミルトン路問題にも多項式時間の解法は知られていません。ただし、ここでしりとりから作った特殊なグラフには、後述の別の解き方があります。
実際にハミルトン路を求めてみると、
「めかぶ」→「ぶどう」→「うめ」→「めだか」
となり、しりとりが完成することがわかります。
実は、このしりとり問題をハミルトン路問題に帰着させるのは、牛刀をもって鶏を割くようなもので、ハミルトン路問題の表現力を無駄遣いしています。難しい問題を解く強力な手法を、簡単な問題に使うのはもったいないのです。一般のハミルトン路を探索するアルゴリズムを使わずに解ける問題を、わざわざそのように定式化してしまっているということです。
すべての単語を用いたしりとり問題は(一方通行の道から構成される)オイラー路問題で表現できます。頂点ではなく辺が単語を表すように、単語ではなく文字を頂点にします。つまり、単語「めかぶ」を、先頭の文字「め」から末尾の文字「ぶ」へ向かう矢印(辺)に置き換えるのです。また、しりとりでは両端に位置する文字以外はしりとりに関係ないので省きます。帰着方法の詳細は書きませんが、以下の図をみてイメージをつかんでください。
このグラフ上でオイラー路をみつければ、それがすべての単語を用いたしりとりになっていることがわかると思います。め → ぶ → う → め → か と矢印をたどると、めかぶ → ぶどう → うめ → めだか の順に単語が並びます。一方通行の辺からなるグラフでは、次数の代わりに各頂点に入る辺と出る辺の数を比べることで、オイラー路の有無を同じように判定できます(章末の練習問題8で扱います)。このように、元の文字列を再構成するためにオイラー路問題を解くグラフを、この形のグラフを1946年に考案したオランダの数学者ド・ブルインにちなんで、de Bruijn グラフ(ド・ブルイングラフ)と呼びます。
|
【実際のゲノムアセンブリとの対応】 しりとりの例は、話を単純にするために「重なりは1文字、頂点も1文字」としました。実際のゲノムアセンブリで使われる de Bruijn グラフでは、読み取った断片(リード)をさらに一定の長さ \(k\) の部分文字列(\(k\)-mer)にすべて切り出し、各 \(k\)-mer の先頭 \(k-1\) 文字と末尾 \(k-1\) 文字を頂点、\(k\)-mer そのものを辺とするグラフを作ります。つまり重なりは \(k-1\) 文字です。しりとりの例は、重なりが1文字という点で \(k=2\) に相当する最も単純な場合です。 また、実際のデータには読み取りの誤りが含まれ、ゲノムには同じ配列の繰り返しもあるため、オイラー路を1本見つけて終わり、というほど単純ではありません。グラフから誤りに由来する部分を取り除いたり、複数ありうる経路から妥当なものを選んだりする、多くの工夫が加わっています。 |
この単純化したモデルでは、一般のハミルトン路探索を使うより、オイラー路として解くほうが効率的です。ただし、実際のゲノムアセンブリには読み取り誤りや反復配列などがあり、すべてが一筆書きだけで解決するわけではありません。
実際のゲノムアセンブリの作業では非常に巨大な de Bruijn グラフができます。このグラフをメモリ上で小さく表現したまま(簡潔de Bruijnグラフ)経路をたどるアルゴリズムが開発されています。新型コロナウイルス(SARS-CoV-2)で最初期に公開された全ゲノム配列も、簡潔de Bruijnグラフを用いる解析ソフトMEGAHITで組み立てたものが使われました(論文では別のソフトTrinityも併用しています)。2020年1月に公開されたこの配列が、mRNAワクチンを設計する出発点になりました。現在のワクチン開発や創薬の背後には、さまざまなアルゴリズムの貢献があります。
出典:Wu et al., A new coronavirus associated with human respiratory disease in China, Nature 579 (2020)。
|
理論と実践の結びつき この例は、純粋に理論的に見える数学的概念(グラフ理論、計算量理論)が、実際の生命科学研究や医療技術開発に貢献していることを示しています。COVID-19パンデミック下でのワクチン開発の速さも、こうした基礎理論の蓄積に支えられていました。 |
|
DNAでハミルトン路を解く 1994年、レナード・エイドルマンは、本物のDNA分子を使って、7つの頂点をもつ有向グラフのハミルトン路問題を解いてみせました。各頂点と各辺を短いDNAの断片(塩基配列)に符号化し、試験管の中で混ぜ合わせると、断片どうしが自然につながって膨大な数の「経路」が一気にできあがります。あとは分子生物学の手法(PCRや磁気ビーズによる選別)で、出発点から始まり全頂点をちょうど1度ずつ通る経路だけを残していきます。実験全体には1週間ほどかかりました。電子回路の代わりに生体分子の並列性で組合せ問題を解いた最初の例で、「DNAコンピューティング」という分野はここから始まりました。ちなみにエイドルマンは、後で出てくるRSA暗号の「A」(Adleman)その人でもあります。 |
1.4. 多項式時間で計算できる問題のクラス: P問題
理化学研究所と富士通が共同開発したスーパーコンピューター富岳は2020年から2年間、計算速度の世界ランキングで1位となりました(現在は1位ではなくなってしまいましたが…)。性能の指標については細かい話もあるのですが、ここでは「富岳は1秒間に約44京回の計算ができる」を目安にしましょう。44京は \(4.4\times 10^{17}\) ですから、富岳の約230倍速い仮想的な計算速度、つまり1秒間に \(10^{20}\) 回計算ができるコンピューターを想定して、計算時間の比較をしてみましょう。
|
富岳の計算能力について \(10^{20}\) という数は1の後に0が20個つく数、つまり1垓(がい)です。表の各欄は、\(n\) や \(2^n\) などの回数の計算を1秒間に \(10^{20}\) 回の速さで行ったときの時間です。この想像を絶する計算速度を持つコンピューターでも、指数時間のアルゴリズムには太刀打ちできないということを、以下の表で確認してみましょう。 |
| 入力サイズ | \(n\) | \(n\log_2 n\) | \(n^2\) | \(2^n\) | \(n!\) |
|---|---|---|---|---|---|
\(10\) |
\(10^{-19}\)秒 |
\(3.3\times 10^{-19}\)秒 |
\(10^{-18}\)秒 |
\(1.0\times 10^{-17}\)秒 |
\(3.6\times 10^{-14}\)秒 |
\(20\) |
\(2\times 10^{-19}\)秒 |
\(8.6\times 10^{-19}\)秒 |
\(4.0\times 10^{-18}\)秒 |
\(1.0\times 10^{-14}\)秒 |
\(0.024\)秒 |
\(30\) |
\(3\times 10^{-19}\)秒 |
\(1.5\times 10^{-18}\)秒 |
\(9.0\times 10^{-18}\)秒 |
\(1.1\times 10^{-11}\)秒 |
\(8\)万\(4\)千年 |
\(40\) |
\(4\times 10^{-19}\)秒 |
\(2.1\times 10^{-18}\)秒 |
\(1.6\times 10^{-17}\)秒 |
\(1.1\times 10^{-8}\)秒 |
\(2.6\times 10^{20}\) 年 |
\(50\) |
\(5\times 10^{-19}\)秒 |
\(2.8\times 10^{-18}\)秒 |
\(2.5\times 10^{-17}\)秒 |
\(1.1\times 10^{-5}\)秒 |
\(9.6\times 10^{36}\) 年 |
\(100\) |
\(10^{-18}\)秒 |
\(6.6\times 10^{-18}\)秒 |
\(10^{-16}\)秒 |
\(400\)年 |
\(3\times 10^{130}\) 年 |
\(1000\) |
\(10^{-17}\)秒 |
\(1.0\times 10^{-16}\)秒 |
\(10^{-14}\)秒 |
\(3.4\times 10^{273}\)年 |
- |
\(10000\) |
\(10^{-16}\)秒 |
\(1.3\times 10^{-15}\)秒 |
\(10^{-12}\)秒 |
- |
- |
\(100000\) |
\(10^{-15}\)秒 |
\(1.7\times 10^{-14}\)秒 |
\(10^{-10}\)秒 |
- |
- |
表の「-」は、値が大きすぎるため省略した欄です。
|
指数時間の恐ろしさ この表から爆発的な時間計算量の増加がわかると思います。
どんなにコンピューターが高速化しても、入力が大きいときには指数時間のアルゴリズムは現実的ではありません。 |
\(n^2\) と \(2^n\) や \(n!\) との間には、入力サイズの変化に対する計算時間の増加について、はっきりとした違いがあります。\(2^n\) のような指数的な増加は、わずかな入力サイズの増加が、爆発的な計算時間の増加につながり、計算量を改善することが非常に困難であることが想像できると思います。スーパーコンピューターやハードウェアの目覚ましい発展ですら焼け石に水と感じるほど、指数的な計算時間の増加は爆発的なのです。
そこで、\(\text O(n)\) や \(\text O(n^2)\) のように、上界が多項式でおさえられる時間計算量を、多項式時間と呼び、比較的、太刀打ちしやすい時間計算量であると考えます。多項式とは、一般的に、\(a_k n^k + a_{k-1} n^{k-1} + \cdots + a_2 n^2 + a_1 n + a_0\) の形をした式のことですが、ビッグオー表記では、次数が最大の項のみを考慮します。また、\(\text O(n \log n)\) の場合、厳密には多項式ではありませんが、多項式時間で抑えられる時間計算量ということで、多項式時間とみなします。
|
多項式の形 多項式とは \(a_k n^k + a_{k-1} n^{k-1} + \cdots + a_2 n^2 + a_1 n + a_0\) の形の式です。具体例
どんなに次数が高くても、指数関数 \(2^n\) や階乗 \(n!\) と比べれば「穏やか」な増加です。 |
Yes/Noで答える決定問題のうち、最悪時間計算量が入力の長さの多項式でおさえられるアルゴリズムをもつ問題すべての集まり(このような集まりをクラスといいます)をP問題とよびます(多項式時間のことを英語で Polynomial Time というため)。
整列やオイラー路の構成は、多項式時間で解ける探索・出力の問題です。Pは厳密には決定問題のクラスなので、例えば「オイラー路は存在するか」という形にしてPへの所属を述べます。オイラー路の存在は、各頂点の次数を数えて連結かどうかを確かめるだけで判定できるので、この問題はPに属します。一方で、「ハミルトン路は存在するか」を判定する問題がP問題に含まれるかどうかは未解決問題です。多項式時間のアルゴリズムは見つかっておらず(すでに見たように、知られている上界は指数時間でした)、かといって「どんなアルゴリズムでも多項式時間では解けない」という下界の証明もないのです。
|
未解決問題の意味 「ハミルトン路問題がP問題に含まれるかどうかは未解決」というのは、以下のような状況です。
つまり、多項式時間のアルゴリズムが見つかる可能性も、「多項式時間では解けない」と証明される可能性も、どちらもまだ残っているということです。 |
なお、多項式時間といっても \(\text O(n^{100})\) のような場合は、とても現実的な計算量とは言い難く、あくまでも多項式時間は理論上の1つの目安であることも念を押しておきます。
1.5. 検証が多項式時間でできる問題のクラス: NP問題
すでにみてきた整列問題や、ハミルトン路・オイラー路を見つける問題は、解くのが易しいか難しいかにかかわらず、いずれも解の候補が示されれば、それが本当に解になっているのかどうか検証することが簡単にできます。 整列問題では、与えられた並びの値を、隣り合う値が非減少順であることに加え、入力と同じ要素が同じ個数ずつ含まれていることも確認します。ハミルトン路問題では、解として示された経路をたどりながら、各頂点がちょうど1度ずつ現れ、連続する頂点の間に辺があることを確認します。オイラー路については、示された経路が、すべての辺を重複せずに含んでいることを確認します。いずれも、入力サイズに対して、多項式時間で検証できることは想像できると思います。
|
「解くこと」と「検証すること」の違い 日常的な例で考えてみます。
迷路は、実は道を見つけるほうも、分かれ道を順に調べていく方法で、迷路の大きさにほぼ比例する時間でできます。「解くのは難しいかもしれないが、少なくともYesの答えの確認は簡単」という性質を持つ問題がNP問題で、迷路のように解くのも簡単な問題もNPに含まれます(正確な定義はすぐ後で述べます)。 |
NPは、次の2つの条件を満たす検証の手続き(検証器)をもつ決定問題のクラスです。
-
答えがYesである各入力には、入力の長さの多項式以内の長さの証拠(証明書ともいいます)があり、検証器はそれを多項式時間で確かめて受理する。
-
答えがNoである入力では、どんな証拠を渡しても検証器は受理しない。
ハミルトン路の存在判定なら、証拠は頂点の並び、検証器は「各頂点がちょうど1度ずつ現れ、隣り合う頂点の間に辺がある」ことを確かめる手続きです。ハミルトン路をもたないグラフでは、どんな並びを渡しても、この確認のどこかで必ず失敗します。
証拠を効率よく見つけられるとは限りません。NPの定義は、見つけ方は問わず、「見せてもらえれば確かめられる」ことだけを求めています。
NP問題のNPは、Nondeterministic Polynomial Time(非決定性多項式時間)の略です。NPはもともと、非決定性チューリングマシンという仮想的な計算機で多項式時間で解ける問題として定義されました。これは、分かれ道に来るたびに、あたかも正解につながる道を選べるかのように振る舞う機械です。そのとき選んだ道の列を証拠とみなすと、上の検証による定義と同じクラスになることが知られています。この章では、検証による定義を使います。なお、NPは「多項式時間ではない(Non-Polynomial)」の略ではありません。次の節で見るとおり、Pの問題もすべてNPに含まれます。
|
決定問題と探索問題 P問題やNP問題は、第11章で定義した決定問題(Yes/Noで答えられる問題)の範囲で定義されます。たとえば、ハミルトン路の場合は、「与えられたグラフに対してハミルトン路が存在するか?」を問う問題になります。存在すれば Yes、存在しなければ No を出力します。 実際に経路を1つ見つける問題(探索問題)と、存在を判定する問題とで、多項式時間で解けるかどうかは変わりません。経路を見つけられれば、存在も分かります。逆に、存在を判定する多項式時間のアルゴリズムがあれば、次のようにして経路も見つけられます。辺を1本ずつ順に取り除いてみて、「取り除いてもまだハミルトン路があるか」を判定します。あればその辺は捨て、なければ元に戻します。これをすべての辺について行うと、最後に残った辺がちょうど1本のハミルトン路になります。判定は辺の数と同じ回数だけなので、全体も多項式時間です。 |
2. P≠NP予想
NP問題のクラスは、解候補さえ与えられれば検証は容易なので、解候補を全列挙してから検証するタイプのアルゴリズムがすぐに作れてしまいます。しかし、実際には解候補の個数は膨大なことがほとんどであり、計算量も大きくなってしまいます。ハミルトン路の場合も、解候補は全頂点の順列を与えれば良いことがすぐに分かります。これは頂点数 \(n\) に対してちょうど \(n!\) 個あり、それぞれの検証に \(n\) に比例する時間がかかりますから、ナイーブなアルゴリズムの計算量は \(\text O(n\cdot n!)\) になってしまいます。
整列問題でも並びの順列を全列挙して、一つ一つ非減少順に並んでいるかをチェックするアルゴリズムを設計することができます。すでにご存知のように、整列問題では、そんな効率の悪いことをしなくても多項式時間のアルゴリズムが見つかっています。しかし、ハミルトン路のように多項式時間の上界が見つかっていないNP問題については、動的計画法のような工夫で指数の底を小さくすることはできても、しらみつぶしに近い指数時間の方法から抜け出せずにいます。
|
なぜ効率のよい方法が見つからないのか? オイラー路では「各頂点の次数」という局所的な情報を数えるだけで、全体として一筆書きできるかが分かりました。ハミルトン路には、このような決め手となる性質が見つかっていません。ある頂点をどの順番で通るかという選択が、ずっと先の選択にまで影響するため、多くの可能性を調べざるを得ないのです。ただし、これは現時点で方法が見つかっていないという経験上の話で、「効率のよい方法は存在しない」ことが証明されているわけではありません。 |
P問題のクラスに属する問題集合を \(\text P\)、NP問題のクラスに属する問題集合を \(\text{NP}\) とおくことにします。すると、P問題ならばNP問題であることは明らかですから、\(\text P\subseteq\text{NP}\) です。なぜなら、答えそのものを多項式時間で計算できるなら、「渡された証拠は見ずに自分で答えを計算し、Yesなら受理する」という検証器が作れるからです。問題は、\(\text P\subsetneq\text{NP}\) なのか(つまり、\(\text P\neq\text{NP}\) なのか)、\(\text P=\text{NP}\) なのかが、1970年代から今に至るまで多くの優れた研究者のチャレンジを寄せ付けず、未だに証明されていないのです。多くの研究者の見立てでは \(\text P\neq\text{NP}\) と予想されていて、下の図のような包含関係があると考えられています。
|
P≠NP予想の重要性 この問題はクレイ数学研究所のミレニアム問題の1つで、解決者には100万ドルの賞金が出されています。なぜこれほど重要なのでしょうか? もしP=NPが証明されたら
もしP≠NPが証明されたら
|
|
もしP=NPなら、創造性は要らなくなる? 理論計算機科学者のスコット・アーロンソンは、もしP=NPが本当だったら、世界はわたしたちが思っているのとはまるで違う姿になるだろう、と述べています。解を自分で「思いつく」ことと、示された解を「確かめる」こととのあいだの隔たりが消えてしまうからです。アーロンソンは、交響曲の良さを味わえる人は誰もがモーツァルトになり、証明の筋道を追える人は誰もがガウスになり、優れた投資判断を見抜ける人は誰もがバフェットのような投資家になってしまう、と喩えています。「良し悪しを判定できること」と「自分で生み出せること」は別物だ、という私たちの日常の実感そのものが、P≠NPだろうという見立てを支えているのかもしれません。 |
|
【P≠NP問題を最初に問うたのは誰か — ゲーデルの手紙】 P≠NP予想が定式化されたのは1970年代初頭ですが、実は本質的に同じ問いが、それより15年も前に立てられていたことが後にわかりました。不完全性定理で知られる論理学者クルト・ゲーデルが、1956年3月にフォン・ノイマンへ宛てた手紙です。ゲーデルはそこで、「与えられた論理式に長さ \(n\) の証明があるかどうかを機械で判定するとき、必要なステップ数は \(n\) に比例、あるいは \(n^2\) に比例する程度まで減らせるだろうか」と問い、もしそれが可能なら「Yes/Noで答えられる問題に関する数学者の頭脳労働は、完全に機械で置き換えられることになる」と書いています。これは、現在の言葉でいえば「NPに属する問題が多項式時間で解けるか」という問いにほかなりません。 当時フォン・ノイマンはがんの闘病中で、返信をしたかどうかは知られていません。手紙自体も長く忘れられており、発見されて計算量理論の研究者に知られるようになったのは1980年代末のことでした。P≠NP予想の重要性を、分野が誕生する前に見抜いていた人物がいたわけです。 |
3. NP完全問題
NP問題の中で最も難しい問題の集まりを、NP完全問題といいます。また、NP完全問題に属する問題をNP完全であるといいます。正確には「NPに属し、かつNPのどの問題もそれに多項式時間還元できる問題」のことです(多項式時間還元についてはこの後で説明します)。よって、NP完全問題に属する問題が多項式時間で解けることがわかれば、NP問題はすべて多項式時間で解ける(つまり、\(\text{NP}=\text P\))ことが言えることになります。一方で、おおかたの予想通り \(\text{NP}\neq\text P\) であるなら、ある問題がNP完全問題であることを示せれば、その問題がP問題でないことを示すことになります。
「最も難しい問題」と言いましたが、何をもって問題の「難しさ」に順序をつけるのでしょうか。ここで登場するのが第11章で触れた還元の考え方です。問題Bを問題Aに帰着(還元)して解けるならば、問題Bは問題Aと同等かそれより易しい問題であると考えられます。この還元は、目的に応じて2通りの使い方があります。
- (1) 対象の問題が易しいと示したいとき(既存のアルゴリズムを流用したいとき)
-
対象の問題Bを、すでに解き方のわかっている問題Aに還元します。問題Aのアルゴリズムを使って問題Bが解けるようになります。
- (2) 対象の問題が難しいと示したいとき
-
難しいとわかっている問題Bを、対象の問題Aに還元します。もし問題Aが易しく解けてしまうなら問題Bも易しく解けてしまうことになるので、問題Aは少なくとも問題Bと同じくらい難しいことになります。
ある問題がNP完全であることを示すときには、(2)の使い方をします。つまり、問題AがNP完全であることを示すには、すでにNP完全であるとわかっている問題Bのすべての入力を効率よく(多項式時間で)問題Aへの入力に変換して、問題Bを問題Aに帰着させて解けることを示します。
そのために、問題を別の問題に帰着させる変換である多項式時間還元(多項式時間帰着ともいいます)について説明します。
3.1. 多項式時間還元
ある問題が別の問題と「どれくらい似ているか」「どちらが難しいか」を調べるための強力な道具が「多項式時間還元」です。
難しそうな用語に聞こえるかもしれませんが、考え方は「翻訳」に似ています。たとえば、日本語しか読めないけれど、英語で書かれた重要な文章を理解したいとします。そのときは、おそらく翻訳ツールを使って、英語の文章を日本語に「翻訳」するでしょう。翻訳さえできれば、日本語を読む能力を使って、元の英語の文章の意味を理解できます。
多項式時間還元もこれと同じ発想です。難しさを比べたい問題Aと問題Bがあるとき、問題Bの入力を問題Aの入力へと「翻訳(還元)」します。もしこの翻訳が高速(多項式時間)にできるなら、次のことが言えます。
-
問題Aを解く方法があれば、それを使って問題Bも解ける
-
つまり、問題Aは少なくとも問題Bと同じか、それ以上に難しい
この「難しさの比較」が還元の要点です。
問題Bをある問題Aに帰着させるというのは、つまりは、問題Bに与える入力を、問題Aの入力に変換して、問題Aを解くということです。しかし、変換にどれだけ時間をかけてもいいのであれば、そこで、本質的な計算をしてしまっていることになりますので、問題の変換時間にも多項式時間という制約を与えます。また、問題A,Bともに決定問題の場合は出力がYes/Noで与えられますので、出力側の変換は不要で、そのまま問題Aの出力が問題Bの出力として使えます。
|
なぜ変換時間に制約が必要か? もし変換に無制限の時間をかけてよいなら、変換の過程で問題Bを直接解いてしまうことができます。そうなると「問題Aに還元した」とは言えません。 例:「ハミルトン路問題」を「簡単な問題」に還元する際、変換で指数時間かけてハミルトン路を見つけてしまったら、還元の意味がありません。 多項式時間という制約により、変換は「本質的な計算」ではなく、純粋な「形式変換」に限定されます。 |
以下の図は決定問題(答えがYes/Noで答えられる問題)における多項式時間還元のイメージです。還元に必要なのは入力の変換だけであり、具体的に問題A,Bを解くアルゴリズムを示す必要はないことに注意してください。問題Bを問題Aに多項式時間還元可能であるとき、\(B\preceq_P A\) と表記します。\(P\) は多項式時間のPであり、\(\preceq\) は問題の難易度に関する順序関係を示しています。
還元の「向き」と難しさの関係をパイプラインの形でまとめると、次の図のようになります。
3.2. 多項式時間還元の例
たとえば、4人の客 a,b,c,d がいて、「aとb」,「aとc」,「cとd」,「bとd」がそれぞれ知り合いの関係にあるとき、知人関係は左下の表のように表現できます(知人関係にある欄に「✔」が記入されています)。このとき、右下の図のように円卓に座れば隣には知人しかいないことがわかります。
| a | b | c | d | |
|---|---|---|---|---|
a |
✔ |
✔ |
||
b |
✔ |
✔ |
||
c |
✔ |
✔ |
||
d |
✔ |
✔ |
さて、下のグラフについてハミルトン閉路の存在の有無を判定する問題を、円卓の席配置の存在の有無を判定する問題に変換してみましょう。
このグラフを知人関係を表す表に変換してみます。
| a | b | c | d | e | f | |
|---|---|---|---|---|---|---|
a |
✔ |
✔ |
||||
b |
✔ |
✔ |
✔ |
✔ |
||
c |
✔ |
✔ |
✔ |
✔ |
||
d |
✔ |
✔ |
✔ |
|||
e |
✔ |
✔ |
✔ |
✔ |
||
f |
✔ |
✔ |
✔ |
辺でつながっている部分は、表では知人関係にあるとして「✔」を入れています。たとえば、頂点 a と b は辺で繋がっているので、表の a と b が行と列で交わる部分に「✔」を記入します。 このとき、知人だけが隣に来るような円卓の席の配置は複数あるかもしれませんが、少なくとも下の図が1つの解になっているのは、容易に確認できると思います。
このように円卓の席配置が存在するとき、かつそのときに限り、ハミルトン閉路も存在し、以下のようになります。
この入力の変換は、頂点の組 \(n^2\) 通りのそれぞれについて、辺があれば表に「✔」を書き写すだけです。したがって \(\text O(n^2)\) 時間、つまり多項式時間でできます。
|
この例の重要な点は、変換したどの入力についても成り立つ、以下の同値性です。
この同値性により、円卓問題を解くアルゴリズムがあれば、グラフを知人関係表に変換してから使うことで、ハミルトン閉路問題も解けます。そして変換(グラフ→知人関係表)が多項式時間でできるため、円卓問題は少なくともハミルトン閉路問題と同じくらい難しい、ということが分かります。(この例では逆向きの変換も同じようにできるので、2つの問題は同じ難しさですが、それは逆向きの還元を別に示して初めて言えることです。) |
以上の議論から、計算量の観点からはハミルトン閉路があるかどうかを判定する問題Bは、円卓の席配置があるかどうかを判定する問題Aよりも、簡単かまたは同等の難しさをもった問題であることがわかります。
そして、円卓問題は検算が容易であり、多項式時間でチェックできることはあきらかです。よって、円卓問題はNPに属する問題であることがわかります。
実はハミルトン閉路問題はNP完全であることが知られています。この事実をもちいると、これまでの議論から円卓問題もNP完全問題であるという論理的帰結に至ります。
3.3. NP完全性の証明手順
上の例で示したことをまとめてみましょう。
解の検証(検算)が多項式時間でできることがわかっている問題Aがあるとします。つまり、問題AはNPに属する問題です。このとき、問題AがNP完全であることを証明するには次の2段階の手順を示せば良いことがわかります。
-
既知のNP完全である問題Bを選ぶ
-
問題Bの入力を問題Aへの入力に多項式時間還元できることを示す
つまり、問題BはすでにNP問題のなかで最も難しい問題であるとわかっているので、同じくNPに属する問題Aも、多項式時間還元により問題Bと同じかそれ以上に難しい問題であることが判明すると、問題AはNP完全であることが結論づけられます。 (問題Aは解の検証が多項式時間でできるため、NPに属する問題であることに注意をしてください。) もし問題Aが多項式時間で解けるなら、還元により問題Bも、ひいてはすべてのNP問題が多項式時間で解けてしまいます。だからこそ問題Aは「NP問題の中で最も難しい問題の1つ」なのです。
|
第1章で触れた数独も、盤面を \(n^2\times n^2\) マスに一般化した「解があるか」という問題がNP完全であることが知られています(2003年、八登崇之・瀬田剛広)。ぷよぷよの連鎖問題もNP完全であることが知られています。問題サイズは盤面の大きさであり、決定問題としての問いは「\(k\) 連鎖可能であるか」です。テトリスでも、落ちてくるブロックの列が最初から分かっているときに「\(k\) 列以上消せるか」を問う問題がNP完全であることが示されています。 |
ここで当然の疑問がわきます。多項式時間還元を用いてある問題がNP完全であることを示すには、最初の出発点となるNP完全問題が必要になります。それは、いったいどうやって得られたのでしょうか。歴史的には、はじめてNP完全であることが示された問題は、ブール代数の充足可能性問題(SAT問題)です。出発点となるこの1問だけは、還元元にできる既知のNP完全問題がありませんから、「NPに属するあらゆる問題から直接還元できる」ことを力ずくで示す必要がありました。その証明は後で扱うことにして、まずSAT問題そのものについて説明します。
この問題は出力がYes/Noの問題ですが、実際に変数への値の割り当てを見つける問題と変更しても計算量の議論はそれほど変わりません。実際にYesとなる証拠である変数の割り当てが示されると、検証は変数に示された値を代入して計算するだけですので、多項式時間で計算可能です。
|
和積形とは? 和積形(連言標準形、CNF: Conjunctive Normal Form)とは、以下の形の論理式です。 \((x_1 + x_2 + \bar{x}_3) \cdot (\bar{x}_1 + x_4) \cdot (x_2 + \bar{x}_4 + x_5)\)
和積形は、「いくつかのOR句をANDでつないだ形」です。 |
SAT問題の例をみてみます。
真理値表を書くのが確実ですが、変数が5つありますので面倒です。 この論理式の値を1にする変数の割り当ては複数ありますが \(x=v=1\), \(w=0\) であれば、残りの変数の値はなんであってもよさそうです。よって、たとえば \(f(1,0,1,1,1)=1\) となります。よって、答えは Yes です。
|
解の確認方法 \(x=v=1, w=0, y=z=1\) を代入してみます。
すべての項が1なので、全体も \(1 \cdot 1 \cdot 1 = 1\) となります。 |
別の論理式についても考えてみます。
この論理式については、\(g(x,y,z)=1\) となるような変数 \(x,y,z\) への値の割り当ては存在しないため、答えは No です。この例では変数が3つなので真理値表を書いてもそれほど手間ではありませんが、変数が \(n\) 個の場合、真理値表の行数は \(2^n\) になりますので、真理値表を使えば指数時間かかります。
|
なぜ答えがNoなのか? \(g(x,y,z)\) を満たす割り当てが存在しないことを示してみましょう。
どちらの場合も矛盾が生じるため、解は存在しません。 |
3.4. 最初のNP完全問題:SATはどうやって証明された?
ここで、「そもそも、なぜSAT問題がNP完全の『最初の石』になれたのか?」という疑問が湧くかもしれません。他のNP完全問題はSATからの還元で証明されるのに、SAT自身はどうしたのでしょうか。
これは1970年代初頭にクックとレヴィンが独立に証明した、計算量理論における画期的な成果です。その証明の概要はやや難解ですが、かいつまんで説明すると以下のようになります。
-
計算の万能モデル「チューリングマシン」: まず、あらゆるコンピューターの計算は、前章で扱ったチューリングマシン(無限に長いテープと、テープの記号を読み書きするヘッドからなる仮想機械)の動作としてモデル化できる、という大前提があります。
-
NP問題と「勘のいい」マシン: NP問題は「『非決定性』チューリングマシンで多項式時間で解ける問題」としても定義できます。この「非決定性」とは、「勘が鋭く、常に正しい選択肢を選べる」能力です。あらゆる可能性を同時に試せる、とイメージしてもよいでしょう。検証による定義でいえば、マシンが選ぶ選択肢の列が証拠にあたります。
-
クックとレヴィンの大発見: 彼らは、「どんな非決定性チューリングマシンの動作(つまり、どんなNP問題の計算過程)でも、それを表現するSATの論理式に変換(エンコード)できる」ことを示しました。
-
具体的には、マシンの「テープの各マスの状態」「ヘッドの位置」「計算のステップ」などをすべて論理変数で表現します。
-
そして、「マシンが正しくルール通りに動作している」という条件全体を、これらの変数を使った一つの巨大な論理式として組み立てたのです。
-
-
証明の完了: この組み立てが元の入力サイズの多項式時間ででき、できあがる論理式も多項式サイズにおさまります。その結果、「元のNP問題の答えがYesである」ことと「組み立てた論理式が充足可能である」ことが同値になります。つまり、どんなNP問題もSAT問題に多項式時間還元できるわけです。SAT自身は割り当てを代入するだけで検証が多項式時間ででき、NPに属していますから、SATは「NPに属し、かつNPのどの問題もそれに還元できる問題」、つまりNP完全の第1号となったのです。
クック(1971年)とレヴィン(1973年発表)の独立な結果は、還元の連鎖の出発点になりました。クックの発表の翌年、1972年にはカープが、SATを含む21の問題の間で還元を示して、それらがNP完全であることを一気に示します。その中には、ハミルトン閉路に関する問題も含まれていました。ハミルトン路の存在判定も、ハミルトン閉路からの還元によってNP完全であることが示されます。この章でオイラー路と対比してきたハミルトン路の問題は、NP完全だったのです。還元を積み重ねてNP完全性を芋づる式に広げていく話は、第13章でくわしく扱います。
|
【冷戦をまたいだ同時発見 — クックとレヴィン】 興味深いのは、SAT問題のNP完全性の証明に、同時期に2人の人物がまったく独立にたどり着いていたということです。当時トロント大学の准教授であったスティーブン・クックと、もうひとりは、モスクワ大学で確率論の大家であるコルモゴロフの元で指導をうけていた大学院生のレオニード・レヴィンです。当時の世界は東西陣営で軍拡競争が激しく行われている冷戦下でしたから、東西陣営間での自由な研究者の人的交流もほとんどなく、互いにほぼ独立した状況で同様の発見に到達していたのです。レヴィンの業績が西側諸国でも徐々に認識されるようになったのは、彼が1978年に米国へ移住し、MITで博士号を取得した1970年代末以降のことです。余談ですが、第10章に登場したクイックソートの考案者ホーアが1959年から留学し、機械翻訳に取り組みながらクイックソートを思いついたのも、同じモスクワ大学でした。ホーアはそこでコルモゴロフのもとで確率論を学んでいます。 現在、SAT問題がNP完全問題であるという事実はクック-レヴィンの定理として知られています。 |
NPに属するすべての問題を多項式時間還元できる問題のクラスを、NP困難(NP-hard)といいます。つまり、NP困難に属する問題は、NP完全に属する問題と同等か、それ以上に難しい問題であると言えます。
|
NP完全とNP困難の違い
正確な関係性
|
これらのクラスの包含関係を、P≠NPの場合とP=NPの場合とで対比して描くと、以下のようになります。どちらの場合も、NPとNP困難の重なりがNP完全です(これは上の定義そのものです)。P≠NPの場合、NP完全問題はどれもPに属さないので、NP完全とPは重なりません。また、P≠NPなら、PにもNP完全にも属さないNPの問題が存在することも証明されています(ラドナーの定理、1975年)。素因数分解の判定版は、そのような問題の候補と考えられています。
4. NPとco-NP
4.1. YesとNoの非対称性
NP問題の定義をあらためて見直してみましょう。NP問題とは「答えがYesであることの証拠(解候補)が与えられれば、それが正しいことを多項式時間で検証できる問題」のクラスでした。ハミルトン閉路問題であれば、閉路を1つ見せてもらい、それをたどって確認するだけで「たしかに存在する(Yes)」と納得できます。
この定義は、YesとNoを対称には扱っていないことに注意してください。答えがNoのとき、つまり「グラフにハミルトン閉路が存在しない」ことを、相手に短時間で納得させる証拠にはどのようなものがあるでしょうか。頂点の順列をすべて確かめてもらう方法では、証拠の検証だけで指数時間かかってしまいます。ハミルトン閉路が存在しないすべての入力に対して使える、多項式長の証拠と多項式時間の検証方法は知られていません。個別には、グラフが非連結など、簡単に非存在を示せる場合があります。
4.2. Noの証拠が検証できる問題のクラス: co-NP問題
そこで、NPの定義のYesとNoを入れ替えたクラスを考えます。答えがNoである各入力には多項式長の「Noの証拠」があって多項式時間で検証でき、答えがYesである入力ではどんな証拠も受理されない、という決定問題のクラスをco-NP問題といいます。ある問題のYesとNoを入れ替えた問題を補問題とよぶと、co-NPとは「補問題がNPに属する問題」の集まりだと言うこともできます。たとえば「グラフにハミルトン閉路は存在しないか」という問題は、ハミルトン閉路の存在判定の補問題なのでco-NPに属します。答えがNoであること(つまり閉路が存在すること)は、閉路を1つ示せば確かめられるからです。
co-NPの代表例は、SAT問題の補問題である「与えられた論理式は充足可能でないか」を判定する問題(UNSAT)です。この問題の答えがNoであること、つまり式が充足可能であることは、式の値を1にする割り当てを1つ示せば多項式時間で検証できます。「与えられた論理式は恒真式か(どのような値の割り当てでも値が1になるか)」を判定する問題(TAUTOLOGY)も同様です。恒真式でないことは、式の値を0にする割り当てを1つ示せば検証できるので、この問題もco-NPに属します。ここでTAUTOLOGYの入力は任意の論理式とし、CNFだけには制限しません。UNSATやTAUTOLOGYは、SATがNPの中で最も難しい問題であるのと対をなして、co-NPの中で最も難しい問題(co-NP完全)であることが知られています。
4.3. PはNPとco-NPの両方に含まれる
Pに属する問題は、証拠に頼らなくても多項式時間で自力で答えを計算できます。この場合、検証する側は渡された証拠を見ずに自分で答えを計算すればよいので、Yesの側にもNoの側にも(空の)証拠で済む検証器が作れます。したがって、Pに属する問題はNPにもco-NPにも属し、
が成り立ちます。\(\text{NP}\cap\text{co-NP}\) は、YesとNoのどちら側にも短い証拠がある問題のクラスです。
このクラスは「Pに属しそうな問題の候補地」とみなされることがあります。象徴的な例が素数判定問題(与えられた自然数は素数か)です。素数でないことの証拠は約数を1つ示せばよく、素数であることにも短い証拠があることが1975年に示されていたため、素数判定は \(\text{NP}\cap\text{co-NP}\) に属することが知られていました。これは「Pに属するのではないか」という兆候と受け止められ、実際、2002年にAKSアルゴリズムという多項式時間アルゴリズムが発見されて、素数判定はPに属することが証明されました。一方、次の節で登場する素因数分解に対応する判定問題も \(\text{NP}\cap\text{co-NP}\) に属することが知られていますが、こちらがPに属するかどうかは未解決のままです。
4.4. NP=co-NPか?
P=NPか?と同じように、NP=co-NPか?も未解決問題です。ここでもNP完全問題が鍵を握ります。もしNP完全問題が1つでもco-NPに属することが示されれば、NPのすべての問題はその問題に多項式時間還元できるため、NP全体がco-NPに含まれることになり、さらに対称性からNP=co-NPが導かれます。多くの研究者はNP≠co-NPと予想していますから、裏を返すと「NP完全問題はco-NPには属さない」、つまり「SATには、充足不能であることの短い証拠は存在しない」と予想されていることになります。
NP≠co-NPと予想される場合のクラスの包含関係を図にすると、次のようになります。前節の図の左側(P≠NPの場合)に、co-NPを描き加えた形になっています。NP完全問題はco-NPと重ならず、co-NP完全問題はNPと重なりません。NP完全問題が1つでもco-NPに入ると、上で見たとおりNP=co-NPになってしまうからです。
4.5. P≠NP予想との関係
NP≠co-NPが証明されると、P≠NPも直ちに従います。対偶で考えてみましょう。もしP=NPなら、NPに属するどの問題も多項式時間で解けることになります。そして、Pに属する問題はYesとNoを入れ替えてもPに属したままです(自力で答えを計算してから反転すればよいだけです)。したがって、P=NPならばNP=co-NPも成り立ちます。この対偶をとると「NP≠co-NPならばP≠NP」が得られます。つまり、NP≠co-NPはP≠NPよりも強い主張です。逆に、P≠NPからNP≠co-NPが従うかどうかはわかっていません。P≠NPでありながらNP=co-NPであるという可能性も、論理的にはまだ排除されていないのです。
5. 計算量と暗号
問題が効率的に解けるというのは、いいことばかりかというと、現在の暗号にとってはそうでもありません。現代の暗号の多くは解読の計算困難性を利用して設計されています。この場合、最悪計算量よりも、鍵の作り方によって実際に生じる入力の(ほとんどすべての)場合に解読が難しいこと、つまり平均的な場合の困難性が重要です。例としてナップサック暗号の話をしましょう。
|
暗号と計算量の密接な関係 現代社会のセキュリティは「計算の困難さ」に依存しています。
この非対称性により、暗号化された情報を安全に送ることができます。もしP=NPが証明されれば、この前提が崩れる可能性があります。 |
いま定義した「総額を最大にする組合せを求める」形のナップサック問題は、NP困難であることが証明されています(「総額を \(V\) 以上にできるか」というYes/No形式に直したものがNP完全です)。かつて、この難しさを頼りに、ナップサック問題を利用した暗号(ナップサック暗号)が設計されました。代表例のMerkle–Hellman暗号(1978年)は、ナップサック問題の特別な場合である部分和問題(与えられた数の中からいくつかを選んで、合計をちょうど指定の値にできるか)を利用します。この暗号は、解きやすい超増加列(各数がそれより前の数の合計より大きい列。たとえば 2, 3, 7, 14, 30)を秘密鍵とし、掛け算と剰余による変換でその構造を隠して、一般の数の列に見える公開鍵を作ります。超増加列なら、大きい数から順に「引けるなら引く」を繰り返すだけで部分和問題が解けます。超増加列が解きやすいこと自体は最初から分かっていて、それを隠すのが設計の要でした。しかし1982年、Shamirは、基本方式では隠した構造を手がかりにして多項式時間で解読できることを示しました。一般のナップサック問題が難しくても、暗号に使われる特別な形の入力が易しければ、安全性は保証されないのです。
|
最悪計算量と暗号の安全性 計算量理論では「最悪の場合」を考えますが、暗号では「実際に使う入力」が難しいことが重要です。
一般の問題の難しさに加え、鍵の生成方法が作る入力の分布や、隠した構造への攻撃も考えなければなりません。最悪計算量の難しさは、それだけでは暗号の安全性を保証してくれないのです。 |
暗号の分野で重要な「素因数分解」や、暗号理論の例(ゼロ知識証明)によく使われる「グラフの同型性判定問題」は、判定版がNPに属しますが、NP完全であることは示されておらず、NP完全ではないだろうと考えられています。ただし、Pに属するかどうかも含めて、正確な位置づけは未確定です(グラフの同型性判定については、2015年にBabaiが準多項式時間アルゴリズムを発表しました。なお「準多項式時間」と、この後に出てくる「準指数時間」は、名前は似ていますが別の概念で、どちらも多項式時間と指数時間の間に位置する時間計算量です)。
公開鍵暗号の1つであるRSA暗号の安全性の拠り所となっているのは、「素因数分解」の計算困難性です。素因数分解は因数を求める探索問題なので、決定問題のクラスNPにそのまま分類することはできません。対応する決定版「整数 N は2以上 k 以下の約数をもつか」なら、約数を証拠として多項式時間で確かめられるのでNPに属します。Nを素因数分解できればRSAの秘密鍵を求められますが、逆に、RSAの解読が素因数分解と同じくらい難しいと証明されているわけではありません。
通常のコンピューターでは、素因数分解の多項式時間アルゴリズムは知られていません。知られている最速の方法である一般数体ふるい法は、標準的なヒューリスティック解析(証明されていない仮定を置いた解析)では準指数時間と評価されます。これは、すべての入力に対して証明された最悪時間の上界ではない点に注意が必要です。
一方で、計算モデルが変わると計算量も変わってしまいます。量子コンピューターを用いると「素因数分解」は多項式時間で解けてしまうことが1994年にShorによって示されています。分解したい数のビット数(桁数)を \(b\) とすると \(\text O(b^3)\) 程度の計算量で、素因数分解の入力サイズはビット数ですから、これは多項式時間です。ただし、量子コンピューターをもちいてもNPに属する問題をすべて多項式時間で解くことは、どうやら不可能だろうと予想されています(量子コンピューターを用いてもNP完全の壁は依然としてありそうだという予想です)。
|
量子コンピューターの脅威と限界 量子コンピューターにより脅かされる可能性がある問題
量子コンピューターでもできないと予想されること
このため、量子計算機による既知の攻撃にも耐えることを目指す「耐量子計算機暗号」(量子耐性暗号、PQC)への移行が進んでいます。米国標準技術研究所(NIST)は2024年8月に最初の3つの標準(鍵共有のML-KEM、電子署名のML-DSAとSLH-DSA)を公開し、2025年3月には予備の鍵共有方式としてHQCを選びました。ML-KEMとML-DSAは、格子と呼ばれる構造に関する問題の難しさを拠り所にしています。これらの問題も、量子計算機で効率よく解けないことが証明されているわけではなく、多くの研究者による攻撃の試みに耐えてきたことが根拠です。古典計算で一方向と考えられる関数が、すべて量子計算にも強いわけではありません。 2026年9月の時点で、2048ビットのRSA暗号を実際に破れる規模の量子コンピューターは作られていません。ただし必要な規模の見積もりは研究とともに下がってきており、2025年のGidneyの見積もりでは、誤りを含む量子ビット100万個未満で1週間足らずとされ、2026年には別の誤り訂正の方式を仮定して、さらに1桁少ない量子ビット数とする見積もりも発表されています(いずれも、ハードウェアの性能に仮定を置いた理論上の見積もりです)。今のうちに暗号を置き換えておくのは、盗聴して保存しておいた通信を将来解読されるおそれがあるためです。 |
6. むすび
この章では、計算できる問題の中にも、多項式時間で解ける問題(P)と、Yesの答えの確認は多項式時間でできるものの、効率よく解く方法が知られていない問題があることを、オイラー路とハミルトン路の対比から見てきました。多項式時間還元は、この章では直接的な変換の例で見ただけでした。第13章では、SATをクリーク問題に還元するという、もう少し歯ごたえのある還元の例を扱います。
|
この章で学んだこと
|
7. 練習問題
次の3つのグラフ(ア)(イ)(ウ)について、(1) オイラー路はあるか(あればオイラー閉路でもあるか)、(2) ハミルトン路はあるか、ハミルトン閉路はあるか、を答えよ。あるものは実際に1つ示し、ないものは理由を述べよ。なお、(ア)で2本の対角線が交わっている点は頂点ではない。
解答
| グラフ | オイラー路 | ハミルトン路 | ハミルトン閉路 |
|---|---|---|---|
(ア) |
あり(閉路ではない) |
あり |
あり |
(イ) |
あり(オイラー閉路) |
なし |
なし |
(ウ) |
なし |
あり |
あり |
-
(ア) 次数は a が3、b が3、c が4、d が4、e が2 です。次数が奇数の頂点は a と b の2つなので、a から b へのオイラー路があります。たとえば a → b → c → d → a → c → e → d → b です。奇数の頂点があるのでオイラー閉路はありません。ハミルトン閉路は a → b → c → e → d → a です(ここから辺を1本除けばハミルトン路)。
-
(イ) 次数は g が6、他はすべて2で、すべて偶数なのでオイラー閉路があります。たとえば g → a → b → g → c → d → g → e → f → g です。ハミルトン路はありません。g 以外の頂点は3つの三角形に分かれていて、ある三角形から別の三角形へ移るには必ず g を通ります。ところがハミルトン路は g を1度しか通れないので、g の前と後で高々2つの三角形しか回れず、3つ目の三角形の頂点が残ってしまいます。
-
(ウ) 8つの頂点の次数がすべて3(奇数)なので、オイラー路はありません。ハミルトン閉路は a → b → c → d → h → g → f → e → a です。
このように、オイラー路があるかどうかから、ハミルトン路があるかどうかは判断できません(逆も同じです)。オイラー路は次数を数えるだけで判定できましたが、ハミルトン路の有無には、そのような簡単な判定法が知られていません。(イ)のように構造を見抜いて説明できる場合もありますが、一般には多くの候補を調べることになります。
次の図は、オイラーが考えたケーニヒスベルクの7つの橋を、陸地を頂点、橋を辺として表したグラフである(同じ2つの陸地の間に橋が2本ある所は、2本の辺で表している)。
(1) 各頂点の次数を求め、7本の橋をすべてちょうど1度ずつ渡る散歩道がないことを説明せよ。
(2) 橋を1本だけ新しく架けて、すべての橋をちょうど1度ずつ渡れるようにしたい。どの陸地の間に架ければよいか。そのとき、散歩の出発点と終点はどこになるか。
解答
(1) 次数は A が3、B が3、C が5、D が3 で、次数が奇数の頂点が4つあります。一筆書きの条件(奇数の頂点が0個か2個)を満たさないので、すべての橋を1度ずつ渡る散歩道はありません。途中で通過する陸地には「入る橋」と「出る橋」が対になって必要なので、橋の数が奇数の陸地は出発点か終点にしかなれません。そのような陸地が4つもあるのは不可能です。
(2) 異なる2つの陸地の間であれば、どこに架けても構いません。新しい橋の両端の陸地は次数が1増えて偶数になり、奇数の頂点が残りの2つだけになるからです。そのとき、出発点と終点は、新しい橋を架けなかった残りの2つの陸地です。たとえば A と B の間に架けると、C から出発して D で終わる(または逆向きの)散歩道ができます。奇数の頂点が2つ残るので、出発点に戻ってくる散歩道(オイラー閉路)にはなりません。
本文の駅と路線のグラフについて、次の頂点の並びが、「ハミルトン路がある」ことや「オイラー路がある」ことの証拠として正しいかを判定せよ。正しくないものは、どの確認に失敗するかを述べよ。
(1) ハミルトン路の証拠として: a, c, b, e, d, f
(2) ハミルトン路の証拠として: a, b, c, d, e, f
(3) ハミルトン路の証拠として: a, b, d, e, c
(4) オイラー路の証拠として: f, d, e, f, c, e, b, c, a, b, d
(5) オイラー路の証拠として: d, b, a, c, b, e, c, f, e, d
また、(2)の結果から「このグラフにはハミルトン路がない」と結論してよいか答えよ。
解答
(1) 正しい。6つの頂点がちょうど1度ずつ現れ、隣り合う頂点の間の辺 a–c, c–b, b–e, e–d, d–f がすべてあります。
(2) 正しくない。c と d の間に辺がありません。
(3) 正しくない。頂点 f が現れていません(5つの頂点しかない)。
(4) 正しい。通る辺は f–d, d–e, e–f, f–c, c–e, e–b, b–c, c–a, a–b, b–d の10本で、グラフの10本の辺がそれぞれちょうど1度ずつ現れます。出発点 f と終点 d は、次数が奇数の2頂点です。
(5) 正しくない。通る辺は9本で、辺 d–f を通っていません。
(2)から「ハミルトン路がない」と結論してはいけません。検証器が拒否したのは、その並びが証拠になっていないということだけで、(1)のように別の並びなら受理されます。Noと結論するには、どの並びも受理されないことを示す必要があります。すべての並びを調べれば確かめられますが、その数は膨大です。ハミルトン路がないことを確かめられる短い証拠は、一般には知られていません(本文のco-NPの節を参照)。
なお、ハミルトン路の証拠の確認は、「各頂点が1度ずつ現れるか」を印をつけながら数える作業と、隣り合う \(n-1\) 組について辺があるかを調べる作業だけです。どちらも頂点数 \(n\) や辺の数 \(m\) の多項式時間(たとえば \(\text O(nm)\) 以下)でできます。
(1) 論理式 \(h(x,y,z)=(x+y)\cdot(\bar x+z)\cdot(\bar y+\bar z)\cdot(\bar x+\bar y)\) の値を1にする割り当てをすべて求めよ。
(2) \(h\) に2つの節を加えた \(h'(x,y,z)=h(x,y,z)\cdot(\bar x+y)\cdot(x+z)\) は充足可能か。
解答
(1) \((x,y,z)=(0,1,0)\) と \((1,0,1)\) の2つです。本文の \(g\) と同じく、\(x\) の値で場合分けします。
-
\(x=1\) のとき: 第2節 \(\bar x+z\) から \(z=1\)、第4節 \(\bar x+\bar y\) から \(y=0\) が必要です。このとき第1節 \(x+y=1\)、第3節 \(\bar y+\bar z=1+0=1\) も満たされるので、\((1,0,1)\) は解です。
-
\(x=0\) のとき: 第1節 \(x+y\) から \(y=1\)、第3節 \(\bar y+\bar z\) から \(z=0\) が必要です。このとき第2節 \(\bar x+z=1\)、第4節 \(\bar x+\bar y=1\) も満たされるので、\((0,1,0)\) は解です。
どちらの場合も値が1つに決まったので、解はこの2つだけです(8通りの真理値表でも確かめられます)。
(2) 充足可能ではありません(答えは No)。\(h'\) の値を1にするには、まず \(h\) の値が1でなければならないので、候補は(1)の2つだけです。\((1,0,1)\) では \(\bar x+y=0+0=0\)、\((0,1,0)\) では \(x+z=0+0=0\) となり、どちらも新しい節を満たしません。
(1)のYesの答えは、割り当てを1つ示せばすぐに確かめられます。一方、(2)のNoの答えを示すには、ここでは場合分けですべての可能性をつぶしました。変数が増えると、このNoの確認は一般には短くできないと予想されています(本文のco-NPの節を参照)。
入力サイズ \(n\) に対する時間計算量の上界が、次の(1)〜(4)で与えられているとする。このうち、示された上界だけで多項式時間だと保証できるものをすべて選べ。
(1) \(\text O(2^{\log n})\)
(2) \(\text O(1.5^n\log n)\)
(3) \(\text O(1.0001^n)\)
(4) \(\text O(n^{5000})\)
ヒント: \(2^{\log n}\) がどのような値になるか考えてみよう。
解答
(1)と(4)です。
(1)については対数の底を \(c\ (c>1)\) と置くと下記のように変形できますので多項式です。
底が2なら \(2^{\log_2 n}=n\)、自然対数なら \(n^{1/\log_2 e}\approx n^{0.69}\) で、底が定数でありさえすれば \(n\) の定数乗になり、結論は変わりません。(4)の \(\text O(n^{5000})\) も、指数が巨大なだけで \(n\) の定数乗なので多項式です(現実的な計算時間とはいえませんが)。
一方、(2)と(3)で上界に使っている関数は、どんな多項式でも抑えられません。\(1.0001^n\) は、\(n\) が小さいうちはほとんど増えませんが、\(n\) が十分大きくなると、どんな \(n^k\) よりも大きくなります。ただし、ここで示されているのはO記法による上界です。上界には実際の増え方より大きな関数も使えるので、「(2)(3)の計算量は多項式時間ではない」とまでは結論できません。
問題Aを問題Bに多項式時間還元した(\(A\preceq_P B\))。このとき、次の中から正しいものをすべて選べ。
(1) 問題Aは、問題Bと同等か、問題Bより難しい問題である。
(2) 問題Bは、問題Aと同等か、問題Aより難しい問題である。
(3) 問題Aが多項式時間で解けるならば、問題Bも多項式時間で解ける。
(4) 問題Bが多項式時間で解けるならば、問題Aも多項式時間で解ける。
解答
(2)と(4)です。
「問題Aを問題Bに還元する」とは、Aの入力をBの入力に多項式時間で変換し、Bを解くアルゴリズムを道具として使ってAを解くことです。したがって、Bが多項式時間で解ければ、「変換(多項式時間)+Bのアルゴリズム(多項式時間)」でAも多項式時間で解けます。これが(4)です。言い換えると、BはAを解ける程度には難しいので、(2)が成り立ちます。
(3)は一般には成り立ちません。たとえば、オイラー路の存在判定(Pに属する)も、NPに属するのでSATに多項式時間還元できます(クック–レヴィンの定理)。しかし、それでSATが多項式時間で解けることにはなりません。易しい問題は、どんな難しい問題にも還元できてしまうのです。(1)は向きが逆です。「還元する側(A)が易しいか同等、還元される側(B)が難しいか同等」と覚えておきましょう。
次の決定問題が、P、NP、co-NPのどれに属することが知られているかを答えよ(当てはまるものはすべて答えること)。また、NPやco-NPに属するものは、Yesの証拠やNoの証拠として何を示せばよいかを述べよ。
(1) グラフにオイラー路は存在するか。
(2) グラフにハミルトン閉路は存在するか。
(3) グラフにハミルトン閉路は存在しないか。
(4) 与えられた論理式は恒真式か(TAUTOLOGY)。
(5) 2以上の整数 \(N\) は合成数か(1と \(N\) 以外の約数をもつか)。
解答
| 問題 | 属することが知られているクラス | 証拠 |
|---|---|---|
(1) |
P(したがってNPにもco-NPにも属する) |
次数を数え、連結かどうかを確かめれば判定できるので、証拠は不要です。Yesの証拠としてオイラー路そのものを使うこともできます。 |
(2) |
NP(NP完全) |
Yesの証拠: ハミルトン閉路(頂点の並び) |
(3) |
co-NP(co-NP完全) |
Noの証拠: ハミルトン閉路(閉路が存在するのでNo) |
(4) |
co-NP(co-NP完全) |
Noの証拠: 論理式の値を0にする割り当て |
(5) |
P(したがってNPにもco-NPにも属する) |
Yesの証拠: 1と \(N\) 以外の約数。Noの証拠(\(N\) が素数であること)にも短い証拠がある(1975年)。 |
-
(2)がPに属するか、co-NPに属するかは未解決です。「Pには属さない」と答えるのは誤りで、それはP≠NPが証明されて初めて言えることです。また、(2)がco-NPに属すると分かれば、NP完全問題がco-NPに入ることになり、NP=co-NPが導かれます。
-
(3)は(2)の補問題です。NPに属するかどうかは未解決で、属するならやはりNP=co-NPになります。
-
(5)は素数判定の補問題です。2002年のAKSアルゴリズムにより素数判定がPに属すると分かったので、その答えを反転すれば(5)もPに属します。約数を示せばYesを確かめられる、という理由で「NP」とだけ答えても誤りではありませんが、知られている最も強い結果はPです。
(1) 単語「めだか」「かもめ」「めがね」「ねこ」「こま」「まめ」をすべて1度ずつ使うしりとりを作りたい。本文のように、文字を頂点とし、単語を「先頭の文字から末尾の文字へ向かう辺」とするグラフを考えて、しりとりが作れるかを判定し、作れるなら1つ示せ(「ん」で終わると負け、といったルールは考えない)。
(2) (1)の6語に「かに」を加えた7語ではどうか。作れる場合、最初と最後の単語は何になるか。
(3) 単語を頂点とする本文のもう1つの表し方では、しりとりを作る問題はどんな問題になるか。単語の数が非常に多いとき、計算の手間の面でどちらの表し方が有利か。
解答
一方通行の辺からなるグラフ(有向グラフ)では、次数の代わりに、各頂点に入る辺の数と出る辺の数を比べます。辺をもつ頂点どうしが(向きを無視して)つながっているとき、次のことが成り立ちます。
-
すべての頂点で「入る数 = 出る数」なら、オイラー閉路がある。
-
「出る数 = 入る数 + 1」の頂点(出発点)と「入る数 = 出る数 + 1」の頂点(終点)が1つずつあり、他のすべての頂点で「入る数 = 出る数」なら、オイラー路がある。
(1) 作れます。頂点は「め」「か」「ね」「こ」「ま」の5つ、辺は め→か(めだか)、か→め(かもめ)、め→ね(めがね)、ね→こ(ねこ)、こ→ま(こま)、ま→め(まめ)です。「め」は入る辺・出る辺が2本ずつ、他の頂点は1本ずつで、すべて等しいのでオイラー閉路があります。たとえば めだか → かもめ → めがね → ねこ → こま → まめ です。閉路なので、この並びをずらして(たとえば かもめ から)始めることもできます。
(2) 作れます。「かに」(か→に)を加えると、「か」は出る辺が2本・入る辺が1本、「に」は入る辺が1本・出る辺が0本になり、他は等しいままです。したがって「か」で始まり「に」で終わるオイラー路があり、しりとりは か で始まる単語から始まって「かに」で終わります。最初に「かに」を使うと先に進めなくなるので、最初の単語は「かもめ」です。実際、7語すべてを使う並びは かもめ → めがね → ねこ → こま → まめ → めだか → かに のただ1通りです。
(3) 単語を頂点とし、しりとりでつながる単語の間に矢印を引くと、しりとりを作る問題は、そのグラフで(有向の)ハミルトン路を見つける問題になります。オイラー路は辺の数にほぼ比例する時間で見つかりますが、一般のハミルトン路には指数時間の方法しか知られていません。したがって、単語の数が多いときは、文字を頂点としてオイラー路を探す表し方のほうが有利です。これが、ゲノムアセンブリで de Bruijn グラフが使われる理由の1つでした。