1. 前置

2. 复杂类

计算复杂性理论按照计算问题所需的资源(例如时间和空间)对问题进行分类。下面以二进制编码的语言 为基础,定义 PNP#P

2.1. P(Polynomial Time)

P 是可由确定性图灵机在多项式时间内判定的语言类。形式地,若存在一个确定性图灵机 和常数 ,使得对任意输入

  1. 步内停机;
  2. 接受 当且仅当

则称 。等价地,

这里的“判定”要求机器对每个输入都停机,并给出“接受”或“拒绝”的答案。

2.2. NP(Nondeterministic Polynomial Time)

NP 有两种常用且等价的定义。

2.2.1. 非确定性图灵机定义

若存在一个非确定性图灵机 和常数 ,使得:

  1. 在输入 上的每条计算分支都在 步内停机;
  2. 当且仅当至少存在一条接受分支,

则称 。等价地,

这里的非确定性机器并不是依次遍历整棵计算树;“存在接受分支”是对所有可能计算分支的数学描述。

2.2.2. 多项式时间验证机定义

若存在一个多项式 和一个确定性多项式时间验证机 ,使得对任意

则称 。字符串 称为 证书(certificate)或见证(witness)。

这一定义表达的是:属于语言的实例拥有长度为多项式、并且可以在多项式时间内验证的证明。显然,

但目前尚不知道该包含关系是否严格,即 仍是开放问题。

2.3. p(Sharp-P)

与 P 和 NP 不同,#P 是函数复杂度类,而不是语言(判定问题)复杂度类。一个函数

属于 ,当且仅当存在一个多项式 和一个确定性多项式时间谓词 ,使得对每个输入

等价地, 是某台多项式时间非确定性图灵机在输入 上的接受计算分支数。

2.4. NP 与 p 的联系

对固定的验证机 和证书长度多项式 ,定义

因此,NP 只询问合法证书是否存在,而 p 计算合法证书的总数。典型的 p 问题包括计算布尔公式的满足赋值数(#SAT)和计算图的完美匹配数。