TCS Homework 7

7.1

题目

设 D-SAT 为判定一个 CNF 公式 φ\varphi 是否至少有两个满足赋值的问题。证明 D-SAT 是 NP-完全的。

解答

1. D-SAT 属于 NP

给定一个 CNF 公式 φ\varphi 和两个赋值 σ1\sigma_1σ2\sigma_2,验证算法如下:

  • 检查 σ1\sigma_1 是否满足 φ\varphi:遍历 φ\varphi 的每个子句,验证子句中至少有一个文字在 σ1\sigma_1 下为真。这可以在 O(φ)O(|\varphi|) 时间内完成,其中 φ|\varphi|φ\varphi 的大小(即子句数和变量数)。
  • 检查 σ2\sigma_2 是否满足 φ\varphi:同样在 O(φ)O(|\varphi|) 时间内完成。
  • 检查 σ1σ2\sigma_1 \neq \sigma_2:比较两个赋值在至少一个变量上的取值是否不同。这可以在 O(n)O(n) 时间内完成,其中 nn 是变量数(nφn \leq |\varphi|)。

由于验证过程的总时间复杂度为 O(φ)O(|\varphi|),是多项式时间,因此 D-SAT 属于 NP。

2. D-SAT 是 NP-难的

我们通过将 SAT 归约到 D-SAT 来证明 D-SAT 是 NP-难的。SAT 问题是判定一个 CNF 公式是否至少有一个满足赋值,且 SAT 是 NP-完全的。

归约过程:
给定一个 SAT 实例,即一个 CNF 公式 φ\varphi,其变量集合为 {x1,x2,,xn}\{x_1, x_2, \dots, x_n\}。构造一个 D-SAT 实例 ψ\psi 如下:

  • 引入一个新变量 yy
  • ψ\psi 的变量集合为 {x1,x2,,xn,y}\{x_1, x_2, \dots, x_n, y\}
  • ψ\psi 的子句集与 φ\varphi 的子句集完全相同(即不添加任何涉及 yy 的新子句)。

此构造可在多项式时间内完成,因为只需添加一个新变量,且 ψ\psi 的大小与 φ\varphi 基本相同(变量数增加 1,子句数不变)。

正确性证明:

  • 如果 φ\varphi 是可满足的(即 φSAT\varphi \in \text{SAT})
    σ\sigmaφ\varphi 的一个满足赋值。那么,以下两个赋值均满足 ψ\psi

    • σ1:σ\sigma_1: \sigma 扩展到 y=truey = \text{true}(即 σ1(xi)=σ(xi)\sigma_1(x_i) = \sigma(x_i) 对所有 ii,且 σ1(y)=true\sigma_1(y) = \text{true})。
    • σ2:σ\sigma_2: \sigma 扩展到 y=falsey = \text{false}(即 σ2(xi)=σ(xi)\sigma_2(x_i) = \sigma(x_i) 对所有 ii,且 σ2(y)=false\sigma_2(y) = \text{false})。
      因为 ψ\psi 的子句与 φ\varphi 相同,且不涉及 yy,所以 σ1\sigma_1σ2\sigma_2 都满足 ψ\psi。此外,σ1σ2\sigma_1 \neq \sigma_2(因为 yy 的取值不同)。因此,ψ\psi 至少有两个满足赋值(即 ψD-SAT\psi \in \text{D-SAT})。
  • 如果 φ\varphi 是不可满足的(即 φSAT\varphi \notin \text{SAT})
    则没有赋值满足 φ\varphi 的子句。由于 ψ\psi 的子句与 φ\varphi 相同,且不涉及 yy,因此也没有任何赋值(无论 yy 的取值如何)满足 ψ\psi。所以,ψ\psi 没有满足赋值,即少于两个满足赋值(即 ψD-SAT\psi \notin \text{D-SAT})。

综上,φ\varphi 是可满足的当且仅当 ψ\psi 至少有两个满足赋值。因此,SAT 多项式时间归约到 D-SAT(即 SATpD-SAT\text{SAT} \leq_p \text{D-SAT})。

7.2

题目

图的着色是一种给图的顶点分配颜色的方式,使得没有相邻顶点具有相同颜色。让 3-COLORING 问题是判断给定图 GG 是否可以使用三种颜色进行着色。

