《Factor Man》︰證明P=NP後,你要如何向全世界宣布?
假如發現了幾乎可破解全世界所有密碼,甚至大幅改善人類生活的技術,你會怎樣做?這大概就是小說《Factor Man》要講的故事。但要了解這個故事為何有趣,必須先了解電腦科學中懸而未決的「P vs. NP問題」,本文會先介紹這個問題,最後才有點劇透(會附上警示)。
嚴格來說,書中的「因數俠」(Factor Man自稱名字參考了Iron Man,所以我這樣翻譯)發現了可以快速解決NP問題的演算法,因此那是個P=NP的世界——不明白不要緊,以下我會解釋。
問題的分類
P vs. NP問題所屬的領域稱為「計算複雜度理論」(computational complexity theory,以下簡稱「複雜度理論」),粗略來說,這是研究問題有多難解決的學科。當然,電腦科學研究的問題需要可以用演算法解決,而這領域的專家就是分析相關演算法去把各種問題分類。
首先要注的是,此處「問題」不是「一個問題」,而是「一組(相關的)問題」,例如加法問題——「計算 m+n 的答案」——其實由無限多個問題組成︰1+1=?, 1+2=?, 1+3=? … 但這些問題可用同一個演算法處理,只需要輸入不同的值便會得出相應問題的答案。
加法問題屬於函數問題(function problem),即計算函數值的問題,而本文主要討論決策問題(decision problem),這類問題只有「是」或「否」兩個可能答案,例如解答「n是否質數?」的質數判斷問題(primality test)。
至於因數分解問題——「尋找n的所有因數(或最小質因數)」——雖是個函數問題,但可以改寫成決策問題「n是否有一個小於m但大於1的因數?」,這兩個版本的因數分解問題可以互相轉換。
複雜度理論中,問題按其解決的演算法分成多個類別,而P vs. NP問題就涉及P和NP兩個類之間的關係,一般會認為屬於P的問題比較容易處理、可以在較短時間內解決,而NP中的問題難以解決、需要花很長時間才能找到答案。「P=NP」代表一些看似較難以解決的問題原來沒那麼困難,而「P≠NP」則表示兩類問題之間有道界線。
接下來我會嘗試解釋P和NP到底是甚麼。
量度效率
複雜度理論中把決策問題分類的方法,是按照解決問題的演算法的效率決定,如果我們找到演算法可以快速解決一個問題,這個問題可視為容易解決;相反,如果目前解決某個問題的演算法非常慢,這個問題應算是難以解決。
但應怎樣判斷「快」和「慢」呢?如果比較運行演算法至得出答案的時間,在不同電腦上運行會得出不同結果,即使訂立一部「標準電腦」也非常不方便——電腦硬件發展迅速,難道每幾年要重新計時嗎?而且現代電腦中央處理器包含很多指令集,程式的效率也取決於處理器支援甚麼指令集。
粗略來說,判斷演算法效率的標準是看它運算所需的「步數」,不過也不是看實際數字,而是跟輸入數值的關係——輸入的數值越大,往往涉及更多運算步驟。量度(二進制的)輸入值大小的單位是位元,也就是數值寫出來有多長(例如十進制…