关于NP与co-NP、RP与coRP的理解
在相信大多数人在接触计算复杂性领域时,都会被P、NP、NPC、NP-Hard、co-NP、RP……的等一系列困难问题的各种分类搞蒙。关于基本的定义,例如什么是P类问题什么是NP类或者NPC类问题,网上有很多很好的回答,我就不介绍了。这篇主要讲什么是co-NP以及如何理解它。
定义
语言 L L L属于 c o N P coNP coNP当且仅当 L L L的补集 L ‾ ∈ N P \overline{L}\in NP L∈NP。
这么简短的一句话该如何理解?若要证明一个问题属于 c o N P coNP coNP,根据定义就是证明它的补问题属于 N P NP NP,那语言 L L L的补集又是什么样子的?该如何描述?这些是我看到这个定义时的疑惑,然后我就进行了一些思考。
从 N P NP NP出发
我们回想一下NP类的定义:所有非确定图灵机在问题规模的多项式时间内可判定的语言类。或者描述为确定性图灵机在多项式时间可验证的语言类。
我们以SAT问题为例来理解一下(众所周知SAT是第一个NPC问题当然也是NP问题):任给一个布尔表达式,是否存在一个赋值使得表达式结果为true。
根据NP定义,给出布尔表达式的一个yes实例,显然,我们可以在多项式时间验证这个实例是不是能够让表达式结果为true(直接代进去计算就行)。
unSAT问题(有时也写作coSAT):任给一个布尔表达式,它是否是不可满足的(任意赋值都不会让表达式输出true)。这是一个 c o N P coNP coNP问题,因为它的补问题SAT问题是NP问题。
从这个例子中可以体会:①什么是补问题②根据补问题与原问题的关系可知,如果一个问题属于 c o N P coNP coNP,那它的no实例可以在多项式时间被确定性图灵机验证。这个方式也可以用来证明一个问题是不是属于 c o N P coNP coNP。
c o N P C coNPC coNPC
类比
N
P
C
NPC
NPC的定义,我们容易理解
c
o
N
P
C
coNPC
coNPC:语言
L
∈
c
o
N
P
C
L\in coNPC
L∈coNPC当且仅当
①
L
∈
c
o
N
P
L\in coNP
L∈coNP;
②任何
c
o
N
P
coNP
coNP问题可以在多项式时间内归约(这里的归约默认都是Cook归约)到
L
L
L
N P NP NP和 c o N P coNP coNP的关系
-
P ⊂ N P P\subset NP P⊂NP且 P ⊂ c o N P P\subset coNP P⊂coNP: P P P类问题可以多项式时间求解,当然它的yes实例和no实例都可以在多项式时间被验证。
-
一般认为 N P ≠ c o N P NP\ne coNP NP=coNP,所以 N P C ⊄ c o N P NPC\not\subset coNP NPC⊂coNP且 c o N P C ⊄ N P C coNPC\not\subset NPC coNPC⊂NPC:这个是可以证明的。
假设 N P C ⊆ c o N P NPC\subseteq coNP NPC⊆coNP,那么所有的 N P NP NP问题可以归约到 c o N P coNP coNP,即 N P ⊆ c o N P NP\subseteq coNP NP⊆coNP;另外,若 L ∈ C o N P L\in CoNP L∈CoNP,则 L ‾ ∈ N P ⊆ c o N P \overline{L}\in NP\subseteq coNP L∈NP⊆coNP,那么 L ‾ ‾ = L ∈ N P \overline{\overline{L}}=L\in NP L=L∈NP,即 c o N P ⊆ N P coNP\subseteq NP coNP⊆NP;综上 N P = c o N P NP=coNP NP=coNP。这与 N P ≠ c o N P NP\ne coNP NP=coNP矛盾。
-
存在语言(问题) L ∈ N P , L ∈ c o N P L\in NP,L\in coNP L∈NP,L∈coNP且 L ∉ P L\not \in P L∈P。这意味着 P ⊂ N P ∩ c o N P P\subset NP\cap coNP P⊂NP∩coNP。
例如大整数分解问题:任给整数 m m m和 n n n,问 m m m是否存在大于1小于 n n n的因子。
①这是NP的:给出一个yes实例,直接用m除一下就知道了。
②这是 c o N P coNP coNP的:思路一是给出这个问题的补问题(任给整数m,n,问m是否不存在小于n的因子),这个补问题的yes实例,可以通过AKS素性检测在多项式时间验证。思路二是直接看原问题的no实例:给整数m和n,其中m不存在小于n的因子,是否能在多项式时间验证出来。这和补问题的yes实例是一样的。
R P RP RP和 c o R P coRP coRP也是一样的理解
R P RP RP问题:语言 L ∈ R P L\in RP L∈RP当且仅当存在随机多项式时间算法 A A A,对 L L L的yes实例 x ∈ L x\in L x∈L,随机数 r r r,有 P r ( A ( x , r ) = 1 ) ≥ 1 2 Pr(A(x,r)=1)\ge \frac{1}{2} Pr(A(x,r)=1)≥21;对no实例 x ∉ L x\not\in L x∈L,随机数 r r r,有 P r ( A ( x , r ) = 0 ) = 1 Pr(A(x,r)=0)=1 Pr(A(x,r)=0)=1。
c o R P coRP coRP问题:语言 L ∈ c o R P L\in coRP L∈coRP当且仅当存在随机多项式时间算法 A A A,对 L L L的yes实例 x ∈ L x\in L x∈L,随机数 r r r,有 P r ( A ( x , r ) = 1 ) = 1 Pr(A(x,r)=1)=1 Pr(A(x,r)=1)=1;对no实例 x ∉ L x \not\in L x∈L,随机数 r r r,有 P r ( A ( x , r ) = 0 ) ≥ 1 2 Pr(A(x,r)=0)\ge \frac{1}{2} Pr(A(x,r)=0)≥21。
初看这个定义觉得很不好理解也不好记忆,利用 N P NP NP和 c o N P coNP coNP的关系来理解后,一切开朗了。
第一步:先理解(记住)好 R P RP RP。既然是 R P RP RP,yse实例求解就是概率性的,所以对 x ∈ L x\in L x∈L,正确判断的概率是某个数(习惯写为 ≥ 1 2 \ge \frac{1}{2} ≥21);而对于 x ∉ L x\not\in L x∈L,一定能够正确判断的。
第二步:推出 c o R P coRP coRP。若 L ∈ c o R P L\in coRP L∈coRP,则 L ‾ ∈ R P \overline{L}\in RP L∈RP。也就是说 x ∈ L ‾ ( x ∉ L ) x\in \overline{L}(x\not\in L) x∈L(x∈L),真确判断是概率性的;而 x ∉ L ‾ ( x ∈ L ) x\not\in \overline{L}(x\in L) x∈L(x∈L),一定能够正确判断。这句话翻译过来不就是若 x ∈ L x\in L x∈L, P r ( A ( x , r ) = 1 ) = 1 Pr(A(x,r)=1)=1 Pr(A(x,r)=1)=1;若 x ∉ L x\not\in L x∈L, P r ( A ( x , r ) = 0 ) ≥ 1 2 Pr(A(x,r)=0)\ge \frac{1}{2} Pr(A(x,r)=0)≥21。