(a) 我们将考虑两个图小工具。首先,三角形图强制顶点具有不同颜色,并且你可以使用 T 和 F 两种颜色来编码真(true)和假(false)。其次,以下图给出的 OR 小工具实现了逻辑 OR 操作。证明 OR 小工具具有以下性质:(1) 如果顶点 xxyy 都有颜色 F,那么标记为 xyx \lor y 的顶点也必须是 F;(2) 如果其中一个顶点有颜色 T,那么可能将顶点 xyx \lor 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 小工具由以下顶点和边组成:

  • 顶点:输入 xx、输入 yy、输出 o=xyo = x \lor y、内部顶点 ppqq
  • 边:(x,p)(x, p)(p,o)(p, o)(y,q)(y, q)(q,o)(q, o)(p,q)(p, q).

颜色集合为 {T, F, U},其中 T 表示 true,F 表示 false,U 是辅助颜色。小工具需满足:

  1. 如果 xxyy 都为 F,则 oo 必须为 F。
  2. 如果 xxyy 至少有一个为 T,则 oo 可以被着色为 T。

证明性质 (1):如果 xxyy 都为 F,则 oo 必须为 F。

假设 xxyy 都被着色为 F。

  • 由于边 (x,p)(x, p) 存在,且 x=Fx = \text{F},所以 pp 不能为 F(相邻顶点颜色不同)。因此,pp 为 T 或 U。
  • 由于边 (y,q)(y, q) 存在,且 y=Fy = \text{F},所以 qq 不能为 F。因此,qq 为 T 或 U。
  • 由于边 (p,q)(p, q) 存在,ppqq 必须不同颜色。
  • 现在考虑 oo:由于边 (p,o)(p, o)(q,o)(q, o) 存在,oo 必须与 ppqq 都不同。

分析 ppqq 的可能颜色组合:

  • ppqq 不能相同(因为 (p,q)(p, q) 边)。
  • 可能情况:
    • 情况 1: p=Tp = \text{T}, q=Uq = \text{U}
      • ooppqq 相邻,所以 oo 不能为 T(因为 p=Tp = \text{T}),也不能为 U(因为 q=Uq = \text{U}),因此 oo 必须为 F。
    • 情况 2: p=Up = \text{U}, q=Tq = \text{T}
      • oo 不能为 U(因为 p=Up = \text{U}),不能为 T(因为 q=Tq = \text{T}),因此 oo 必须为 F。
  • 其他情况(如 p=Tp = \text{T}, q=Tq = \text{T}p=Up = \text{U}, q=Uq = \text{U}) 不可能,因为 (p,q)(p, q) 边要求 ppqq 不同。

在所有可能情况下,oo 都必须为 F。因此,当 xxyy 都为 F 时,oo 必须为 F。

证明性质 (2):如果 xxyy 至少有一个为 T,则 oo 可以被着色为 T。

假设至少一个输入为 T,不妨设 x=Tx = \text{T}y=Fy = \text{F}y=Ty = \text{T} 的情况类似)。

  • 由于边 (x,p)(x, p) 存在,且 x=Tx = \text{T},所以 pp 不能为 T。因此,pp 为 F 或 U。
  • 由于边 (y,q)(y, q) 存在:
    • 如果 y=Fy = \text{F},则 qq 不能为 F,所以 qq 为 T 或 U。
    • 如果 y=Ty = \text{T},则 qq 不能为 T,所以 qq 为 F 或 U。
  • (p,q)(p, q) 要求 ppqq 不同。
  • 我们需要证明存在一种着色方式使 o=To = \text{T}

