最初に理解することは、PとNPが問題ではなく言語を分類するということです。これが何を意味するのかを理解するには、まず他の定義が必要です。
アルファベットは記号の空でない有限集合です。
{ 0
、1
}は、ASCII文字セットと同様にアルファベットです。{}は空なのでアルファベットではありません。N(整数)は有限ではないため、アルファベットではありません。
してみましょうΣはアルファベットなります。以下からのシンボルの有限個の注文連結Σが呼び出された単語の上にΣ。
文字列101
は、アルファベット{ 0
、1
} 上の単語です。空の単語(多くの場合のように書かεは)任意のアルファベット以上の単語です。文字列penguin
は、ASCII文字を含むアルファベット上の単語です。数πの小数点表記は、アルファベット{超える単語ではない.
、0
、1
、2
、3
、4
、5
、6
、7
、8
、9
それは有限ではないので}。
|として書かれた単語wの長さ w |は、その中のシンボルの数です。
たとえば、| hello
| = 5および| ε | =0。任意の単語wに対して| w | ∈ Nしたがって、有限。
してみましょうΣはアルファベットなります。セットΣ *には、εを含むΣ上のすべての単語が含まれます。集合Σ +には、εを除く、Σ上のすべての単語が含まれます。以下のためのN ∈ N、Σ N長さの単語の組であるN。
すべてのアルファベットΣ、Σ *およびΣ +は無限の可算集合です。ASCII文字の設定Σ ASCII、正規表現.*
と.+
意味ΣのASCII *とΣ ASCII +をそれぞれ。
{ 0
、1
} 7は 7ビットのASCIIコードのセットは、{ 0000000
、0000001
、...、1111111
}。{ 0
、1
} 32は32ビット整数値のセットです。
してみましょうΣはアルファベットとなるL ⊆ Σ *。Lが呼び出された言語を超えますΣ。
アルファベットΣの場合、空の集合とΣ *はΣ上の自明な言語です。前者はしばしば空の言語と呼ばれます。空の言語{}と空の単語{ ε } のみを含む言語は異なります。
非NaN IEEE 754浮動小数点値に対応する{ 0
、1
} 32のサブセットは、有限言語です。
言語には無限の数の単語を含めることができますが、すべての言語は可算です。文字列のセットは、{ 1
、2
、...}進数の整数を表すことは{アルファベット上無限の言語です0
、1
、2
、3
、4
、5
、6
、7
、8
、9
}。文字列の無限集合は、{ 2
、3
、5
、7
、11
、13
、...}進表記で素数を表すことは、その適切なサブセットです。正規表現に一致するすべての単語を含む[+-]?\d+\.\d*([eE][+-]?\d+)?
言語は、ASCII文字セット上の言語です(Cプログラミング言語で定義されている有効な浮動小数点式のサブセットを示します)。
実数のセットは数えられないため、すべての実数(表記法)を含む言語はありません。
してみましょうΣはアルファベットとなるL ⊆ Σ *。マシンDは 決定 Lをすべて入力するための場合のw ∈ Σ *が演算特性関数 χ L(Wを有限時間で)。特性関数は次のように定義されます
χ L:Σ * →{0、1}
W 1↦、 W ∈ L
そうでなければ、0。
このようなマシンが呼び出される決定者のためのL。「与えられたw、D出力x」に対して「D(w)= x」と書きます。
多くのマシンモデルがあります。今日実用化されている最も一般的なものは、チューリングマシンのモデルです。チューリングマシンには、セルにクラスター化された無制限の線形ストレージがあります。各セルには、任意の時点でアルファベットのシンボルを1つだけ保持できます。チューリングマシンは、一連の計算ステップとして計算を実行します。各ステップで、1つのセルを読み取り、場合によってはその値を上書きし、読み取り/書き込みヘッドを左または右のセルの1つの位置だけ移動できます。マシンが実行するアクションは、有限オートマトンによって制御されます。
有限の命令セットと無制限のストレージを備えたランダムアクセスマシンは、チューリングマシンモデルと同じくらい強力な別のマシンモデルです。
この議論のために、使用する正確な機械モデルに煩わされることはありませんが、機械には有限の決定論的な制御ユニット、無制限のストレージがあり、計算できるステップのシーケンスとして計算を実行すると言うだけで十分です。
あなたは質問でそれを使用したので、あなたはすでに「big-O」記法に精通していると思いますので、ここでは簡単な復習に過ぎません。
してみましょうfは:Nの関数とします→。セットO(fは)すべての機能を含んでいるG:N → Nが定数が存在するため、N 0 ∈ NおよびC ∈ N毎にこのようなことN ∈ NとN > N 0、それが事実であるG(N)≤ のC Fを(n)。
これで、本当の問題に取り組む準備ができました。
クラスPは、すべての言語の含有Lチューリングマシンが存在するためにDを決定L及び定数のK ∈ N毎に入力するためのように、W、Dの停止後に最大でTを(| wは機能するためのステップを|)T ∈ O(N ↦ N K)。
以来O(nは ↦ N K)、書き込みに不便で、ほとんどの人が読んで数学的に正しいが、 -正直に言うと、誰も自分を除いては-通常、単純に書き込みますO(N kは)。
境界はwの長さに依存することに注意してください。したがって、素数の言語に対して行う引数は、unarayエンコーディングの数値に対してのみ正しいです。ここで、数値nのエンコーディングwの場合、エンコーディングの長さは| w | nに比例します。実際にそのようなエンコーディングを使用する人はいません。ただし、考えられるすべての要因を単に試すよりも高度なアルゴリズムを使用すると、入力がバイナリ(または他のベース)にエンコードされている場合、素数の言語はPのままであることがわかります。(大きな関心にもかかわらず、これはマニンドラ・アグラワル、ニーラジ・カヤル、ニティン・サクセナによってのみ証明されました 2004年の受賞論文では、アルゴリズムはそれほど単純ではないと推測できます。)
自明な言語{}とΣ *および自明でない言語{ ε }は明らかにP(アルファベットΣの場合)です。入力として文字列を受け取り、文字列がこれらのそれぞれの言語の単語であるかどうかを示すブール値を返すお気に入りのプログラミング言語で関数を作成し、関数が多項式ランタイムの複雑さを持っていることを証明できますか?
すべての正規言語(正規表現で記述された言語)はPにあります。
してみましょうΣはアルファベットとなるL ⊆ Σ *。機械V二つの単語の符号化されたタプルをとるwは、C ∈ Σ *とステップ有限数の後に0又は1を出力は、検証のためにLが以下の特性を有する場合。
- (所与のwは、C)、Vは 1た場合にのみ出力W ∈ L。
- すべてのためのw ∈ L、存在するC ∈ Σ *ように、Vは(wは、C)= 1。
上記の定義のcは、証人(または証明書)と呼ばれます。
検証者は、実際にwがLにある場合でも、間違った証人に対して偽陰性を与えることができます。ただし、誤検出を許可することはできません。また、言語の各単語に対して、少なくとも1人の証人が存在する必要があります。
素数ではないすべての整数の10進エンコーディングを含むCOMPOSITE言語の場合、目撃は因数分解である可能性があります。たとえば、∈COMPOSITEの(659, 709)
証人です467231
。目撃者の証言がなくても1枚の紙で簡単に確認できます。467231が首相ではないことは、コンピューターを使用しなければ困難であることを証明できます。
適切な証人を見つける方法については何も言わなかった。これは非決定的な部分です。
クラスNPは、すべての言語の含有Lチューリングマシンが存在するためにVのことを確認するLと定数のK ∈ N毎に入力するためのように(W、C)、Vの停止後に最大でT(| W |)関数のための手順T ∈ O(N ↦ N K)。
上記の定義は、それぞれについてことを意味することに留意されたいW ∈ L証人が存在するCを有します| c | ≤ T(| W |)。(チューリングマシンは、目撃者のシンボルをこれ以上見ることはできません。)
NPはPのスーパーセットです(なぜですか?)。NPにはあるがPにはない言語が存在するかどうかは不明です。
整数因数分解はそれ自体言語ではありません。ただし、それに関連する決定問題を表す言語を構築できます。すなわち、すべてのタプルを含んでいる言語(N、Mのように)N因子有するDとD ≤ Mを。この言語をFACTORと呼びましょう。FACTORを決定するアルゴリズムがある場合、それを使用して、各素因数に対して再帰的なバイナリ検索を実行することにより、多項式のオーバーヘッドのみで完全な因数分解を計算できます。
FACTORがNPにあることを示すのは簡単です。適切な証人単に因子であろうD自体、すべて検証者が実行しなければならないでいることを確認しているD ≤ MとN MOD Dこの= 0全てが多項式時間で行うことができます。(繰り返しますが、カウントするのはエンコードの長さであり、nの対数であることを思い出してください。)
FACTORがPにもあることを示すことができれば、多くのクールな賞を獲得することができます。(そして、あなたは今日の暗号のかなりの部分を破壊しました。)
NPのすべての言語には、決定論的に決定するブルートフォースアルゴリズムがあります。すべての証人に対して徹底的な検索を実行するだけです。(ミラーリング監視の最大長は多項式で区切られていることに注意してください。)したがって、PRIMESを決定するアルゴリズムは、実際にはCOMPOSITEを決定するブルートフォースアルゴリズムでした。
最後の質問に対処するために、reductionを導入する必要があります。削減は、理論的なコンピューターサイエンスの非常に強力な概念です。ある問題を別の問題に還元するということは、基本的に、別の問題を解決することである問題を解決することを意味します。
してみましょうΣはアルファベットとなるAとB以上の言語もΣ。ある多項式時間多対1の還元可能にBの関数が存在する場合は、Fを:Σ * → Σ *以下の性質を持ちます。
- W ∈ A ⇔ F(W ∈)B 全てについてのw ∈ Σ *。
- 関数fは、|の多項式で区切られた多数のステップで、すべての入力wに対してチューリングマシンによって計算できます。w |。
この場合、我々は書くA ≤ p個の Bを。
たとえば、三角形を含むすべてのグラフ(隣接行列としてエンコードされた)を含む言語をAとします。(三角形は長さ3のサイクルです。)さらにBを、ゼロ以外のトレースを持つすべての行列を含む言語とします。(行列のトレースは、その主な対角要素の合計です。)その場合、AはBに還元可能な多項式時間の多対1 です。これを証明するには、適切な変換関数fを見つける必要があります。この例では、設定することができるFを 3計算する番目の隣接行列のパワーを。これには、それぞれが多項式の複雑さを持つ2つの行列行列積が必要です。
これは、その自明の事実であるL ≤ p個の L。(正式に証明できますか?)
これを今NPに適用します。
言語LはあるNPの -hardの場合に限りL '≤ P L、すべての言語のためのL ' ∈ NP。
アンNP -hard言語はまたはであってもなくてもよいNPそのもの。
言語LはNP-完全な場合にのみ
最も有名なNP完全言語はSATです。満たすことができるすべてのブール式が含まれています。例えば、(∨ B)∧(¬ ∨¬ B)∈座っていました。有効な証人は{ a = 1、b = 0}です。式(∨ B)∧(¬ ∨ B)∧¬ B ∉座っていました。(それをどのように証明しますか?)
そのSAT∈示すことは難しいことではありませんNPを。SAT のNPの難しさを示すことはいくつかの作業ですが、1971年にStephen Cookによって行われました。
その1つのNP完全言語が知られると、縮小によって他の言語のNP完全性を示すのは比較的簡単でした。言語の場合はAがあることが知られているNPは、その示す-hard A ≤ Pの Bのことを示しているBがあるNPは(「≤の推移を経ても、-hard P」)。1972年、リチャード・カープはNPであると証明できる21の言語のリストを発表しました-SATの(推移的な)削減を介して完了します。(これは、この回答の中で実際にお読みになることをお勧めする唯一の論文です。他の記事とは異なり、理解するのは難しくなく、リダクションによるNP完全性の証明方法の非常に良いアイデアを提供します。)
最後に、短い要約。NPHとNPCの記号を使用して、それぞれNP -hardおよびNP -complete言語のクラスを示します。
- P ⊆ NP
- NPC ⊂ NPとNPC ⊂ NPH、実際にNPC = NP ∩ NPH定義により、
- (A ∈ NP)∧(B ∈ NPH)⇒ A ≤ P B
含めることに留意されたいNPC ⊂ NPがいる場合には、適切な偶数P = NP。これを確認するには、自明でない言語を自明な言語に減らすことはできず、Pには自明な言語があり、NPには自明でない言語があることを明確にしてください。ただし、これは(あまり面白くない)コーナーケースです。
補遺
混乱のあなたの主な供給源は、あなたが「のことを考えたことがあるように思わN」の「O(nは ↦ F(N))」として解釈それが実際に指し、アルゴリズムの入力の長さを入力します。これは、アルゴリズムの漸近的な複雑さが入力に使用されるエンコードに依存することを意味するため、重要な違いです。
今週、知られている最大のメルセンヌ素数の新記録が達成されました。最大の現在知られている素数は2である74 207 281 - 1。この数は、私は、次の例では小さいものを使用しますので、それは私に頭痛を与えるほど巨大である:2 31 - = 2 1 147 483 647それができますさまざまな方法でエンコードされます。
- 10進数としてのメルセンヌ指数による:
31
(2バイト)
- 10進数として:
2147483647
(10バイト)
- 単項数として:
11111…11
が…
2 147 483 640さらに1
s(ほぼ2 GiB)に置き換えられる場所
これらのすべての文字列は同じ番号をエンコードし、これらのいずれかを指定すると、同じ番号の他のエンコードを簡単に構築できます。(必要に応じて、10進数エンコードを2進数、8進数、または16進数に置き換えることができます。定数係数だけ長さを変更します。)
素数性をテストするための素朴なアルゴリズムは、単項エンコーディングの多項式のみです。AKS素数判定法は、小数(または他の任意の塩基に対する多項式であるB 2≥)。ルーカス-レーマーの素数性テストがメルセンヌための最もよく知られているアルゴリズムが素数であるM個のPを用いてP奇素数をそれはまだメルセンヌ指数のバイナリエンコーディングの長さの指数関数であるP(の多項式P)。
アルゴリズムの複雑さについて話したい場合、使用する表現を非常に明確にすることが非常に重要です。一般に、最も効率的なエンコーディングが使用されていると想定できます。つまり、整数のバイナリ。(すべての素数がメルセンヌ素数であるとは限らないため、メルセンヌ指数の使用は一般的なエンコード方式ではないことに注意してください。)
理論的な暗号化では、多くのアルゴリズムは、最初のパラメーターとして完全に役に立たないk 1
の文字列を正式に渡されます。このアルゴリズムは、このパラメータを見たことがないが、それはそれは正式に多項式にすることができますKで、セキュリティパラメータをチューニングする手順のセキュリティを使用していました。
バイナリエンコーディングの決定言語がNP完全であるいくつかの問題では、埋め込み数値のエンコーディングが単項に切り替えられた場合、決定言語はNP完全ではなくなります。他の問題の決定言語は、NPのままです。後者は強くNP完全と呼ばれます。最もよく知られている例は、ビンパッキングです。
また、入力が圧縮された場合にアルゴリズムの複雑さがどのように変化するかを見るのも(そしておそらくもっと)おもしろいです。メルセンヌ素数の例では、3つのエンコーディングが見られました。各エンコーディングは、前のものよりも対数的に圧縮されています。
1983年、Hana GalperinとAvi Wigdersonは、グラフの入力エンコーディングが対数的に圧縮される場合の一般的なグラフアルゴリズムの複雑さについて興味深い論文を書きました。これらの入力に対して、上からの三角形(明らかにPにある場所)を含むグラフの言語は、突然NP完全になります。
それは、PやNPなどの言語クラスが問題ではなく言語に対して定義されているためです。