P/NP问题:修订间差异
→P 和NP: "本质上"一詞不合適。多項式時間不等於"很快" . |
Pioneerlike(留言 | 贡献) 无编辑摘要 |
||
第1行: | 第1行: | ||
{{千禧年 |
{{千禧年難題}} |
||
<!--Das P/NP-Problem ist ein offenes Problem der theoretischen Informatik, speziell der Komplexitätstheorie und wurde vom Clay Mathematics Institute in die Liste der Millennium-Probleme aufgenommen. Es beinhaltet die Beziehung zwischen den Komplexitätsklassen P und NP. 1971 stellten Stephen Cook und Leonid Levin unabhängig voneinander erstmals die Frage, ob diese beiden Komplexitätsklassen identisch sind--> |
<!--Das P/NP-Problem ist ein offenes Problem der theoretischen Informatik, speziell der Komplexitätstheorie und wurde vom Clay Mathematics Institute in die Liste der Millennium-Probleme aufgenommen. Es beinhaltet die Beziehung zwischen den Komplexitätsklassen P und NP. 1971 stellten Stephen Cook und Leonid Levin unabhängig voneinander erstmals die Frage, ob diese beiden Komplexitätsklassen identisch sind--> |
||
'''P/NP |
'''P/NP問題'''是在[[理論資訊學]]中[[計算複雜度理論]]領域裏至今沒有解決的問題,它被“[[克雷數學研究所]]”(Clay Mathematics Institute, 簡稱CMI)在[[千禧年大獎難題]]中收錄。P/NP問題中包含了[[複雜度類]][[P]]與[[NP]]的關係。1971年[[史提芬•古克]](Stephen A. Cook) 和 [[:en:Leonid Levin|Leonid Levin]] 相對獨立的提出了下面的問題,即是否兩個複雜度類P和NP是恒等的(P=NP?)。 |
||
== P 和NP == |
== P 和NP == |
||
<!--Die Komplexitätsklasse P beinhaltet alle Probleme, welche von deterministischen Turingmaschinen in polynomiell beschränkter Zeit gelöst werden können. Dagegen beinhaltet NP die Menge aller von nichtdeterministischen Turingmaschinen in polynomialzeit lösbaren Probleme. Aus diesen beiden Definitionen geht hervor, dass P eine Teilmenge von NP ist, unklar ist aber, ob NP ebenfalls eine Teilmenge von P ist und die beiden Klassen somit identisch wären.--> |
<!--Die Komplexitätsklasse P beinhaltet alle Probleme, welche von deterministischen Turingmaschinen in polynomiell beschränkter Zeit gelöst werden können. Dagegen beinhaltet NP die Menge aller von nichtdeterministischen Turingmaschinen in polynomialzeit lösbaren Probleme. Aus diesen beiden Definitionen geht hervor, dass P eine Teilmenge von NP ist, unklar ist aber, ob NP ebenfalls eine Teilmenge von P ist und die beiden Klassen somit identisch wären.--> |
||
複雜度類'''[[P (複雜度類)|P]]'''包含所有那些可以由一個[[圖靈機|確定型圖靈機]]在多項式表達的時間內解決的問題;類'''[[NP (複雜度)|NP]]'''由所有其肯定解可以在給定正確資訊的多項式時間內驗證的決定問題組成,或者等效的說,那些解可以在[[非確定圖靈機]]上在[[多項式時間]]內找出的問題的集合。很可能,[[計算理論]]最大的未解決問題就是關於這兩類的關係的: |
|||
:'''P'''和'''NP'''相等 |
:'''P'''和'''NP'''相等嗎? |
||
在2002年 |
在2002年對於100研究者的調查,61人相信答案是否定的,9個相信答案是肯定的,22個不確定,而8個相信該問題可能和現在所接受的公理獨立,所以不可能證明或證否。[http://www.cs.umd.edu/~gasarch/papers/poll.ps] 對於正確的解答,有一個[[Clay Mathematics Institute|$1,000,000美元的獎勵]]。 |
||
[[NP-完全]] |
[[NP-完全]]問題(或者叫'''NPC''')的集合在這個討論中有重大作用,它們可以大致的被描述為那些在'''NP'''中最不像在'''P'''中的。(確切定義細節請參看[[NP-完全]])理論[[電腦科學家]]現在相信'''P''', '''NP''',和'''NPC'''類之間的關係如圖中所示,其中'''P'''和'''NPC'''類不交。 |
||
[[Image:Complexity classes (en).svg|thumb|250px|假 |
[[Image:Complexity classes (en).svg|thumb|250px|假設'''P''' ≠ '''NP'''的複雜度類的圖解.如'''P''' = '''NP'''則三個類相同.]] |
||
簡單來說,'''P''' = '''NP''' |
簡單來說,'''P''' = '''NP'''問題問道:如果是/不是問題的正面答案可以很快''驗證'',其答案是否也可以很快''計算''?這裏有一個給你找點這個問題的感覺的例子。給定一個大數''Y'',我們可以問''Y''是否是[[合數|複合數]]。例如,我們可能問53308290611是否有非平凡的因數。回答是肯定的,雖然手工找出一個因數很麻煩。從另一個方面講,如果有人聲稱答案是"對,因為224737可以整除53308290611",則我們可以很快用一個除法來驗證。驗證一個數是除數比首先找出除數來簡單得多。用於驗證一個正面答案所需的資訊也稱為''證書''。所以我們的結論是,給定 正確的證書,問題的正面答案可以很快的(也就是,在多項式時間內)驗證,而這就是這個問題屬於'''NP'''的原因。雖然這個特定的問題,最近被證明為也在'''P'''類中(參看[[#外部鏈結和參考|下面的]]關於"質數在P中"的參考),這一點也不明顯,而且有很多類似的問題相信不屬於類'''P'''。 |
||
限制到是/不是 |
限制到是/不是問題並沒有改變問題;即使我們允許更複雜的答案,最後的問題(是否[[FP (複雜度)|FP]] = [[FNP (複雜度)|FNP]])是等價的。 |
||
==形式化定 |
==形式化定義== |
||
更正式一些,一 |
更正式一些,一個''決定問題''是一個取一些[[字串]]為輸入並要求輸出為是或否的問題。若有一個[[演算法]](譬如[[圖靈機]],或一個[[Lisp編程語言|LISP]]或[[Pascal編程語言|Pascal]]的程式並有無限的記憶體)能夠在最多''n''<sup>''k''</sup>步內對一個串長度為''n''的輸入給出正確答案,其中''k''是某個不依賴於輸入串的常數,則我們稱該問題可以在''多項式時間''內解決,並且將它置入類'''P'''。直觀的講,我們將'''P'''中的問題視為可以較快解決的問題。 |
||
現在假設有一個演算法A(''w'',''C'')取兩個參數,一個串''w'',也就是我們的決定問題的輸入串,而另一個串''C''是“建議證明”,並且使得A在最多''n''<sup>''k''</sup>步之內產生“是/否”答案(其中''n''是''w''的長度而''k''不依賴於''w'')。進一步假設 |
|||
: ''w''是一 |
: ''w''是一個答案為“是”的例子,當且僅當,存在''C''使得A(''w'',''C'')返回“是”。 |
||
則我們稱這個問題可以在''非決定性多項式時間''內解決,且將它放入'''NP'''類。我們把演算法A作為一個所建議的證明的檢驗器,它運行足夠快。(注意縮寫'''NP'''代表“'''N'''on-deterministic(非確定性)'''P'''olynomial(多項式)”而''不是''代表“'''N'''on-'''P'''olynomial(非多項式)。) |
|||
==NP完全== |
==NP完全== |
||
要解 |
要解決'''P''' = '''NP'''問題,[[NP完全|'''NP'''完全]]的概念非常有用。不嚴格的講,'''NP'''完全問題是'''NP'''類中“最難”的問題,也就是說它們是最可能不屬於'''P'''類的。這是因為''任何'''''NP'''中的問題可以在多項式時間內變換成為任何特定'''NP'''完全問題的一個特例。例如,[[旅行商問題]]的判定問題版本是'''NP'''完全的。所以'''NP'''中的''任何''問題的''任何''特例可以在多項式時間內機械地轉換成旅行商問題的一個特例。 |
||
所以若旅行商 |
所以若旅行商問題被證明為在'''P'''內,則'''P ''' = '''NP'''!旅行商問題是很多這樣的'''NP'''完全的問題之一。若任何一個'''NP'''完全的問題在'''P'''內,則可以推出'''P''' = '''NP'''。不幸的是,很多重要的問題被證明為'''NP'''完全,但沒有一個有已知快速的演算法。 |
||
==更 |
==更難的問題== |
||
雖然是否'''P'''='''NP'''還是未知的,在'''P'''之外的問題是已經知道存在的。尋找[[國際象棋]]或[[圍棋]]最佳走法(在''n''乘''n''棋盤上)是[[指數時間完全]]的。因為可以證明P ≠ EXPTIME(指數時間),這些問題位於'''P'''之外,所以需要比多項式時間更多的時間。判定[[Presburger算術]]中的命題是否為真的問題更加困難。Fischer和[[Michael O. Rabin|Rabin]]於[[1974年]]證明每個決定Presburger命題的真偽性的演算法有最少2^(2^(''cn''))的運行時間,''c''為某個常數。這裏,''n''是Presburger命題的長度。因此,該命題已知需要比指數時間更多的運行時間。不可判定問題是更加困難的,例如[[停機問題]]。它們無法在任何給定時間內解決。 |
|||
==P真的容易 |
==P真的容易處理嗎?== |
||
上面所有的 |
上面所有的討論假設了'''P'''表示“容易”而“不在'''P'''中”表示“困難”。這是一個在複雜度理論中常見而且有一定準確性的假設,它在實踐中卻不總是真的,原因包括如下幾點: |
||
*它忽略了常 |
*它忽略了常數因數。一個需要10<sup>1000</sup>''n''時間的問題是屬於'''P'''的(它是線性時間的),但是事實上完全無法處理。一個需要10<sup>-10000</sup>2<sup>''n''</sup>時間的問題不是在'''P'''中的(它是指數時間的),但是對於''n'' 取值直到幾千時還是很容易處理的。 |
||
*它忽略了指 |
*它忽略了指數的大小。一個時間複雜度''n''<sup>1000</sup>屬於'''P''',但是很難對付。已經證明在'''P'''中存在需要任意大的指數的問題(參看[[時間等級定理]])。一個時間複雜度2<sup>''n''/1000</sup>的問題不屬於'''P''',但對與''n''直到幾千還是容易應對的。 |
||
*它只考 |
*它只考慮了最壞情況的複雜度。可能現實世界中的有些問題在多數時候可以在時間''n''中解決,但是很偶爾你會看到需要時間2<sup>''n''</sup>的特例。這個問題可能有一個多項式的平均時間,但最壞情況是指數式的,所以該問題不屬於'''P'''。 |
||
*它只考 |
*它只考慮確定性解。可能有一個問題你可以很快解決如果你可以接受出現一點誤差的可能,但是確保正確的答案會難得多。這個問題不會屬於'''P''',雖然事實上它可以很快求解。這實際上是解決屬於'''NP'''而還不知道是否屬於'''P'''的問題的一個辦法(參看'''[[RP (複雜度)|RP]]''', '''[[BPP]]''')。 |
||
*新的 |
*新的諸如[[量子電腦]]這樣的計算模型,可能可以快速的解決一些尚未知道是否屬於'''P'''的問題;但是,沒有一個它們已知能夠解決的問題是'''NP'''完全的。不過,必須注意到'''P'''和'''NP'''問題的''定義''是採用象圖靈機這樣的經典計算模型的屬於表述的。所以,即使一個量子電腦演算法被發現能夠有效的解決一個'''NP'''完全問題,我們只是有了一個快速解決困難問題的實際方法,而不是數學類'''P'''和'''NP'''相等的證明。 |
||
== |
==電腦科學家為什麼認為P ≠ NP?== |
||
多 |
多數電腦科學家相信'''P'''≠'''NP'''。該信念的一個關鍵原因是經過數十年對這些問題的研究,沒有人能夠發現一個NP完全問題的多項式時間演算法。而且,人們早在NP完全的概念出現前就開始尋求這些演算法了([[Karp的21個NP完全問題]],在最早發現的一批中,有所有著名的已經存在的問題]])。進一步地,P = NP這樣的結果會導出很多驚人的結果,那些結果現在被相信是不成立的,例如NP = [[餘NP]]和P = [[PH (複雜度)|PH]]。 |
||
也有 |
也有這樣論證的:問題較難求解(NP)但容易驗證(P),這和我們日常經驗是相符的。 |
||
從另一方面講,某些研究者認為我們過於相信'''P''' ≠ '''NP''',而應該也去尋找'''P''' = '''NP'''的證明。例如,2002年中有這樣的聲明: [http://www.cs.umd.edu/~gasarch/papers/poll.ps] |
|||
: |
: 傾向P≠NP的主要論據是在窮盡搜索的領域完全沒有本質進展。也就是說,以我的觀點,一個很弱的論據。演算法的空間是很大的,而我們只是在開始探索的起點。[ . . . ] [[費馬最後定理]]的解決也顯示非常簡單的[sic]問題可能只有用非常深刻的理論才能解決。 |
||
: — Moshe Vardi,[[ |
: — Moshe Vardi,[[萊斯大學]] |
||
: |
: 過分依賴某種投機不是規劃研究的一個好的導引。我們必須總是嘗試每個問題的兩個方向。偏見可能導致著名的數學家無法解決答案和他們的預計相反的著名問題,雖然他們發展了所有所需的方法。 |
||
: — Anil Nerode, [[康奈 |
: — Anil Nerode, [[康奈爾大學]] |
||
== |
==關於證明的難度的結果== |
||
雖然百萬美元的獎金和大量投入巨大卻沒有實質性結果的研究足以顯示該問題是困難的,還有一些形式化的結果證明為什麼該問題可能很難解決。 |
|||
最常被引用的 |
最常被引用的結果之一設計[[神喻機器|神喻]]。假想你有一個魔法機器可以解決單個問題,例如決定一個給定的數字是否為質數,但可以瞬間解決這個問題。我們的新問題是,若我們被允許任意利用這個機器,是否存在我們可以在多項式時間內驗證但無法在多項式時間內解決的問題?結果是,依賴於機器能解決的問題,'''P''' = '''NP'''和'''P''' ≠ '''NP'''二者都可以證明。這個結論的後果是,任何可以修改來證明該機器的存在性的結果不能解決問題。不幸的是,幾乎所有經典的方法和大部分已知的方法可以這樣修改(我們稱它們在''相對化'')。 |
||
如果 |
如果這還不算太糟的話,1993年Razborov和Rudich證明的一個結果表明,給定一個特定的可信的假設,在某種意義下“自然”的證明不能解決'''P''' = '''NP'''問題。[http://www-2.cs.cmu.edu/~rudich/papers/natural.ps] 這表明一些現在似乎最有希望的方法不太可能成功。隨著更多這類的定理得到證明,該定理的可能證明有越來越多的陷阱要規避。 |
||
這實際上也是為什麼NP完全問題有用的原因:若有一個多項式時間演算法,或者沒有一個這樣的演算法,對於NP完全問題存在,這將用一種相信不被上述結果排除在外的方法來解決'''P''' = '''NP'''問題。 |
|||
==多 |
==多項式時間演算法== |
||
沒人知道多項式時間演算法對於NP完全問題是否存在。但是如果這樣的演算法存在,我們已經知道其中的一些了!例如,下面的演算法正確的接受了一個NP完全語言,但是沒人知道通常它需要多久運行。它是一個多項式時間演算法當且僅當'''P''' = '''NP'''。 |
|||
// 接受NP完全 |
// 接受NP完全語言的一個演算法[[子集和問題|子集和]]。 |
||
// |
// |
||
// |
// 這是一個多項式時間演算法當且僅當P=NP。 |
||
// |
// |
||
// “多 |
// “多項式時間”表示它在多項式時間內返回“是”,若 |
||
// |
// 結果是“是”,否則永遠運行。 |
||
// |
// |
||
// |
// 輸入:S = 一個自然數的有限集 |
||
// |
// 輸出:"是" 如果某個S的子集加起來等於0。 |
||
// 否 |
// 否則,它永遠運行沒有輸出。 |
||
// 注意: "程 |
// 注意: "程式數P" 是你將一個整數P寫為二進位,然後 |
||
// |
// 將位元串考慮為一個程式。 |
||
// 每 |
// 每個可能的程式都可以這樣產生, |
||
// |
// 雖然多數什麼也不做因為有語法錯誤。 |
||
// <br> |
// <br> |
||
FOR N = 1...infinity |
FOR N = 1...infinity |
||
FOR P = 1...N |
FOR P = 1...N |
||
以S |
以S為輸入運行程式數P N步 |
||
IF 程 |
IF 程式輸出一個不同的整數的列表 |
||
AND 所有整 |
AND 所有整數都在S中 |
||
AND 整 |
AND 整數的和為0<br> |
||
THEN |
THEN |
||
OUTPUT "是" |
OUTPUT "是" 並 停機 |
||
若'''P''' = '''NP''', |
若'''P''' = '''NP''',則這是一個接受一個NP完全語言的多項式時間演算法。“接受”表示它在多項式時間內給出“是”的答案,但允許在答案是“否”的時候永遠運行。 |
||
可能我 |
可能我們想要“解決”子集和問題,而不是僅僅“接受”子集和語言。這表示我們想要它總是停機並返回一個“是”或“否”的答案。是否存在任何可能在多項式時間內解決這個問題的演算法?沒有人知道。但是如果這樣的演算法存在,那麼我們已經知道其中的一些了!只要將上面的演算法中的IF語句替換成下面的語句: |
||
IF 程 |
IF 程式輸出一個完整的數學證明 |
||
AND |
AND 證明的每一步合法 |
||
AND |
AND 結論是S確實有(或者沒有)一個和為0的子集 |
||
THEN |
THEN |
||
OUTPUT "是" (或者"不是"如果那被 |
OUTPUT "是" (或者"不是"如果那被證明了)並停機 |
||
== |
==邏輯表述== |
||
P=NP |
P=NP問題可以用邏輯命題的特定類的可表達性的術語來重新表述。所有P中的語言可以用[[一階邏輯]]加上[[最小不動點]]操作(實際上,這允許了遞迴函數的定義)來表達。類似地,NP是可以用存在性[[二階邏輯]]來表達—也就是,在關係、函數、和子集上排除了[[全域量詞]]的二階邏輯。[[多項式等級]],[[PH (複雜度)|PH]]中的語言對應與所有的[[二階邏輯]]。這樣,“P是NP的真子集嗎”這樣的問題可以表述為“是否存在性二階邏輯能夠表達帶最小不動點操作的一階邏輯的所不能表達的語言?” |
||
==花絮== |
==花絮== |
||
[[普林斯 |
[[普林斯頓大學]]電腦系樓將[[二進位碼]]表述的“P=NP?”問題刻進頂樓西面的磚頭上。如果證明了P=NP,磚頭可以很方便的換成表示“P=NP!”。[http://www.princeton.edu/~taubetap/tours/handbook.pdf] |
||
[[康奈 |
[[康奈爾大學]]的Hubert Chen博士提供了這個玩笑式的P不等於NP的證明:“<i>反證法。設P = NP。令y為一個P = NP的證明。證明y可以用一個合格的電腦科學家在多項式時間內驗證,我們認定這樣的科學家的存在性為真。但是,因為P = NP,該證明y可以在多項式時間內由這樣的科學家發現。但是這樣的發現還沒有發生(雖然這樣的科學家試圖發現這樣的一個證明),我們得到矛盾。</i>"[http://www.cs.cornell.edu/hubes/pnp.htm] |
||
== |
==參看== |
||
*[[P ( |
*[[P (複雜度)]] |
||
*[[NP ( |
*[[NP (複雜度)]] |
||
*[[NP完全]] |
*[[NP完全]] |
||
==外部 |
==外部鏈結及參考== |
||
* [http://www.claymath.org/prizeproblems/index.htm The Clay Math Institute Millennium Prize Problems] |
* [http://www.claymath.org/prizeproblems/index.htm The Clay Math Institute Millennium Prize Problems] |
||
第130行: | 第130行: | ||
* [http://www.complexityzoo.com Scott Aaronson's Complexity Zoo] |
* [http://www.complexityzoo.com Scott Aaronson's Complexity Zoo] |
||
<!--{{ |
<!--{{複雜度類}}--> |
||
[[Category: |
[[Category:複雜度類]] |
||
[[Category:猜想]] |
[[Category:猜想]] |
||
[[Category: |
[[Category:數學中未解決的問題]] |
||
[[ca:P versus NP]] |
[[ca:P versus NP]] |
2006年7月11日 (二) 03:35的版本
千禧年大獎難題 |
---|
P/NP問題是在理論資訊學中計算複雜度理論領域裏至今沒有解決的問題,它被“克雷數學研究所”(Clay Mathematics Institute, 簡稱CMI)在千禧年大獎難題中收錄。P/NP問題中包含了複雜度類P與NP的關係。1971年史提芬•古克(Stephen A. Cook) 和 Leonid Levin 相對獨立的提出了下面的問題,即是否兩個複雜度類P和NP是恒等的(P=NP?)。
P 和NP
複雜度類P包含所有那些可以由一個確定型圖靈機在多項式表達的時間內解決的問題;類NP由所有其肯定解可以在給定正確資訊的多項式時間內驗證的決定問題組成,或者等效的說,那些解可以在非確定圖靈機上在多項式時間內找出的問題的集合。很可能,計算理論最大的未解決問題就是關於這兩類的關係的:
- P和NP相等嗎?
在2002年對於100研究者的調查,61人相信答案是否定的,9個相信答案是肯定的,22個不確定,而8個相信該問題可能和現在所接受的公理獨立,所以不可能證明或證否。[1] 對於正確的解答,有一個$1,000,000美元的獎勵。
NP-完全問題(或者叫NPC)的集合在這個討論中有重大作用,它們可以大致的被描述為那些在NP中最不像在P中的。(確切定義細節請參看NP-完全)理論電腦科學家現在相信P, NP,和NPC類之間的關係如圖中所示,其中P和NPC類不交。
簡單來說,P = NP問題問道:如果是/不是問題的正面答案可以很快驗證,其答案是否也可以很快計算?這裏有一個給你找點這個問題的感覺的例子。給定一個大數Y,我們可以問Y是否是複合數。例如,我們可能問53308290611是否有非平凡的因數。回答是肯定的,雖然手工找出一個因數很麻煩。從另一個方面講,如果有人聲稱答案是"對,因為224737可以整除53308290611",則我們可以很快用一個除法來驗證。驗證一個數是除數比首先找出除數來簡單得多。用於驗證一個正面答案所需的資訊也稱為證書。所以我們的結論是,給定 正確的證書,問題的正面答案可以很快的(也就是,在多項式時間內)驗證,而這就是這個問題屬於NP的原因。雖然這個特定的問題,最近被證明為也在P類中(參看下面的關於"質數在P中"的參考),這一點也不明顯,而且有很多類似的問題相信不屬於類P。
限制到是/不是問題並沒有改變問題;即使我們允許更複雜的答案,最後的問題(是否FP = FNP)是等價的。
形式化定義
更正式一些,一個決定問題是一個取一些字串為輸入並要求輸出為是或否的問題。若有一個演算法(譬如圖靈機,或一個LISP或Pascal的程式並有無限的記憶體)能夠在最多nk步內對一個串長度為n的輸入給出正確答案,其中k是某個不依賴於輸入串的常數,則我們稱該問題可以在多項式時間內解決,並且將它置入類P。直觀的講,我們將P中的問題視為可以較快解決的問題。
現在假設有一個演算法A(w,C)取兩個參數,一個串w,也就是我們的決定問題的輸入串,而另一個串C是“建議證明”,並且使得A在最多nk步之內產生“是/否”答案(其中n是w的長度而k不依賴於w)。進一步假設
- w是一個答案為“是”的例子,當且僅當,存在C使得A(w,C)返回“是”。
則我們稱這個問題可以在非決定性多項式時間內解決,且將它放入NP類。我們把演算法A作為一個所建議的證明的檢驗器,它運行足夠快。(注意縮寫NP代表“Non-deterministic(非確定性)Polynomial(多項式)”而不是代表“Non-Polynomial(非多項式)。)
NP完全
要解決P = NP問題,NP完全的概念非常有用。不嚴格的講,NP完全問題是NP類中“最難”的問題,也就是說它們是最可能不屬於P類的。這是因為任何NP中的問題可以在多項式時間內變換成為任何特定NP完全問題的一個特例。例如,旅行商問題的判定問題版本是NP完全的。所以NP中的任何問題的任何特例可以在多項式時間內機械地轉換成旅行商問題的一個特例。 所以若旅行商問題被證明為在P內,則P = NP!旅行商問題是很多這樣的NP完全的問題之一。若任何一個NP完全的問題在P內,則可以推出P = NP。不幸的是,很多重要的問題被證明為NP完全,但沒有一個有已知快速的演算法。
更難的問題
雖然是否P=NP還是未知的,在P之外的問題是已經知道存在的。尋找國際象棋或圍棋最佳走法(在n乘n棋盤上)是指數時間完全的。因為可以證明P ≠ EXPTIME(指數時間),這些問題位於P之外,所以需要比多項式時間更多的時間。判定Presburger算術中的命題是否為真的問題更加困難。Fischer和Rabin於1974年證明每個決定Presburger命題的真偽性的演算法有最少2^(2^(cn))的運行時間,c為某個常數。這裏,n是Presburger命題的長度。因此,該命題已知需要比指數時間更多的運行時間。不可判定問題是更加困難的,例如停機問題。它們無法在任何給定時間內解決。
P真的容易處理嗎?
上面所有的討論假設了P表示“容易”而“不在P中”表示“困難”。這是一個在複雜度理論中常見而且有一定準確性的假設,它在實踐中卻不總是真的,原因包括如下幾點:
- 它忽略了常數因數。一個需要101000n時間的問題是屬於P的(它是線性時間的),但是事實上完全無法處理。一個需要10-100002n時間的問題不是在P中的(它是指數時間的),但是對於n 取值直到幾千時還是很容易處理的。
- 它忽略了指數的大小。一個時間複雜度n1000屬於P,但是很難對付。已經證明在P中存在需要任意大的指數的問題(參看時間等級定理)。一個時間複雜度2n/1000的問題不屬於P,但對與n直到幾千還是容易應對的。
- 它只考慮了最壞情況的複雜度。可能現實世界中的有些問題在多數時候可以在時間n中解決,但是很偶爾你會看到需要時間2n的特例。這個問題可能有一個多項式的平均時間,但最壞情況是指數式的,所以該問題不屬於P。
- 它只考慮確定性解。可能有一個問題你可以很快解決如果你可以接受出現一點誤差的可能,但是確保正確的答案會難得多。這個問題不會屬於P,雖然事實上它可以很快求解。這實際上是解決屬於NP而還不知道是否屬於P的問題的一個辦法(參看RP, BPP)。
- 新的諸如量子電腦這樣的計算模型,可能可以快速的解決一些尚未知道是否屬於P的問題;但是,沒有一個它們已知能夠解決的問題是NP完全的。不過,必須注意到P和NP問題的定義是採用象圖靈機這樣的經典計算模型的屬於表述的。所以,即使一個量子電腦演算法被發現能夠有效的解決一個NP完全問題,我們只是有了一個快速解決困難問題的實際方法,而不是數學類P和NP相等的證明。
電腦科學家為什麼認為P ≠ NP?
多數電腦科學家相信P≠NP。該信念的一個關鍵原因是經過數十年對這些問題的研究,沒有人能夠發現一個NP完全問題的多項式時間演算法。而且,人們早在NP完全的概念出現前就開始尋求這些演算法了(Karp的21個NP完全問題,在最早發現的一批中,有所有著名的已經存在的問題]])。進一步地,P = NP這樣的結果會導出很多驚人的結果,那些結果現在被相信是不成立的,例如NP = 餘NP和P = PH。
也有這樣論證的:問題較難求解(NP)但容易驗證(P),這和我們日常經驗是相符的。
從另一方面講,某些研究者認為我們過於相信P ≠ NP,而應該也去尋找P = NP的證明。例如,2002年中有這樣的聲明: [2]
- 傾向P≠NP的主要論據是在窮盡搜索的領域完全沒有本質進展。也就是說,以我的觀點,一個很弱的論據。演算法的空間是很大的,而我們只是在開始探索的起點。[ . . . ] 費馬最後定理的解決也顯示非常簡單的[sic]問題可能只有用非常深刻的理論才能解決。
- — Moshe Vardi,萊斯大學
- 過分依賴某種投機不是規劃研究的一個好的導引。我們必須總是嘗試每個問題的兩個方向。偏見可能導致著名的數學家無法解決答案和他們的預計相反的著名問題,雖然他們發展了所有所需的方法。
- — Anil Nerode, 康奈爾大學
關於證明的難度的結果
雖然百萬美元的獎金和大量投入巨大卻沒有實質性結果的研究足以顯示該問題是困難的,還有一些形式化的結果證明為什麼該問題可能很難解決。
最常被引用的結果之一設計神喻。假想你有一個魔法機器可以解決單個問題,例如決定一個給定的數字是否為質數,但可以瞬間解決這個問題。我們的新問題是,若我們被允許任意利用這個機器,是否存在我們可以在多項式時間內驗證但無法在多項式時間內解決的問題?結果是,依賴於機器能解決的問題,P = NP和P ≠ NP二者都可以證明。這個結論的後果是,任何可以修改來證明該機器的存在性的結果不能解決問題。不幸的是,幾乎所有經典的方法和大部分已知的方法可以這樣修改(我們稱它們在相對化)。
如果這還不算太糟的話,1993年Razborov和Rudich證明的一個結果表明,給定一個特定的可信的假設,在某種意義下“自然”的證明不能解決P = NP問題。[3] 這表明一些現在似乎最有希望的方法不太可能成功。隨著更多這類的定理得到證明,該定理的可能證明有越來越多的陷阱要規避。
這實際上也是為什麼NP完全問題有用的原因:若有一個多項式時間演算法,或者沒有一個這樣的演算法,對於NP完全問題存在,這將用一種相信不被上述結果排除在外的方法來解決P = NP問題。
多項式時間演算法
沒人知道多項式時間演算法對於NP完全問題是否存在。但是如果這樣的演算法存在,我們已經知道其中的一些了!例如,下面的演算法正確的接受了一個NP完全語言,但是沒人知道通常它需要多久運行。它是一個多項式時間演算法當且僅當P = NP。
// 接受NP完全語言的一個演算法子集和。 // // 這是一個多項式時間演算法當且僅當P=NP。 // // “多項式時間”表示它在多項式時間內返回“是”,若 // 結果是“是”,否則永遠運行。 // // 輸入:S = 一個自然數的有限集 // 輸出:"是" 如果某個S的子集加起來等於0。 // 否則,它永遠運行沒有輸出。 // 注意: "程式數P" 是你將一個整數P寫為二進位,然後 // 將位元串考慮為一個程式。 // 每個可能的程式都可以這樣產生, // 雖然多數什麼也不做因為有語法錯誤。 //
FOR N = 1...infinity FOR P = 1...N 以S為輸入運行程式數P N步 IF 程式輸出一個不同的整數的列表 AND 所有整數都在S中 AND 整數的和為0
THEN OUTPUT "是" 並 停機
若P = NP,則這是一個接受一個NP完全語言的多項式時間演算法。“接受”表示它在多項式時間內給出“是”的答案,但允許在答案是“否”的時候永遠運行。
可能我們想要“解決”子集和問題,而不是僅僅“接受”子集和語言。這表示我們想要它總是停機並返回一個“是”或“否”的答案。是否存在任何可能在多項式時間內解決這個問題的演算法?沒有人知道。但是如果這樣的演算法存在,那麼我們已經知道其中的一些了!只要將上面的演算法中的IF語句替換成下面的語句:
IF 程式輸出一個完整的數學證明 AND 證明的每一步合法 AND 結論是S確實有(或者沒有)一個和為0的子集 THEN OUTPUT "是" (或者"不是"如果那被證明了)並停機
邏輯表述
P=NP問題可以用邏輯命題的特定類的可表達性的術語來重新表述。所有P中的語言可以用一階邏輯加上最小不動點操作(實際上,這允許了遞迴函數的定義)來表達。類似地,NP是可以用存在性二階邏輯來表達—也就是,在關係、函數、和子集上排除了全域量詞的二階邏輯。多項式等級,PH中的語言對應與所有的二階邏輯。這樣,“P是NP的真子集嗎”這樣的問題可以表述為“是否存在性二階邏輯能夠表達帶最小不動點操作的一階邏輯的所不能表達的語言?”
花絮
普林斯頓大學電腦系樓將二進位碼表述的“P=NP?”問題刻進頂樓西面的磚頭上。如果證明了P=NP,磚頭可以很方便的換成表示“P=NP!”。[4]
康奈爾大學的Hubert Chen博士提供了這個玩笑式的P不等於NP的證明:“反證法。設P = NP。令y為一個P = NP的證明。證明y可以用一個合格的電腦科學家在多項式時間內驗證,我們認定這樣的科學家的存在性為真。但是,因為P = NP,該證明y可以在多項式時間內由這樣的科學家發現。但是這樣的發現還沒有發生(雖然這樣的科學家試圖發現這樣的一個證明),我們得到矛盾。"[5]
參看
外部鏈結及參考
- The Clay Math Institute Millennium Prize Problems
- Gerhard J. Woeginger. The P-versus-NP page. Lists a number of incorrect solutions to the problem.
- A. S. Fraenkel and D. Lichtenstein, Computing a perfect strategy for n*n chess requires time exponential in n, Proc. 8th Int. Coll. Automata, Languages, and Programming, Springer LNCS 115 (1981) 278-293 and J. Comb. Th. A 31 (1981) 199-214.
- E. Berlekamp and D. Wolfe, Mathematical Go: Chilling Gets the Last Point, A. K. Peters, 1994. D. Wolfe, Go endgames are hard, MSRI Combinatorial Game Theory Research Worksh., 2000.
- Neil Immerman. Languages Which Capture Complexity Classes. 15th ACM STOC Symposium, pp.347-354. 1983.
- Computational Complexity of Games and Puzzles
- Manindra Agarwal, Nitin Saxena, Neeraj Kayal, "PRIMES is in P", Preprint, August 6, 2002
- The "PRIMES is in P" FAQ
- Scott Aaronson's Complexity Zoo