选择颜色以使 oo 可以为 T:

  • 子情况:x=Tx = \text{T}, y=Fy = \text{F}
    • 设置 p=Fp = \text{F}(因为 pp 不能为 T,且可为 F 或 U)。
    • 设置 q=Uq = \text{U}(因为 y=Fy = \text{F}qq 不能为 F,且可为 T 或 U;选择 U 以避免冲突)。
    • 现在 p=Fp = \text{F}, q=Uq = \text{U},二者不同(满足 (p,q)(p, q) 边)。
    • ooppqq 相邻:oo 不能为 F(因为 p=Fp = \text{F}),不能为 U(因为 q=Uq = \text{U}),因此 oo 可以为 T(T 不同于 F 和 U)。
  • 类似地,如果 x=Tx = \text{T}, y=Ty = \text{T}:
    • 设置 p=Fp = \text{F} 或 U(例如 p=Fp = \text{F})。
    • 设置 q=Uq = \text{U}(或 F,但选择 U)。
    • ppqq 不同(例如 F 和 U)。
    • oo 可以为 T(不同于 F 和 U)。
  • 如果 y=Ty = \text{T}, x=Fx = \text{F},证明类似。

因此,当至少一个输入为 T 时,总可以选择颜色使 o=To = \text{T}

综上,OR 小工具满足所需性质。

(b) 使用图小工具证明 3-COLORING 是 NP 完全的

证明步骤:

  1. 3-COLORING 属于 NP: 给定一个图和一种着色方案,可以在多项式时间内验证是否没有相邻顶点颜色相同(检查所有边)。因此,3-COLORING ∈ NP。
  2. 3-COLORING 是 NP-难的: 通过从 3-SAT 问题归约到 3-COLORING 来证明。3-SAT 是 NP 完全问题。给定一个 3-SAT 布尔公式,构造一个图 GG,使得 GG 是 3-可着色的当且仅当该公式可满足。归约中使用:
    • 三角形小工具(用于变量): 强制顶点颜色不同,并用 T 和 F 编码布尔值。
    • OR 小工具(用于子句): 实现子句的 OR 逻辑。

归约构造:
给定一个 3-SAT 公式,包含变量集合 X={x1,x2,,xn}X = \{x_1, x_2, \ldots, x_n\} 和子句集合 C={c1,c2,,cm}C = \{c_1, c_2, \ldots, c_m\},每个子句是三个文字的析取(literal 是变量或其否定)。

构造图 GG 如下:

  • 全局颜色参考顶点: 添加三个顶点 TgT_gFgF_gUgU_g,并添加边 (Tg,Fg)(T_g, F_g)(Tg,Ug)(T_g, U_g)(Fg,Ug)(F_g, U_g) 形成一个三角形。这强制它们着不同颜色,分别记为 T(true)、F(false)、U(辅助)。这些顶点固定颜色的参考。

  • 变量部分(使用三角形小工具思想): 对每个变量 xix_i:

    • 创建一个顶点 viv_i 表示变量值。
    • 添加边 (vi,Ug)(v_i, U_g),这强制 viv_i 不能为 U(因为与 UgU_g 相邻),所以 viv_i 必须为 T 或 F,编码 xix_i 的真假值:
      • vi=Tv_i = \text{T} 表示 xi=truex_i = \text{true}
      • vi=Fv_i = \text{F} 表示 xi=falsex_i = \text{false}
    • 对于否定文字(如 ¬xi\neg x_i),需要顶点表示其真假。对每个变量 xix_i,创建一个额外顶点 noti\text{not}_i 用于否定文字:
      • 添加边 (noti,vi)(\text{not}_i, v_i)(noti,Ug)(\text{not}_i, U_g)
      • 由于 (noti,Ug)(\text{not}_i, U_g)noti\text{not}_i 不能为 U,所以为 T 或 F。
      • 性质:如果 vi=Tv_i = \text{T},则 noti=F\text{not}_i = \text{F}(因为与 viv_i 相邻);如果 vi=Fv_i = \text{F},则 noti=T\text{not}_i = \text{T}。这正好编码 ¬xi\neg x_i 的真假:
        • noti=T\text{not}_i = \text{T}¬xi=true\neg x_i = \text{true}(即 xi=falsex_i = \text{false})。
        • noti=F\text{not}_i = \text{F}¬xi=false\neg x_i = \text{false}(即 xi=truex_i = \text{true})。
  • 子句部分(使用 OR 小工具): 对每个子句 cj=(l1l2l3)c_j = (l_1 \lor l_2 \lor l_3)(其中 lkl_k 是文字):

    • 为每个文字 lkl_k 定义输入顶点:
      • 如果 lkl_k 是正文字 xix_i,则输入顶点为 viv_i
      • 如果 lkl_k 是负文字 ¬xi\neg x_i,则输入顶点为 noti\text{not}_i
    • 由于 OR 小工具处理两个输入,需将三个文字组合:
      • 首先,为前两个文字 l1l_1l2l_2 创建一个 OR 小工具(如 (a) 部分定义),输出顶点记为 oj12o_{j12}
      • 然后,为 oj12o_{j12} 和第三个文字 l3l_3 创建另一个 OR 小工具,输出顶点记为 ojo_j(表示子句 cjc_j 的输出)。
    • 添加边 (oj,Fg)(o_j, F_g),这强制 ojo_j 不能为 F(因为与 FgF_g 相邻),所以 ojo_j 必须为 T 或 U。这一约束确保:当子句可满足时,ojo_j 可以着色;当子句不可满足时,冲突发生。

