作者:王垠
原文鏈接:http://www.yinwang.org/blog-cn/2019/07/21/pnp2
好幾年前曾經寫過一篇文章表達對計算機科學里著名的 “P vs NP” 問題的看法。當時正值我人生中第 N 次研究那些東西,由于看透了卻不在乎,所以寫得特別簡略。沒想到有人看到后,還以為我沒仔細學過復雜度理論,說我信口開河。我一般懶得談論這種太理論的問題,身邊也很少有人關心,所以后來干脆把文章撤了。不是我說的有什么不對,而是我懶得跟人爭論。
沒想到最近又遇到有人抓住我刪掉的文章,乘機拿出來貶損我,盡其羞辱之能力。說王垠你太自以為是了,你知不知道“P vs NP”要是解決了,世界將有天翻地覆的變化,多少的計算難題會被解決,機器學習都沒必要了,非對稱加密全都被破解…… 跟上課似的頭頭是道滔滔不絕,幾乎把他本科算法課本上的內容給我背了一遍,以為別人不知道一樣,卻沒有顯示出任何他自己的思想。
呃,我真是服了某些人背書冒術語的能力,難怪能做國內某大廠的 P10(注:不是我的在職公司)。鑒于很多人對此類問題的一知半解,反倒嘲笑別人不懂,牛逼轟轟打壓其他人,我決定事后把這個問題再詳細講一下,免得以后還要為它費口舌。
對于初學者這篇文章有點門檻,需要學習一些東西。“P vs NP” 問題屬于計算理論(Theory of Computation)的一部分——復雜度理論。計算理論不止包括復雜度理論(Complexity),還包括可計算性(Computability),也就是“停機問題”一類的內容。
國內大學的計算機教學一般在算法課上對復雜度理論有初級的講授,但很少人能夠真的理解。如果你沒有系統的學習過復雜度理論,我建議你研讀一下計算理論的專著(而不是普通的算法教材),比如 Michael Sipser 的『Introduction to the Theory of Computation』。
我當年在 Indiana 做研究生計算理論課助教的時候,可算是把這書給看透了…… 被逼的。其中“可計算性理論”在我將來的 PL 研究中起了比較大的啟發作用,而復雜度理論的用處一般。我覺得 Sipser 的書寫的不夠清晰透徹,但很多學校拿它做教材,好像也沒有其它特別好的替代品。
計算理論如此晦澀難懂,我認為圖靈機是禍首。如果你能理解 lambda calculus,將會大大簡化理解計算理論的過程。如果你想用更深刻更容易的方法理解計算理論,可以參考這篇文章的“Lambda 演算與計算理論”一節,里面會提到另一本參考書。從這篇文章你也可以看出來,我絲毫不崇拜圖靈。
“P vs NP” 真的重要嗎?
“P vs NP” 這個問題有它的理論價值,它是有趣的問題,里面的有些思路有啟發意義,值得花些時間來了解。但計算機科學界長久以來都嚴重夸大它的重要性,把一個很普通的問題捧上了天,吹得神乎其神。
再加上圖靈機模型在計算理論界的廣泛使用,使得這門學問顯得異常艱深。很多人看到圖靈機就暈了,在課程上蒙混過關,考試完了就全忘了,根本無法理解里面的實質內容。正是因為很多人的不明覺厲,使得“P vs NP”登上了它在 CS 界的寶座。
很多人做了一輩子計算機工作,做了很多巧妙的設計構架,寫了許許多多的代碼,解決了很多性能難題。提到“P vs NP”,雖然一輩子都沒用上這個理論,仍然頂禮膜拜。由此可見“不明覺厲”對于人們心理的威力。
很多人認為“P vs NP”是計算機科學最重要的問題。Clay 數學研究所甚至懸賞一百萬美元解決這個問題,把它叫做數學界的 7 個千年難題之一,跟黎曼猜想并列其中。
好幾次有人聲稱解決了“P vs NP”,上了新聞,鬧得輿論沸沸揚揚,小編們吹得好像世界要天翻地覆了一樣,把他們追捧為天才苦行僧,后來卻又發現他們的結果是錯的……
如果你真的理解了“P vs NP”的內涵,就會發現這一切都是鬧劇。這個問題即使得到解決,也不能給世界帶來很大變化。解決這個問題對于現實的計算,作用是微乎其微的。不管 P 是否等價于 NP,我們遇到的計算問題的難度不會因此有重大改變。
甚至有些數學家認為“P vs NP” 根本沒有資格跟黎曼猜想一起并列于“千禧年問題”。我倒是希望有人真的解決了它,這樣我們就可以切實的看到這有什么意義。
“P vs NP” 也許不是愚蠢的問題,但計算機科學界幾十年以來夸大它的重要性的做法,是非常愚蠢的,讓整個領域蒙羞。
真正重要的數學問題被解決,應該對現實世界具有強大的作用。這種作用可以是“潛在的”,它的應用可以發生在很久以后的將來,但這必須能夠被預見到。數學家們把這叫做“applicable result”(注意不叫 applied 或者 practical)。否則這個數學問題就只能被叫做“有理論價值”,“有趣”,而不能叫做“重要”。即使所謂“純數學”,也應該有可以預見的效果。
很多數學家都明白黎曼猜想(Riemann hypothesis)的重要性。大數學家希爾伯特說過:“如果我沉睡了三千年醒過來,我的第一句話會是‘黎曼猜想被解決了嗎?’” 假設希爾伯特還在世,他會對解決“P vs NP”有同樣的渴望嗎?我覺得不會。實際上,很多數學家都覺得“P vs NP”的重要性根本沒法和黎曼猜想相提并論,因為我們預見不到它會產生任何重要的效果。
什么是多項式時間?
很多人提到“P vs NP”就會跟你吹噓,P 如果等于 NP,世界將有天翻地覆的變化。許許多多我們以前沒法辦到的事情,都將成為現實。非對稱加密技術會被破解,生物化學將得到飛躍,機器學習將不再有必要……
這些人都忽略了一個重要的問題:什么是多項式時間。盲目的把“多項式”等同于“容易”和“高效”,導致了對 “P vs NP” 重要性的嚴重夸大。
n100 是不是多項式?是的。n1000000 也是多項式。n100100 也是多項式,n100100100 也是多項式…… 實際上,只要 n 的指數是常數,它就是一個多項式,而 n 的指數可以是任意大的常數!n 的指數可以是任意大的常數!n 的指數可以是任意大的常數!重要的事情說三遍。
時間復雜度 n100100100 的算法,能用嗎?所以即使 P=NP,你需要的計算時間仍然可以是宇宙毀滅 N 次,其中 N 是任意的常數。
說到這里,又會有人跟我說你不懂,當 n 趨近于無窮的時候,非多項式總會在某個時候超越多項式,所以當 n “足夠大”的時候,多項式時間的算法總是會更好。很可惜,“無窮”對于現實的問題是沒有意義的。任何被叫做“重要”的問題,都應該在合理的時間內得到結果。
我們關心的要點不應該是“足夠大”,而是“具體要多大”。精確的量化,找到實際可以用的區間,這才是合格的科學家該有的思路。計算機科學里,大 O 表示法泛濫成災,只看最高次冪,忽略系數和常數項,也是常見的誤區。我也曾經沉迷于如何把 O(n3) 的算法降低到 O(n2.9),現在回頭才發現當年是多么的幼稚。
“多項式時間”這個概念太寬泛太籠統。以如此籠統的概念為基礎的理論,不可能對現實的計算問題產生意義。我們關心的不應該僅僅是“是否多項式”,而是“具體是什么樣的多項式”。6n20 + 26n7 + 200,1000n3 + 8n2 + 9,…… 每一個多項式的曲線都是很不一樣的,在各個區間它們的差別也是不一樣的。多項式的冪,系數,常數項,它們的不同都會產生重大的差異。
這就是為什么“P=NP”沒有很大意義,因為 P 本身太籠統,其內部的差異可以是天壤之別。與其試圖籠統的證明 P 等價于 NP,還不如為具體的問題想出實質意義上高效的算法,精確到冪,系數,常數項。
更進一步看,這些“復雜度”的數學公式,不管是多項式還是指數,不管你的冪,系數常數項有多精確,終究難以描述現實系統的特性。物理的機器有各種分級的 cache,并行能力,同步開銷,傳輸開銷,各種瓶頸…… 最后你發現性能根本無法用數學公式來表達,它根本不是一個數學問題,而是一個物理問題,工程問題。這就像汽車引擎的功率一樣,只有放到測試設備(Dyno)上面,通過系統的測量過程才能得到。
有些理論家喜歡小看“工程”,自以為會分析復雜度就高高在上的樣子,而其實呢,工程和物理才是真實的。數學只是粗略描述物理和工程的工具。
P!=NP 有意義嗎?
“P vs NP”問題有兩種可能性:P=NP(等價),或者 P!=NP(不等價)。以上我說明了 P=NP 的意義不大,那么要是 P!=NP 呢?
很多人會跟你說,要是一個問題是 NP-Hard,然后又有 P!=NP,那么我們就知道這個問題沒有多項式時間的算法存在,就避免了為多項式時間算法浪費時間了。這不也有一些價值嗎?
我并沒有否認 P!=NP 是有那么一點價值:在某些時候它也許避免了浪費時間。但這種價值比較小,而且它具有誤導性。
一個常見的 NP-Hard 問題是 SAT。如果 P!=NP,那么大家就應該放棄為它找到高效的算法嗎?如果大家都這樣想,那么現在的各種高效的 SAT solver 就不存在了。實際上,利用隨機算法,我們在大多數時候都能比較快的解決 SAT 問題。
問題在于,“P vs NP”關心的只是“最壞情況”,而最壞情況也許非常罕見。有些問題大部分實際的情況都可以高效的解決,只有少數變態的情況會出現非常高的復雜度。為了這少數情況放棄大多數,這就是“P vs NP”的誤導。
如果因為 P!=NP,你認為 NP-Hard 的問題就沒有高效的算法,那你也許會誤以為你可以利用這些“難題”來做非對稱加密。然而 NP-Hard 并不等于沒法快速解決,所以要是你因此被誤導,也許會設計出有漏洞的加密算法。
即使 P!=NP,我們仍然不能放棄尋找重要的 NP-Hard 問題的高效算法,所以確切的證明 P!=NP 的價值也不是那么重要了。其實你只要知道 P=NP “大概不可能”,就已經能起到“節省時間”的目的了。你沒必要證明它。
什么是 NP?
這一節我來講講“P vs NP”里的“NP”到底是什么。內容比較深,看不懂的人可以跳過。
很多人都沒搞明白 NP 是什么就開始夸夸其談“P vs NP”的價值。 經常出現的錯誤,是把 NP 等同于“指數時間”。實際上 NP 代表的是“Nondeterministic Polynomial time”,也就是“非確定性圖靈機”(nondeterministic Turing machine)能在多項式時間解決的那些問題。
什么是“非確定性圖靈機”?如果你把課本上那堆圖靈機的定義看明白看透了,然后又理解了程序語言理論,你會發現所謂“非確定性圖靈機”可以被很簡單的解釋。
你可以把我們通常用到的程序看作是“確定性圖靈機”(deterministic Turing machine)。它們遇到條件分支,在同一個時刻只能走其中一條路,不能兩邊同時探索。
那么“非確定性圖靈機”呢?你可以把“非確定性圖靈機”想象成一個具有“超能力”的計算機,它遇到分支語句的時候,可以同時執行 True 和 False 兩個分支。它能夠同時遍歷任意多的程序分支,這是一臺具有超能力的機器!
所以“P vs NP”的含義大概就是這樣:請問那些需要非確定性圖靈機(超能力計算機)在多項式時間才能解決的問題,能夠用確定性圖靈機(普通計算機)在多項式時間解決嗎?
現在問題來了,具有如此超能力的機器存在嗎?答案當然是“No!” 就算是量子計算機做成功了,也不可能具有這樣的計算能力。沒有人知道如何造出非確定性圖靈機,人們沒有任何頭緒它如何能夠存在。
所以 “P vs NP” 這個 問題的定義,是基于一個完全假想的機器——非確定性圖靈機。既然是假象的機器,為什么一定要是“非確定圖靈機”呢?為什么不可以是其它具有超能力的東西?
仔細想想吧,“非確定性圖靈機”對于現實的意義,就跟 Hogwarts 魔法學校和哈利波特對于現實的意義一樣。我們為什么不研究“P vs HP”呢,其中 H 代表 Harry Potter。HP 定義為:哈利波特能夠在多項式時間解決的問題。
“P vs NP”問題:請問那些需要非確定性圖靈機(超能力計算機)在多項式時間才能解決的問題,能夠用確定性圖靈機(普通計算機)在多項式時間解決嗎?
“P vs HP”問題:請問那些需要哈利波特在多項式時間才能解決的問題,能夠用確定性圖靈機(普通計算機)在多項式時間解決嗎?
我不是開玩笑,仔細回味一下 “P vs NP” 和 “P vs HP” 的相似性吧。也許你會跟我一樣意識到 NP 這個概念本身就是虛無的。我不明白“一個不存在的機器能在多項式時間解決的問題”,這樣的說法有何意義,基于它的理論又有什么科學價值。
非確定性圖靈機存在的意義,也許只是因為它可以被證明等價于其它一些常見的問題,比如 SAT。計算理論書籍一般在證明 SAT 與 非確定性圖靈機等價性之后,就完全拋掉了非確定性圖靈機,之后的等價性證明都是通過 SAT 來進行。
我覺得 NP 這個概念其實是在故弄玄虛。我們完全可以從 SAT 本身出發去發展這個理論,而不需要設想一個具有超能力的機器。我們可以有一個問題叫做“P vs SAT”,而不出現 NP 這個概念。
(有點扯遠了)
其它質疑 P vs NP 價值的人
有人認為我質疑 P vs NP 的價值是一知半解信口開河,然而我并不是第一個質疑它的人。很多人對 P vs NP 都有類似的疑惑,但因為這個問題的地位如此之高,沒人敢站出來。只要你開口,一群人就會居高臨下指責你基礎課程沒學好,說你眼界太窄…… 再加上那一堆紛繁復雜基于圖靈機的證明,讓你有苦說不出。
由于這個原因,我從來沒敢公開表達我的觀點,直到我發現 Doron Zeilberger 的這篇文章。Zeilberger 是個數學家,Rutgers 大學的數學系教授。在那之前他開了個玩笑,戲稱自己證明了 P=NP,還寫了篇像模像樣的論文。在文章里他告誡大家:不要愛上你的模型(Don’t Fall In Love With Your Model)。他這句話說到了我心里。
你還能在網絡上找到其它人對“P vs NP”的質疑,比如這篇來自于一位專門研究計算理論的學者:
? Is P=NP an Ill Posed Problem?
我覺得他講的也很在理。正是在這些人的鼓舞之下,我隨手寫出了之前對“P vs NP” 的質疑。只言片語里面,融入了我多年的深入學習,研究和思考。
總結
看這篇文章很累吧?我寫著也累。對于我來說這一切都已經那么明了,真的不想費口舌。但是既然之前已經說出來了,為了避免誤解,我仍然決定把這些東西寫下來擺在這里。如果你暫時看不懂可以先放在一邊,等到了需要深入研究計算理論,想得頭痛的時候再來看。你也許會感謝我。
我希望嚴謹的計算機科學工作者能夠理解我在說什么,反思一下對“P vs NP”的理解。計算機專業的學生應該理解“P vs NP”理論,但不必沉迷其中。這并不是一個值得付出畢生精力去解決的問題。計算機科學里面還有其它許多有趣而重要的問題需要你們去探索。如果你覺得計算機科學都不過癮,你可以去證明黎曼猜想啊 :)
當然所有這些都是我的個人觀點,我沒有強求任何人接受它們。強迫別人接受自己的觀點是不可以的,但想阻止別人表達對此類問題的質疑,也是不可以的,因為我們生活在自由的世界。
沒人想搶走你們的玩具,但不要忘了,它只是玩具。