IT 论文精读 · PAPER 52

The Complexity of Theorem-Proving Procedures(NP 完全性)

Stephen Cook · University of Toronto · STOC 1971

EN →

这篇论文干了什么?

1971 年,Stephen Cook 证明了一件让计算机科学至今头疼的事:有一大类问题,「验证一个答案对不对」很容易,但「从头找出答案」却可能难到天荒地老——而且它们本质上是「同一道题」,攻破任何一个就等于攻破全部。这就是那道著名悬案 P 对 NP 的起点。

先说个怪事

有些事,别人把答案摆你面前,你一眼能核对;可要你自己找出来,却难上天。一盒散拼图,拼好了你一秒看出对不对,可从散片拼起来能耗一整天。给一大桌人排座位、满足一堆「谁不能挨着谁」的要求——给你一张排好的表你立刻能检查合不合规,但从零排出来,人一多就没头绪。Cook 注意到:这种「验证容易、求解看起来极难」的问题多得数不清,而且它们全都「连在一起」。

那个点子

Cook 干了两步。第一步,他把「验证容易」的这一大类问题圈成一个家族(后来叫 NP)。第二步——也最惊人——他证明这家族里有一道题(判断一串逻辑条件能不能同时被满足,叫「可满足性」)是「最难的那个代表」:家族里任何一道题,都能被快速改写成这道题的样子。

它是怎么做到的?

关键工具叫「改写」(专业叫归约)。如果我能把问题 A 快速翻译成问题 B——A 的答案就藏在 B 的答案里——那么「B 好解」就意味着「A 也好解」。Cook 证明了:NP 这一大家族里的每一道题,都能这样翻译成那道「可满足性」题。于是它成了一把「总钥匙」:谁要是找到一个又快又通用的办法解开它,那一整个家族——几千个看似八竿子打不着的难题——就会同时被解开。反过来,几十年没人做到,也让大家越来越相信:也许根本就没有这样的快办法。

它带来了什么?

「P 到底等不等于 NP」成了计算机科学最大的悬案,悬赏一百万美元至今没人领走。实际用处也极大:当你发现手上的难题和那把「总钥匙」是「同一家的」,基本就等于收到一封通知——别再指望找到又完美又飞快的算法了,老老实实用近似、用巧办法凑合。诚实说一句:「最难」指的是最坏情况——现实里很多这类问题的具体例子,用今天的求解器照样又快又好地解出来,「同一家」不等于「这道具体题永远解不动」。

一句话记住

Cook 证明了:在「验证容易」的一大类问题里,存在一个「最难代表」,攻破它就攻破全部;而至今没人知道这样的攻破到底存不存在——这就是 P 对 NP。

想看 P / NP 的准确定义、Cook 定理怎么证的、以及那张「把计算写成逻辑题」的图? → 切到精读版