正确性证明:

  • 如果公式可满足,则 GG 是 3-可着色的:

    • 取一个满足赋值:为每个变量 xix_i 赋真值,使所有子句为真。
    • 着色:
      • 全局参考:固定 Tg=TT_g = \text{T}, Fg=FF_g = \text{F}, Ug=UU_g = \text{U}
      • 变量:对每个 viv_i,如果 xi=truex_i = \text{true},则设 vi=Tv_i = \text{T}; 如果 xi=falsex_i = \text{false},则设 vi=Fv_i = \text{F}
      • 否定文字顶点:对每个 noti\text{not}_i,如上所述设置(例如,如果 vi=Tv_i = \text{T},则 noti=F\text{not}_i = \text{F})。
      • 子句 OR 小工具:对每个子句 cjc_j,由于可满足,至少一个文字为真,所以其输入顶点为 T(正文字:vi=Tv_i = \text{T}; 负文字:noti=T\text{not}_i = \text{T})。由 OR 小工具性质 (2),在 OR 小工具中,输出 oj12o_{j12}ojo_j 都可以被着色为 T(因为输入有至少一个 T)。设置 oj=To_j = \text{T}(或 U,但 T 可行)。由于 ojo_jFgF_g 相邻,但 oj=TFo_j = \text{T} \neq \text{F},无冲突。
    • 所有边约束满足,故 GG 是 3-可着色的。
  • 如果 GG 是 3-可着色的,则公式可满足:

    • 取一个有效的 3-着色。
    • 从着色导出变量赋值:对每个 viv_i,由于 (vi,Ug)(v_i, U_g)viv_i 为 T 或 F。设 xi=truex_i = \text{true} 如果 vi=Tv_i = \text{T}; xi=falsex_i = \text{false} 如果 vi=Fv_i = \text{F}
    • 对每个子句 cjc_j,考虑其输出顶点 ojo_j。由于 (oj,Fg)(o_j, F_g)ojo_j 不能为 F,所以 ojo_j 为 T 或 U。
    • 但由 OR 小工具性质,如果子句 cjc_j 的所有文字为假,则:
      • 输入顶点都为 F(正文字:vi=Fv_i = \text{F}; 负文字:noti=F\text{not}_i = \text{F})。
      • 由 OR 小工具性质 (1),oj12o_{j12} 必须为 F。
      • 然后 ojo_j(OR 的输出)必须为 F(因为输入 oj12o_{j12}l3l_3 都为 F)。
      • ojo_j 不能为 F(与 FgF_g 相邻),矛盾。
    • 因此,不可能所有文字为假,即每个子句至少一个文字为真,故公式可满足。

归约复杂度: 构造图 GG 需添加 O(n+m)O(n + m) 顶点和边(每个变量和子句的处理是常数大小),为多项式时间。因此,3-SAT ≤P 3-COLORING。

综上,3-COLORING 是 NP 完全的(NP 且 NP-难)。

7.3

题目

