第二章 \(\text{NP}\) 问题和 \(\text{NP}\)-完全问题

2.1 \(\text{NP}\) 问题

通俗来说,对于一个判定类问题(函数),比如说一个简单无向图是否存在大小大于等于 \(k\) 的独立集,直接判定它的存在性可能是困难的,但是我们允许给出一个额外的长度为多项式级别的输入表示一个待验证的解,\(\text{NP}\) 类问题就是可以相对容易地判定这个解是否符合要求的问题。

Def.(\(\text{NP}\) 类问题)称一个 0/1 函数 \(f\)\(\text{NP}\) 类问题,如果存在多项式 \(P:\mathbb{N}\to \mathbb{N}\) 和一个步数为多项式的图灵机 \(M\),使得 \(\forall x\in\{0,1\}^*\)

$$f(x)=1\Leftrightarrow \exists u\in{0,1}^{P(|x|)} \text{s.t.} M(x,u)=1$$

如果 \(f(x)=1,u\in\{0,1\}^{P(|x|)},M(x,u)=1\),则称 \(u\) 是在 \(f\)\(M\) 条件下的 \(x\) 的一个证明(certificate)

根据定义,只要任意 \(f(x)=1\)\(x\) 存在一个容易验证的解即可。

举几个 \(\text{NP}\) 类问题的例子:

(1)无向图同构的判定。\(x\) 是两个无向图的信息,certificate 是第一个无向图的标号的一个置换 \(\sigma\)\(P(n)=n\)

(2)无向图两个给定顶点的连通性:\(x\) 是无向图的信息和 \(s,t\),certificate 是 \(s\)\(t\) 的一条路径。当然这也是一个 \(\text{P}\) 类问题。

(3)素数的判定。\(x\) 是要检查的整数,\(u\) 是另一个整数,检查 \(x\) 是否能被 \(u\) 整除即可。注意,素数判定是 \(\text{P}\) 类问题,相关论文的翻译版在这里。非常震撼,也很反我的直觉,打算过段时间欣赏一下这一数论美学。但是要注意,截至目前,大整数分解依然是 \(\text{NP}\) 的。

2.1.1 P 类和 NP 类的关系

Claim:\(\text{P}\subseteq \text{NP}\subseteq \text{DTIME}(2^{n^c})\)

Proof:

