7.1
题目
设 D-SAT 为判定一个 CNF 公式 φ 是否至少有两个满足赋值的问题。证明 D-SAT 是 NP-完全的。
解答
1. D-SAT 属于 NP
给定一个 CNF 公式 φ 和两个赋值 σ1 和 σ2,验证算法如下:
- 检查 σ1 是否满足 φ:遍历 φ 的每个子句,验证子句中至少有一个文字在 σ1 下为真。这可以在 O(∣φ∣) 时间内完成,其中 ∣φ∣ 是 φ 的大小(即子句数和变量数)。
- 检查 σ2 是否满足 φ:同样在 O(∣φ∣) 时间内完成。
- 检查 σ1=σ2:比较两个赋值在至少一个变量上的取值是否不同。这可以在 O(n) 时间内完成,其中 n 是变量数(n≤∣φ∣)。
由于验证过程的总时间复杂度为 O(∣φ∣),是多项式时间,因此 D-SAT 属于 NP。
2. D-SAT 是 NP-难的
我们通过将 SAT 归约到 D-SAT 来证明 D-SAT 是 NP-难的。SAT 问题是判定一个 CNF 公式是否至少有一个满足赋值,且 SAT 是 NP-完全的。
归约过程:
给定一个 SAT 实例,即一个 CNF 公式 φ,其变量集合为 {x1,x2,…,xn}。构造一个 D-SAT 实例 ψ 如下:
- 引入一个新变量 y。
- ψ 的变量集合为 {x1,x2,…,xn,y}。
- ψ 的子句集与 φ 的子句集完全相同(即不添加任何涉及 y 的新子句)。
此构造可在多项式时间内完成,因为只需添加一个新变量,且 ψ 的大小与 φ 基本相同(变量数增加 1,子句数不变)。
正确性证明:
-
如果 φ 是可满足的(即 φ∈SAT):
设 σ 是 φ 的一个满足赋值。那么,以下两个赋值均满足 ψ:
- σ1:σ 扩展到 y=true(即 σ1(xi)=σ(xi) 对所有 i,且 σ1(y)=true)。
- σ2:σ 扩展到 y=false(即 σ2(xi)=σ(xi) 对所有 i,且 σ2(y)=false)。
因为 ψ 的子句与 φ 相同,且不涉及 y,所以 σ1 和 σ2 都满足 ψ。此外,σ1=σ2(因为 y 的取值不同)。因此,ψ 至少有两个满足赋值(即 ψ∈D-SAT)。
-
如果 φ 是不可满足的(即 φ∈/SAT):
则没有赋值满足 φ 的子句。由于 ψ 的子句与 φ 相同,且不涉及 y,因此也没有任何赋值(无论 y 的取值如何)满足 ψ。所以,ψ 没有满足赋值,即少于两个满足赋值(即 ψ∈/D-SAT)。
综上,φ 是可满足的当且仅当 ψ 至少有两个满足赋值。因此,SAT 多项式时间归约到 D-SAT(即 SAT≤pD-SAT)。
7.2
题目
图的着色是一种给图的顶点分配颜色的方式,使得没有相邻顶点具有相同颜色。让 3-COLORING 问题是判断给定图 G 是否可以使用三种颜色进行着色。
(a) 我们将考虑两个图小工具。首先,三角形图强制顶点具有不同颜色,并且你可以使用 T 和 F 两种颜色来编码真(true)和假(false)。其次,以下图给出的 OR 小工具实现了逻辑 OR 操作。证明 OR 小工具具有以下性质:(1) 如果顶点 x 和 y 都有颜色 F,那么标记为 x∨y 的顶点也必须是 F;(2) 如果其中一个顶点有颜色 T,那么可能将顶点 x∨y 着色为 T。
graph LR
T((x))
F((y))
T --- p((p))
F --- q((q))
p --- q
p --- o((x ∨ y))
q --- o
(b) 使用上述图小工具证明 3-COLORING 是 NP 完全的。
解答
(a) 证明 OR 小工具的性质
假设 OR 小工具由以下顶点和边组成:
- 顶点:输入 x、输入 y、输出 o=x∨y、内部顶点 p 和 q。
- 边:(x,p)、(p,o)、(y,q)、(q,o) 和 (p,q).
颜色集合为 {T, F, U},其中 T 表示 true,F 表示 false,U 是辅助颜色。小工具需满足:
- 如果 x 和 y 都为 F,则 o 必须为 F。
- 如果 x 或 y 至少有一个为 T,则 o 可以被着色为 T。
证明性质 (1):如果 x 和 y 都为 F,则 o 必须为 F。
假设 x 和 y 都被着色为 F。
- 由于边 (x,p) 存在,且 x=F,所以 p 不能为 F(相邻顶点颜色不同)。因此,p 为 T 或 U。
- 由于边 (y,q) 存在,且 y=F,所以 q 不能为 F。因此,q 为 T 或 U。
- 由于边 (p,q) 存在,p 和 q 必须不同颜色。
- 现在考虑 o:由于边 (p,o) 和 (q,o) 存在,o 必须与 p 和 q 都不同。
分析 p 和 q 的可能颜色组合:
- p 和 q 不能相同(因为 (p,q) 边)。
- 可能情况:
- 情况 1: p=T, q=U
- o 与 p 和 q 相邻,所以 o 不能为 T(因为 p=T),也不能为 U(因为 q=U),因此 o 必须为 F。
- 情况 2: p=U, q=T
- o 不能为 U(因为 p=U),不能为 T(因为 q=T),因此 o 必须为 F。
- 其他情况(如 p=T, q=T 或 p=U, q=U) 不可能,因为 (p,q) 边要求 p 和 q 不同。
在所有可能情况下,o 都必须为 F。因此,当 x 和 y 都为 F 时,o 必须为 F。
证明性质 (2):如果 x 或 y 至少有一个为 T,则 o 可以被着色为 T。
假设至少一个输入为 T,不妨设 x=T(y=F 或 y=T 的情况类似)。
- 由于边 (x,p) 存在,且 x=T,所以 p 不能为 T。因此,p 为 F 或 U。
- 由于边 (y,q) 存在:
- 如果 y=F,则 q 不能为 F,所以 q 为 T 或 U。
- 如果 y=T,则 q 不能为 T,所以 q 为 F 或 U。
- 边 (p,q) 要求 p 和 q 不同。
- 我们需要证明存在一种着色方式使 o=T。
选择颜色以使 o 可以为 T:
- 子情况:x=T, y=F
- 设置 p=F(因为 p 不能为 T,且可为 F 或 U)。
- 设置 q=U(因为 y=F,q 不能为 F,且可为 T 或 U;选择 U 以避免冲突)。
- 现在 p=F, q=U,二者不同(满足 (p,q) 边)。
- o 与 p 和 q 相邻:o 不能为 F(因为 p=F),不能为 U(因为 q=U),因此 o 可以为 T(T 不同于 F 和 U)。
- 类似地,如果 x=T, y=T:
- 设置 p=F 或 U(例如 p=F)。
- 设置 q=U(或 F,但选择 U)。
- p 和 q 不同(例如 F 和 U)。
- o 可以为 T(不同于 F 和 U)。
- 如果 y=T, x=F,证明类似。
因此,当至少一个输入为 T 时,总可以选择颜色使 o=T。
综上,OR 小工具满足所需性质。
(b) 使用图小工具证明 3-COLORING 是 NP 完全的
证明步骤:
- 3-COLORING 属于 NP: 给定一个图和一种着色方案,可以在多项式时间内验证是否没有相邻顶点颜色相同(检查所有边)。因此,3-COLORING ∈ NP。
- 3-COLORING 是 NP-难的: 通过从 3-SAT 问题归约到 3-COLORING 来证明。3-SAT 是 NP 完全问题。给定一个 3-SAT 布尔公式,构造一个图 G,使得 G 是 3-可着色的当且仅当该公式可满足。归约中使用:
- 三角形小工具(用于变量): 强制顶点颜色不同,并用 T 和 F 编码布尔值。
- OR 小工具(用于子句): 实现子句的 OR 逻辑。
归约构造:
给定一个 3-SAT 公式,包含变量集合 X={x1,x2,…,xn} 和子句集合 C={c1,c2,…,cm},每个子句是三个文字的析取(literal 是变量或其否定)。
构造图 G 如下:
-
全局颜色参考顶点: 添加三个顶点 Tg、Fg、Ug,并添加边 (Tg,Fg)、(Tg,Ug)、(Fg,Ug) 形成一个三角形。这强制它们着不同颜色,分别记为 T(true)、F(false)、U(辅助)。这些顶点固定颜色的参考。
-
变量部分(使用三角形小工具思想): 对每个变量 xi:
- 创建一个顶点 vi 表示变量值。
- 添加边 (vi,Ug),这强制 vi 不能为 U(因为与 Ug 相邻),所以 vi 必须为 T 或 F,编码 xi 的真假值:
- vi=T 表示 xi=true。
- vi=F 表示 xi=false。
- 对于否定文字(如 ¬xi),需要顶点表示其真假。对每个变量 xi,创建一个额外顶点 noti 用于否定文字:
- 添加边 (noti,vi) 和 (noti,Ug)。
- 由于 (noti,Ug),noti 不能为 U,所以为 T 或 F。
- 性质:如果 vi=T,则 noti=F(因为与 vi 相邻);如果 vi=F,则 noti=T。这正好编码 ¬xi 的真假:
- noti=T 当 ¬xi=true(即 xi=false)。
- noti=F 当 ¬xi=false(即 xi=true)。
-
子句部分(使用 OR 小工具): 对每个子句 cj=(l1∨l2∨l3)(其中 lk 是文字):
- 为每个文字 lk 定义输入顶点:
- 如果 lk 是正文字 xi,则输入顶点为 vi。
- 如果 lk 是负文字 ¬xi,则输入顶点为 noti。
- 由于 OR 小工具处理两个输入,需将三个文字组合:
- 首先,为前两个文字 l1 和 l2 创建一个 OR 小工具(如 (a) 部分定义),输出顶点记为 oj12。
- 然后,为 oj12 和第三个文字 l3 创建另一个 OR 小工具,输出顶点记为 oj(表示子句 cj 的输出)。
- 添加边 (oj,Fg),这强制 oj 不能为 F(因为与 Fg 相邻),所以 oj 必须为 T 或 U。这一约束确保:当子句可满足时,oj 可以着色;当子句不可满足时,冲突发生。
正确性证明:
-
如果公式可满足,则 G 是 3-可着色的:
- 取一个满足赋值:为每个变量 xi 赋真值,使所有子句为真。
- 着色:
- 全局参考:固定 Tg=T, Fg=F, Ug=U。
- 变量:对每个 vi,如果 xi=true,则设 vi=T; 如果 xi=false,则设 vi=F。
- 否定文字顶点:对每个 noti,如上所述设置(例如,如果 vi=T,则 noti=F)。
- 子句 OR 小工具:对每个子句 cj,由于可满足,至少一个文字为真,所以其输入顶点为 T(正文字:vi=T; 负文字:noti=T)。由 OR 小工具性质 (2),在 OR 小工具中,输出 oj12 和 oj 都可以被着色为 T(因为输入有至少一个 T)。设置 oj=T(或 U,但 T 可行)。由于 oj 与 Fg 相邻,但 oj=T=F,无冲突。
- 所有边约束满足,故 G 是 3-可着色的。
-
如果 G 是 3-可着色的,则公式可满足:
- 取一个有效的 3-着色。
- 从着色导出变量赋值:对每个 vi,由于 (vi,Ug),vi 为 T 或 F。设 xi=true 如果 vi=T; xi=false 如果 vi=F。
- 对每个子句 cj,考虑其输出顶点 oj。由于 (oj,Fg),oj 不能为 F,所以 oj 为 T 或 U。
- 但由 OR 小工具性质,如果子句 cj 的所有文字为假,则:
- 输入顶点都为 F(正文字:vi=F; 负文字:noti=F)。
- 由 OR 小工具性质 (1),oj12 必须为 F。
- 然后 oj(OR 的输出)必须为 F(因为输入 oj12 和 l3 都为 F)。
- 但 oj 不能为 F(与 Fg 相邻),矛盾。
- 因此,不可能所有文字为假,即每个子句至少一个文字为真,故公式可满足。
归约复杂度: 构造图 G 需添加 O(n+m) 顶点和边(每个变量和子句的处理是常数大小),为多项式时间。因此,3-SAT ≤P 3-COLORING。
综上,3-COLORING 是 NP 完全的(NP 且 NP-难)。
7.3
题目
证明 Z(n) 和 nZ(n) 在 n 的多项式时间内可计算。 Z 的定义如下:枚举所有图灵机 M1,M2,…。不失一般性,假设 Mi 的运行时间最多为 ni,并且每个机器在此序列中有无限多个编码。定义 Z(1)=1。假设 Z(n−1)=i。如果对于所有长度不超过 logn 的 x, Mi 计算 SATZ(x),则定义 Z(n)=i。否则,定义 Z(n)=min{i+1,loglogn}。注意,我们要求 Z(n) 增长得比 loglogn 慢,以便 Mi 的时间复杂度最多是 n 的多项式。
解答
1. Z(n) 在多项式时间内可计算
我们设计一个算法计算 Z(n),并分析其时间复杂度
算法描述:
- 初始化: 设置 Z(1)=1。
- 递归计算: 对于每个整数 k 从 2 到 n(按顺序计算 Z(k)):
- 令 i=Z(k−1)。
- 检查条件:对于所有长度 ∣x∣≤logk 的字符串 x,验证 Mi(x) 输出是否等于 SATZ(x)。
- 如果所有 x 都满足条件,则设置 Z(k)=i。
- 否则,设置 Z(k)=min{i+1,⌊loglogk⌋}(其中 log 以 2 为底,且 ⌊⋅⌋ 表示向下取整,以确保结果为整数)。
关键细节:
- 计算 SATZ(x): SATZ 是 Ladner 构造中定义的语言,通常依赖于 Z。对于输入 x 满足 ∣x∣≤logk,由于 ∣x∣<k(当 k≥2 时),Z 在 ∣x∣ 及更小的位置已在前步计算完成。因此,SATZ(x) 可以显式计算:
- 在标准 Ladner 构造中,SATZ(x) 等价于 SAT 的相对化版本(例如,如果 Z(∣x∣) 为偶数,则输出 SAT(x),否则输出 0)。
- SAT(x) 可以通过暴力搜索计算:枚举所有可能的布尔赋值(共 2∣x∣ 个),并验证是否满足 x。
- 模拟 Mi(x): 给定索引 i,可以访问图灵机 Mi 的描述(假设枚举是固定的)。模拟 Mi 在输入 x 上运行,时间上限为 ∣x∣i。
- 处理 log 和 min: logk 和 loglogk 可以通过计算 log2k(例如,通过位长度计算)和取整得到,时间多项式于 k。
时间复杂度分析:
计算 Z(n) 需要计算所有 Z(k) for k=1 to n。对每个 k:
- 字符串数量: 长度 ∣x∣≤logk 的 x 的数量为 ∑l=0⌊logk⌋2l≤2logk+1=2⋅k,即 O(k)。
- 每个 x 的计算:
- 计算 SATZ(x): 暴力搜索 SAT(x) 的时间为 O(2∣x∣)≤O(2logk)=O(k)(因为 ∣x∣≤logk)。访问 Z(∣x∣) 是常数时间,因为 Z 值已预计算。
- 模拟 Mi(x): i=Z(k−1)≤loglog(k−1)≤loglogk(由定义保证),且 ∣x∣≤logk,所以运行时间上限为 ∣x∣i≤(logk)loglogk。
- 分析 (logk)loglogk: 令 v=log2k,则 (logk)loglogk=vlog2v。
- ln(vlog2v)=log2v⋅lnv=ln2lnv⋅lnv=ln2(lnv)2。
- 由于 ln2(lnv)2≤v 对于足够大的 v(因为 (lnv)2/v→0),有 vlog2v≤2v=k(当 k 足够大)。因此,∣x∣i≤O(k)。
- 比较结果:常数时间。
- 每个 k 的总时间: O(k) 个 x,每个 x 耗时 O(k)(SAT 计算和 Mi 模拟各 O(k)),所以每个 k 的时间为 O(k)×O(k)=O(k2)。
- 求和从 k=1 到 n: ∑k=1nO(k2)=O(n3)(因为 ∑k=1nk2=Θ(n3))。
因此,计算 Z(n) 的总时间为 O(n3),是多项式时间(以数值 n 为输入大小)。
2. nZ(n) 在多项式时间内可计算
一旦 Z(n) 被计算,我们计算 nZ(n)。利用 Z(n)≤loglogn 的性质。
算法描述:
- 先计算 Z(n)(使用上述算法)。
- 令 k=Z(n)。
- 计算 nk 通过重复乘法:初始化 result=1,重复 k 次 result=result×n(或使用快速幂,但 k 小,简单乘法即可)。
时间复杂度分析:
- 计算 Z(n) 的时间为 O(n3)。
- 计算 nk:
- k=Z(n)≤loglogn,所以 k 很小。
- 乘法次数:k 次(从 n1 到 nk)。
- 第 j 次乘法:计算 nj×n。
- nj 的二进制长度为 Θ(jlogn)(因为 log2(nj)=jlog2n)。
- 与 n(长度 Θ(logn)) 相乘:使用标准乘法算法(如 Karatsuba 或 schoolbook),时间 O((length)2)=O((jlogn)2)。
- 总乘法时间:∑j=1k−1O((jlogn)2)=O((logn)2)∑j=1k−1j2。
- ∑j=1k−1j2=Θ(k3)。
- k≤loglogn,所以 k3≤(loglogn)3。
- 因此,总时间为 O((logn)2(loglogn)3)。
- 输出 nk: 其二进制长度为 Θ(klogn)=Θ(logn⋅loglogn),输出时间为 O(logn⋅loglogn)。
- 总时间: 由计算 Z(n) 的 O(n3) 主导(因为 O((logn)2(loglogn)3)=o(n3)),所以整体为 O(n3)。
因此,nZ(n) 也可在 O(n3) 时间内计算。