P/NP 问题 是理论计算机科学 中计算复杂度理论 领域至今未解决的问题,是克雷数学研究所 七題千禧年大奖难题 之一。P/NP问题包括复杂度类 P 与NP 的关系。1971年由史提芬·古克 (Stephen A. Cook)和列昂尼德·列文 分別提出。
P=NP
复杂度类P 即為所有可以由一个确定型图灵机 在多项式 表达的时间内解决的问题;类NP 由所有可以在多项式时间内验证它的解是否正確的决定问题组成,或者等效的说,那些可以在非確定型圖靈機 上在多项式时间 内找出解的问题的集合。很可能,计算理论 最大的未解决问题就是关于这两类的关系的:
P 和NP 相等
在2002年对于100研究者的调查中,61人相信答案是否定的,9人相信答案是肯定的,22人不确定,而8人相信问题可能和现在所接受的公理独立,所以不可能证明或证否。[ 1] 对于正确的解答,有一个一百萬美元的奖励 。
NP-完全 问题(或者叫NPC )的集合在这讨论有重大作用,它们可以大致的描述为那些在NP 中最不像在P 中的(确切定义细节请参看NP-完全 理论)。计算机科学家 现在相信P 、NP 和NPC 类之间的关系如图中所示,其中P 和NPC 类不相交。
假设P ≠NP 的复杂度类的图解。如P =NP 则三个类相同。
簡單來說,P =NP 即:「若问题的答案可以很快验证,其答案是否也可以很快被计算出來。」
例如某大数是否合数 :如53308290611有否非平凡因數 。答案是肯定的,虽然人手找出一个因數很麻烦。从另一个方面讲,如果有人声称答案是「对,224737可以整除53308290611」,则我们可以很快用除法验证。验证一个数是除数比找出一個明顯除数来简单得多。用於验证一个正面答案所需的信息也称为证明 。所以我们的结论是,给定正确的证明,问题的正面答案可以很快(也就是,在多项式时间内)验证,而这就是这个问题属于NP 的原因。
虽然这个特定的问题,最近也獲证實在P 类中(参看下面的 关于"质数在P中"的参考),这一点也不明显,而且有很多类似的问题相信不属于类P 。
像上面这样,把问题限制到“是/不是”问题并没有改变原问题(即没有降低难度);即使我们允许更复杂的答案,最后的问题(是否FP =FNP )是等价的。
学术定义
更正式一些,一个决定问题 是一个取一些字符串 为输入并要求输出为是或否的问题。若有一个算法 (譬如图灵机 ,或一个LISP 或Pascal 的程序并有无限的内存)能够在最多n k 步内对一个串长度为n 的输入给出正确答案,其中k 是某个不依赖于输入串的常数,则我们称该问题可以在多项式时间 内解决,并且将它置入类P 。直观的讲,我们将P 中的问题视为可以较快解决的问题。
现在假设有一个算法A(w ,C )取两个参数,一个串w ,也就是我们的决定问题的输入串,而另一个串C 是“建议证明”,并且使得A在最多n k 步内产生“是/否”答案(其中n 是w 的长度而k 不依赖于w )。然後假设:w 是一个答案为“是”的例子,当且仅当,存在C 使得A(w ,C )返回“是”。
则我们称这个问题可以在非决定性多项式时间 内解决,且将它放入NP 类。我们把算法A作为一个所建议的证明的检验器,它运行足够快。(注意缩写NP 代表“N on-deterministic(非确定性)P olynomial(多项式)”而不是代表“N on-P olynomial(非多项式)。)
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 棋盘上)是NP困难 的。因为可以证明P≠EXPTIME(指数时间),这些问题位于P 之外,所以需要比多项式时间更多的时间。判定皮尔斯伯格算术 中的命题是否为真的问题更加困难。Fischer和Rabin 于1974年证明每个决定Presburger命题的真伪性的算法有最少22cn 的运行时间,c 为某个常数。这裡,n 是Presburger命题的长度。因此,该命题已知需要比指数时间更多的运行时间。不可判定问题是更加困难的,例如停机问题 ,而它们无法在任何给定时间内解决。
P真的容易处理吗?
上面所有的讨论,假设了P 表示“容易”而“不在P 中”表示“困难”。这是一个在复杂度理论中常见而且有一定准确性的假设,它在实践中却不总是真的,原因包括如下几点:
它忽略了常数因子。一个需要101000 n 时间的问题是属于P 的(它是线性时间的),但是事实上完全无法处理。一个需要10-10000 2n 时间的问题不是在P 中的(它是指数时间的),但是对于n 取值直到几千时还是很容易处理的。
它忽略了指数的大小。一个时间复杂度n 1000 属于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 [ 2] 。该信念的一个关键原因是经过数十年对这些问题的研究,没人能发现一个NP完全问题的多项式时间算法。而且,人们早在NP完全的概念出现前就开始寻求这些算法(Karp的21个NP完全问题 ,在最早发现的一批中,有所有著名的已经存在的问题)。进一步,P=NP这样的结果会导致很多惊人结果,那些结果现在被相信不成立,如NP=反NP 和P=PH 。
也有这样论证:问题难求解(P)但易验证(NP),这和我们日常经验相符。
从另一方面讲,某些研究者认为我们过于相信P ≠NP ,而应该也去寻找P =NP 的证明。例如,2002年有这声明:[ 3]
“
倾向P≠NP的主要论据是在穷举搜索领域完全没有本质性进展。也就是说,以我的观点,这是一个很弱的论据。算法的空间非常大,而我们只是在开始探索的起点。……费马最后定理 的解决也显示非常简单的问题可能只有用非常深刻的理论才能解决。
”
——Moshe Y. Vardi ,莱斯大学
“
过分依赖某种投机的猜測不是规划研究的一个好导引。我们必须总是尝试每个问题的两个方向。偏见可能导致著名的数学家无法解决答案和他们的预计相反的著名问题,虽然他们发展了所有所需的方法。
”
——Anil Nerode ,康奈尔大学
关于证明的难度的结果
虽然百万美元的奖金和投入巨大却没有实质性结果的大量研究足以显示该问题很难,但是还有一些形式化的结果证明为什么该问题可能很难解决。
最常引用的结果之一是设计神諭 。假想你有部魔法机器可以解决单一问题,例如「判定某数是否质数」,這魔法機器可以瞬间解决这问题。我们的新问题是,若我们獲允许任意利用这机器,是否存在我们可以在多项式时间内验证但无法在多项式时间内解决的问题?结果是,依赖于机器能解决的问题,P =NP 和P ≠NP 二者都可以证明。这个结论带来的后果是,任何可以通过修改神諭 来证明该机器的存在性的结果不能解决问题。不幸的是,几乎所有经典的方法和大部分已知的方法可以这样修改(我们称它们在相对化 )。
如果这还不算太糟的话,1993年Razborov和Rudich证明的一个结果表明,给定一个特定的可信的假设,在某种意义下“自然”的证明不能解决P =NP 问题。[1] (页面存档备份 ,存于互联网档案馆 )这表明一些现在似乎最有希望的方法不太可能成功。随着更多这类定理得到证明,该定理的可能证明方法有越来越多的陷阱要规避。
这实际上也是为什么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]
[ 5]
康奈尔大学 的Hubert Chen博士提供了这个玩笑式的P不等于NP的证明:[ 6]
反证法。设P=NP。令y为一个P=NP的证明。证明y可以用一个合格的计算机科学家在多项式时间内验证,我们认定这样的科学家的存在性为真,但因为P=NP,该证明y可在多项式时间内由这样的科学家发现,但是这样的发现还没有发生(虽然这样的科学家试图发现这样的一个证明),我们得到矛盾。
註釋
参考文献
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.
延伸閱讀
Fraenkel, A. S.; Lichtenstein, D. Computing a Perfect Strategy for n*n Chess Requires Time Exponential in N. . Lecture Notes in Computer Science. 1981: 278–293. doi:10.1007/3-540-10843-2_23 . (原始内容 存档于2017-04-25).
Garey, Michael; Johnson, David. Computers and Intractability: A Guide to the Theory of NP-Completeness . San Francisco: W. H. Freeman and Company . 1979. ISBN 0-7167-1045-5 .
Goldreich, Oded. P, Np, and Np-Completeness. Cambridge: Cambridge University Press. 2010. ISBN 978-0-521-12254-2 . Online drafts (页面存档备份 ,存于互联网档案馆 )
Immerman, N. Languages which capture complexity classes . SIAM Journal on Computing. 1987, 16 (4): 760–778 [2018-01-19 ] . doi:10.1137/0216051 . (原始内容存档 于2013-04-29).
Cormen, Thomas. Introduction to Algorithms . Cambridge: MIT Press . 2001. ISBN 0-262-03293-7 .
Papadimitriou, Christos. Computational Complexity . Boston: Addison-Wesley. 1994. ISBN 0-201-53082-1 .
Fortnow, L. The Status of the P versus NP problem . Communications of the ACM. 2009, 52 (9): 78 [2018-01-19 ] . doi:10.1145/1562164.1562186 . (原始内容存档 于2017-02-15).
Fortnow, L.; Gasarch, W. Computational complexity . [2019-04-27 ] . (原始内容存档 于2009-05-01).
外部链接
参见
易解复杂度类
怀疑难解复杂度类 难解复杂度类 复杂度类的谱系 相关复杂度族