证明 Z(n)Z(n)nZ(n)n^{Z(n)}nn 的多项式时间内可计算。 ZZ 的定义如下:枚举所有图灵机 M1,M2,M_1, M_2, \ldots。不失一般性,假设 MiM_i 的运行时间最多为 nin^i,并且每个机器在此序列中有无限多个编码。定义 Z(1)=1Z(1) = 1。假设 Z(n1)=iZ(n - 1) = i。如果对于所有长度不超过 logn\log nxxMiM_i 计算 SATZ(x)\text{SAT}_Z(x),则定义 Z(n)=iZ(n) = i。否则,定义 Z(n)=min{i+1,loglogn}Z(n) = \min\{i + 1, \log\log n\}。注意,我们要求 Z(n)Z(n) 增长得比 loglogn\log\log n 慢,以便 MiM_i 的时间复杂度最多是 nn 的多项式。

解答

1. Z(n)Z(n) 在多项式时间内可计算

我们设计一个算法计算 Z(n)Z(n),并分析其时间复杂度
算法描述:

  • 初始化: 设置 Z(1)=1Z(1) = 1
  • 递归计算: 对于每个整数 kk 从 2 到 nn(按顺序计算 Z(k)Z(k)):
    • i=Z(k1)i = Z(k-1)
    • 检查条件:对于所有长度 xlogk|x| \leq \log k 的字符串 xx,验证 Mi(x)M_i(x) 输出是否等于 SATZ(x)\text{SAT}_Z(x)
      • 如果所有 xx 都满足条件,则设置 Z(k)=iZ(k) = i
      • 否则,设置 Z(k)=min{i+1,loglogk}Z(k) = \min\{i + 1, \lfloor \log\log k \rfloor\}(其中 log\log 以 2 为底,且 \lfloor \cdot \rfloor 表示向下取整,以确保结果为整数)。

关键细节:

  • 计算 SATZ(x)\text{SAT}_Z(x): SATZ\text{SAT}_Z 是 Ladner 构造中定义的语言,通常依赖于 ZZ。对于输入 xx 满足 xlogk|x| \leq \log k,由于 x<k|x| < k(当 k2k \geq 2 时),ZZx|x| 及更小的位置已在前步计算完成。因此,SATZ(x)\text{SAT}_Z(x) 可以显式计算:
    • 在标准 Ladner 构造中,SATZ(x)\text{SAT}_Z(x) 等价于 SAT 的相对化版本(例如,如果 Z(x)Z(|x|) 为偶数,则输出 SAT(xx),否则输出 0)。
    • SAT(xx) 可以通过暴力搜索计算:枚举所有可能的布尔赋值(共 2x2^{|x|} 个),并验证是否满足 xx
  • 模拟 Mi(x)M_i(x): 给定索引 ii,可以访问图灵机 MiM_i 的描述(假设枚举是固定的)。模拟 MiM_i 在输入 xx 上运行,时间上限为 xi|x|^i
  • 处理 log\logmin\min: logk\log kloglogk\log\log k 可以通过计算 log2k\log_2 k(例如,通过位长度计算)和取整得到,时间多项式于 kk

时间复杂度分析:
计算 Z(n)Z(n) 需要计算所有 Z(k)Z(k) for k=1k = 1 to nn。对每个 kk:

  • 字符串数量: 长度 xlogk|x| \leq \log kxx 的数量为 l=0logk2l2logk+1=2k\sum_{l=0}^{\lfloor \log k \rfloor} 2^l \leq 2^{\log k + 1} = 2 \cdot k,即 O(k)O(k)
  • 每个 xx 的计算:
    • 计算 SATZ(x)\text{SAT}_Z(x): 暴力搜索 SAT(xx) 的时间为 O(2x)O(2logk)=O(k)O(2^{|x|}) \leq O(2^{\log k}) = O(k)(因为 xlogk|x| \leq \log k)。访问 Z(x)Z(|x|) 是常数时间,因为 ZZ 值已预计算。
    • 模拟 Mi(x)M_i(x): i=Z(k1)loglog(k1)loglogki = Z(k-1) \leq \log\log (k-1) \leq \log\log k(由定义保证),且 xlogk|x| \leq \log k,所以运行时间上限为 xi(logk)loglogk|x|^i \leq (\log k)^{\log\log k}
      • 分析 (logk)loglogk(\log k)^{\log\log k}: 令 v=log2kv = \log_2 k,则 (logk)loglogk=vlog2v(\log k)^{\log\log k} = v^{\log_2 v}
      • ln(vlog2v)=log2vlnv=lnvln2lnv=(lnv)2ln2\ln(v^{\log_2 v}) = \log_2 v \cdot \ln v = \frac{\ln v}{\ln 2} \cdot \ln v = \frac{(\ln v)^2}{\ln 2}
      • 由于 (lnv)2ln2v\frac{(\ln v)^2}{\ln 2} \leq v 对于足够大的 vv(因为 (lnv)2/v0(\ln v)^2 / v \to 0),有 vlog2v2v=kv^{\log_2 v} \leq 2^v = k(当 kk 足够大)。因此,xiO(k)|x|^i \leq O(k)
    • 比较结果:常数时间。
  • 每个 kk 的总时间: O(k)O(k)xx,每个 xx 耗时 O(k)O(k)(SAT 计算和 MiM_i 模拟各 O(k)O(k)),所以每个 kk 的时间为 O(k)×O(k)=O(k2)O(k) \times O(k) = O(k^2)
  • 求和从 k=1k=1nn: k=1nO(k2)=O(n3)\sum_{k=1}^n O(k^2) = O(n^3)(因为 k=1nk2=Θ(n3)\sum_{k=1}^n k^2 = \Theta(n^3))。

