悪魔の証明に挑む計算複雑性理論のわかりやすい(つもり)の解説

PとNPと聞くと胃が痛くなる人はどれくらいいるでしょうか。あ、俺もそうです。

一般にないことを証明するのは非常に困難だ。それを人々は悪魔の証明と呼ぶ。

悪魔の証明とは、「ある事実・現象が『全くない(なかった)』」というような、それを証明することが非常に困難な命題を証明すること。例えば「アイルランドに蛇はいる」ということを証明するとしたら、アイルランドで蛇を一匹捕まえて来ればよいが、「アイルランドに蛇はいない」ということの証明はアイルランド全土を探査しなくてはならないので非常に困難、事実上不可能であるというような場合、これを悪魔の証明という。

http://d.hatena.ne.jp/keyword/%B0%AD%CB%E2%A4%CE%BE%DA%CC%C01

ある問題を現実的な計算量で解くアルゴリズムが存在するか否か―存在しないことが判明してしまえば、その問題の効率的なアルゴリズムを探すことは意味がなくなってしまうので、その問題を一部制限することで解けるようにするなどのアプローチを試すきっかけになるだろう。しかし、存在しないことを証明するというのは、先ほども述べたように悪魔の証明だ。

これを解決したのが計算複雑性理論であり、PとかNPとかだが、結局のところよく分からない。俺自身学部で習った時は、なんのことやら判らなかった。

しかし、判ってみたら、なんてことなかった。このエントリでは計算複雑性の考え方を説明したいと思う。

PとNPって何だ?

PとかNPとは問題の「集合」のことで、

P
現実的に解ける計算量で正確な答えが出せるアルゴリズムが存在する判定問題の集合
NP
ある条件さえ整えば、現実的に解ける計算量で正確な答えが出せるアルゴリズムが存在する判定問題の集合

のことだ。「現実的な計算量とは何か」やらNPの「ある条件」などはとりあえず片隅に置いておきまましょう。重要なのは、二つとも問題に対する現実的な計算量のアルゴリズムが存在することが条件となっている。明らかにP \subset NPである。しかし、問題が容易に解けるかどうかしか説明していない。では解けないことを証明するにはどうするのだろうか。ここでNP- hardという問題の集合が登場するのだ。

現実的な計算量で解けないことを証明する

NP-hardとは、

NP-hard
あらゆるNPから現実的に解ける計算量で変換できる判定問題の集合

のことだ。ここでNP-hardの問題が1問でも現実的な計算量で解けると仮定しよう。このとき、あらゆるNPに属する問題は、その問題に現実的な計算量で変換できるので、NPすべての問題が現実的な計算量で解けることになり、PNPは同じ集合を指すことになる。すなわち、P = NPだ。

一方、今の話の対偶を取ってみよう、「あるNP-hardに属する問題が現実的な計算量で解けるならば、NPすべての問題が現実的な計算量で解ける」の対偶は、「あるNPの問題が現実的な計算量で解けないならば、すべてのNP-hardに属する問題は現実的な計算量で解けない」、すなわちNP-hardの問題は、一問たりともPに属さないことになる。

まとめ

つまりP = NPP \neq NPの考え方をまとめると、

P = NP
すべてのNPは現実的な計算量で解ける。(ただし、NP-hardのある問題が現実的な計算量で解けることが条件)
P \neq NP
NP-hardに属する問題は現実的な計算量で解けない。(ただし、NPのある問題が現実的な計算量で解けないことが条件)

となる。今のを図で整理するとこのようになる。

NP-hardのある問題が現実的な計算量で解ける場合


NPのある問題が現実的な計算量で解けない場合


間違ってもこのようなことはありえない。


最後に、現実的な計算量とは多項式時間、すなわち、入力の大きさの何乗かのオーダーに収まることを指します。だから2^nとかはアウトね。

もし、すんなりと受け入れられたら、参考書を開いてみましょう。今度は判るはず。