👻
1分でNP、NP完全、NP困難の違いを理解する
NP問題
まずはNP問題の定義について説明します。多項式時間=現実的な時間です。ある判定問題がNPに属するなら
- 問題に対する証拠wが与えられたとき、その証拠wが本当に正しいかどうかを多項式時間で判定できる。
ということになります。証拠があれば現実的な時間で解けるが、証拠がなければ現実的な時間で解けないということです。
例えば、あなたが北海道から鹿児島まで歩いて移動する(NP問題)としましょう。グーグルマップ(証拠)があれば簡単そうですが、なかったら難しそうですね。
帰着
次にNP完全と困難の定義に使う帰着[1]について説明します。
- 問題Aが問題Bに帰着できる
という関係は
- 問題Bを解く手順があったら問題Aを解ける
ということです。つまり、Aを解く関数をsolve_a
、Bを解く関数をsolve_b
とすると
def solve_a():
#なんかする
answer_b=solve_b()
#なんかする
return answer_a
のような関数が実現でき、その答え(answer_a
)が正しいことになります。
NP完全問題、NP困難問題
最後にNP完全と困難を説明します。NP完全問題とは
- 任意のNP問題と同等かそれ以上に難しいNP問題
NP困難問題とは
- 任意のNP問題と同等かそれ以上に難しい問題
のことです。2つの違いは
- NP完全問題はNP問題
- NP困難問題はNP問題でなくてもいい
ということです。正確に定義すると
- 問題
がNP困難問題とは、任意のL に対しL'\in NP をL' に現実的な時間で帰着できる。L - 問題
がNP完全問題とは、L でありかつ、任意のL\in NP に対しL'\in NP をL' に現実的な時間で帰着できる。L
ということになります。
まとめ
以下の記事で暗号とNP問題の関係についても説明しています。
-
多対一帰着という特殊ケースも存在する。これはここで述べられているチューリング帰着よりも弱い。 ↩︎
Discussion
「帰着」の章についてですが、帰着にも色々なものがあるので、それについて言及してみてはいかがでしょうか?
帰着の例は以下のようなものがあります:
また、細かいですが NP 困難問題の定義に登場する帰着は、多項式時間で計算できるものである必要があります。
これについては脚注で言及しようと思います。チューリング帰着しか知らなかったのでありがとうございます!
これは「できる」の部分に含意させたつもりでしたが、改めて見ると多項式時間で効率的に計算できる旨を記述したほうがよいように思いました。修正しておきます。