因此,计算 Z(n)Z(n) 的总时间为 O(n3)O(n^3),是多项式时间(以数值 nn 为输入大小)。

2. nZ(n)n^{Z(n)} 在多项式时间内可计算

一旦 Z(n)Z(n) 被计算,我们计算 nZ(n)n^{Z(n)}。利用 Z(n)loglognZ(n) \leq \log\log n 的性质。

算法描述:

  • 先计算 Z(n)Z(n)(使用上述算法)。
  • k=Z(n)k = Z(n)
  • 计算 nkn^k 通过重复乘法:初始化 result=1\text{result} = 1,重复 kkresult=result×n\text{result} = \text{result} \times n(或使用快速幂,但 kk 小,简单乘法即可)。

时间复杂度分析:

  • 计算 Z(n)Z(n) 的时间为 O(n3)O(n^3)
  • 计算 nkn^k:
    • k=Z(n)loglognk = Z(n) \leq \log\log n,所以 kk 很小。
    • 乘法次数:kk 次(从 n1n^1nkn^k)。
    • jj 次乘法:计算 nj×nn^j \times n
      • njn^j 的二进制长度为 Θ(jlogn)\Theta(j \log n)(因为 log2(nj)=jlog2n\log_2(n^j) = j \log_2 n)。
      • nn(长度 Θ(logn)\Theta(\log n)) 相乘:使用标准乘法算法(如 Karatsuba 或 schoolbook),时间 O((length)2)=O((jlogn)2)O( (\text{length})^2 ) = O( (j \log n)^2 )
    • 总乘法时间:j=1k1O((jlogn)2)=O((logn)2)j=1k1j2\sum_{j=1}^{k-1} O( (j \log n)^2 ) = O( (\log n)^2 ) \sum_{j=1}^{k-1} j^2
      • j=1k1j2=Θ(k3)\sum_{j=1}^{k-1} j^2 = \Theta(k^3)
      • kloglognk \leq \log\log n,所以 k3(loglogn)3k^3 \leq (\log\log n)^3
      • 因此,总时间为 O((logn)2(loglogn)3)O( (\log n)^2 (\log\log n)^3 )
  • 输出 nkn^k: 其二进制长度为 Θ(klogn)=Θ(lognloglogn)\Theta(k \log n) = \Theta( \log n \cdot \log\log n ),输出时间为 O(lognloglogn)O( \log n \cdot \log\log n )
  • 总时间: 由计算 Z(n)Z(n)O(n3)O(n^3) 主导(因为 O((logn)2(loglogn)3)=o(n3)O( (\log n)^2 (\log\log n)^3 ) = o(n^3)),所以整体为 O(n3)O(n^3)

因此,nZ(n)n^{Z(n)} 也可在 O(n3)O(n^3) 时间内计算。


TCS Homework 7
https://xiao-ao-jiang-hu.github.io/2025/05/30/tcs/tcs-hw-7/
作者
wst
发布于
2025年5月31日
许可协议