对于一个 \(\text{P}\) 类问题,设解决它的图灵机是 \(M\),那么令 \(u\equiv 0,P(n)\equiv 1\)\(M'\)\(M\) 唯一差别在于其忽略输入末尾的 \(u=0\)。所以它也是 \(\text{NP}\) 类问题。

对于一个 \(\text{NP}\) 类问题,跑遍 \(u\in\{0,1\}^{P(|x|)}\),计算 \(M(x,u)\),看看有没有 \(1\) 即可。容易验证复杂度至多为 \(O(2^{n^c})\)

这个不等式目前已经达到最强了,不能再优化。计算复杂性领域的核心问题,即 \(\text{P}\) 是否等于 \(\text{NP}\),大多数科学家认为是不等于的,我也认为是不等于的。但是这种不等关系可能有什么证明思路,完全不懂,还得多学习。

2.1.2 非确定性图灵机

Def.(非确定性图灵机 NDTM)非确定性图灵机 \(M\) 与图灵机的性质几乎完全相同,唯二的区别是:(1)它有两套转移函数 \(\delta_0,\delta_1\),每步转移 \(M\) 可以任意选择一个转移函数进行转移;(2)它有一个特殊的状态 \(q_{accept}\)。定义 \(M(x)=1\),当且仅当输入为 \(x\) 时,存在一种选择转移函数的方式(称为 \(M\) 的非确定性选择 non-deterministic choices)使得它能达到状态 \(q_{accept}\)。称 \(M\) 的运行步数为 \(T(n)\),当且仅当对任意输入 \(x\),不论 \(M\) 进行哪个非确定性选择,\(M\)\(T(|x|)\) 步数内要么停机要么达到 \(q_{accept}\)

Def.(\(\text{NTIME}\) 类)对于时间可构函数 \(T(n)\),0/1 函数 \(f\),和运行步数不超过 \(c\times T(n)\)\(c\) 为常数的非确定性图灵机 \(M\),如果对于任意 \(x\in\{0,1\}^*\)\(f(x)=M(x)\),则称 \(f\in\text{NTIME}(T(n))\)

Thm. \(\text{NP}=\displaystyle\bigcup_{n\geq 1}\text{NTIME}(n^c)\)

Proof. 核心思路并不难,考虑到每步有 \(2\) 种选择,\(k\) 步有 \(2^k\) 种选择即可。先证明若 \(f\in\text{NP}\),则 \(f\in \displaystyle\bigcup_{n\geq 1}\text{NTIME}(n^c)\)\(f\in\text{NP}\) 说明 \(f\) 若存在合法解,其长度必然不超过 \(P(n)\),共 \(2^{P(n)}\) 种可能。那么如此制造一台模拟深度为 \(P(n)+O(1)\) 的二叉树的图灵机 \(M\):读入 \(x\) 长度为 \(n\),然后在二叉树的叶子结点处用步数为多项式 \(Q(n)\) 的算法检查所有可能解是否满足要求,总步数是 \(P\times Q\) 仍然是多项式的。容易验证 \(M=f\)。再证明若 \(f\in \displaystyle\bigcup_{n\geq 1}\text{NTIME}(n^c)\),则 \(f\in \text{NP}\):此时存在一个 NDTM \(N\) 能计算 \(f\),也就是说 \(\forall x\in\{0,1\}^*\),存在 \(N\) 的一个非确定性选择 \(s(x)\)(表示为 0/1 字符串)使得 \(N(x)\) 能到达状态 \(q_{accept}\)。可以这样构造一个图灵机 \(M\):输入为 \(x\)\(s(x)\),功能为通过修改状态的表示模拟一台 NDTM \(N\),在上面进行 \(s(x)\) 这个选择,检查发现能达到 \(q_{accept}\),根据 NDTM 的定义 \(f(x)=M(x)=1\),于是输出 \(1\)。这个复杂度显然是多项式的,所以 \(f\) 属于 \(\text{NP}\) 类问题。

注意这本书第一章一般说“函数”,第二章则因为多在讲值域为 \(\{0,1\}^*\) 的函数,因此都写“语言”了。所以接下来我也切换成语言的表述,回忆:函数 \(f:\{0,1\}^*\to \{0,1\}\) 对应的语言 \(L=\{x\in\{0,1\}^*\mid f(x)=1\}\)

2.2 可归约性和 \(\text{NP}-\)完全

Def.(规约,\(\text{NP}-\)困难和 \(\text{NP}-\)完全)称语言 \(A\) 可以多项式规约到语言 \(B\)(记作 \(A\leq_p B\))当且仅当存在可以以多项式步数计算的函数 \(f:\{0,1\}^*\to \{0,1\}^*\),满足 \(x\in A\Leftrightarrow f(x)\in B\)。称 \(B\)\(\text{NP}-\)困难的(\(\text{NP-hard}\)),当且仅当 \(\forall A\in\text{NP}:A\leq_p B\);称 \(B\)\(\text{NP}-\)完全的(\(\text{NP-complete}\)),当且仅当 \(B\)\(\text{NP}-\)困难的且 \(B\in \text{NP}\)

一些性质:

(1)(传递性)如果 \(A\leq_p B,B\leq_p C\),则 \(A\leq_p C\)

(2)如果 \(A\)\(\text{NP}-\)困难的,且 \(A\in \text{P}\),则 \(\text{P}=\text{NP}\)

(3)\(A\)\(\text{NP}-\)完全的且 \(A\in\text{P}\) 等价于 \(\text{P}=\text{NP}\)

证明比较容易。

比较反直觉的一件事是(其实我目前还没什么直觉):已经找到了一个 \(\text{NP}-\)完全的问题。

Thm. 以下语言是 \(\text{NP}-\)完全的:

\[\text{TMSAT}=\{\langle \alpha,x,1^n,1^t\rangle:\exists u\in\{0,1\}^{*}\ \text{s.t.} M_\alpha(x,u)\text{ outputs $1$ within $t$ steps}\} \]

然而这个语言用处不大,因为它和图灵机的关系过于密切了。

2.3 Cook-Levin 定理:计算是本地(local)的?

2.3.1 布尔算式和合取范式(CNF,Conjunctive Normal Form)

布尔算式是由 0/1 变量 \(u_1,u_2,\cdots u_n\)\(\text{AND}\bigwedge\)\(\text{OR}\bigvee\)\(\text{NOT}\neg\) 组成的算式。称关于 0/1 变量 \(u_1,u_2,\cdots u_n\) 的布尔算式是合取范式,当且仅当其是若干个由若干个单位变量的 \(\text{OR}\)\(\text{AND}\) 构成的算式,单位变量包括 \(u_i\)\(\overline{u_i}\)

例如,\((u_1\bigwedge \overline{u_2})\bigvee (u_3\bigwedge u_4)\) 是 CNF。

对于一个 CNF,称其为可满足的(satisfiable),当且仅当存在一个分配 \(u_1,u_2,\cdots u_n\) 的值的方式使之可以为真;否则称其为不可满足的(unsatisfiable)。

\(k-\)CNF 指的是每组取 \(\text{OR}\) 的变量个数不超过 \(k\) 的 CNF。

2.3.2 Cook-Levin 定理

Thm.(Cook-Levin)记 \(\text{SAT}\) 表示所有可满足的 CNF 构成的语言,\(3-\text{SAT}\) 表示所有可满足的 \(3-\)CNF 构成的语言。则 \(3-\text{SAT}\)\(\text{SAT}\) 都是 \(\text{NP}-\)完全的。

  • 第六章会给出对 Cook-Levin 定理的从布尔电路来看的视角的证明。

显然 \(\text{SAT}\)\(3-\text{SAT}\) 都是 \(\text{NP}\) 的。所以只需要证明 \(\text{SAT}\)\(\text{NP}-\)困难的且 \(\text{SAT}\) 可以多项式规约到 \(3-\text{SAT}\) 就可以了。

先考虑将 \(k-\text{SAT}\) 规约到 \(3-\text{SAT}\)。注意到对于一组 \(2k\) 个单位变量的\(\ \text{OR}\)\(u_1\bigvee u_2\bigvee \cdots \bigvee u_{2k}\),可以通过加入一个额外的变量 \(z\),将其等价为 \((u_1\bigvee u_2\bigvee\cdots \bigvee u_k\bigvee z)\bigwedge (u_{k+1}\bigvee u_{k+2}\bigvee\cdots \bigvee u_{2k}\bigvee \overline{z})\),设原算式数量为 \(x\),则算式数量增加了 \(x\),变量数量增加了 \(x\)。所以等价 \(O(\log k)\) 次后就转化为了 \(3-\text{SAT}\) 问题。算式数量和变量数量大约变成了原来的平方,是正确的多项式规约。

任何一个定义在 \(\{0,1\}^k\) 上的语言都可以用一个至多长为 \(k\times 2^k\)\(k-\)CNF 来表示,这是很显然的。但是这样表示的代价过高,下文中只有 \(k\) 为常数时我们才考虑用这样的表示方式。

接下来证明任何 \(\text{NP}\) 类问题都可以多项式规约到 \(\text{SAT}\)

设语言 \(L\in\text{NP}\),计算它的图灵机为 \(M\),输入参数 \(x,u\)。我们知道对于一个输入 \(x,|x|=n\)\(t\in L\Leftrightarrow \exists u\in\{0,1\}^{P(n)}:M(x,u)=1\)。所以对于一个输入 \(x\),可以考虑枚举 \(u\) 的长度 \(m\)(这不会导致多项式复杂度退化到高于多项式的复杂度)。不妨设 \(M\) 是只有 \(1\) 条输入纸带和 \(1\) 条工作纸带的 oblivious TM,这样一来对于长度为 \(n+m\) 的输入 \(x+u\)\(M\) 的纸带头在第 \(i\) 步所处的位置是固定的。设 \(pos_i\) 表示第 \(i\) 步输入纸带的纸带头所处的位置,\(pre_i\) 表示 \(M\) 上一次来到它在第 \(i\) 步所处的工作纸带上的位置的时刻。通过任意构造一个长度为 \(n\)\(M\) 的输入,可以模拟操作过程得到所有 \(pos_i,pre_i\) 的信息。

我们用 \(z_i\) 描述第 \(i\) 步结束后,纸带头移动前 \(M\) 的信息:两个纸带头所读到的 bit 和 \(M\) 所处的状态 \(q\)\(z_i\) 可以以一个长度为 \(c\) 的 0/1 串来表示,其中 \(c\) 为常数。设输入为 \(y\in\{0,1\}^n\),则 \(z_i=F(z_{i-1},z_{pre_i},y_{pos_i})\)。设 \(M\) 运行的总步数为 \(T\)(关于 \(n\) 的多项式),构造 \(u=z_1+z_2+\cdots+z_{T}\),序列 \(\{z_i\}\) 需要保证它描述的是一个合法的过程,最后会停机且输出 \(1\),尝试以这样的 \(u\) 作为 \(x\) 的 certificate。

\(y=x+u\),我们想找到的这样的 \(y\) 必须满足以下性质:

  1. \(y\) 的前 \(n\) 位与 \(x\) 相同。

  2. \(z_1\) 表示 \(M\) 的初始状态。

  3. \(\forall i\in[2,T]:z_i=F(z_{i-1},z_{pre_i},y_{pos_i})\)

  4. \(z_T\) 刻画了一个 \(M\) 输出 \(1\) 并停机的状态。

两个长度为 \(r\) 的 0/1 串 \(a,b\) 要求它们相等,可以用长度为 \(4r\) 的 CNF 表示:\(\displaystyle\bigwedge_{i=1}^r ((a_i\bigvee \overline{b_i})\bigwedge(\overline{a_i}\bigvee b_i))\) 。所以 \(1,2\) 都解决了。

\(4\) 总共可能涉及到的状态数量是关于图灵机 \(M\) 的常数,用 \(k\times 2^k\) 的那个暴力编码方式就行。

\(3\) 也是对每对 \((pre_i,i-1,i)\) 暴力找出所有合法的状态对,因为一共只涉及到 \(u\) 中的 \(3c+1\) 个位,所以还是用暴力编码,对 CNF 长度的总贡献为 \(T\times (3c+1)\times 2^{3c+1}\)

因此枚举 \(u\) 的长度 \(m\) 后能构造出长度为关于 \(n\) 的多项式的 CNF \(\varphi_x\),即多项式规约到了 \(\text{SAT}\)\(\square\)

这个定理还揭示了一些更为深刻的东西:

因为 \(x\in L\Leftrightarrow f(x)\in\text{SAT}\),所以 Cook-Levin 定理以多项式的代价将寻找 \(x\) 的一个 certificate 转化为了求出满足 \(f(x)=1\) 的一个合法 0/1 分配方案的问题,把具有这种性质的规约称为 Levin 规约(我也不知道这种性质具体指什么,后面遇到了再看吧)。并且 certificate 和合法 0/1 分配方案构成双射,也就是说它们的数量是相同的。 把具有这种性质的规约称为简约的规约(parsimonious reduction)。所有 \(\text{NP}\) 问题都有到大多数 \(\text{NP}-\)完全问题的具有以上两个性质的规约。

再来解释一下“计算是本地的”的意思:任意时刻图灵机只会查询、修改纸带上的常数个位置,这也是能用大小为常数的 \(z_i\) 来描述一个图灵机在某一时刻的状态的本质原因。

2.4 几个 \(\text{NP-}\)完全问题的规约例子

要想证明一个 \(\text{NP}\) 问题是 \(\text{NP}-\)完全的,只需要将 \(\text{SAT}\)\(3-\text{SAT}\) 规约到它即可。

以下几个问题是 \(\text{NP}-\)完全的:

  1. 无向图最大独立集问题。

显然它是 \(\text{NP}\) 的。

规约方法:设 \(3-\text{SAT}\)\(m\) 个条件,对于这个 \(3-\text{SAT}\) 中的每个条件 $u_1\bigvee u_2\bigvee u_3 $,建立一个表示这三个变量合法取值的 \(7\) 种情况的 \(7\) 个结点,然后对所有有矛盾的结点间连一条边(所以这 \(7\) 个点间肯定构成一个团)。求出这个无向图的最大独立集为 \(x\),如果 \(x=m\),则 \(3-\text{SAT}\) 有解,否则无解。读者自证不难。

  1. 整数规划问题。

整数规划问题是指对于整数变量 \(u_1,u_2,\cdots u_n\),给出 \(m\) 条不等式,不等式形如 \(\displaystyle\sum_{i=1}^n c_iu_i\geq d\),其中所有系数都是有理数。问是否存在一组的解。显然它是 \(\text{NP}\) 的。

规约方法:将 \(3-\text{SAT}\)\(u_i=\text{false}\) 看作 \(u_i=0\),否则看作 \(u_i=1\)。对于 \(3-\text{SAT}\) 的每个条件,可以转化为 \(\displaystyle\sum_{i=1}^n Q_i\geq 1\),其中 \(Q_i\) 表示 \(u_i\)\(1-u_i\)

  1. 哈密尔顿路径的存在性问题。

有向图的哈密尔顿路径是指经过每个结点恰好一次的路径。显然它的存在性是 \(\text{NP}\) 的。

对于每个 \(u_i(1\leq i\leq n)\),建立一条长为 \(2m\) 的双向链 \(v_{i,1},v_{i,2},\cdots v_{i,2m}\),相邻点之间有两条方向不同的单向边。建立一个起始结点 \(s\) 和终止结点 \(t\),称 \(v_{,1},v_{,2m}\) 为链的端点,标号为 \(i\) 的链的端点分别向标号为 \(i+1\) 的链的端点各连一条边。然后 \(s\) 向标号为 \(1\) 的链的端点连边,标号为 \(n\) 的链的端点向 \(t\) 连边。从 \(s\) 开始跑,每条链都只能选择一个方向经过,递增表示 \(u_i=0\),递减表示 \(u_i=1\)

接下来,对于第 \(k\) 个要求,建立一个点 \(c_k\),考虑其中的单位变量。如果是 \(u_i=0\),连边 \(v_{i,2k-1}\to c_k,c_k\to v_{i,2k}\),否则连边 \(v_{i,2k}\to c_k,c_k\to v_{i,2k-1}\)

哈密尔顿路径保证了每个 \(c_k\) 虽然可以有任意条相邻边,但都能被经过恰好一次,而每个要求也是需要其中的某一个单位变量的取值符合即可,所以每个要求都可以被满足;并且,\(u_i\) 的取值也能唯一确定。这个构造可以说是非常取巧的。

如果 \(\text{P}\neq \text{NP}\),那么很多问题就是不存在以目前存世的计算模型能高校计算的算法的。但是这不代表我们就只能摆烂了:

首先是对我们要计算的问题的建模方式的思考。上述提到的很多 \(\text{NP}-\)完全问题都过于 general 了,考虑实际意义的情况下,我们可能只会考虑其中的一些特殊情形。比如 \(\text{TSP}\) 问题:在带权无向图上包含所有顶点的路径的最短长度,现实中我们对距离会有要求(如欧氏距离,或曼哈顿距离),并不是任意指定的;此外,我们可能也不追求最优解,允许与真是答案的不超过比例为 \(\varepsilon\) 的误差。

实际上,单单把 \(\text{TSP}\) 的距离简化为合法的欧式距离,或是允许比例为一个常数的误差,仍然无法把它变成 \(\text{P}\) 问题。但是如果把这两个条件结合起来,可以得到复杂度为 \(O(\text{poly}(n\log n^{O(1/\varepsilon)}))\) 的解决在欧几里得平面上以欧式距离为两点间连边的长度,包含所有顶点的路径的长度至多为 \((1+\varepsilon)\) 倍最短长度的一条路径的问题。

2.5 判断 vs. 求解

Thm. 如果 \(\text{P}=\text{NP}\),那么对于任意 \(L\in\text{NP}\),存在图灵机 \(B\) 能够在多项式的时间内计算出给定输入的对于 \(L\) 的一个 certificate。

对于 \(\text{SAT}\) 问题,这是显然的,只要通过多项式的时间判断出有解,每次强制某个 \(u_i=0/1\),一步步做下去就能得到一组合法的解,即一个 certificate。

对于其他的 \(L\in\text{NP}\),我们知道 \(L\)\(\text{SAT}\) 的规约是 Levin 规约(见 2.3.2),通过求出它对应的 \(\text{SAT}\) 的一个 certificate,可以还原出 \(L\) 的一个 certificate。

通过这个证明我可以发现对于输入大小为 \(n\)\(\text{SAT}\) 我们可以规约到输入大小小于 \(n\)\(\text{SAT}\),称之为向下可自规约的(downward self-reducible),根据 Cook-Levin 定理的证明中的规约方法,所有 \(\text{NP}\) 的问题都具有这个性质。

2.6 coNP,EXP 和 NEXP

Def. 对于语言 \(L\)\(\overline{L}=\{x\mid x\notin L\}\)\(\text{coNP}=\{L\mid \overline{L}\in \text{NP}\}\)

这里书上完全写错了,谴责一下。显然 \(\text{NP}\)\(\text{coNP}\) 并非无交并恰好产生 \(\{0,1\}^*\)

有一个等价的定义方式:\(\text{coNP}=\{L\mid L\subseteq \{0,1\}^*,x\in L\Leftrightarrow \forall u\in \{0,1\}^{p(|x|)}:Q(x,u)=1\}\),其中 \(p\) 是多项式,\(Q\) 是时间为多项式的图灵机。

根据 \(\text{NP}-\)完全的定义,可以类似地定义出 \(\text{coNP}-\)完全。

以下这个问题是 \(\text{coNP}-\)完全的:给定一个布尔表达式 \(x\),判断是否对于任何单位变量分配的值,\(x\) 都为真。称这个问题为 \(\text{TAUTOLOGY}\)

显然 \(\text{TAUTOLOGY}\in \text{coNP}\)。另一方面,对于任何 \(L\in\text{TAUTOLOGY}\)\(\overline{L}\in\text{NP}\),所以存在一个图灵机 \(M\) 能够将 \(\forall x\in\{0,1\}^*\) 转化为 \(\varphi_x\) 这个 CNF,\(\varphi_x\) 可为真说明 \(x\notin L\)。因此,通过判断 \(\neg\varphi_x\) 是否在 \(\text{TAUTOLOGY}\) 里,即可判断 \(x\) 是否在 \(L\) 里。

Rmk. \(\neg\varphi_x\) 不是 CNF,但是是布尔表达式,这里与之前 \(\text{SAT}\) 的定义方式有本质上的不同。

容易证明若 \(\text{P}=\text{NP}\),那么 \(\text{P}=\text{coNP}=\text{NP}\),换句话说,只要证明 \(\text{NP}\neq \text{coNP}\),即可证明 \(\text{P}\neq \text{NP}\)。并且,从直觉上来说,去期待 \(\text{TAUTOLOGY}\) 这个 \(\text{coNP}-\)完全问题能有一个多项式级别的 certificate,看起来是没什么希望的。

Def. \(\text{EXP}=\displaystyle\bigcup_{c\geq 1}\text{DTIME}(2^{n^c})\)\(\text{NEXP}=\displaystyle\bigcup_{c\geq 1}\text{NTIME}(2^{n^c})\)

由定义 \(\text{P}\subseteq \text{NP}\subseteq \text{EXP}\subseteq\text{NEXP}\)

Thm. 如果 \(\text{EXP}\neq \text{NEXP}\),则 \(\text{P}\neq\text{NP}\)

考虑反证法。如果 \(\text{P}=\text{NP}\)\(\forall L\in \text{NTIME}(2^{n^c})\),即 \(L\in \text{NEXP}\),设图灵机 \(M\) 可以以 \(O(2^{n^c})\) 的步数计算它。定义 \(L'=\{\langle x,1^{2^{|x|^c}}\rangle:x\in L\}\)。对于给定的 \(\langle y_1,y_2\rangle\),要判断其是否在 \(L'\) 中,先检查 \(y_2\) 的长度是否正确。这个是关于输入长度线性的。如果正确的话,我们只需要检查 \(y_1\) 是否在 \(L\) 中。用 \(M\) 来做,也是线性的,所以 \(L'\in\text{NP}=\text{P}\)

此时,给定 \(x\in\{0,1\}^*\),要判断 \(x\) 是否在 \(L\) 中,只需要写出 \(u=\langle x,1^{2^{|x|^c}}\rangle\),用上述的算法判断 \(u\) 是否在 \(L'\) 中,所用时间也是 \(O(2^{n^{c'}})\),所以 \(L\in\text{DTIME}(2^{n^{c'}})=\text{EXP}\)。综上,\(\text{EXP}=\text{NEXP}\)

这个技巧叫 padding technique,我的理解是要建立在不同级别的算法的复杂度之间的联系的联系(有点抽象),可以考虑把高复杂度的算法的输入提高一个量级使其变成低复杂度的算法。再深入我不知道怎么说了,因为我自己也没完全搞明白更本质的东西,请读者们自求多福吧。

Exercise:

13.(Berman’s Theorem)对于语言 \(L\),如果 \(\forall x\in L:x=1^i(i\geq 1)\),则称 \(L\) 是一元语言(unary language)。证明:如果某个一元语言 \(L\)\(\text{NP}-\)完全的,则 \(\text{P}=\text{NP}\)

14.证明无向图是否存在一定大小的团和无向图是否存在一定大小的点覆盖都是 \(\text{NP}-\)完全的。

已经证明了无向图是否存在一定大小的独立集的问题是 \(\text{NP}-\)完全的。而上述两个问题显然是 \(\text{NP}\) 的。注意到无向图的补图的独立集对应原图的团,无向图的点覆盖的反向选取对应原图的独立集,因此无向图的独立集问题可以分别多项式规约到另外两个问题。\(\square\)

1.(通用 NDTM)证明:存在通用 NDTM \(NU\),记 \(M_\alpha\) 表示 \(\alpha\) 描述的 NDTM,对于任意 \(\alpha\),对于任意 \(x\)\(NU(\alpha, x)=M_\alpha(x)\),且前者的运行时间不超过 \(C\) 倍后者的运行时间,其中 \(C\) 为一个只和 \(\alpha\) 有关的常数。

回顾一下通用确定性图灵机的复杂度在朴素情况下为什么会是 \(T^2\),又是怎么优化到 \(T\log T\) 的。转移函数的数量是常数,不成问题。主要问题是纸带数量。我造出来的这个通用图灵机的纸带数量是常数,而要模拟的图灵机可能有很多个纸带,所以这个通用图灵机用多条纸带和一条纸带的效果是一样的。用一条纸带的话,我们需要把所有纸带上同一横坐标的 \(k\) 个格子的信息都打包到一个格子里。字符集从 \(\Gamma\) 变成 \(\Gamma^k\),这仍然是常数,但是你只有一个纸带头了,做不到同时读取原来的不同纸带上不同横坐标的信息。所以就需要把“移动纸带头”改成“移动纸带上的信息”,而后者每次消耗 \(T\) 的时间。优化到 \(T\log T\),即通过类似倍增的方式减少移动信息的次数。

对于通用非确定性图灵机,做法是这样的:本来每次纸带头的移动由转移函数确定,而转移函数的输入参数由之前存储的状态和当前纸带头读到的信息组成。所有可能的数量为常数。而步数原本是 \(T\)。我们直接不管读到什么信息了。暴力模拟所有的可能情况,共有 \(c^T\) 种。用 NDTM 每次有两个选择的性质取个 \(\log\),就变成了 \(T\times \log c\)\(c\) 是常数。每种情况模拟完之后,再根据读入的数据 check 一下是否合法即可。