IIT-计算复杂性基础笔记-全-
IIT 计算复杂性基础笔记(全)
001:课程概述与动机

在本节课中,我们将学习计算复杂性理论的基本概念,了解其研究动机,并预览整个课程的核心内容。
课程概述
欢迎来到计算复杂性理论课程。本课程在印度理工学院(IIT)的课程编号为C640。这是一门中级课程,难度适中,既非基础入门,也非高级专题。它通常安排在“计算理论”课程之后。如果你已经学习过计算理论,那么本课程中的一些概念会更容易理解。否则,我会在第一周快速回顾一些基本模型,如图灵机、时间和空间等计算资源。之后,我们将开始构建新的概念和复杂性类。
什么是计算?
如今,我们每天都在使用计算。计算本质上是在计算机类设备上运行的一个过程。随着新设备的出现,我们对“计算机类设备”的定义也在不断变化。例如,以前的手机不被视为计算机,但如今的智能手机功能已与计算机相当。无论设备如何,在机器上运行的过程就是计算。它是一个可以解决任何可自动化问题的过程。
什么是复杂性?
复杂性指的是这个过程所需的资源。最常见的资源是时间,即解决问题需要多长时间。例如,当你打开浏览器在谷歌搜索时,谷歌需要多长时间才能给出结果?这就是时间。对于谷歌而言,除了时间,空间也是一个重要资源,因为算法需要多少空间决定了谷歌需要购买多少服务器。因此,时间和空间是主要的资源。
此外,计算机进行随机选择的能力也非常重要。许多实际算法确实会进行随机选择。在这种情况下,随机性也是一种资源。事实上,在本课程中,我们将多次提及随机性,它是一个非常重要的资源。
从计算理论到复杂性理论
上一门课程——计算理论——的研究动机是:每个问题都有解决方案吗? 这里的“解决方案”不仅指数学上的解,也指在计算设备上运行的计算过程。计算理论中并未提及时间、空间等资源。
而复杂性理论的研究动机是:一旦存在一个解决方案或过程,最经济的解决方案是什么? “经济”可以体现在时间、空间或随机比特数等方面。
实例分析
简单问题:整数加法
我们知道如何对两个n比特的整数A和B进行加法运算。从学校学到的加法算法就是一个解决方案。但它的效率如何?它快吗?
如果我们仔细实现这个加法算法,其时间复杂度大约是O(n)。因为算法需要扫描A和B的每一位(共2n位),每一位都必须被查看,因为即使翻转一个比特,结果也会改变。因此,时间复杂度至少是线性的。这是加法运算能达到的最快速度,我们无法做得比线性时间更快,否则就会遗漏部分输入比特。这是一个非常简单且实际的问题的例子。
困难问题:停机问题
另一个极端是非常困难甚至不可能解决的问题,即不可计算问题。对于这类问题,复杂性的问题甚至不会出现,因为问题根本没有算法,所需的资源是无限的。
一个著名的例子是停机问题:给定一个程序M(例如C程序),判断它是否会终止(即是否会停止运行)。这是一个不可解的问题。
为了证明一个问题是不可计算的,我们需要一个严格的计算定义。我们需要一个数学上严谨且通用的计算设备定义,以避免被不同设备的速度、架构等多样性所混淆。这就是图灵机模型。艾伦·图灵在1936年定义了它,为“计算”提供了数学基础。一旦我们基于图灵机定义了计算,就可以严谨地讨论复杂性。
本课程将处理在图灵机上可解的各种问题的复杂性概念。这将摆脱不同计算设备速度、计算机架构、操作系统或应用程序的差异,提供一个严谨、清晰且与架构无关的计算定义。
课程大纲预览
在深入图灵机定义之前,让我们快速预览一下课程大纲。课程将围绕几个核心问题展开,每个问题都引出一个重要的主题。
-
停机问题:虽然这不完全是复杂性理论的内容,但我们将通过它来回顾图灵机模型的关键点,以及如何证明某些问题是不可计算的。这个证明思想将在本课程的其他定理(如层次定理)中再次使用。另一个例子是希尔伯特第十问题,即判断一个给定的丢番图方程组是否有整数解。这个问题也被证明是不可计算的。
-
可满足性问题:这是计算机科学中最重要的开放问题之一。给定一个由与、或、非门组成的布尔公式φ,判断是否存在一组对变量的真值赋值,使得公式φ为真。这个问题定义了复杂性理论(乃至整个计算机科学和数学)中最重要的开放问题:P是否等于NP?
-
量化布尔公式问题:给定一个带有量词(存在量词∃和全称量词∀)的布尔公式,判断该公式是否为真。例如,判断公式 ∃x1 ∃x2 ∀x3 φ(x1, x2, x3) 是否为真。在研究这个问题时,我们将定义新的复杂性类,并引出 NP是否等于PSPACE 等问题。
这些看似具体的问题,将引导我们定义复杂性类。当我们提出关于复杂性类的问题时,我们实际上是在询问关于无限多问题的性质,而不仅仅是单个问题。这正是复杂性问题的有趣之处。
总结

本节课我们一起学习了计算复杂性理论的基本动机。我们明确了计算是解决问题的过程,而复杂性是衡量该过程所需资源(如时间、空间、随机性)的标尺。我们从简单的加法问题出发,看到了高效算法的存在;也认识了像停机问题这样不可计算的难题。最后,我们预览了本课程将围绕SAT、QBF等核心问题展开,并引出P vs NP等重大开放性问题。在接下来的课程中,我们将首先回顾图灵机这一计算模型的基础,为后续深入学习做好准备。
002:课程概述与问题引入

在本节课中,我们将概述计算复杂性理论的核心问题,并介绍一系列关键的复杂性类别。我们将从停机问题等经典问题出发,逐步深入到公式优化、恒等测试、图可达性、矩阵积和式以及图同构等具体问题,并探讨它们所引出的P、NP、PH、BPP、L、RL、#P、IP等复杂性类别之间的关系。
章节概览
上一节我们介绍了课程的整体框架,本节中我们将具体了解课程将要探讨的核心问题及其对应的复杂性类别。
以下是本课程将要深入研究的八个核心问题:
- 停机问题与希尔伯特第十问题:我们将在第一章探讨停机问题。希尔伯特第十问题将在第二章介绍。
- P与NP问题:这是计算复杂性理论中最核心的开放性问题之一。
- P空间与NP问题:探讨多项式空间与NP类的关系。
- 公式优化问题:给定一个布尔公式Φ,判断是否存在一个更小的公式Ψ,使得Ψ与Φ逻辑等价。这里的“更小”指的是公式的规模更小。例如,公式
x1 ∨ ¬x1可以简化为常量1。这个问题引出了多项式谱系这一复杂性类别,并引发PH是否不同于NP和P的疑问。 - 恒等测试问题:给定一个n元多项式f,判断f是否恒等于零多项式。目前已知的快速算法是随机化算法。这个问题引出了BPP类,并引发P是否等于BPP的疑问,即快速的随机化算法能否被确定性地快速去随机化。
- 图可达性问题:给定一个图G和两个顶点s、t,判断是否存在从s到t的路径。问题的挑战在于要求使用极少的计算空间(相对于输入规模指数级小)。这个问题表明,可达性可以在对数空间内解决。它引出了复杂性类别L和RL(随机化对数空间),并引发L是否等于RL的疑问。
- 矩阵积和式问题:对于一个n×n的矩阵A,计算其积和式。积和式的定义与行列式类似,但省略了排列的符号项。具体公式为:
Perm(A) = Σ_π Π_i A_i, π(i),其中π取遍所有排列。积和式在实践中非常重要,因为它本质上是计算SAT问题的满足赋值个数。这个问题引出了计数复杂性类别#P。 - 图同构问题:给定两个图G1和G2,判断它们是否同构(即是否存在一个顶点重标号使得两个图完全相同)。这个问题引出了交互式证明系统复杂性类别IP,并引发IP是否等于多项式时间的疑问。需要指出的是,在2016年取得了重大突破,给出了一个拟多项式时间算法,时间复杂度为
n^(O(log n))。
复杂性类别关系图
以上问题引出了众多复杂性类别。以下是当前对这些类别之间关系的认知(大多数为开放性问题):
- L ⊆ RL:我们不知道它们是否相等。
- RL ⊆ P:我们不知道它们是否相等。如果相等将非常令人惊讶。
- P ⊆ NP:这是最著名的开放性问题。
- NP ⊆ PH:我们不知道多项式谱系是否严格更大。
- PH ⊆ #P:我们不知道它们是否不同。
- #P ⊆ IP:我们不知道它们是否不同。但有一个著名定理表明 IP = PSPACE。
- PSPACE ⊆ EXP:我们不知道多项式空间是否严格小于指数时间。
- P ⊆ BPP:我们不知道它们是否相等,但猜想相等。
- P ≠ EXP:这是我们确知的不等式。
总而言之,我们从多项式时间P开始,定义了越来越大的复杂性类别,但大多不能确定它们是否真正更大(只是猜想)。然而,我们最终知道,指数时间EXP确实严格大于我们出发的起点P。
问题的形式化
上一节我们概述了具体问题,本节中我们来看看在计算机科学中如何形式化地定义“问题”和“输入”。
对我们而言,一个“问题”总是指计算一个函数。该函数的输入和输出都是有限的二进制字符串。关键在于“有限性”。我们可以将其写为一个函数:F: {0, 1}* → {0, 1}*。这是一个将字符串映射到另一个字符串的函数,可称为多值布尔函数。
我们同样关注只输出单个比特的函数,即输出仅为0或1(是或否)。这对应判定问题。之前概述中的许多问题都是判定问题。更一般的函数问题通常可以转化为有意义的判定问题,这将是我们下一节课定义复杂性类别的基础。
为什么我们专注于比特?因为计算机底层电子电路用“有电流”(1)和“无电流”(0)来表示所有信息。因此,一切计算最终都需归结为对比特串的操作,并通过称为算法或计算的巧妙过程来执行。
课程信息与评分政策
如果你已注册本课程,评分政策如下:将有大约4次作业,占总成绩的40%;一次期中考试和一次期末考试,各占30%。课程资料可在我个人主页的“教学”栏目下找到。


本节课中我们一起学习了计算复杂性课程将要涵盖的核心问题集合、它们对应的复杂性类别以及这些类别之间已知和未知的关系。我们还形式化地定义了计算机科学中的“问题”。在接下来的课程中,我们将以此为基础,深入探索这些有趣的问题和类别。
003:问题、机器与资源的形式化

在本节课中,我们将学习如何形式化地定义计算问题、计算模型(图灵机)以及衡量计算效率的两个核心资源:时间和空间。我们将从数学函数的角度理解问题,并介绍图灵机的基本工作原理。
问题与输入的形式化
上一节我们概述了计算复杂性,本节我们将形式化计算问题和问题的输入。
对我们而言,一个问题本质上是一个数学函数。它从布尔字符串映射到布尔字符串,即 F: {0,1} → {0,1}**。布尔字符串(仅由0和1组成的字符串)足以表示任何数学对象,因为你可以将任何对象(如整数、图、矩阵)编码为二进制字符串。在计算机硬件底层,数据正是以比特(0表示关闭状态,1表示开启状态)的形式存储和处理的。
一个重要的概念是,我们可以将输出为字符串的函数,转化为输出仅为单个比特(0或1)的函数。这类函数我们称之为问题的布尔版本或判定版本。例如,对于加法函数 PLUS(A, B),其判定版本可以是 PLUS_COMMA_I(A, B),它只询问和数的第 i 位是0还是1。如果你能快速解决所有 i 位的 PLUS_COMMA_I 问题,那么你就能通过组合结果来解决完整的加法问题。这是一种将函数问题转化为判定问题的通用策略。
判定问题的好处在于,每个判定问题 F 都对应一个语言 L_F。语言 L_F 是所有使得 F(x) = 1 的输入字符串 x 的集合。因此,语言就是字符串集合的一个子集,其中的字符串就是相对于该问题的“是”实例。这样,我们就把一个判定问题形式化为一个语言(字符串的子集)。然后,我们可以讨论识别这个语言的机器,这等价于解决该问题。
所以,计算一个布尔函数 F 和判定其对应的语言 L_F 是同一回事。这种形式化虽然不一定是深刻的洞见,但它有助于我们清晰地定义问题之上的概念,如复杂性类和归约,这对于书写计算复杂性理论的内容非常方便。
至此,我们已将问题形式化为语言(字符串的子集),将输入形式化为字符串。“是”实例在语言中,“否”实例在语言外,机器的任务就是区分它们。
图灵机:计算模型
那么,什么是机器?机器做什么?为了形式化计算,目前最好的形式化模型是图灵机。
图灵机 M 由一个元组描述:M = (Γ, Q, δ)。其中:
- Γ 是字母表,包含符号
0、1、起始符号␣和空白符号□。 - Q 是状态集合,包含起始状态
q_s和终止状态q_f。 - δ 是转移函数,定义了机器在每一步的行为。
图灵机由有限控制单元(由 Γ, Q, δ 定义)和无限内存(磁带)组成。实际的计算机内存是有限的,但为了从数学上研究能处理任意长度输入的问题,我们假设内存是无限的,但控制单元必须是有限的。
转移函数 δ 的输入是当前状态和两个磁带头读取的符号,输出是下一个状态、要在两个磁带上写入的符号以及两个磁头的移动方向(左移 L、右移 R 或保持 S)。其语义如下:
δ(q, a, b) = (q‘, a’, b‘, m1, m2) 表示:当控制状态为 q,输入磁带读到的符号是 a,工作磁带读到的符号是 b 时,机器应转移到状态 q‘,在输入磁带上写入 a’(通常输入磁带只读,写入特指输出),在工作磁带上写入 b‘,然后按照 m1 和 m2 移动输入磁头和工作磁头。
机器的格局完整描述了计算在某一时刻的状态:控制单元的状态、两个磁带上的内容以及两个磁头的位置。计算从起始格局开始:状态为 q_s,输入磁带上为输入字符串(以起始符号开头,后接空白),工作磁带全为空白。计算过程是依据转移函数 δ 不断从一个格局变换到下一个格局的序列。当机器进入终止状态 q_f 时,计算立即停止。此时,输入/输出磁带上的内容(在起始符号之后的部分)就是计算的输出。
这种形式化非常优美,我们可以从中自然地定义衡量计算效率的资源。
时间与空间资源
基于图灵机模型,我们可以精确定义时间和空间。
- 时间:图灵机
M在输入x上从起始格局运行到终止格局所经历的步数,记作Time_M(x)。如果机器永不停止,则时间为无穷大,但本课程中我们主要关注总是会停止的程序。 - 空间:图灵机
M在输入x的整个计算过程中,工作磁带上被读写访问过的不同单元格的数量,记作Space_M(x)。输入磁带通常不计入空间消耗,因为它通常是只读的。
需要注意的是,时间和空间消耗都依赖于具体的输入 x 和机器描述 M。这个定义独立于任何具体的硬件架构,是纯粹数学和抽象的。任何实际计算机设备的行为,其每一步都可以看作是简单的,但通过许多简单步骤的组合,最终可能完成复杂的任务。
关于输入/输出磁带需要说明:它通常是只读的,不允许随意擦写。但机器可以逐步将输出字符串写入到这个磁带上(例如,从起始符号后面开始写)。工作磁带才是完全可读写的,用于存储中间计算结果。
示例:奇偶性计算
让我们通过设计一个计算奇偶性(Parity)的图灵机来示例上述定义。
问题:给定一个长度为 n 的二进制输入字符串 x = x1 x2 ... xn,计算其奇偶性。奇偶性定义为所有比特的模2和(即异或和):若 x1 ⊕ x2 ⊕ ... ⊕ xn = 1(奇数个1),则输出 1;否则输出 0。
算法思路:图灵机从左到右扫描输入。它用一个内部状态来记录当前已扫描部分的奇偶性(例如,状态 q_even 表示偶数,q_odd 表示奇数)。起始状态为 q_even(0个1是偶数)。
- 读取一个比特
xi。 - 如果
xi = 0,则奇偶性不变,保持当前状态。 - 如果
xi = 1,则奇偶性翻转:从q_even切换到q_odd,或从q_odd切换到q_even。 - 磁头向右移动,处理下一个比特。
- 当扫描完所有输入(遇到空白符)后,根据最终状态输出:若在
q_even则输出0,在q_odd则输出1。
这个图灵机只使用了一个工作状态(或两个状态来记录奇偶性),工作磁带可能完全不需要(或者只用极少单元格来辅助移动)。因此,对于长度为 n 的输入,其时间复杂度约为 O(n) 步(需要扫描每个输入比特),空间复杂度为 O(1)(仅使用常数大小的额外空间)。
总结

本节课我们一起学习了计算复杂性理论的基础形式化工具。我们首先将计算问题定义为从布尔字符串到布尔字符串的函数,并引入了便于理论分析的判定问题和语言的概念。接着,我们介绍了图灵机作为计算的形式模型,它由有限控制单元和无限磁带构成,通过转移函数驱动计算。基于这个模型,我们精确定义了衡量算法效率的两个核心资源:时间(计算步数)和空间(工作磁带使用量)。最后,我们通过奇偶性计算的例子演示了如何在实际问题中应用这些概念。这些形式化定义为我们后续深入研究不同的复杂性类(如P、NP)和归约技术奠定了坚实的基础。
004:图灵机与复杂度分析

概述
在本节课中,我们将学习如何用图灵机描述一个简单的算法(计算奇偶性),并理解如何分析图灵机的时间和空间复杂度。我们还将介绍用于描述算法效率的渐进符号(如大O、大Ω、Θ等)。
图灵机计算奇偶性
我们尝试计算奇偶性,并观察图灵机在运行时的定义。
图灵机逐步读取输入。这是一个增量算法。图灵机大致上会逐位读取输入。
假设你已经读取了前 i 位,当你读取第 i+1 位时,它可能是0或1。
如果该位是0,则不改变当前的奇偶性,保持原状。如果读取到1,则翻转当前的奇偶性。这是正确的做法。
因为,请记住,1加1等于0,而1加0等于1。所以当你看到一个1时,必须翻转奇偶性;当你看到一个0时,则不翻转。
第三步是继续执行,直到到达输入磁带上的空白单元格。空白意味着输入结束。你不断重复这个循环。
这只是一个简单的循环,磁头在输入磁带上持续向前移动。状态只有两个。显然,起始状态和结束状态存在,但你也可以将其视为奇偶性为0的状态(偶数状态)或奇偶性为1的状态(奇数状态)。
无论图灵机停止时处于何种状态,那就是答案。输出0或1,基于当前状态,然后转移到结束状态。
这就是图灵机如何扫描位并改变状态的方式。这是一个非常简单的算法,显然可以由图灵机实现。
状态图表示
实际上,我们也可以将其绘制成一张图。
你有起始状态和结束状态,这是两个顶点。你还有偶数状态和奇数状态作为顶点。
将顶点视为状态,边视为转移函数的值。
那么,转移函数何时会指示从起始状态 Qs 转移到偶数状态 Qeven?Qeven 对应当前奇偶性为0。如果你看到第一个位是0,那么你就转移到 Qeven。
从起始配置开始,你将在输入磁带上向右移动,但不会改变工作磁带上的单元格。这里唯一的信息实际上是向右移动和输入位。
起始之后,你转移到奇偶性为0的状态。现在,当你向右移动时,输入磁头看到第一个位。基于该位,它必须采取行动。
行动是什么?如果该位是0,则不改变任何状态,只是继续向右移动,读取第二位。状态不改变,因为0意味着奇偶性仍然是0。
另一方面,如果你看到1,则继续向右移动,但状态必须翻转,因此它转移到奇数状态。因为第一个位是1意味着奇偶性现在变为1。
现在,在奇数状态下,如果你在某个时间点处于奇数状态,那么再次看到0时,你将保持在奇数状态。你继续在输入磁带上向右移动,因为你想移动到下一个输入位。
工作磁带似乎没有任何用处。工作磁带的磁头始终位于起始符号上。所以这实际上甚至不需要工作磁带。
相反的情况是,如果你看到1,那么从奇数状态你会转移到偶数状态。
这是一种循环:从偶数到奇数,从奇数到偶数,每当你看到1时。如果你一直看到1,你就在这个循环中移动。如果你一直看到0,那么你保持在相同的状态:偶数到偶数,或奇数到奇数。
一切何时结束?你何时到达结束状态?那就是当你看到空白时。在那个空白处,如果你处于偶数状态,那么你写入输出0,并且不再需要向右移动。类似地,如果你处于奇数状态,你写入1。
这就是图灵机的状态图。上面是用文字描述的步骤,下面是用紧凑的图片描述的状态图,它通过边告诉你转移函数是什么,顶点是状态。
你可以运行整个算法的执行过程。这就是状态图。
状态图的意义
你可以看到,即使是一个简单的、几乎是微不足道的算法,也需要一段时间来写下、描述图灵机和描述计算过程。
虽然定义很容易,但有很多符号。因此,描述图灵机会变得相当繁琐,但你仍然必须记住这一点,因为这是形式化一切的方式。每个算法最终看起来都是这样的。
状态图描述了转移函数,描述了 δ,节点是状态 Q,边是转移状态。
你会看到这些大顶点,但其余的信息你会在边上看到。
在这个例子中,你可以看到工作磁带没有被使用,并且输出被写在输入磁带的最后一位。在状态图中我们看到,当从 Qeven 转移到 Qf 时,我们在看到的第一个空白处写了0。那是输入磁带的末尾。对于从 Qodd 到 Qf 的转移也有类似的情况。
你可以看到的一个属性是:状态图的大小在实践中意味着什么?更大的状态图意味着什么?
更大的状态图意味着一个更大的程序。状态图的大小大致上与C程序的大小成比例。模拟这个算法时,状态图的大小在物理上可以这样解释:更大的状态图意味着你的C程序会更大。因为在C程序中,你必须处理这些步骤,这有点像你在C程序中实现的流程图。
因此,如果有更多的状态,那么你必须在C程序中维护更多的变量;如果有更多的边,那么你必须实现更多的if-else条件。会有更多的循环,比如for或while循环。
程序的大小是固定的,与输入的长度无关。这是一个需要记住的重要事情。这个大小是独立于输入的。
一旦你编写了C程序,无论输入是什么,或者你的输入可以任意大,都没有关系。将来,当有更大的计算机、更大的硬盘时,同一个程序可以运行更大的输入。
这就是在这一点上你必须理解的事情:有限控制和状态图转移函数这些东西可以处理任何长度的输入。x 可以是无限长的,这就是为什么你需要磁带是无限的,尽管程序和控制是有限的。
时间与空间复杂度
这是对你所学图灵计算的一个快速回顾。现在,让我们开始计算和界定资源。
我们从图灵机的时间复杂度开始。
设 f 是一个从字符串到字符串的函数。设 M 是一个计算函数 f 的图灵机。T 是表示时间复杂度的函数。
我们说 M 在时间 T 内计算 f,如果对于所有输入字符串 x,M 在最多 T(|x|) 步后停止。这里的竖线符号表示 x 的长度,即 x 中有多少位。显然,仅仅停止是不够的,它还必须给出正确的答案,并输出 f(x)。它应该在 T 函数(关于长度的函数)所描述的步数内停止并给出正确的输出。
这很重要,我们希望将时间复杂度捕获为输入字符串的函数。为什么?因为输入字符串可以是任意长的。我们无法跟踪每个字符串需要多少时间。字符串有无限多个。因此,我们实际上希望关注一个大概的数字,在这种情况下是函数 T,它告诉你图灵机的好坏。
类似地,你可以定义表达式“M 在 S(n) 空间内计算 f”的含义。这个短语意味着使用了多少个工作磁带单元格。
例如,在前面的奇偶性计算示例中,根本没有使用工作磁带。只使用了输入磁带的一个位。所以它实际上是常数空间复杂度。
奇偶性计算的时间复杂度是多少?它所花费的时间与输入的长度成正比。所以我们可以写成:对于奇偶性,我们看到时间 T(n) 大约是 n。空间复杂度仅为1。没有使用工作磁带单元格,并且写入了一个输出位。这就是图灵机在这个例子中发生的情况。
渐进符号
我们也不想对 T 和 S 函数过于精确。我们想再次得到一个大概的估计。为此,我们将形式化渐进符号。
设 f、g 为函数。为简洁起见,将函数缩写为 f(n)。f、g 是从自然数到正实数或非负实数的函数。
大O符号是这样的:写 f = O(g),这大致意味着 f 小于等于 g,但最多差一个常数倍。即,如果存在常数 c 和 n0,使得对于所有 n ≥ n0,f(n) ≤ c * g(n)。注意,这里有两个放宽条件:首先,f 可以是 g 的倍数,但必须是常数 c。第二个放宽条件是,这个不等式可能在一段时间后才开始成立,即从某个 n0 开始可能不成立,但超过 n0 后总是成立。所以,最终 f 被 g 以一个常数 c 为界。这就是 f = O(g) 的含义。
大Ω符号:如果你写 f = Ω(g),这基本上是第一条线的反面。如果 g = O(f),那么你就是在说 f 大于等于 g,最多差一个常数。所以,大O是上界,大Ω是下界。
然后是Θ符号:f = Θ(g),如果两者都成立。所以你既有上界也有下界。g 小于等于某个常数乘以 f,f 小于等于某个常数乘以 g。所以 f 和 g 实际上是一样的,这就是Θ的含义。Θ是一个很好的界限,理想情况下你想要Θ,你想要这种两个东西相等的关系。
对于小o符号:这个想法是 f 严格小于 g。在大O的情况下,f/g 像一个常数。在小o的情况下,f/g 趋向于0。当 n 趋向于无穷大时,g 变得比 f 大得多,并且比率变为0。类似地,小ω符号:小ω与此相反。如果 g = o(f),那么小ω表示 f 显著大于 g。
最后,还有 Õ 符号:f = Õ(g) 这类似于大O,但这里的常数倍被放宽为 g 的更小的函数。所以如果 f ≤ g * (某个更小的函数),我们选择 log g。所以 g log g 被写成 Õ(g),或者你甚至可以允许常数幂。log g 比 g 小得多,我们只允许它的常数幂。所以你不期望这个太大。所以尽管 f 可能比 g 大,但不会大太多。与此对称,你可以有 Ω̃。
所有这些函数的想法是相同的,即理解渐进性。
比较算法效率
让我们设定时间复杂度。如果你用一个图灵机解决问题需要 f 时间,另一个图灵机(另一种算法)需要 g 时间,你如何比较这两种算法的优劣?你基本上会使用具有更小时间复杂度的算法。所以你会想要 f = o(g),因为对于更大的输入,f 时间复杂度比 g 小得多。
如果 f = Θ(g),那么你不会太在意。尽管在实践中,常数可能很重要,但在理论上,f = Θ(g) 意味着只有常数倍的差异,所以时间复杂度是差不多的。因此,从数学上讲,算法是差不多的。这就是我们使用的渐进符号。我们可以在下次看到一些例子。

总结
本节课中,我们一起学习了如何用图灵机描述计算奇偶性的算法,并通过状态图直观理解其运行过程。我们定义了图灵机的时间和空间复杂度,并介绍了用于比较算法效率的渐进符号(如 O、Ω、Θ、o、ω、Õ)。理解这些概念是分析计算问题复杂性的基础。
005:渐进分析与图灵机模型

在本节课中,我们将学习渐进分析(Asymptotics)的核心概念,并深入探讨图灵机模型在定义计算复杂性时的关键细节。我们将理解大O、大Ω、Θ等符号的含义,并澄清图灵机模型与日常算法分析(如二分查找)之间的重要区别。
渐进符号回顾
上一节我们介绍了渐进分析的基本符号。本节中,我们来看看这些符号的具体应用和含义。
我们定义了以下符号:大O(Big O)、大Ω(Big Omega)、Θ(Theta)、小o(small o)和小ω(small ω)。此外,还有它们的“波浪号”变体,例如 \(\tilde{O}\) 和 \(\tilde{\Omega}\)。
以下是几个简单的例子,用于说明这些符号的用法:
- 函数 \(n + 100n^2\):这个函数是 \(O(n^2)\),因为常数因子100可以忽略,且 \(n^2\) 项主导了增长。实际上,它也是 \(\Omega(n^2)\) 和 \(\Theta(n^2)\)。同时,它是 \(o(n^{2.01})\),因为当 \(n\) 趋于无穷时,\((n + 100n^2) / n^{2.01}\) 的极限为0。
- 函数 \(n \log n\):这个函数是 \(O(n^{1.01})\),因为 \(\log n\) 的增长慢于任何 \(n^\epsilon\)(\(\epsilon > 0\))。事实上,对于任意正实数 \(\epsilon\),\(n \log n\) 都是 \(o(n^{1+\epsilon})\),因为 \(\lim_{n \to \infty} (\log n / n^\epsilon) = 0\)。
一个需要记住的重要结论是:对于任意常数 \(c\),多项式 \(n^c\) 总是小于指数函数 \(2^n\)。即:
这表明在渐进意义上,多项式增长总是慢于指数增长。
关于图灵机模型的重要说明
理解了渐进符号后,我们需要明确图灵机模型中的一些关键约束,这些约束直接影响我们对算法时间复杂度的分析。
首先,输入/输出磁带仅用于读写输入和输出字符串,不允许进行其他操作。所有中间计算都必须在工作磁带上完成。有时,如果输出很小(例如决策问题的“是/否”答案),甚至可以直接放在工作磁带上。
其次,也是至关重要的一点,需要澄清一个常见的误解。我们熟知的二分查找算法通常被称为具有 \(O(\log n)\) 的时间复杂度。然而,这在图灵机模型中是不可能的。
原因在于,图灵机的读写头一次只能移动到相邻的单元格。它无法直接从输入磁带的一端“跳转”到中点。这样的跳转本身就需要大约 \(n/2\) 步移动。此外,图灵机模型没有“随机访问”内存的概念,无法通过索引直接访问特定位置。
因此,所谓的 \(O(\log n)\) 步二分查找算法,依赖于随机访问假设,并不对应图灵机模型中的时间复杂度。在图灵机模型上,要扫描一个长度为 \(n\) 的输入,至少需要线性时间 \(\Omega(n)\)。当我们讨论时间复杂度时,输入大小 \(n\) 被认为是任意的,而非固定常数。
丘奇-图灵论题与可计算性
在定义了图灵机、问题、时间复杂度和渐进分析之后,我们现在可以讨论什么能被图灵机模拟。这就是丘奇-图灵论题。
该论题指出:任何现实可行的计算设备(无论是基于晶体管、硅、DNA、神经元,还是未来的量子技术乃至外星科技)所能完成的计算,都可以被一台图灵机模拟。图灵机是一种通用计算模型。
这是一个“论题”而非可证明的定理,但至今未被证伪。因此,图灵机能解决的问题被称为可计算的(Computable)、可判定的(Decidable) 或递归的(Recursive)。
还有一个更广义的概念叫递归可枚举(Recursively Enumerable),它包含但不等于可判定性。递归可枚举集存在图灵机可以逐个列出其所有“是”实例,但对于给定的输入,该图灵机不一定能停机并给出“是/否”答案。本课程主要关注的是可有效判定的问题。
多项式时间与高效算法
我们关注比“可计算”更特殊的一类问题:那些可以高效解决的问题。
一个函数或问题被称为多项式时间可计算的(Polynomial Time Computable),如果存在一台图灵机 \(M\) 来解决它,且其时间复杂度 \(T(n)\) 是一个多项式函数,即 \(T(n) = O(n^c)\),其中 \(c\) 是一个不依赖于输入大小 \(n\) 的常数。
我们通常将其简称为 P 时间(Poly-time) 问题。非正式地,我们称解决这些问题的图灵机为高效算法。
这里的关键在于,即使多项式是 \(n^{100}\),我们也认为它是“高效”的,因为在渐进意义上,任何多项式 \(n^c\) 都远小于指数函数 \(2^n\):
作为练习,可以思考:任何时间复杂度为多项式的 C 程序,都可以转化为一个高效的图灵机程序;反之,任何高效的图灵机也可以转化为一个高效的 C 程序。这建立了现实编程与抽象图灵机模型在效率层面的对应关系。
因此,如果一个问题是图灵机难以解决的(例如需要超多项式时间),那么它在现实计算机上也极有可能是困难的。这就是理论计算机科学家青睐图灵机模型的原因。
不过需要注意的是,丘奇-图灵论题是关于“可计算性”的,其“高效版本”(即任何现实高效计算都可被图灵机高效模拟)未来可能受到挑战。例如,已知量子计算机可能在某些问题上比经典计算机更快。
图灵机的自指与通用图灵机
一个自然的问题是:能否将一台图灵机作为另一台图灵机的输入?就像 C 编译器可以将 C 程序作为输入一样。答案是肯定的。
因为图灵机的描述(有限状态集、字母表、转移函数)是有限的,我们可以将其编码成一个二进制字符串 \(\alpha\)。我们固定一种编码方式。对于字符串 \(\alpha\),我们用 \(M_{\alpha}\) 表示它编码的图灵机。如果 \(\alpha\) 不是一个有效的图灵机编码,我们就定义 \(M_{\alpha}\) 为一个计算常值零函数的平凡图灵机。
基于此,一个重要的结论是:存在一台通用图灵机(Universal Turing Machine) \(U\)。
通用图灵机 \(U\) 的行为可以描述为:在输入 \((\alpha, x)\) 上,模拟图灵机 \(M_{\alpha}\) 在输入 \(x\) 上的运行。\(U\) 可以通过解读 \(\alpha\) 中编码的转移函数,并在自己的工作磁带上模拟 \(M_{\alpha}\) 的磁带状态来实现这一点。其设计细节可以作为练习。
停机问题
利用通用图灵机的概念,我们可以定义著名的停机问题(Halting Problem)。
停机问题 \(HALT\) 是一个语言,其包含所有这样的字符串对 \((\alpha, x)\):其中 \(\alpha\) 编码的图灵机 \(M_{\alpha}\) 在输入 \(x\) 上会停机并输出一个答案(无论是接受还是拒绝)。
停机问题是不可判定的,这意味着不存在一台图灵机能够正确判定任意 \((\alpha, x)\) 是否属于 \(HALT\)。这展示了计算固有的极限。
总结
本节课中我们一起学习了:
- 渐进符号(\(O, \Omega, \Theta, o, \omega\))的应用与比较,特别是多项式与指数函数的渐进关系。
- 图灵机模型的关键约束:无随机访问,读写头只能逐格移动,这导致像二分查找这样的算法在图灵机模型上至少需要线性时间。
- 丘奇-图灵论题及其意义,以及可计算性、多项式时间可计算性(高效算法)的概念。
- 图灵机可以通过编码成为另一台图灵机的输入,从而引出了通用图灵机的概念。
- 基于通用图灵机,我们定义了经典的停机问题,它揭示了计算的边界。

这些概念为后续深入研究计算复杂性理论奠定了坚实的基础。
006:停机问题与对角化论证

在本节课中,我们将学习计算理论中的一个核心概念:停机问题。我们将看到,尽管图灵机功能强大,但存在一些问题是任何图灵机都无法解决的。我们将通过一个巧妙的“对角化论证”来证明停机问题是不可计算的,并了解这一论证在数学史上的深远影响。
停机问题的定义
上一节我们介绍了图灵机作为计算模型。本节中,我们来看看一个关于图灵机自身行为的根本性问题:停机问题。
停机问题可以形式化为一个语言 HALT。该语言的字符串集合由形如 <M, x> 的编码组成,其中:
M代表一台图灵机。x代表一个输入字符串。
一个字符串 <M, x> 属于 HALT 语言(即答案为“是”)的条件是:图灵机 M 在输入 x 上运行最终会停机。
因此,停机问题就是问:是否存在一台图灵机(算法),能够判定任意给定的 <M, x> 是否属于 HALT?换句话说,我们能否设计一个算法来测试另一台图灵机在特定输入上是否会陷入无限循环?
停机问题的不可计算性证明
我们将证明 HALT 是不可计算的。这意味着不存在任何图灵机可以解决停机问题。
证明采用反证法。我们首先假设存在一台图灵机 M0 能够判定 HALT。
M0的输入是<α, x>,其中α是某台图灵机M_α的编码。M0的输出定义如下:- 如果
M_α在输入x上停机,则M0(<α, x>)输出 1。 - 如果
M_α在输入x上不停机(即进入无限循环),则M0(<α, x>)输出 0。
- 如果
接下来,我们利用这台假设存在的 M0 来构造一台新的图灵机 M‘。M‘ 的行为定义如下:
给定输入 α(一个图灵机编码),M‘ 执行以下步骤:
- 它调用
M0来判定M_α在自身编码α上是否会停机。即计算M0(<α, α>)。 - 根据
M0的结果,M‘采取相反的行动:- 如果
M0(<α, α>)输出 1(表示M_α在α上停机),那么M‘就模拟M_α在α上的计算,并输出与M_α结果相反的答案。 - 如果
M0(<α, α>)输出 0(表示M_α在α上不停机),那么M‘直接输出 1。
- 如果
关键在于,无论 M0 给出什么答案,M‘ 都被设计成总是会停机并输出 0 或 1。
现在,矛盾出现了。让我们考虑 M‘ 在它自身的编码上运行会发生什么。设 β 是图灵机 M‘ 的编码,即 M_β = M‘。我们问:M_β 在输入 β 上运行会输出什么?
我们来分析 M_β(β)(即 M‘(β))的计算过程:
- 根据
M‘的定义,它首先计算M0(<β, β>)。 - 情况一:假设
M0(<β, β>)输出 1。这意味着M_β(即M‘)在β上应该停机。于是M‘进入步骤2,它模拟M_β(β)并输出其结果的反码。但M_β(β)的模拟结果就是M‘(β)自身,这导致了一个逻辑循环,其输出必须与自身相反,这是不可能的。 - 情况二:假设
M0(<β, β>)输出 0。这意味着M_β在β上不应该停机。但根据M‘的定义,在这种情况下它会直接输出 1 并停机。这直接与M0的判断(M_β在β上不停机)相矛盾。
因此,无论 M0 对 <β, β> 做出何种判断,都会导致矛盾。这个矛盾源于我们最初的假设——存在能判定 HALT 的图灵机 M0。所以,这样的 M0 不可能存在。HALT 问题是不可计算的。
何为“对角化论证”?
上述证明技巧被称为“对角化论证”。这个名字来源于一种形象的理解方式。
想象一个巨大的表格:
- 行索引是所有可能的图灵机编码
α。 - 列索引是所有可能的输入字符串
x。 - 表格第
α行、第x列的元素表示图灵机M_α在输入x上是否停机(1 或 0)。
我们构造的图灵机 M‘ 特别关注这个表格的对角线上的条目,即 M_α(α) 的值。M‘ 被设计成:当输入为 α 时,其输出与对角线上的值 M_α(α) 相反。
现在,如果 M‘ 自己的编码是 β,那么它应该出现在表格的第 β 行。这一行第 β 列的值(即对角线上的值)应该是 M_β(β)。但根据 M‘ 的定义,这个值必须与 M0 计算出的 M_β(β) 值相反。这就使得 M_β 无法在表格中找到自己的位置,从而引出矛盾。本质上,M‘ 是一台与所有 M_α 在对角线上行为都不同的图灵机,因此它不可能被包含在原本被认为完备的列表之中。
对角化论证在数学史上的应用
对角化论证是一种强大而深刻的证明技巧,在图灵之前就已在数学基础研究中多次出现。以下是三个著名的例子:
以下是三个著名的例子:
- 康托尔的对角线论证(1891):用于证明实数集是不可数的。即,不存在从自然数集到实数集的一一对应。康托尔通过假设存在这样一个对应(列表),然后构造一个新的实数,其每一位都与列表中对应位置实数的相应位不同,从而证明该实数不在列表之中,产生矛盾。
- 罗素悖论:在朴素集合论中,考虑集合
S = {x | x ∉ x},即“所有不属于自身的集合的集合”。那么S是否属于S本身?如果S ∈ S,根据定义应有S ∉ S;如果S ∉ S,根据定义又应有S ∈ S。这构成了一个悖论,说明了“所有集合的集合”这类概念会导致矛盾。 - 哥德尔不完备性定理:在数学逻辑中,哥德尔证明了在任何足以表达自然数算术的一致公理系统中,都存在一些命题,既不能被证明,也不能被证伪。其证明的核心思想也包含了某种形式的自指和对角化。
归约:证明不可计算性的工具
既然我们已经知道 HALT 是不可计算的,如何证明其他问题也是不可计算的呢?一个强有力的工具是“归约”。
其核心思想是:如果问题 A 可以“归约”到问题 B,并且 A 是不可计算的,那么 B 也一定是不可计算的。因为如果 B 是可计算的,我们就可以利用这个计算过程来解决 A,这与 A 的不可计算性矛盾。
更形式化地说,如果我们想证明某个函数 F 是不可计算的,可以通过构造一个可计算的转换函数 F‘,使得对于任意输入 x,满足:
HALT(x) = F( F‘(x) )
这意味着,解决 F 就能解决 HALT。既然 HALT 不可解,那么 F 也必然不可解。我们记作 HALT ≤ F,表示 HALT 可归约到 F,F 至少和 HALT 一样难。
总结
本节课中我们一起学习了:
- 停机问题的形式化定义:判定一台图灵机在给定输入上是否会停机。
- 通过巧妙的对角化论证证明了停机问题是不可计算的,即不存在通用的算法能解决它。
- 理解了对角化这一核心论证技巧,并看到了它在康托尔、罗素和哥德尔等数学基础重大发现中的应用。
- 介绍了归约的概念,作为利用已知的不可计算问题(如停机问题)来证明新问题不可计算的基本工具。


停机问题的不可判定性是计算理论的基石,它揭示了计算的固有局限性。在接下来的课程中,我们将把目光转向那些可计算的问题,并研究如何比较和衡量它们的计算难度。
007:从停机问题到P与NP类

在本节课中,我们将学习计算复杂性理论的核心概念。我们将从不可计算问题出发,引入“归约”的思想,然后定义时间复杂度的概念,并最终介绍两个最重要的复杂性类:P(多项式时间可解问题)和NP(多项式时间可验证问题)。
停机问题与归约
上一节我们证明了停机问题是不可计算的,即不存在一个图灵机可以解决所有实例。这个证明技术被称为对角化法。
现在,我们引入一个在复杂性理论中至关重要的概念:归约。其基本思想是,如果你能将停机问题“归约”到另一个问题F,那么问题F也同样是不可计算的。
归约的形式化定义如下:假设你想计算函数 f1(x)。如果存在一个可计算函数 F‘,它能将输入 x 转换为 F‘ (x),使得 F(F‘ (x)) 的结果与 Halt(x)(停机问题的结果)相同,那么我们就说停机问题被归约到了问题F。这意味着,如果我们能解决问题F,那么通过这个归约过程,我们也能解决停机问题。因此,如果停机问题是不可计算的,那么问题F也必定是不可计算的。
有界资源与时间复杂度
现在,我们将从“可计算但可能耗时极长”的范畴,转向对计算时间和空间资源进行限制的研究,这将引出一系列复杂性类。
首先,我们定义图灵机的时间复杂度。对于一个图灵机M,我们定义其在所有长度为 n 的输入上运行的最大步数为 T_M(n)。这是一个关于输入长度 n 的函数。
我们通常使用渐近分析来理解这个函数。对于一个给定的时间函数 T(n)(例如 n^2 或 2^n),我们可以定义一个复杂性类 DTIME(T(n))。
以下是DTIME类的正式定义:
- DTIME(T(n)) 是所有语言(即判定问题)的集合,使得存在一个图灵机M,它能在
O(T(n))的时间内判定该语言。
例如,DTIME(n) 包含所有可在线性时间内解决的问题,这类算法通常非常高效。DTIME(n^2) 则包含所有可在二次时间内解决的问题。
复杂性类 P:多项式时间
在理论计算机科学中,我们通常将多项式时间的算法视为“快速”或“高效”的算法,这与指数时间算法形成鲜明对比。
这引出了最重要的复杂性类之一:P(确定性多项式时间)。
以下是P类的定义:
- P 是所有语言(判定问题)的集合,使得存在一个图灵机M和一个常数
c,使得M能在O(n^c)的时间内判定该语言。
换句话说,P类包含了所有能用多项式时间算法解决的问题。尽管在实践中,当常数 c 很大时(如 n^10),算法可能并不快,但在理论层面,多项式时间与指数时间的区分至关重要,并且P类作为一个数学抽象,成功地概括了“高效计算”的核心思想。
P类中包含了大量实际问题,例如:
- 图的连通性
- 算术运算
- 线性代数问题
- 搜索问题
实践中的难题与NP类
然而,并非所有实际问题都已知属于P类。存在一些“困难”问题,尽管它们可计算,但我们尚未发现解决它们的多项式时间算法。
以下是三个经典的难题示例:
- 旅行商问题:给定一个带权完全图和一个整数k,是否存在一条访问所有顶点恰好一次并返回起点、总长度不超过k的环路?
- 子集和问题:给定一个整数集合S和一个目标整数T,是否存在S的一个子集,其元素之和恰好等于T?
- 整数规划问题:给定一组线性不等式,是否存在一组整数解(或布尔解)满足所有不等式?
对于这些问题,已知的最佳算法通常需要检查指数级的可能性(如所有排列、所有子集),其时间复杂度为 O(2^n) 或 O(n!),属于指数时间类 EXP。
这些难题有一个共同的关键特征:虽然找到解可能很难,但验证一个给定的候选解是否正确却相对容易(可以在多项式时间内完成)。例如,给定一条环路,可以快速计算其总长度并与k比较;给定一个子集,可以快速求和并与T比较。
这个“高效可验证”的特性促使Cook和Levin定义了另一个核心复杂性类:NP(非确定性多项式时间)。
以下是NP类的定义:
- 一个语言L属于 NP,如果存在一个多项式时间图灵机M和一个常数
c,满足:对于任意输入字符串x,x属于L 当且仅当 存在一个长度不超过|x|^c的“证书”字符串y,使得图灵机M在输入(x, y)上能在多项式时间内接受。
这里的图灵机M扮演了验证者的角色,而证书 y 可以理解为问题的一个“解”或“证明”。NP类包含了所有其解可以在多项式时间内被验证的判定问题。
总结
本节课我们一起学习了计算复杂性理论的基础框架。我们从不可计算的停机问题出发,通过归约方法将问题的难度联系起来。接着,我们引入了时间复杂度的概念,并定义了基于确定型图灵机的复杂性类 DTIME。
我们重点介绍了两个核心复杂性类:
- P:代表那些存在多项式时间算法解决的问题,被视为理论上的“高效”问题类。
- NP:代表那些其解可以在多项式时间内被验证的问题类。许多重要的组合优化问题(如旅行商问题)都属于NP。

理解P与NP的关系——即P是否等于NP——是理论计算机科学中最深奥、最重要的未解问题之一,我们将在后续课程中继续探讨。
008:NP类与非确定性图灵机

在本节课中,我们将学习计算复杂性理论中的一个核心概念:NP类。我们将从NP的定义出发,通过例子理解它,并探讨它与P类和EXP类的关系。最后,我们将引入非确定性图灵机的概念,并解释NP类名称的由来。
NP的定义与验证
上一节我们介绍了P类问题,即可以在多项式时间内解决的问题。本节中我们来看看另一类重要的问题:NP类问题。NP类由库克和莱文独立提出,其灵感来源于那些看似难以求解,但一旦给出一个“答案”,就很容易验证其正确性的优化问题。
NP类包含了所有满足以下条件的判定问题:存在一个多项式时间的图灵机M(称为验证器),对于问题的每个“是”实例x,都存在一个字符串u(称为证书),使得验证器M在输入(x, u)后能在多项式时间内接受。反之,如果x是“否”实例,则不存在这样的证书。
以下是定义的核心要点:
- 验证器:一个多项式时间的图灵机M。
- 证书:一个字符串u,其长度是输入x长度的多项式倍。
- 验证过程:对于“是”实例x,存在一个证书u,使得M(x, u)接受。
NP问题示例
为了更具体地理解,让我们看一个NP问题的例子:子集和问题。
子集和问题的判定版本是:给定一个整数集合S和一个目标值T,问是否存在S的一个子集,其元素之和恰好等于T。
对于这个问题的“是”实例(S, T),一个自然的证书就是那个和为T的子集U本身。验证器M的工作非常简单:
- 检查U是否是S的子集。
- 计算U中所有元素的和,检查其是否等于T。
这两个检查步骤都可以在多项式时间内完成。同时,证书U的大小不会超过输入(S, T)的大小。因此,根据定义,子集和问题属于NP类。类似地,像“一-in-三 SAT”这样的问题也属于NP。
P、NP与EXP的关系
现在,让我们将NP类放在我们已知的复杂性类中进行定位。一个重要的结论是:P ⊆ NP ⊆ EXP。
P ⊆ NP 的证明是简单的。如果一个语言L在P中,意味着存在一个多项式时间图灵机M可以直接判定它。我们可以将这个M本身看作一个验证器,并取证书u为空字符串。这样,对于“是”实例x,M(x)本身就接受了,满足NP的定义。因此,所有P类问题也都是NP类问题。
NP ⊆ EXP 的证明思路是暴力搜索。对于一个NP问题,其“是”实例x必然存在一个长度不超过|x|c的证书u(c为常数)。最笨的算法就是枚举所有可能的证书字符串(最多有2{|x|c}个),对每一个候选证书,用多项式时间的验证器M进行检查。验证器M检查一个候选证书的时间是多项式时间,设为O(|x|d)。因此,总时间开销是 2^{O(|x|^c)} * O(|x|^d),这仍然是一个指数时间算法。所以,任何NP问题都可以在指数时间内解决,即NP ⊆ EXP。
P与NP问题
虽然我们知道P ⊆ NP ⊆ EXP,但它们之间是否是真子集关系是计算机科学中著名的开放问题。
- 我们不知道P是否等于NP(即是否所有NP问题都能被高效解决)。普遍猜想是P ≠ NP。
- 我们不知道NP是否等于EXP。同样,猜想是NP ≠ EXP。
一个有趣的事实是,在本课程后续内容中,我们将能够证明P ≠ EXP,即多项式时间和指数时间确实是不同的复杂度类。这说明P和EXP之间存在巨大的鸿沟,而NP就位于这个鸿沟之中,但我们尚不清楚它更靠近P端还是EXP端。
非确定性图灵机
最后,我们来解释NP中“N”的含义。N代表“非确定性”,全称是非确定性多项式时间。
为什么叫这个名字?这需要引入一个新的计算模型:非确定性图灵机。它与我们熟悉的确定性图灵机类似,但关键区别在于转移函数。
- 在确定性图灵机中,给定当前状态和读头下的符号,转移函数唯一确定了下一个状态、要写的符号和读头的移动方向。
- 在非确定性图灵机中,给定当前配置,存在多个(通常我们简化为两个)可能的下一步配置。你可以将其视为转移“关系”而非“函数”。
NDTM在计算时,每一步都可以“选择”走其中一条分支。我们如何定义它的接受准则呢?
- 我们说一台NDTM 接受输入x,当且仅当存在至少一条计算路径(即一系列选择序列)最终进入接受状态。
- 反之,如果所有可能的计算路径都最终拒绝,则NDTM 拒绝输入x。
NDTM的时间复杂度定义为:在所有可能计算路径中,所需的最大步数。这是一个理论模型,并不对应现实的计算机,但它为理解NP类提供了另一个视角:NP恰好就是那些能在非确定性图灵机上以多项式时间判定的语言集合。验证器猜测证书并验证的过程,正对应了NDTM在多项式时间内“猜中”正确解路径的行为。
总结
本节课中我们一起学习了:
- NP类的正式定义:存在多项式时间验证器和短证书的判定问题集合。
- 通过子集和问题的例子理解了验证过程。
- 证明了复杂度类之间的包含关系:P ⊆ NP ⊆ EXP。
- 探讨了P与NP问题这一核心开放性问题。
- 引入了非确定性图灵机模型,并解释了NP名称的由来。

理解NP类是进入计算复杂性理论更深领域的关键一步,它为研究NP完全性等概念奠定了基础。
009:NP的等价定义与SAT问题

在本节课中,我们将学习NP问题的另一种定义方式——非确定性图灵机,并介绍一个在NP中至关重要的核心问题:布尔可满足性问题。
NP与非确定性图灵机
上一节我们介绍了通过验证器来定义NP类。本节中,我们来看看如何用非确定性图灵机来等价地定义NP。
非确定性图灵机在每一步都有两种可能的转移函数:δ₀ 和 δ₁。机器可以选择其中任意一个。我们不知道它会做出何种选择,但我们说,如果存在至少一条接受路径,机器就接受输入字符串;如果所有路径都拒绝,则拒绝输入。
对于一个运行时间为T步的非确定性图灵机,其可能的路径总数为 2ᵀ,这是一个指数级的数量。因此,非确定性图灵机是一个理论构造,无法在实际中高效实现。
非确定性图灵机的时间复杂度定义为所有可能路径中的最大长度。这很重要,因为要判断一个输入是否为“否”实例,必须检查所有路径。
复杂度类NTIME
与非确定性图灵机相关的复杂度类是 NTIME。定义如下:
NTIME(T(n)) 表示所有能被一台时间复杂度为 O(T(n)) 的非确定性图灵机判定的语言集合。
特别地,我们关心多项式时间非确定性图灵机所能解决的问题类,即 NP = ∪ₖ NTIME(nᵏ)。
NP的等价定义
现在,我们来证明通过验证器定义的NP类与通过非确定性图灵机定义的NP类是等价的。
定理:NP = ∪ₖ NTIME(nᵏ)

证明:
我们需要证明两个方向的包含关系。
1. NP ⊆ ∪ₖ NTIME(nᵏ)
设语言 L ∈ NP,则存在一个多项式时间验证器图灵机 M。我们可以构造一台非确定性图灵机 N 来判定 L:
- N 在输入 x 上运行时,首先非确定性地“猜测”一个证书 w(通过一系列选择0或1的步骤写入工作带)。
- 然后,N 模拟验证器 M 在输入 (x, w) 上的运行。
- 如果 x ∈ L,则存在某个证书 w 使得 M 接受,因此 N 的某条路径会接受。
- 如果 x ∉ L,则对所有证书 w,M 都拒绝,因此 N 的所有路径都拒绝。
由于猜测和模拟都在多项式时间内完成,因此 L ∈ NTIME(nᵏ) 对于某个 k 成立。
2. ∪ₖ NTIME(nᵏ) ⊆ NP
设语言 L ∈ NTIME(nᵏ),由非确定性图灵机 N 在时间 O(nᵏ) 内判定。我们可以构造一个多项式时间验证器 M:
- 对于输入 x,证书 u 被解释为在 N 的计算中,每一步应选择哪个转移函数(0或1)的指示序列。
- 验证器 M 在输入 (x, u) 上,确定性地模拟 N 在输入 x 上的运行,但每一步都根据证书 u 的指示来选择转移函数。
- 如果存在一个证书 u 使得这条模拟路径接受,则 M 接受。这意味着 x ∈ L。
- 如果对于所有证书 u,模拟路径都拒绝,则 M 拒绝。这意味着 x ∉ L。
由于模拟是确定性的且运行时间多项式,因此 L ∈ NP。
综上,我们证明了 NP = ∪ₖ NTIME(nᵏ)。这表明,非确定性图灵机完美地刻画了那些“易于验证但可能难于求解”的问题。
布尔可满足性问题
在理解了NP的两种等价定义后,我们聚焦于NP中一个极其重要的问题:布尔可满足性问题。
SAT问题定义如下:
- 输入:一个合取范式布尔公式 Φ。
- 问题:判断是否存在一个对变量的赋值,使得公式 Φ 的值为真(即可满足)。
合取范式是指公式由多个子句的合取构成,每个子句是多个文字的析取。文字是变量或其否定。
例如,公式 (x₁ ∨ ¬x₂) ∧ (¬x₁) 是可满足的(令 x₁=0, x₂=0 即可)。而公式 (x₁) ∧ (¬x₁) 是不可满足的,因为它包含了矛盾。
引理1:SAT ∈ NP
给定一个公式 Φ 和一个候选赋值 x,很容易在多项式时间内验证 Φ(x) 是否等于1。因此,赋值 x 可以作为证书,验证过程是高效的。
SAT的NP完全性
SAT的重要性不仅在于它属于NP,更在于它是NP中最“难”的问题之一。下面的引理阐述了其核心地位。
引理2:对于任意 L ∈ NP,存在多项式时间归约算法 R,使得 x ∈ L 当且仅当 R(x) ∈ SAT。

这意味着,如果能在多项式时间内解决SAT问题,那么就能在多项式时间内解决NP中的所有问题。SAT是NP完全的。
证明思路:
设 L ∈ NP,由验证器图灵机 M 在时间 T 内验证。归约算法 R 的工作是将输入 x 转换成一个布尔公式 Φₓ,其可满足性等价于 x ∈ L。
- 构造的关键在于将验证器 M 在输入 (x, w) 上的整个计算过程(一系列配置)编码成一个布尔公式。
- 公式的变量用于表示计算过程中每个时间点的配置信息:状态、读写头位置、带子内容等。
- 公式的约束条件用于确保:
- 初始配置正确(对应输入 x)。
- 每一步配置之间的转移都遵循 M 的规则。
- 最终配置是接受状态。
- 在这个编码中,证书 w 的值成为公式中需要被满足的一部分自由变量。
- 如果存在一个赋值(即存在一个证书 w)能满足整个公式,就意味着存在一条接受的计算路径,即 x ∈ L。
- 反之,如果公式不可满足,则意味着没有证书能使 M 接受,即 x ∉ L。
由于验证器 M 的运行时间是多项式的,因此编码产生的公式 Φₓ 其大小也是多项式的,并且归约过程可以在多项式时间内完成。
总结
本节课中我们一起学习了:
- NP的等价定义:我们证明了通过“多项式时间验证器”定义的NP类,与通过“多项式时间非确定性图灵机”定义的NP类是等价的。这加深了我们对NP类本质的理解。
- SAT问题:我们介绍了布尔可满足性问题,并证明了它属于NP。
- SAT的核心地位:我们概述了SAT是NP完全的关键思想——任何NP问题都可以在多项式时间内归约到SAT。这意味着SAT是NP类中“最难”的问题之一,攻克SAT就等于攻克了所有NP问题。

理解SAT的NP完全性是计算复杂性理论的一个里程碑,它为研究P与NP关系以及其他复杂性类奠定了基础。
010:从NP到SAT的归约(Cook-Levin定理)详解

在本节课中,我们将深入学习Cook-Levin定理证明的核心部分,即如何将非确定性图灵机的计算过程编码成一个布尔公式。我们将重点关注如何构造公式的Compute部分,它负责验证计算步骤的正确性。
上一节我们介绍了如何用布尔公式描述计算的起始和终止配置。本节中,我们来看看如何描述计算过程本身,即从一个配置到下一个配置的合法转移。
计算过程的编码:Compute公式
Compute公式的目标是断言存在一个配置序列 C1 = G0, G1, ..., Gt-1 = C2,使得序列中的每一步 Gi 到 Gi+1 都遵循图灵机 M 的转移函数 δ。
其逻辑结构可以表示为:
Compute(C1, C2) = ∃ G1, G2, ..., Gt-2:
[ (G0 = C1) ∧ (Gt-1 = C2) ∧
∀ i ∈ {0, ..., t-2}: Step(Gi, Gi+1) ]
其中,Step(Gi, Gi+1) 是一个布尔公式,用于检查从配置 Gi 到 Gi+1 的一步转移是否合法。
单步转移的检查:Step公式
Step 公式需要检查:给定两个配置 C3 和 C4,以及一个来自转移函数 δ 的具体指令 I,判断 C3 到 C4 的一步转移是否恰好遵循了指令 I。
一条指令 I 通常包含以下信息:
- 当前状态
s - 读头下输入带符号
b1和工作带符号b2 - 下一状态
s‘ - 要写入工作带的符号
b2’ - 输入带头移动方向
ε1(左L,右R,不动S) - 工作带头移动方向
ε2(左L,右R,不动S)
以下是构造 Step 公式的思路。我们以 ε1 = S (不动) 且 ε2 = S (不动) 的情况为例进行说明。
对于给定的配置 C3 和 C4,以及指令 I,Step 公式需要断言以下所有条件同时成立:
- 状态匹配:
C3的状态必须是s,C4的状态必须是s‘。 - 带头位置:存在位置
k(输入带头) 和k’(工作带头),使得在C3和C4中,输入带头都位于k,工作带头都位于k’。(因为带头不动) - 带头下符号:在
C3中,输入带位置k的符号是b1,工作带位置k’的符号是b2。在C4中,工作带位置k’的符号变为b2’。 - 非带头位置不变:除了工作带位置
k’的符号按规则改变外,C3和C4的所有其他带单元符号必须完全相同。
将以上所有条件用逻辑“与”(∧)连接起来,就得到了针对“不动-不动”指令的 Step 公式。对于 ε1 和 ε2 的其他8种组合(如左移、右移),可以类似地构造相应的公式。
关键实现细节与挑战
在将上述逻辑构想实现为合取范式(CNF)布尔公式时,我们遇到几个关键挑战:
- 变量的角色:在我们的归约中,证书
u的部分将成为最终布尔公式中的变量。公式的可满足性对应于存在一个证书u使得验证机M接受输入(x, u)。 - 相等性的编码:在公式中,我们频繁检查两个符号或字符串是否相等。这可以通过对每个位(bit)进行异或非(XNOR)操作来实现。对于两个位
a和b,a = b可以表示为(a ∧ b) ∨ (¬a ∧ ¬b)。字符串的相等则是每个对应位相等条件的合取。 - 全称量词(∀)的处理:公式中的
∀ i(对所有步骤i)可以直接展开为t个Step子公式的合取,因为t是输入规模的多项式,展开后公式规模仍然是多项式的。 - 存在量词(∃)的挑战:最棘手的部分是
Step公式中“存在位置k和k’”这一存在量词。我们不能简单地在CNF中写一个析取(∨),因为k和k’的可能取值有t个,直接展开会导致指数级规模的析取式。
解决方案: Oblivious图灵机
为了解决存在量词带来的挑战,证明中采用了一个关键技巧:我们可以假设验证机 M 是一个 Oblivious图灵机。
Oblivious图灵机的特点是:其读头在每一步的移动位置仅取决于输入的长度 |x| 和当前的步数 i,而与输入 x 的具体内容以及证书 u 完全无关。
这个假设是合理的,因为任何图灵机都可以被改造成一个等价的Oblivious图灵机,且只带来多项式的时间开销。这通常作为一道练习来证明。
在Oblivious的假设下,我们知道在计算第 i 步时,输入带头和工作带头必然位于某个由 n 和 i 决定的固定位置 K1(i) 和 K2(i)。因此,“存在位置 k” 就不再是一个需要猜测的变量,而是一个已知的函数值。这样,Step 公式中就不再需要存在量词,我们可以直接用 K1(i) 和 K2(i) 来指代带头位置,从而将所有条件都写成确定的合取形式。
总结

本节课中我们一起学习了Cook-Levin定理证明的核心构造。我们详细探讨了如何将非确定性图灵机的计算过程编码为布尔公式,重点是构造验证计算步骤的 Compute 和 Step 公式。我们遇到了将存在量词(∃)编码到合取范式中的挑战,并通过引入 Oblivious图灵机 的概念巧妙地解决了这一问题。这保证了最终生成的布尔公式规模是输入规模的多项式,从而完成了从任意NP问题到SAT问题的多项式时间归约。下一节,我们将整合所有部分,完成整个定理的证明。
011:NP完全性与归约

概述
在本节课中,我们将学习NP完全性的核心概念,特别是如何证明一个问题是NP完全的。我们将回顾库克-列文定理的证明思路,理解如何将任意NP问题归约到布尔可满足性问题,并进一步简化为3-SAT问题。最后,我们将介绍归约的概念,并通过一个简单的例子展示如何证明整数规划问题是NP完全的。
从任意NP问题到SAT的归约
上一节我们介绍了可满足性问题。研究SAT问题的规模是容易的,因为一个可满足的公式可以很容易地被验证。给定一个赋值,验证过程是直接的。但更困难的是证明NP中的任何问题都能高效地归约到SAT问题。
考虑一个NP中的问题L。我们将展示为什么它能被写成一个布尔公式。思路是,我们取解决L的非确定性图灵机,将其视为一个验证器。这台图灵机M作为一个验证器,寻找一个证书u,或者给定一个证书u,它将检查u是否通过这台验证图灵机M证明了x。因此,u应该被视为形式变量,即未知数。x是已知变量。我们将根据u得到一个布尔公式,最终我们称之为φ。
这个公式本质上将捕捉一个配置如何通过转移函数变化到下一个配置。配置是一组变量,数量与输入带和工作带上使用的单元一样多。它捕捉了a0'到a_{t-1}'和e0到e_{t-1},当然还有状态和读写头位置。
首先,我们将其分解为起始配置、计算步骤和停止配置。起始和停止配置是简单的。对于计算部分,我们进一步将其分解为步骤。假设时间为T,将会有T个步骤。计算步骤从配置C1到C2的描述,本质上归结为检查配置C3到C4是否遵循转移函数δ的转移规则。我们可以捕捉这一点。
这里的关键点是,在捕捉这一点时,需要知道读写头位置k'和k。读写头位置是什么?如何在计算过程中找出读写头位置?为此,我们实际上假设图灵机是“无记忆”的。这样,在第i步读写头的位置将是预先确定的,与x无关。这可以被假设。读写头位置作为i的函数,这可以被假设。你不需要知道x或u,u是未知的,但即使对于x也不需要,只需要x的长度。这将是一个赋值问题。
如何将一个图灵机转换为无记忆图灵机?有了这个假设,由于k是作为i的已知函数,所以这个步骤i可以很容易地写成一个等式,最终转换为AND、OR、NOT操作。所以最终它是一个布尔公式。
构造的公式及其性质
我们最终得到的公式,我们称之为φ(x, u)。这个公式具有以下性质:φ(x, u)关于u是可满足的,当且仅当存在一个证书u,从而图灵机接受,即φ(x, u)为真。这又当且仅当x是一个“是”字符串。因此,输入字符串x是一个“是”字符串,当且仅当该公式是可满足的。
这个公式的规模有多大?它不是一个很大的公式。我们所做的本质上是有T个步骤,每个步骤i内部最多有T次比较。所以它是O(T²)的规模。这完成了证明。
因此,我们已经高效地将L归约到了SAT。我们写作 L ≤_p SAT,其中p指的是我们刚刚给出的多项式时间归约。所以NP中的任何问题都归约到SAT。这正是我们承诺要证明的。
简化为3-SAT
事实上,我们可以使这个公式φ更加特殊。公式φ可以简化为另一个公式,即可以简化为一个每个子句只有三个文字的合取范式,使得ψ是可满足的,当且仅当φ是可满足的。
一般来说,CNF公式φ总是可以转换为一个每个子句只有三个文字的CNF公式ψ。这被称为3-CNF。
这个断言的证明是什么?对于一个有,比如说,4个文字的子句,我们可以通过引入一个新变量,将其分解为更多每个只有三个文字的子句。思路是将一个有多于三个文字的子句转换为多个每个有三个文字的子句。我们需要为此引入一个新变量。
让我们通过一个例子来看,这就足够了。取子句P为 (x1 ∨ ¬x2 ∨ x3 ∨ ¬x4)。你可以将其转换为ψ,其中你看前两个文字和后两个文字。使用x1和¬x2与一个新变量z,然后使用其补集。你可以看到这两个是等价的。检查φ和ψ确实是相同的。因为如果这两个子句都为真,它是一个AND运算。假设z为0,则意味着x1 ∨ ¬x2部分必须为真。如果z为1,则意味着x3 ∨ ¬x4部分必须为真。我们将其分解为两种情况,这基本上是一个案例分析。
这样,任何有k个文字的子句都有一个等价的3-CNF。如前所述,3-CNF是子句的合取,其中每个子句只有三个文字。
由此得到的结果是3-SAT。什么是3-SAT?它是可满足的3-CNF公式的集合。因此,3-SAT和SAT一样困难。所以,这就是我们所在的位置。如果输入是子句的合取,其中每个子句只有三个文字,问题是它是否可满足,那么这个问题和整个NP一样困难。3-SAT是NP完全的。
这里有一个你应该作为练习的问题:2-SAT呢?以及3-SAT的特殊情况呢?2-SAT每个子句只有两个文字。你也可以研究介于2-SAT和3-SAT之间的设置,看看3-SAT是否可以进一步简化。提示是2-SAT实际上可以在多项式时间内解决。但在2-SAT和3-SAT之间可能仍然存在有趣的问题,你可以想出来。
归约的形式化定义
现在让我们形式化我们刚刚做的归约。如果存在一个多项式时间图灵机M,使得x是否是A中的“是”字符串这个问题,机器M会将x转换为M(x)在B中,那么语言A是多项式时间卡普可归约到语言B的。多项式时间卡普可归约意味着你可以高效地将输入转换为一个不同的字符串,该字符串对应于B的“是”字符串,当且仅当原始输入是A的“是”字符串。这是一种非常强的归约类型,A和B之间的等价性。这就是我们定义的A以强方式归约到B。
如果NP中的每个问题都归约到B,那么B被称为NP困难的。这是你可能听说过的术语,一个问题是否是NP困难的,或者仅仅是一个问题是否困难。通常这意味着它是如此困难,以至于如果你解决了它,那么你就解决了NP中的每个问题,通过使用卡普归约,多项式时间卡普归约存在。
最后,NP完全性意味着B本身在NP中。如果B是NP困难的并且在NP中,那么B被称为NP完全的。所以这个问题对于NP是完全的。
我们可以重新表述我们刚刚证明的内容为以下定理,由库克和列文提出:3-SAT是NP完全的。这是半个世纪前证明的,3-SAT是一个NP完全问题。直到现在,我们仍然不知道是否能在多项式时间内解决它。猜想是NP完全意味着你不能在多项式时间内解决它,但没有证明。尽管我们刚刚展示了这个完全性结果。
我们已经证明,对于NP中的每种语言,A可以多项式时间卡普归约到3-SAT。而且,3-SAT本身在NP中,这是毫无疑问的,因为3-SAT只是一个公式,所以给定一个赋值,你可以验证它,这是平凡的,存在一个验证器。所以3-SAT既在NP中又是NP困难的,因此它是NP完全的。
归约的重要性与性质
归约在计算机科学中实际上非常重要,我们一直使用它们。它们在数学中也很重要,但某种程度上没有这样形式化,但在计算机科学中,我们将其形式化并一直使用。归约也可以被认为是调用程序子程序。所以你产生你的问题并在其他地方解决它,这基本上是编程思想。这种归约与编程思想是一致的。
归约的一些简单性质:如果A归约到B,并且B归约到C,那么A归约到C。这种传递性来自定义,因为无论你如何将A中的x转换为B中的M1(x),然后将其转换为C中的M2(M1(x)),取复合,你就有了从A到C的归约。
如果A是NP困难的,并且A在P中,这意味着什么?如果你找到了一个NP困难问题的算法,那么你就证明了NP中的每个问题都是容易的,所以你证明了P等于NP。如果你证明了P等于NP,那么P中的任何问题都可以被认为是NP困难的。实际上,这两件事是等价的,当且仅当。
如果A是NP困难的,并且A归约到B,那么会怎样?如果你将一个NP困难问题归约到B,那么B必须至少同样困难。所以B至少是NP困难的。这就是我们认为NP完全问题是最困难的问题的意义。NP完全问题是NP中最困难的,因为无论你将其归约到哪个问题,那个问题也会变成NP困难的,如果它至少同样困难的话。所以基本上,这第三点可以这样理解:NP完全问题是最困难的,每个问题都归约到它们,如果它们归约到某个新问题,那么根据命题1,你的新问题也变成NP完全的。
所以SAT和3-SAT是NP完全问题的典型例子。还有其他例子吗?自然的例子有哪些?其他例子包括我在课程概述第一讲中提到的旅行商问题、子集和问题、整数规划。这些都是NP完全的。这些是一些实际问题,被证明是NP完全的。如何证明它们是NP完全的?首先你看到它们在NP中,这很容易。接下来,你必须从3-SAT归约到TSP、子集和、整数规划。每个归约你都必须努力。归约可能并不容易。
我们不会在本课程中做所有这些归约,我们会做一些简单的。但你可以阅读文献中的这些归约。这对本课程并不重要,因为实际上已知有成千上万的NP完全问题。所以,已经研究了数百个NP完全问题。NP完全问题可能是无限多的,但有数百个实际上是容易表述的,即所谓的自然问题,人们已经展示了归约,他们给出了证明,3-SAT归约到所有这些。所以让我们做一个简单的归约。
示例:证明整数规划是NP完全的
让我们展示整数规划是NP完全的。让我们看一下证明概要。我们已经证明了它在NP中。让我们限制在布尔解,即x在0和1之间。如果你限制在这个只是0/1解,通过引入这些不等式,很明显它将在NP中,因为如果有一个布尔解,有人给你,你可以验证它。
现在,NP困难部分。这需要更多的工作。在NP困难部分,我们将从一个3-CNF开始。让φ是一个3-CNF。让我们将每个子句转换为一个不等式。让我们这样做。例如,如果子句是 (x1 ∨ ¬x2 ∨ x3),那么你可以将其写为:首先,我们希望x1, x2, x3在0和1之间,这是我们想要的第一件事,因为我们想将x识别为假和真。接下来,我们想确保x1或(1 - x2)或x3中至少有一个是1。所以我们把它写下来:x1 + (1 - x2) + x3 ≥ 1。这就是我们在整数规划系统中写的不等式。注意,x1, (1 - x2)和x3不能全为0。换句话说,x1, ¬x2, x3不能全为假,因为如果发生这种情况,那么你将得到1 ≤ 0。所以这个不等式实际上意味着该子句为真,你对每个子句都这样做。每个子句给出一个新的不等式。所以,这证明了3-SAT归约到整数规划。而整数规划只涉及布尔点,每个不等式只有3个变量。所以它是非常特殊的。你甚至没有使用整数规划的全部能力,你只使用那些只关注0/1解、布尔可行解点,且每个不等式最多有三个变量的整数规划。这已经是NP完全的了。因此,由于整数规划的特殊情况是NP完全的,一般情况也是。
这种从布尔子句到算术的转换,自然被称为算术化。从布尔CNF到代数多项式,这被称为算术化。你也可以称之为代数化。这种算术化或代数化基本上是将原始的组合问题带入算术或代数。你看到了这个线性系统,我们也可以得到更高次的系统,这将在下一个例子中得到。

总结
本节课我们一起学习了NP完全性的核心概念。我们回顾了库克-列文定理,理解了如何将任意NP问题通过模拟其验证图灵机的计算过程,归约到布尔可满足性问题。我们进一步学习了如何将SAT简化为每个子句只有三个文字的3-SAT问题,从而证明了3-SAT的NP完全性。我们形式化了多项式时间归约的定义,并理解了NP困难和NP完全的含义。最后,我们通过一个将3-SAT归约到整数规划的例子,展示了如何利用归约来证明新问题的NP完全性。归约是计算机科学中连接不同问题的强大工具,而NP完全问题则代表了NP类中最困难的问题。
012:NP完全问题与coNP类

在本节课中,我们将学习如何将3-SAT问题进一步算术化,并引入一个重要的新概念:coNP复杂性类。我们将看到,即使对多项式系统求解问题施加严格的限制,它依然是NP难的。同时,我们将探讨coNP类的定义、其完全问题,以及它与NP类的关系。
二次方程系统求解是NP完全的
上一节我们介绍了使用线性不等式对3-SAT进行算术化。本节中,我们来看看另一种不使用不等式的算术化方法。
我们将3-SAT问题转化为一个模2的二次方程系统求解问题。具体来说,我们构造一个由二次多项式(次数为2)组成的系统S,其运算在模2(即二进制)下进行。我们只关心该系统的0/1解。问题是:系统S是否存在一个模2下的根(即满足所有方程的解)?这个问题被称为“二次方程系统求解(模2)”,它同样是NP完全的。
以下是证明思路:
- 属于NP:给定一个候选解(一个0/1向量),我们可以快速验证它是否满足所有方程。
- NP难:我们需要证明任何3-CNF公式都可以在多项式时间内转化为一个等价的模2二次方程系统。
我们通过一个例子来展示如何将单个子句转化为二次方程。
考虑子句:(x1 ∨ ¬x2 ∨ x3)。我们引入一个辅助变量z,并构造以下两个模2二次方程:
(x1 - 1) * z = 0(1 - x2) * (1 - x3) * (1 - z) = 0
逻辑解释:
- 方程1:要么
x1 = 1(使子句为真),要么z = 0。 - 方程2:如果
z = 0,则要求要么x2 = 0(使¬x2为真),要么x3 = 1(使x3为真)。 - 因此,原子句可满足,当且仅当这个由两个方程组成的系统有解。
对3-CNF公式中的每一个子句都进行这样的转换。最终,变量数量大约增加为原变量数加上子句数,方程数量约为子句数的两倍。这是一个多项式时间的规约。因此,模2二次方程系统求解是NP难的,结合其属于NP,所以它是NP完全的。
这个结论表明,即使是寻找非常特殊的(模2、二次)多项式系统的根,在计算上也是困难的。你可以尝试将这个证明思路推广到其他数域(如有理数域、实数域、复数域或其他有限域)上的二次方程系统求解问题,它们通常也是NP难的。
引入coNP复杂性类
现在,让我们从P和NP类出发,通过一个简单的操作来定义更多的复杂性类。第一个技巧是取“补”操作,我们称之为补类。
对于一个语言L,我们定义其补问题co-L就是L的补集。对于一个复杂性类C,我们可以将其中的所有语言的补集收集起来,定义一个新的复杂性类co-C,即补类。
由此,我们可以定义coNP类:
coNP = { L | 补集(L) ∈ NP }
换句话说,coNP包含了所有那些“补问题”属于NP的语言。
直观理解:
- 对于NP类,给定一个输入和一个“证书”,我们可以高效验证该输入是否是一个“是”实例(即属于该语言)。
- 对于coNP类,给定一个输入和一个“证书”,我们可以高效验证该输入是否是一个“否”实例(即不属于该语言)。
coNP的完全问题:重言式问题
一个自然的问题是:coNP类中“最难”的问题是什么?就像3-SAT是NP完全问题一样,3-SAT的补问题自动就是coNP完全的。但我们希望有一个更自然的定义。
这个完全问题就是重言式问题。
- 定义:给定一个命题逻辑公式φ(通常表示为析取范式DNF),问φ是否是一个重言式?即,是否对于变量的所有可能赋值,φ都取值为真?
断言:重言式问题是coNP完全的。
- 属于coNP:要验证一个公式不是重言式(即“否”实例),只需要给出一个使其为假的变量赋值作为证书,即可快速验证。因此,重言式问题的补问题属于NP,故重言式问题本身属于coNP。
- coNP难:我们需要证明任何coNP中的问题L都可以多项式时间规约到重言式问题。
- 因为L ∈ coNP,所以其补集
co-L ∈ NP。 - 根据库克-列文定理,存在一个从
co-L到3-SAT的多项式时间规约。即,对于输入x,我们可以构造一个3-CNF公式ψ(x),使得x ∉ L当且仅当ψ(x)是可满足的。 - 那么,
x ∈ L当且仅当ψ(x)不可满足。 - 一个公式不可满足,意味着它的否定
¬ψ(x)在所有赋值下都为真,即¬ψ(x)是一个重言式。 - 因此,我们将问题L的实例x,规约到了公式
¬ψ(x)是否为重言式的问题。这就完成了从任意coNP问题到重言式问题的规约。
- 因为L ∈ coNP,所以其补集
P、NP与coNP的关系
现在,我们来看一下P、NP和coNP这几个复杂性类之间的关系。以下是一些基本命题:
- P = coP:由于P类问题可以在多项式时间内直接求解,求解一个问题和求解其补问题的难度相同。
- P ⊆ NP ∩ coNP:显然,P类中的问题既属于NP(因为多项式时间解本身就是验证证书),也属于coNP。
- 如果 P = NP,那么 NP = coNP:因为如果P=NP,那么coNP = coP = P = NP。
- 其逆否命题是:如果 NP ≠ coNP,那么 P ≠ NP。这是证明P≠NP的一条潜在途径。
- NP ∪ coNP ⊆ EXP:NP问题和coNP问题都可以在指数时间(EXP)内通过穷举所有可能的证书来解决。
关于NP和coNP是否相等,是理论计算机科学中一个重大的未解决问题。普遍认为NP ≠ coNP,但这尚未被证明。如果NP = coNP,将会带来深刻的计算和代数意义,例如意味着存在一种高效的方法来验证一个多项式系统没有解(而目前我们只知道验证有解是容易的)。

本节课中我们一起学习了:
- 将3-SAT算术化为模2二次方程系统,证明了后者是NP完全的。
- 通过取补操作定义了coNP复杂性类,其特点是能高效验证“否”实例。
- 证明了重言式问题是coNP完全问题。
- 探讨了P、NP和coNP三类之间的基本包含关系,并指出了“NP是否等于coNP”是一个重要的开放性问题。
013:时间与空间层次定理 🔬

在本节课中,我们将学习计算复杂性理论中的核心概念——层次定理。我们将看到,当给定更多的计算资源(如时间或空间)时,图灵机能够解决更多的问题。我们将通过精巧的对角线法来证明这些定理,并探讨它们与P vs NP等开放问题的联系。
上一节我们介绍了co-NP类以及Tautology问题,并讨论了P、NP、EXP和NEXP之间的关系。本节中,我们将深入探讨层次定理,它严格地证明了“更多资源能解决更多问题”这一直观想法。
层次定理概述 📈
层次定理的核心思想是:对于一个固定的计算资源(如时间或空间),如果提供严格更多的资源,那么图灵机就能解决严格更多的问题。这与P vs NP问题不同,后者比较的是两种不同的资源(确定时间 vs 非确定时间)。
证明这些定理的关键工具是对角线法。这种方法曾用于证明停机问题的不可判定性和实数集的不可数性,现在它被巧妙地应用于计算复杂性理论中。
时间层次定理 ⏱️
定理1(确定性时间层次定理):
如果函数 g(n) 满足 g(n) ≥ f(n) log f(n),那么确定性时间类 DTIME(f(n)) 是 DTIME(g(n)) 的真子集。即:
DTIME(f(n)) ⊊ DTIME(g(n))
这意味着,只要时间函数 g(n) 比 f(n) 大一个对数因子,我们就能用 g(n) 的时间解决一些用 f(n) 时间无法解决的问题。
证明思路:构造一个“额外”的问题
证明的目标是构造一个语言 L,它属于 DTIME(g(n)),但不属于 DTIME(f(n))。我们通过设计一个图灵机 D 来实现这一点。
以下是图灵机 D 在输入 x 上的行为描述:
- 检查输入:如果
x不是一个合法的图灵机描述,则直接输出0(拒绝)。 - 模拟计算:将
x解释为一台图灵机M_x,并模拟M_x在它自身的描述x上运行。 - 时间截断:模拟过程最多进行
g(|x|)步。如果在g(|x|)步内M_x没有停机或没有输出,则D输出0。 - 取反输出:如果
M_x在g(|x|)步内停机并输出结果(0或1),那么D输出与之相反的结果(即1 - M_x(x))。
为何这能奏效?
L(D)属于DTIME(g(n)):根据构造,D在任意输入x上的运行时间都被明确限制在O(g(|x|))步内(主要用于模拟)。L(D)不属于DTIME(f(n)):我们使用反证法。假设存在一台图灵机M,它在O(f(n))时间内判定语言L(D)。考虑M自身的描述字符串(足够长,使其运行时间规律成立)。当我们用D去模拟M在这个字符串上的运行时,会发生以下情况:- 由于
f(n) log f(n) ≤ g(n),D有足够的时间(g(n)步)完成对M的模拟(这需要约O(f(n) log f(n))时间,因为模拟会有开销)。 - 根据
D的定义,它对M的输出进行了取反。这意味着对于这个特定的输入,D的输出与M的输出相反。 - 但
M被假定为判定L(D)的机器,所以它的输出应该和D的输出一致。这就产生了矛盾。
- 由于
因此,我们的假设错误,不存在这样的 M。语言 L(D) 就在 DTIME(g(n)) 中但不在 DTIME(f(n)) 中,从而证明了两类不同。
空间层次定理与其它层次 📊
类似的层次定理也适用于空间复杂度。
定理2(确定性空间层次定理):
如果函数 g(n) ≥ f(n),那么确定性空间类 SPACE(f(n)) 是 SPACE(g(n)) 的真子集。即:
SPACE(f(n)) ⊊ SPACE(g(n))
值得注意的是,空间层次定理的条件比时间层次定理更宽松,只要求 g(n) 更大,而不需要额外的对数因子。
无限复杂性类塔
利用层次定理,我们可以构建出一系列严格递增的复杂性类,形成一个无限的“塔”。
例如,从多项式时间开始:
P ⊊ EXP ⊊ 2-EXP ⊊ 3-EXP ⊊ ...
这里,2-EXP = DTIME(2^{2^{poly(n)}}) 表示双重指数时间,以此类推。
同样地,对于非确定性时间:
NP ⊊ NEXP ⊊ 2-NEXP ⊊ ...
这些已被证明的严格包含关系,与 P vs NP、NP vs co-NP、EXP vs NEXP 等尚未解决的开放问题形成了鲜明对比。层次定理处理的是同一资源下的定量增长,而开放问题涉及的是不同资源模型(如确定性与非确定性)之间的定性比较。
一个哲学启示:定理的自动化?🤖
让我们回到一个有趣的NP问题:THEOREM。
定义:语言 THEOREM = { (φ, 1^n) },其中 φ 是一个形式数学陈述,1^n 表示数字 n(一元编码)。(φ, 1^n) 属于 THEOREM 当且仅当存在一个长度不超过 n 的形式证明,能证明 φ 为真。
复杂性:THEOREM 是一个NP完全问题。因为给定一个候选证明(证书),我们可以在多项式时间内验证其正确性。
这个定义将计算复杂性与数学基础联系了起来。它引出了一个深刻的哲学问题:
如果 P = NP 会怎样?
如果 P = NP,那么就存在一个高效的多项式时间算法来解决 THEOREM 问题。这意味着,对于任何数学猜想 φ,我们都可以通过算法快速判断:“是否存在一个长度不超过 N 页的证明?”通过不断增大 N,我们最终能自动化地发现或否定大多数数学定理的证明。
这将从根本上改变数学研究的方式,甚至可能使数学家的工作被自动化。这从另一个角度说明了 P vs NP 问题不仅仅是一个技术性问题,更是一个关于数学探索和知识本质的深刻问题。


本节课中我们一起学习了计算复杂性理论中的核心工具——层次定理。我们看到了如何运用经典的对角线法证明时间与空间层次定理,从而严格确立了“更多资源解决更多问题”的原则。我们还探讨了由此产生的无限复杂性类塔,并通过 THEOREM 问题,将复杂性理论与数学哲学联系起来,理解了 P vs NP 问题的深远意义。
014:时间、空间与非确定性层次定理

在本节课中,我们将学习计算复杂性理论中的核心定理:时间、空间和非确定性时间层次定理。这些定理揭示了当计算资源(时间或空间)增加时,可解决的问题集合会严格扩大。我们将通过构造性的对角化证明来理解这些概念。
时间层次定理
上一节我们介绍了复杂性类的基本概念。本节中,我们来看看时间层次定理,它表明给予更多时间,图灵机可以解决更多问题。
定理1:如果函数 g(n) 是时间可构造的,并且满足 g(n) = ω(f(n) log f(n))(即 g(n) 渐近地大于 f(n) log f(n)),那么确定性时间复杂性类 DTIME(f(n)) 是 DTIME(g(n)) 的真子集。用公式表示为:
DTIME(f(n)) ⊂ DTIME(g(n))
我们将通过构造一个语言 L 来证明,该语言在 DTIME(g(n)) 中,但不在 DTIME(f(n)) 中。假设 L 能被一台在时间 c * f(n) 内运行的图灵机 M 判定。
以下是证明的核心步骤,我们构造一台图灵机 D:
- 如果输入
x不是有效的图灵机描述符,则输出0。 - 否则,在时间
g(|x|)内模拟图灵机M_x在输入x上的运行。- 如果模拟在
g(|x|)步内未停机,则输出0。 - 如果模拟在
g(|x|)步内停机,则输出1 - M_x(x)(即与M_x的输出相反)。
- 如果模拟在
这里的关键在于模拟的效率。一台通用图灵机可以在时间 d * f(y) * log f(y) 内模拟 M_y 在输入 y 上的运行。由于我们假设 g(y) > d * f(y) * log f(y)(对于足够大的 y),因此 D 可以在其分配的时间 g(y) 内完成对 M_y(y) 的模拟。
现在考虑矛盾:假设 M 确实在时间 c * f(n) 内判定 L。那么对于 M 的描述符 y,M_y 就是 M。根据 D 的定义,D(y) 将模拟 M_y(y) 并输出其相反值 1 - M_y(y)。这意味着 D(y) ≠ M(y)。然而,我们最初假设 M 和 D 判定的是同一个语言 L,这产生了矛盾。因此,这样的图灵机 M 不存在,L 不在 DTIME(f(n)) 中,从而证明了 DTIME(f(n)) 是 DTIME(g(n)) 的真子集。
空间层次定理
理解了时间层次定理后,我们转向空间层次定理。空间作为资源时,定理的条件可以更强。
定理2:如果函数 g(n) 是空间可构造的,并且满足 g(n) = ω(f(n)),那么确定性空间复杂性类 SPACE(f(n)) 是 SPACE(g(n)) 的真子集。用公式表示为:
SPACE(f(n)) ⊂ SPACE(g(n))
证明思路与时间层次定理类似,但有一个关键优势:通用图灵机可以在大致相同的空间内模拟另一台图灵机。以下是构造的图灵机 D:
- 如果输入
x不是有效的图灵机描述符,则输出0。 - 否则,在空间
g(|x|)内模拟图灵机M_x在输入x上的运行。- 如果模拟使用的空间超过
g(|x|),则输出0。 - 如果模拟在
g(|x|)空间内停机,则输出1 - M_x(x)。
- 如果模拟使用的空间超过
由于模拟可以在 f(n) 空间内完成(没有对数因子开销),当 g(n) > f(n) 时,D 的模拟能够在其分配的空间 g(n) 内完成。通过类似的反证法,可以得出 SPACE(f(n)) 是 SPACE(g(n)) 的真子集。
一个开放问题是:能否将定理1加强到与定理2同样优的条件,即仅要求 g(n) = ω(f(n))?这等价于问 DTIME(f(n)) 是否严格包含于 DTIME(f(n) log f(n))。目前我们尚不知道答案。
非确定性时间层次定理
最后,我们探讨非确定性时间作为资源的情况。非确定性时间层次定理的证明更为复杂。
定理3:如果函数 g(n) 是时间可构造的,并且满足 g(n) = ω(f(n)),那么非确定性时间复杂性类 NTIME(f(n)) 是 NTIME(g(n)) 的真子集。用公式表示为:
NTIME(f(n)) ⊂ NTIME(g(n))
为什么不能直接沿用时间层次定理的证明方法?问题在于“取反”操作。对于非确定性图灵机 M,计算 1 - M(x)(即对 M 的输出取反)可能需要指数级的时间,因为需要检查所有计算路径。这会导致从 f(n) 直接跳到 2^f(n) 的类。
为了证明更紧密的层次关系(仅要求 g(n) = ω(f(n))),需要更精巧的构造。核心思想是设计一个在 NTIME(g(n)) 中的图灵机 D,它只与左侧 NTIME(f(n)) 中的任何特定图灵机在极少数输入上输出不同。这种差异非常罕见,例如,对于长度为 n 的输入,可能只在 log n 个输入上不同。这种技术被称为“惰性对角化”。
为了实现这一点,我们需要一个增长极快的函数 s(i),满足:
s(i+1) > g(s(i)) 且 g(s(i+1)) > s(i+1)
这确保了差异点 s(i) 之间的距离呈超指数级增长,从而使得“取反”操作只需要非常少的非确定性选择,最终能在 g(n) 时间内完成。
总结
本节课中我们一起学习了计算复杂性理论的三个核心层次定理:
- 时间层次定理:给予更多时间,可以解决严格更多的问题,但证明需要
g(n) = ω(f(n) log f(n))的条件。 - 空间层次定理:给予更多空间,可以解决严格更多的问题,且证明只需
g(n) = ω(f(n))的更强条件。 - 非确定性时间层次定理:给予更多非确定性时间,也可以解决严格更多的问题,且条件也是
g(n) = ω(f(n)),但其证明需要使用惰性对角化等更复杂的技术。

这些定理奠定了复杂性类之间关系的基础,并揭示了不同计算资源的内在层次结构。
015:时间层级定理与Ladner定理

在本节课中,我们将学习两个重要的定理:非确定性时间层级定理和Ladner定理。非确定性时间层级定理揭示了当函数g(n)渐进地大于f(n)时,非确定性时间复杂性类NTIME(f(n))是NTIME(g(n))的真子集。Ladner定理则探讨了在P ≠ NP的假设下,NP类中是否存在既不属于P也不是NP完全的问题。我们将通过“惰性对角化”和“填充”技术来证明这些结论。
非确定性时间层级定理
上一节我们介绍了确定性时间层级定理。本节中,我们来看看非确定性时间层级定理,它指出如果函数g(n)渐进地大于f(n),那么NTIME(f(n))是NTIME(g(n))的真子集。
定理:如果函数g(n)满足 g(n) = ω(f(n))(即 lim_{n→∞} f(n)/g(n) = 0),那么 NTIME(f(n)) ⊊ NTIME(g(n))。
证明的核心思想是使用对角化方法。然而,直接使用之前证明时间/空间层级定理的“朴素对角化”方法会遇到问题。
朴素对角化的问题
问题在于否定一个非确定性图灵机(NDTM)的输出是困难的。因为对于一个NDTM,只需要存在一条接受路径即可接受输入;但要否定它(即判断为拒绝),则需要检查所有路径是否都拒绝。这种模拟无法简单地用另一个NDTM高效完成,至少目前未知。这似乎比处理“是”实例更困难。
解决方案:惰性对角化
因此,我们采用一种称为“惰性对角化”的技术。其思路是:当需要否定一个NDTM的输出时,我们用一个确定性图灵机来模拟它,但这只有在非确定性选择的位数非常少时才可能实现。所以,我们只在输入规模非常小时,才去否定NDTM的输出。
以下是具体的构造步骤。
步骤一:定义辅助函数s
首先,我们定义一个快速增长的函数s(i),满足 g(s(i)) > 2^{g(s(i-1))}。直观上,s(i)类似于一个高度为i的“幂塔”(例如 2^{2^{.^{.^{2}}}}),其增长极其迅速。我们将用这个函数来定义我们的NDTM D。
步骤二:构造非确定性图灵机D
我们构造一个NDTM D,其行为根据输入x的不同而不同:
- 如果输入
x不是一元字符串(即包含0):D直接拒绝(输出0)。 - 如果输入
x是一元字符串1^n:找到唯一的i,使得s(i) < n ≤ s(i+1)。- 情况A(
s(i) < n < s(i+1)):模拟第i个非确定性图灵机描述符M_i在输入1^{n+1}上运行g(n)步。D的输出与此次模拟的结果相同(接受则接受,拒绝则拒绝,若未停机或M_i无效描述符则拒绝)。 - 情况B(
n = s(i+1)):这是进行“否定”操作的关键步骤。模拟图灵机M_i在输入1^{s(i)+1}上运行g(s(i+1))步。如果M_i在此步数内拒绝该输入,则D接受(输出1);如果M_i接受,则D拒绝(输出0)。
- 情况A(
步骤三:分析D的时间复杂度
我们需要证明D所判定的语言L(D)属于NTIME(g(n))。
- 步骤1是平凡的。
- 步骤2(情况A):模拟一个NDTM
M_i运行g(n)步。一个关键的事实是,通用NDTM模拟器可以在线性时间内完成模拟,即O(g(n))时间。这与确定性模拟需要O(T log T)时间不同。直观原因是,模拟NDTM时,可以“猜测”远处工作带上的内容,最后再验证,从而避免来回移动磁头的开销。因此,步骤2可在NTIME(g(n))内完成。 - 步骤3(情况B):这里需要判断
M_i是否拒绝,这要求检查所有计算分支。确定性模拟所有分支最多需要2^{g(s(i)+1)}时间。根据函数s的定义,2^{g(s(i)+1)} ≤ g(s(i+1)) = g(n)。因此,步骤3也可以在NTIME(g(n))内完成(通过一个确定性地模拟所有分支的图灵机,其运行时间受g(n)限制)。
综上,L(D) ∈ NTIME(g(n))。
步骤四:证明L(D) ∉ NTIME(f(n))
现在用反证法证明L(D)不属于NTIME(f(n))。
假设存在一个NDTM M,在时间c * f(n)(c为常数)内判定L(D),即 L(D) ∈ NTIME(f(n))。设M的描述符为M_J。
选取足够大的J,使得对于所有n > s(J),有 g(n) > c * f(n)。这是可能的,因为g(n) = ω(f(n))。
根据D在情况A(步骤2)的定义,对于所有满足 s(J) < n < s(J+1) 的n,D(1^n)的行为等于M_J(1^{n+1})的行为。这意味着在这一区间内,M_J在连续输入1^n和1^{n+1}上的输出必须相同。
将这个性质从n = s(J)+1开始连续应用,我们可以推导出 M_J(1^{s(J)+1}), M_J(1^{s(J)+2}), ..., 直到 M_J(1^{s(J+1)}) 的输出全都相同。
但这与D在情况B(步骤3)的定义矛盾!因为步骤3明确要求 D(1^{s(J+1)}) 的输出必须与 M_J(1^{s(J)+1}) 的输出相反。
由此产生矛盾,故假设不成立。因此 L(D) ∉ NTIME(f(n))。
结论:我们构造了一个语言L(D),它属于NTIME(g(n))但不属于NTIME(f(n)),从而证明了 NTIME(f(n)) ⊊ NTIME(g(n))。
关键点:证明依赖于“NDTM模拟可以在线性时间内完成”这一性质,这使得层级定理的条件达到最优(仅要求g(n) = ω(f(n))),而不像确定性时间层级定理需要额外的对数因子。
Ladner定理:NP中的中间问题
上一节我们介绍了非确定性时间层级定理。本节中,我们利用对角化思想来探讨一个关于NP完全性的有趣问题:如果P ≠ NP,是否所有NP中不属于P的问题都是NP完全的?Ladner定理给出了否定的答案。
定理(Ladner):如果 P ≠ NP,那么存在一个问题属于 NP - P,但它不是NP完全的(甚至不是NP难的)。
这个定理表明,即使P不等于NP,NP类内部也可能存在复杂的结构,并非所有困难问题都是“同等困难”的NP完全问题。
证明思路:对SAT进行填充
证明的核心技巧是“填充”。我们知道布尔可满足性问题(SAT)是NP完全的。假设 P ≠ NP,那么 SAT ∉ P。我们通过对SAT实例添加大量“填充”位,构造一个新问题,使其变得“过于简单”而不再是NP完全的,但又通过填充保证了它仍在NP中且不在P中。
构造填充语言
设 h: ℕ → ℕ 是一个增长极其缓慢(但最终趋于无穷)的函数,例如 h(n) = log log n。定义填充语言 Pad-SAT_h 如下:
Pad-SAT_h = { (φ, 1^{m}) | φ ∈ SAT 且 m = |φ|^{h(|φ|)} }
其中,|φ|表示公式φ的长度,1^{m}表示m个连续的1作为填充。
观察与证明
以下是关于Pad-SAT_h的几个关键观察:
Pad-SAT_h ∈ NP:验证者可以先检查输入格式是否为(φ, 1^{m})且m = |φ|^{h(|φ|)}(这可以在多项式时间内完成),然后验证φ是否可满足(利用SAT的NP证书)。因此它在NP中。- 如果
h(n) → ∞,则Pad-SAT_h ∉ P(在P ≠ NP假设下)。用反证法:假设Pad-SAT_h ∈ P。那么我们可以设计一个判定SAT的多项式时间算法:对于输入φ,计算m = |φ|^{h(|φ|)},构造填充实例(φ, 1^{m}),然后用Pad-SAT_h的多项式时间判定器来判断。由于h(n)增长缓慢,m是|φ|的拟多项式(而非多项式),但关键在于,对于每个固定的φ,(φ, 1^{m})的构造和判定时间关于|φ|是多项式的(因为h(|φ|)是一个具体的数,算法运行时间依赖于它,但这是常数因子)。更严谨的论证需要精心选择h的增长速度,确保如果Pad-SAT_h在P中,会导致SAT也在P中,与P ≠ NP矛盾。 - 如果
h(n) → ∞,则Pad-SAT_h不是NP完全的(在P ≠ NP假设下)。用反证法:假设Pad-SAT_h是NP完全的,那么存在从SAT到Pad-SAT_h的多项式时间归约。- 设归约函数为
R,对于SAT实例φ,R(φ) = (ψ, 1^{m}) ∈ Pad-SAT_h,且|R(φ)| ≤ |φ|^c(c为常数)。 - 根据
Pad-SAT_h的定义,必须有m = |ψ|^{h(|ψ|)}。 - 由于
|R(φ)| = |ψ| + m ≈ m(对于大的m),且|R(φ)| ≤ |φ|^c,我们得到m ≤ |φ|^c。 - 同时,
m = |ψ|^{h(|ψ|)} ≥ h(|ψ|)(因为至少为1的指数)。结合|ψ| ≤ m,有h(|ψ|) ≤ h(m)。 - 因此,
h(m) ≥ m / |φ|^c?更直接的分析是:m = |ψ|^{h(|ψ|)}且|ψ| + m ≤ |φ|^c意味着|ψ|相对于|φ|^c非常小。由于h趋于无穷,当|φ|很大时,h(|ψ|)也很大,这将迫使m(即|ψ|^{h(|ψ|)})超级巨大,很容易超过|φ|^c,产生矛盾。这表明,从SAT到这样一个被大量填充的语言的多项式时间归约不可能存在。
- 设归约函数为
通过精心选择增长足够慢的函数h(例如,使得Pad-SAT_h刚好不在P中,但又增长得足够快以至于破坏NP完全性的归约),我们可以严格证明存在这样的h,使得Pad-SAT_h满足:
Pad-SAT_h ∈ NPPad-SAT_h ∉ P(由P ≠ NP保证)Pad-SAT_h不是NP完全的
这就证明了Ladner定理。
结论:即使P ≠ NP,在NP类中也存在既不是多项式时间可解,也不是NP完全(或NP难)的“中间”问题。NP类的内部结构可能比简单的“P vs. NP完全”二分法更为丰富。
总结
本节课中我们一起学习了:
- 非确定性时间层级定理:通过“惰性对角化”技术,证明了如果
g(n) = ω(f(n)),则NTIME(f(n)) ⊊ NTIME(g(n))。证明的关键在于NDTM的线性时间模拟特性。 - Ladner定理:在
P ≠ NP的假设下,利用“填充”技术,证明了存在属于NP但不属于P,且不是NP完全的问题。这表明NP类中可能存在复杂的中间结构。


这两个定理都是对角化原理的精妙应用,分别揭示了时间复杂性类的严格层级关系和NP完全问题集合的潜在性质。
016:Ladner定理与Oracle引入

在本节课中,我们将学习Ladner定理的证明思路,并了解如何通过“填充”技术构造一个既不属于P类,也不是NP难的问题。课程结尾,我们将引入“Oracle”(谕示机)的概念,为理解相对化证明做准备。
填充集合不是NP难的
上一节我们介绍了填充集合的概念。本节中我们来看看,通过精心选择填充函数h,我们可以证明填充后的集合SAT_h不是NP难的。
假设SAT_h是NP难的,那么存在一个从SAT问题到SAT_h的多项式时间归约。对于一个大小为n的SAT实例φ,它将被归约为一个SAT_h实例(ψ, 1^{h(|\psi|)}),且归约后的实例大小至多为n^c(c为常数)。
观察这个大小限制n^c,这意味着原始实例φ必须极其小。换句话说,一个大小为n的实例φ被归约到了一个小得多的实例ψ上。这可以表示为:
φ (size n) 归约为 ψ (size << n)
如果重复这个归约过程多次,最终SAT实例会被归约到一个常数大小的问题,从而使SAT问题变得平凡可解,即SAT ∈ P。但这与我们假设的P ≠ NP矛盾。因此,SAT_h不可能是NP难的。
至此,我们完成了第一个观察:填充集合SAT_h不是NP难的。为了证明Ladner定理,我们的目标是证明SAT_h ∈ NP - P。我们已经证明了它不是NP难的,显然它在NP中。剩下的就是证明它不在P中。
构造缓慢增长的函数h
前面我们证明了SAT_h不像NP难问题那样“难”,现在需要确保它也不像P类问题那样“容易”。为此,函数h不能增长太快,而应该增长得非常缓慢,以便允许我们进行对角化论证。
以下是函数h的定义方式:
h(n) = 最小的 i,使得对于所有长度 ≤ log n 的字符串x,图灵机M_i在时间 i * |x|^i 内判定x是否属于填充集合SAT_h。
如果这样的i不存在,则定义h(n) = log log n。
这个定义看起来复杂,但其核心思想是:h(n)本质上是在寻找一个能快速解决小规模SAT_h实例的图灵机编号(即时间复杂度的指数i)。这是一个递归定义,但因为只涉及长度≤ log n的字符串(数量很少),所以h(n)本身是容易计算的,时间复杂度约为O(n^3)。
证明SAT_h不属于P类
断言1:对于按上述方式定义的h,SAT_h ∉ P。
证明采用反证法。假设存在图灵机M在多项式时间n^c内判定SAT_h。我们可以选取一个足够大的描述符j(j > c),使得M就是图灵机M_j。
根据h的定义,既然M_j能在时间n^j内判定SAT_h,那么对于足够大的n,必有h(n) ≤ j。这意味着SAT_h的填充长度最多是n^j个1。由于j是常数,这只是一个多项式规模的填充。因此,如果能解决SAT_h,就能在多项式时间内解决原始的SAT问题(只需去掉填充即可),即SAT ∈ P。这与P ≠ NP的假设矛盾。因此,SAT_h不可能属于P。
证明函数h趋于无穷
断言2:按上述方式定义的函数h(n)满足lim_{n→∞} h(n) = ∞。
这个断言可以从断言1推导出来。既然SAT_h ∉ P,那么对于任何常数i,都不存在一个图灵机M_i能在时间i * n^i内解决所有的SAT_h实例。换句话说,对于每个i,都存在足够大的n,使得h(n) ≠ i。这意味着h(n)不能永远停留在任何一个常数值上,因此它必须趋于无穷。
完成Ladner定理的证明
结合断言1和断言2,我们得到了一个多项式时间可计算的函数h,它满足:
h(n)趋于无穷。- 对应的填充集合
SAT_h属于NP类。 SAT_h不属于P类。SAT_h不是NP难的。
这便完整地证明了Ladner定理:如果P ≠ NP,则存在一个既不是P类也不是NP难的问题,它严格位于NP - P之中。
引入Oracle(谕示机)的概念
既然对角化论证如此巧妙,一个自然的问题是:仅凭这类技术,能否证明P ≠ NP?为了探讨计算证明方法的局限性,我们需要引入Oracle(谕示机)的概念。
Oracle提供了一种思考方式:假设我们拥有一个“外星”设备,它能瞬间(在一个时间单位内)解决某个特定难题,比如SAT问题或停机问题。那么,借助这个强大的Oracle,我们能解决哪些其他问题?这引出了相对化复杂度类的定义。
以下是Oracle图灵机的形式化描述:
我们称图灵机M是一个关于语言O的Oracle图灵机,如果M拥有三个特殊状态:q_query(查询状态)、q_yes(是状态)和q_no(否状态)。M可以配备一条专用的Oracle磁带。
其工作流程如下:
- 当M想向Oracle O提问“字符串y是否属于O?”时,它将y写在Oracle磁带上,并进入状态
q_query。 - 在下一个瞬间,Oracle会给出答案。如果
y ∈ O,M进入状态q_yes;如果y ∉ O,M进入状态q_no。 - 无论问题y本身多难求解,这个回答过程只消耗M的一个计算步骤。
这种模型使我们能够定义像P^O(拥有Oracle O的P类)和NP^O(拥有Oracle O的NP类)这样的复杂度类,并研究在不同Oracle存在下,P与NP的关系是否保持不变。这有助于我们理解哪些证明技术是“相对化”的,即它们在这种Oracle模型下依然成立,从而判断其能否用于解决P vs NP问题。

本节课总结:
我们一起学习了Ladner定理的核心证明。通过构造一个缓慢增长的填充函数h,我们展示了如何构建一个位于NP中但既不属于P也不是NP难的中间问题。最后,为了探讨证明技术的局限性,我们引入了Oracle图灵机和相对化复杂度的基本概念,为后续学习奠定了基础。
017:神谕机与复杂性类

在本节课中,我们将学习一种定义复杂性类的新视角——通过神谕机。我们将介绍神谕图灵机的概念,并探讨基于神谕的复杂性类,如 P^O 和 NP^O。最后,我们将讨论“相对化”证明的概念,并了解为何证明 P ≠ NP 需要非相对化的方法。
神谕图灵机
上一节我们介绍了神谕机的概念。本节中,我们来看看一种新的图灵机模型——神谕图灵机。
我们已经见过确定性图灵机和非确定性图灵机。神谕图灵机是一种可以访问神谕机的图灵机。它除了通常的状态外,还有三个特殊状态:查询状态 Q_query、肯定状态 Q_yes 和否定状态 Q_no。
它有一条额外的工作带,称为神谕带。当机器进入查询状态时,它会将一个字符串 y 写入神谕带。在下一步,机器会根据神谕机 O 对字符串 y 的判断,瞬间转移到 Q_yes(若 y ∈ O)或 Q_no(若 y ∉ O)状态。这意味着,通过查询神谕,困难的问题可以在一步之内得到解答。
基于神谕的复杂性类
理解了神谕图灵机后,我们现在可以定义基于神谕的复杂性类。
- P^O:这是所有语言 L 的集合,存在一个多项式时间的神谕图灵机 M,使用神谕 O 来判定 L。
- NP^O:这是所有语言 L 的集合,存在一个多项式时间的非确定性神谕图灵机 M,使用神谕 O 来判定 L。
这里的区别仅在于底层机器是确定性的还是非确定性的。通过结合非确定性和强大的神谕,理论上可以解决非常困难的问题,其难度取决于神谕 O 本身的难度。
基本观察
以下是关于这些类的一些快速观察:
- P^(O) = P^(O̅)。因为对神谕的答案取反可以在多项式时间内完成。
- 如果神谕 O ∈ P,那么 P^O = P。因为多项式时间图灵机可以自己模拟神谕的查询,无需真正求助神谕。
- 定义指数时间计算问题 EXPCOM 为:
{ <M, x, 1^t> | 图灵机 M 在输入 x 上在 2^t 步内接受 }。这是一个属于 EXP 的单一语言。那么有:- P^(EXPCOM) = EXP
- NP^(EXPCOM) = EXP
原因在于,任何使用 EXPCOM 神谕可解的问题,都可以通过模拟在指数时间内解决;而任何指数时间可解的问题,都可以通过一个指数时间图灵机解决,该图灵机自然也能使用 EXPCOM 神谕。对于 NP^(EXPCOM),非确定性猜测的证书和查询的字符串都是多项式大小的,因此整个计算过程可以在指数时间内模拟。
相对化证明
基于神谕的概念,我们可以讨论关于复杂性类等式的证明类型。
一个关于复杂性类 C1 和 C2(例如,证明 C1 = C2 或 C1 ≠ C2)的证明被称为相对化的,如果该证明在引入任何神谕 O 后仍然成立。即,对于所有神谕 O,都有 C1^O = C2^O(或 C1^O ≠ C2^O)。
需要注意的是,C1 = C2 并不自动意味着对于所有神谕 O,都有 C1^O = C2^O。神谕可以改变复杂性类之间的关系。
然而,我们之前见过的对角化证明(例如,层次定理)都是相对化的。这是因为这类证明的核心只需要“取反”操作,而正如我们观察到的,利用神谕进行取反是容易模拟的(P^O = P^(O̅))。在更一般的图灵机层面,只要能够模拟取反操作,对角化论证就能进行下去。
P ≠ NP 需要非相对化证明
基于以上理解,Baker、Gill和Solovay在1975年证明了一个关键结论:证明 P ≠ NP 需要非相对化的方法。
他们的证明思路是构造了两个神谕 A 和 B,使得:
- 在神谕 A 下,P^A = NP^A。
- 在神谕 B 下,P^B ≠ NP^B。
如果存在一个相对化的证明能够证明 P ≠ NP,那么这个证明在引入任何神谕后都应成立,即对于所有神谕 O,都应有 P^O ≠ NP^O。但上述构造表明这是不可能的,因为存在神谕 A 使得两者相等。因此,任何成功的 P ≠ NP 证明必须是非相对化的。
我们已经知道 A 可以取为 EXPCOM,这使得 P^A = NP^A = EXP。剩下的关键就是构造神谕 B。
构造神谕 B
构造 B 的核心思想是:设计一个神谕,使得与之相关的一元语言 U_B 属于 NP^B,但不属于 P^B,从而证明 P^B ≠ NP^B。
- 一元语言 U_B 的定义:对于任意语言 B,定义
U_B = { 1^n | 存在某个长度为 n 的字符串 w ∈ B }。 - U_B ∈ NP^B:验证者可以非确定性地猜一个长度为 n 的字符串 w,然后使用神谕 B 查询 w ∈ B?。如果猜中了一个属于 B 的 w,则接受
1^n。
现在,目标转化为:构造一个神谕 B,使得 U_B ∉ P^B。我们将通过对角化技巧来递归地构造 B。
构造过程如下:
- 枚举:枚举所有多项式时间神谕图灵机
M1, M2, M3, ...(按描述符递增)。 - 初始化:设 B 初始为空集。我们将分阶段构造 B,在第 i 阶段确保机器 M_i 无法在指数时间内正确判定 U_B。
- 第 i 阶段:
- 假设在前
i-1阶段,我们已经对有限多个字符串决定了它们是否属于 B。 - 选择一个足够大的长度 n_i,大于所有已处理字符串的长度。
- 在输入
1^(n_i)上模拟机器 **M_i^B(使用当前部分定义的 **B**)运行2^(n_i - 1)` 步。在模拟时处理查询:- 如果 M_i 查询一个未确定状态(尚未声明是否在 B 中)的字符串,我们临时声明它不在 B 中,并继续模拟。
- 如果查询一个已确定状态的字符串,则根据 B 的当前定义给出答案。
- 关键的对角化步骤:
- 如果在此模拟过程中,**M_i^B
接受了1^(n_i),那么我们就通过**确保1^(n_i) ∉ U_B** 来迫使 **M_i** 犯错。具体做法是:声明所有长度为n_i的字符串都**不属于 B**。这样,U_B中就没有长度为n_i的字符串,因此1^(n_i)` 应该是“否”实例,但 M_i 却接受了它。 - 如果 **M_i^B
拒绝了1^(n_i)或未在限制步数内停机,那么我们就通过**确保1^(n_i) ∈ U_B** 来迫使 **M_i** 犯错。具体做法是:选择任意一个尚未确定的状态的长度为n_i的字符串,声明它**属于 B**。这样,U_B中就包含1^(n_i)`,因此它应该是“是”实例,但 M_i 却拒绝了它或未给出答案。
- 如果在此模拟过程中,**M_i^B
- 假设在前
通过这种方式,我们确保了每一台多项式时间神谕图灵机 M_i 都无法正确判定 U_B,因此 U_B ∉ P^B。而如前所述,U_B ∈ NP^B,所以 P^B ≠ NP^B。
总结

本节课中我们一起学习了:
- 神谕图灵机:一种可以瞬间查询外部“神谕”来获得问题答案的增强型图灵机。
- 基于神谕的复杂性类:如 P^O 和 NP^O,它们的能力取决于神谕 O 的难度。
- 相对化证明:指那些在引入任意神谕后结论依然成立的证明。对角化证明通常是相对化的。
- P ≠ NP 证明的障碍:Baker-Gill-Solovay 定理表明,存在神谕 A 使 P^A = NP^A,又存在神谕 B 使 P^B ≠ NP^B。因此,任何证明 P ≠ NP 的方法都必须是非相对化的,不能仅仅依赖于对角化这类相对化技术。这揭示了 P vs NP 问题的深刻性与困难所在。
018:相对化与空间复杂性

在本节课中,我们将学习相对化证明技术,并探讨空间复杂性类及其关系。我们将看到,证明P不等于NP的某些方法无法通过相对化技术实现,并初步了解空间复杂性类,如L、PSPACE和NPSPACE。
相对化证明的完成
上一节我们介绍了通过构造预言B来区分PB和NPB的核心思路。本节中,我们来看看这个构造如何最终证明P不等于NP的证明不能“相对化”。
这个未确定的字符串必须存在。它确实存在。因为我们精心选择了步骤数,使其比字符串总数少1。步骤数小于字符串总数。这是简单的原因。既然步骤数小于2{n_i},机器M_i不可能查询所有长度为n_i的字符串。在步骤1中,总会剩下一些未被触及的字符串,它们仍然是“未确定”的。记住,最初在集合{0,1}中,所有字符串都是未确定的。只有步骤1在改变这个场景,在那个空间{0,1}{n_i}中增长集合B。步骤2并不增长B。因此,在步骤3中,你总会找到一个字符串,并且你将那个未确定的字符串设为“是”(即加入B)。于是,1也变成了U_B的一个“是”字符串。
我们实现了什么?通过这个,我们得到了B的一个算法定义。它是一个迭代的、递归的,你可以称之为B的动态构造定义。从B等于空集开始。不变式得以保持:在第i阶段,机器M_i现在无法在2^{n_i} - 1步内解决U_B。因此,对于所有i,在第i阶段,M_iB无法在2 - 1步内解决U_B。在这个阶段,无论B的定义是什么,机器M_i使用预言的那部分,但无法解决U_B。这由定义的第3步确保。因为M_iB接受了1,而我们从B中移除了整个{0,1}{n_i}集合,所以1变成了一个“否”字符串,这意味着M_i^B与U_B不一致,并且是在这么多步内。这就是B的定义和性质。
现在,我们几乎完成了。记住我们最初想要证明的:我们想证明U_B不在PB中。根据B的这个定义,实际上,U_B不在PB中。这只是一个形式化的收尾,我们几乎完成了。现在,如果U_B在PB中,我们考虑一个大的索引j。一个大的描述符j,使得M_jB在多项式时间内判定U_B。即在nc时间内,对于某个常数c。我的意思是,存在一个多项式时间图灵机,因为你假设U_B在PB中。所以那个图灵机,或者说一个图灵机,有无限多个描述符。选取一个大的描述符M_j。“大”的部分稍后会说明。那么M_jB在多项式时间内解决U_B。但这与之前蓝色的观察相矛盾。因为如果你取足够大的j,那么在那一阶段,B的定义会产生矛盾。这就是“大”的含义。所以,这与之前的观察,或者我应该说,之前的2 - 1步的下界相矛盾。这里有一个图灵机在多项式时间内解决U_B,但之前我们已经证明这甚至在2^{n} - 1步内都不可能发生。这意味着M_j不可能存在。U_B不可能在PB中。这意味着PB不等于NPB。因此,我们证明了存在预言B使得PB不等于NP^B。这完成了Baker-Gill-Solovay定理。这意味着,仅通过“相对化”技术无法证明P不等于NP。它将需要更多我们目前尚不了解的关于P和NP的结构。我们通常说,P不等于NP的证明是“非相对化”的。这就是关于预言图灵机的内容,并展示了复杂性中这个主要问题(P vs NP)的一个很好的性质。
空间复杂性简介
现在让我们更多地讨论空间复杂性。我们能否将空间与非确定性、空间与预言等结合起来?我们还没有恰当地研究过这些。
让我为非确定性空间定义类。对于函数f,这些是语言L的集合,存在一个非确定性图灵机M,使用这么多空间来判定L。即,使用f(n)空间,其中n是输入大小。然后我们可以定义NSPACE(f)。它是非确定性版本的PSPACE。它是所有NSPACE(nc)类的并集,对于所有c。所以那是非确定性多项式空间。一个直接的问题是,它与PSPACE相比如何?下一个定义是PSPACE。哦,这个我还没定义。我忘了。PSPACE是相对于空间nc定义的。也许我们之前没见过空间类。PSPACE是所有多项式空间类的并集。NPSPACE是所有非确定性多项式空间类的并集。然后还有实际感兴趣的最小可能空间,即对数空间。所以L是那个类。它是SPACE(log n)。当然,根据定义,L包含在PSPACE中。这是你能想到的最小空间。这也可以说是感兴趣的最小的复杂性类。因为即使为了索引输入的一个比特,你也需要log n比特。因为表示从1到n的数字,你需要log n比特来表示它们。所以即使索引也需要这么多空间。一个基本的问题是,你能在L中解决哪些问题。
以下是例子:
- 加法:甚至乘法都属于L。作为练习,证明你可以仅使用对数空间将两个n位数相加。本质上,你只需要进行单次扫描,所以你只需要位置的索引,然后重用空间。
- 乘法:同样的事情,但这会更巧妙一些。
即使在L中也有非平凡的问题,我们稍后会看到更多。如果你将PSPACE作为P和NP的预言,会发生什么?再次,发生了一些预期的事情。P^PSPACE等于PSPACE。如果你将PSPACE作为NP的预言,你同样可以解决PSPACE。这与我们之前对类X所做的相同:如果你给P和NP一个解决X的预言,它们就变得等于X。如果你给P和NP一个PSPACE预言,P和NP就变得等于PSPACE。所以这并不令人惊讶。
稍微更有趣的命题如下。DTIME(f)也包含在SPACE(f)中。如果时间复杂性是f,空间不可能更多。因为最终,每一步都使用一些空间。如果它没有使用所有空间,那么某处存在一个循环,你可以移除它。并且SPACE(f)包含在NSPACE(f)中。并且NSPACE(f)包含在DTIME(2^{O(f)})中。让我们证明这一点。还有另一组性质。这意味着P包含在NP中。并且NP包含在PSPACE中。并且PSPACE包含在EXP中。这些是我们可以证明的简单性质。
证明这些观察所需的内容非常少,正如我所说,有一件事你需要证明:一个使用f(n)时间的图灵机,不可能使用超过f(n)的空间。因为在每一步,它都在做某事。或者换句话说,如果它使用了超过足够的空间,那么那些单元被访问过。如果那些单元被访问过,那么每访问一个单元就是一步。所以它也会超过f(n)时间。这是一个观察。所以DTIME(f)包含在SPACE(f)中。然后SPACE(f)平凡地包含在NSPACE(f)中。然后NSPACE(f)包含在DTIME(2{O(f)})中,因为一个使用f(n)空间的图灵机最多有2种配置。想想看,f(n)空间意味着工作带有f(n)个已使用的单元。所以对于二进制字母表,配置的数量大约是2{O(f(n))}。事实上,即使它是非二进制的,我们也只需要这里是2。在f(n)个单元中,配置的数量是2{O(f(n))},不会超过这个。这是图灵机必须处理的最大配置数。所以这是时间的上界,这意味着时间小于等于2。这就是你如何从NSPACE(f)得到DTIME(2{O(f)})。超过这些配置,超过这些配置意味着计算有一个循环。但然后,做一些计算并返回,然后重复那个循环,你可以移除那个循环。所以如果你看最小可能的时间,那里的配置必须是不同的。不同的配置。所以那个数以2为上界。所以这使得空间具有指数级的时间上界。这完成了第一组包含关系序列。
第二组呢?这里也很容易。NP包含在PSPACE中,因为SAT在PSPACE中。因为人们可以在{0,1}n空间中搜索。对于SAT,你只需要找到一个满足赋值。所以那只是一个n比特长的字符串。所以你可以一次检查一个字符串。所以它只需要n空间,不会超过这个。稍微多一点是因为你必须存储公式,但这是多项式空间。并且PSPACE包含在EXP中,因为根据我们上面展示的,这意味着PSPACE在EXP中。因为DTIME(2),取并集,你会得到PSPACE在EXP中。这些是证明所有这些简单性质的思想。
开放问题与PSPACE完全性
有了这些复杂性类及其比较关系,我还应该在这里说明,其中许多是开放问题。当然,P是否严格包含在NP中,NP是否严格包含在PSPACE中,以及PSPACE是否严格包含在EXP中,这些都是开放问题。
带着现在研究PSPACE的目标,就像我们研究NP一样,让我们现在通过寻找在归约下最难的问题来研究PSPACE。这就是PSPACE完全性的主题。那么,一个问题何时是PSPACE完全的?语言B是PSPACE完全的,如果B必须在PSPACE中,并且对于PSPACE中的所有A,A应该在确定性多项式时间内归约到B。这是PSPACE完全性的概念。这就像NP完全性,但现在我们在PSPACE内部。但你能猜出一个实际上是PSPACE完全的问题吗?你也可以认为第二部分是PSPACE难的。B是PSPACE难的,并且B在PSPACE中,那么B是PSPACE完全的。
实际上,我们将从SAT中获得灵感。SAT有一个存在量词,这使它成为NP难的。如果我们添加许多量词,那么会发生什么?我们看到存在量词给了我们NP完全问题。那么如果我们同时使用“对所有”呢?如果我们对每个变量使用许多量词,一些存在,一些对所有,那会给你一个非常难的PSPACE难问题。这个我在课程概述中提到过,让我们在这里定义它。它被称为TQBF,真量化布尔公式。定义为:∃x1 ∀x2 ... Qxn φ(x1, ..., xn)。这个作用于一个布尔公式φ上。如果量词Qs是量词,φ是关于x的布尔公式,并且Q1 x1 ... Qn xn φ为真,则它被设为一个真量化布尔公式。这就是问题TQBF(真量化布尔公式)的定义,我们将在下一节课中研究它。
总结


本节课中,我们一起学习了Baker-Gill-Solovay定理,它展示了存在预言B使得PB不等于NPB,从而证明P不等于NP的证明不能仅通过相对化技术完成。我们还初步探讨了空间复杂性类,包括L、PSPACE和NPSPACE,了解了它们之间的基本包含关系(如 P ⊆ NP ⊆ PSPACE ⊆ EXP),并引入了PSPACE完全性的概念,为下一课学习具体的PSPACE完全问题(如TQBF)奠定了基础。
019:空间复杂性与PSPACE完全性

在本节课中,我们将学习空间复杂性的概念,特别是非确定性空间类,并深入探讨PSPACE完全问题。我们将重点介绍一个关键的PSPACE完全问题——真量化布尔公式问题,并理解其证明的核心思想。
空间复杂性回顾
上一节我们介绍了空间复杂性的主题。我们定义了非确定性图灵机的空间版本。基于此,一个函数 f 的 NSPACE 可以定义为:能被一个非确定性图灵机在 O(f(n)) 空间内判定的所有问题集合。
基于此定义,我们可以定义 PSPACE 类,它是所有多项式空间 n^c 的 NSPACE 的并集。其确定性版本,即所有多项式空间 n^c 的 SPACE 的并集,显然是 NPSPACE 的子集。
对于非常小的函数,例如对数空间,我们有对应的复杂性类。任何小于对数的空间对我们来说意义不大。但对数空间 log n 很有趣,因为至少可以用它来索引输入字符串。输入字符串长度为 n,仅为了索引一个位置,就需要 log n 比特。因此,如果工作带具有这么多空间,我们说这类可解问题是 L 类,其非确定性版本是 NL 类。例如,加法和乘法可以在这种空间内完成。在多项式空间归约下,P 和 NP 变得等价。我们可以比较确定性时间、空间、非确定性空间和指数时间之间的关系。
PSPACE完全性
现在,让我们看看受NP完全性启发而产生的PSPACE完全性概念。这里我们讨论的是工作带上的多项式空间,这是一个很大的空间量。而时间实际上可能是指数时间。因此,在PSPACE中应该能解决更多问题。那么,你能解决的最难问题是什么?这将是PSPACE中一个潜在的最难问题,称为 TQBF。
TQBF代表“真量化布尔公式”。这里我们有许多量词:存在 ∃ 和任意 ∀。公式形式为 Q1 x1 Q2 x2 ... Qn xn φ(x1, ..., xn)。所有变量都被量化,最内层是一个布尔公式 φ,就像在SAT问题中一样。SAT问题是这个定义的核心。我们可以把 φ 也看作一个合取范式,但我们只称它为布尔公式,不讨论其具体形式。这个公式应为真。
我们首先观察到,容易的部分是 TQBF ∈ PSPACE。可以在多项式空间内解决TQBF问题。现在,考虑 x1, ..., xn 的定义域是 {0, 1}^n,这是指数级大的。因此,如果想在多项式空间内实现,暴力算法必须非常小心地设计。
TQBF的PSPACE算法
设 Q1 ... Qn φ(x) 是一个大小为 m 的QBF。考虑量词交替存在和任意的情况。必须首先检查是否存在 x1(可能是0或1),然后对于所有 x2(两种可能性0和1),再次检查是否存在 x3(0或1)。如何一起处理这些存在和任意量词?我们将在多项式空间内实现算法,空间复杂度是 n 的多项式。
我们将递归地进行。检查公式是否为真,当且仅当:
- 情况1:如果
Q1是∃,那么需要[Q2 x2 ... Qn xn φ(0, x2, ..., xn)]或[Q2 x2 ... Qn xn φ(1, x2, ..., xn)]为真。 - 情况2:如果
Q1是∀,那么需要[Q2 x2 ... Qn xn φ(0, x2, ..., xn)]与[Q2 x2 ... Qn xn φ(1, x2, ..., xn)]为真。
以下是算法的核心思路:
- 检查
Q1是存在量词还是全称量词。 - 如果是存在量词,则先检查
x1=0的情况,然后重用工作带空间,删除所有内容,再检查x1=1的情况。 - 如果是全称量词,则类似地顺序检查两种情况。
- 根据是“或”还是“与”操作,组合两次检查的结果。
通过这种重用工作带空间的方式,空间复杂度 S(n, m) 满足递归式 S(n, m) ≤ S(n-1, m) + O(m)。这最终得出 S(n, m) = O(n*m),表明TQBF问题在PSPACE内可解。可以尝试将其改进为 O(n+m),但这不影响TQBF ∈ PSPACE的结论。
TQBF是PSPACE完全的
现在来到主要引理:关于完全性。对于PSPACE中的每一个语言,都可以将其归约到TQBF。注意,归约是确定性多项式时间的,比PSPACE归约更弱。因此,一旦证明这一点,就知道TQBF是PSPACE中最难的问题,它实际上比NP完全问题难得多,因为这里我们只限制空间而不限制时间,这是一个很大的放宽。
设 M 是一个在空间 S(n) 内判定语言 L ∈ PSPACE 的图灵机。思路是为图灵机 M 和长度为 n 的输入 x 构造一个大小为 O(S(n)^2) 的QBF公式 Ψ,该公式为真当且仅当 M 接受 x。这将是一个归约,立即表明 L 可归约到TQBF。
如何构造?除了模拟图灵机 M 的每一步之外,没有其他选择。这类似于Cook-Levin归约中的细节。我们有一个公式 φ,捕获配置 C 到 C‘ 的有效转换步骤,其大小为 O(S)。
观察:在输入 x 上,M 最多有 2^(O(S(n))) 个不同的配置。因此,计算步数最多也是 2^(O(S(n)))。
我们设计一个QBF公式 Ψ_i(C, C‘),用于捕获从配置 C 能否在最多 2^i 步内到达配置 C‘。一个初步的递归想法是:Ψ_i(C, C‘) = ∃ C‘‘: [Ψ_{i-1}(C, C‘‘) ∧ Ψ_{i-1}(C‘‘, C‘)]。但这会使公式大小在每一步翻倍,最终导致指数级大小,这是不可接受的。
为了改进,我们避免大小翻倍。这可以通过巧妙使用全称量词来实现。重新定义 Ψ_i(C, C‘) 如下:
Ψ_i(C, C‘) = ∃ C‘‘ ∀ D1 ∀ D2: [ ( (D1 = C ∧ D2 = C‘‘) ∨ (D1 = C‘‘ ∧ D2 = C‘) ) ⇒ Ψ_{i-1}(D1, D2) ]
这个定义的巧妙之处在于,它使用全称量词和新的变量 D1, D2,将前半段和后半段的检查压缩到一个语句中,而没有使公式大小翻倍。现在,递归调用的次数是 O(S(n)),每次递归增加的大小是 O(S(n))。因此,最终公式的总大小是 O(S(n)^2)。
最终构造的公式 Ψ 表达的是:从包含输入 x 的起始配置,能否到达接受配置。如果存在这样一条路径,公式为真;否则为假。这意味着,任何PSPACE问题 L 都被归约到了TQBF。
总结
本节课中,我们一起学习了:
- 回顾了空间复杂性,特别是非确定性空间类NPSPACE和PSPACE。
- 介绍了PSPACE完全问题的概念,类比NP完全性。
- 深入研究了关键的PSPACE完全问题——真量化布尔公式。
- 证明了TQBF ∈ PSPACE,通过一个递归的、重用空间的算法。
- 证明了TQBF是PSPACE完全的,核心思想是通过构造一个模拟图灵机计算的量化布尔公式,并利用全称量词巧妙地控制公式大小,使其仅为空间复杂度的平方。

这一定理由Meyer和Stockmeyer在1972年证明。比较一下,SAT是NP完全的,而TQBF是PSPACE完全的,直观上这意味着TQBF要难得多。这也意味着TQBF是NP难的,因为NP ⊆ PSPACE。但我们猜想,TQBF本身在NP之外。
020:量词布尔公式游戏与空间复杂性

在本节课中,我们将学习如何将量词布尔公式问题解释为一个双人游戏,并探讨这一视角如何帮助我们理解空间复杂性类之间的关系,特别是PSPACE、NPSPACE以及更小的对数空间类。
量词布尔公式游戏 🎮
上一节我们介绍了TQBF问题。现在,我们来看看如何将其形式化为一个游戏。
TQBF公式的格式为:∃x₁ ∀x₂ ∃x₃ ... Qₙxₙ φ(x₁, x₂, ..., xₙ)。其真值可以解释为一个双人游戏。
- 玩家1(你)负责存在量词(∃)对应的变量(奇数下标变量,如x₁, x₃, ...)。
- 玩家2(对手)负责全称量词(∀)对应的变量(偶数下标变量,如x₂, x₄, ...)。
游戏进行n轮。在每一轮中,对应玩家为其变量选择一个值。游戏结束后,根据赋值计算φ的值。如果φ为真,则玩家1获胜;否则,玩家2获胜。
因此,TQBF问题等价于询问:玩家1是否存在一个必胜策略? 这意味着无论玩家2如何选择,玩家1都能通过自己的选择序列,最终使φ为真。
从寻找单个满足赋值(如SAT问题)到寻找一个应对所有可能性的策略,这是一个更一般的设定。这暗示了许多有限棋盘游戏(如国际象棋、围棋、跳棋在n×n棋盘上的推广版本)的决策问题可能是PSPACE难的。这直观地说明了“游戏”(需要策略)可能比“谜题”(只需一个解)更难,对应到计算复杂性中,就是NP与PSPACE是否相等这一开放问题。
Savitch定理与NPSPACE = PSPACE 🔄
TQBF的PSPACE完全性有一个重要推论,它为我们研究非确定性空间类提供了一种巧妙的方法。
引理2(Savitch, 1970)指出:非确定性空间开销可以通过平方级的确定性空间来消除。具体来说,如果语言L能被一个非确定性图灵机在空间S(n)内判定,那么L也能被一个确定性图灵机在空间O(S(n)²)内判定。
为什么空间允许这种平方级的模拟,而时间通常需要指数级(2^O(S))呢?原因在于,我们可以利用引理2中的方法,将非确定性图灵机M在输入x上是否存在接受计算路径的问题,编码成一个TQBF公式Ψ_{M,x}。这个公式的大小是O(S(n)²)。而根据引理1,我们有一个算法可以在空间线性于公式大小内判定TQBF。因此,整个判定过程可以在O(S(n)²)空间内完成。
核心结论:由于任何多项式S(n)的平方仍然是多项式,这意味着NPSPACE = PSPACE。在多项式空间层次上,非确定性并没有带来额外的能力。
配置树与可达性 🌳
理解Savitch定理的另一种直观方式是观察非确定性图灵机的配置树。
- 树的根节点是起始配置 C_start。
- 每个节点(配置)根据非确定性选择,可以产生多个子节点(后续配置)。
- 树的深度对应计算的时间上限,即 2^O(S(n))。
- 每个配置的大小为 O(S(n))。
在这个树中,接受计算对应一条从根节点到某个接受配置 C_accept 的路径。因此,原问题转化为树中的可达性问题。
指定树中的一个位置(一条路径)需要 O(S(n)) 空间(因为深度为2^O(S(n)),用二进制串表示路径选择即可)。在探索可达性时(例如使用深度优先搜索),我们需要存储当前路径和当前配置,总空间开销为 O(S(n)) * O(S(n)) = O(S(n)²)。
这里存在一个典型的时空权衡:
- 若要时间快,可以存储整个树(指数空间),进行DFS(线性时间)。
- 若要空间省,只存储当前路径(平方空间),但时间可能很长(因为要回溯)。
对数空间类简介 🔍
可达性问题在小空间复杂性类中扮演着核心角色。基于上述树遍历的思想,我们可以研究更小的类,如NL(非确定性对数空间)。
当我们取 S(n) = O(log n) 时,2^O(S(n)) = n^O(1),即多项式时间。因此,NL ⊆ P。这表明NL和L(确定性对数空间)是“小”类,但它们内部的结构和完全性问题仍然非常丰富且值得研究。
在接下来的课程中,我们将深入探讨NL的结构,并引入NL完全性的概念。
总结 📝

本节课我们一起学习了:
- 将TQBF解释为双人游戏,其核心是判断玩家1是否存在必胜策略,这为理解PSPACE难度提供了直观背景。
- 通过将非确定性图灵机的计算路径问题编码为TQBF并利用其可判定性,我们证明了Savitch定理:NSPACE(S(n)) ⊆ SPACE(S(n)²)。
- 一个重要的推论是 NPSPACE = PSPACE,即在多项式空间下,确定性与非确定性等价。
- 我们从配置树和可达性的角度重新审视了该证明,并理解了其中的时空权衡。
- 最后,我们引出了对数空间类NL,为后续学习更精细的空间复杂性分类奠定了基础。
021:NL完全性与路径问题

在本节课中,我们将学习非确定性对数空间类NL,并探讨其完全性问题。我们将重点介绍一个关键的NL完全问题——有向图路径问题,并理解其重要性。
回顾与引入
上一节我们证明了萨维奇定理,即 NSPACE(S) 包含于 SPACE(S^2)。特别地,NPSPACE = PSPACE。这表明,对于像PSPACE或更大的复杂性类,非确定性并不能提供额外的帮助。
我们还研究了配置树的概念。这为我们定义像NL这样的小复杂性类提供了新思路。配置树从起始配置开始,由于非确定性,每一步都可能产生两个可能的后续配置。
我留了一个练习:计算此配置树的大小,并在 2^O(S) 的时间和 O(S^2) 的空间内测试可达性。我们上面展示的实际上是在 O(S^2) 空间内可以解决可达性问题。但对于 O(S^2) 的空间,最坏情况下的时间可能是 2^O(S^2)。如果你想通过增加空间来减少时间,这就是可达性问题在有向图中的时空权衡问题。
定义NL类
现在让我们来看NL。NL是非确定性对数空间类。
定义: NL = NSPACE(log n)
我们知道 NL 包含于 SPACE(log^2 n)。但我们更感兴趣的是将其与 SPACE(log n)(即 L)进行比较。我们想知道,在没有空间膨胀的情况下,NL 和 L 的关系如何?这种空间膨胀是必要的吗?
另一个可以立即观察到的事实是:L 包含于 NL。因为根据定义,SPACE(log n) 显然包含于 NSPACE(log n)。
同时,NL 包含于 P(多项式时间)。为什么?因为配置的数量是 2^O(log n),即多项式数量级。因此,任何在 NL 中的问题都可以在多项式时间内解决。这也遵循我们之前证明的空间与时间的关系:空间 S 可转换为 2^O(S) 的时间。所以,NL 介于对数空间 L 和多项式时间 P 之间,可能更接近对数空间,但我们不知道具体有多接近。
NL完全性与对数空间归约
为了研究NL中最难的问题,我们需要一个在NL内有意义的“困难”概念。这需要对数空间归约,而不是多项式时间归约。为什么?因为多项式时间 P 大于 NL,如果使用多项式时间归约,那么 L 中的任何问题都可以归约到 NL 中的任何其他问题(因为所有问题都可以在多项式时间内独立解决)。为了在NL的世界里有一个更有意义的困难概念,我们必须限制归约的类型,将其限制在对数空间。
对数空间归约小于并包含于NL,因此这将是一个更有用的归约概念。基于此,我们进行定义。
首先,定义一个函数是隐式对数空间可计算的。
定义(隐式对数空间可计算): 称一个函数 f: Σ* → Σ* 是隐式对数空间可计算的,如果以下两个语言都在 L(对数空间)中:
- 语言
A = { (x, i, b) | f(x) 的第 i 位是 b } - 语言
A' = { (x, i) | |f(x)| ≥ i }
直观上,这意味着给定输入 x 和索引 i,我们可以在对数空间内计算出 f(x) 的长度是否至少为 i,以及第 i 位的值。
接下来,定义对数空间归约。
定义(对数空间归约): 称语言 A 可对数空间归约到语言 B(记作 A ≤_L B),如果存在一个隐式对数空间可计算的函数 f,使得对于所有输入字符串 x,有:x ∈ A 当且仅当 f(x) ∈ B。
这与卡普归约的定义类似,只是函数 f 现在被限制为隐式对数空间可计算。
最后,定义NL完全性。
定义(NL完全): 称语言 B 是NL完全的,如果:
B ∈ NL- 对于所有
A ∈ NL,都有A ≤_L B
对数空间归约的性质
以下是两个重要的性质:
- 传递性: 如果
A ≤_L B且B ≤_L C,则A ≤_L C。 - 下封闭性: 如果
A ≤_L B且B ∈ L,则A ∈ L。
证明第一个性质(传递性)并非完全平凡。关键在于,虽然我们没有足够的空间存储中间输出 f(x),但可以在计算 g(f(x)) 的某一位时,按需动态计算 f(x) 的相应位。由于 f 和 g 各自只需要对数空间,它们的组合也只需要对数空间。第二个性质(下封闭性)是传递性的直接推论:将 A 归约到 B 后,再利用 B 的对数空间算法即可解决 A。
因此,对数空间归约对于像NL这样的小复杂性类来说,是一个非常理想的概念。
一个NL完全问题:有向图路径问题
现在,让我们来看一个NL完全问题。回想一下,我们是通过树中的可达性来引入NL的。因此,可达性是一个很好的候选问题。
定义(PATH问题): 给定一个有向图 G 和两个顶点 s(源点)和 t(目标点),判断是否存在一条从 s 到 t 的有向路径。
显然,这是一个非常自然的问题。从时间角度看,它很容易在线性时间内解决。但如果我们想尽可能优化空间呢?线性空间是最优的吗?是否存在更好的空间复杂度?这正是我们要形式化并回答的问题。
首先,我们证明 PATH ∈ NL。
证明: 利用非确定性猜测,可以在对数空间内解决有向可达性问题。非确定性图灵机 M 从顶点 s 开始,反复猜测下一个邻接顶点。由于图中顶点数 |V| 是多项式级的,用 O(log |V|) 位即可标识一个顶点。机器只需要记住当前顶点,并猜测下一个顶点,检查是否为 t。这只需要 O(log n) 的工作空间。因此,PATH 在 NL 中。
所以,我们证明了有向可达性问题(PATH)在NL中。如果我们能消除非确定性,那么最优空间将是对数空间 L,这将是一个指数级的空间改进。这可能吗?这正是问题的核心。
接下来,我们将证明 PATH 是NL完全的。这意味着,如果能在对数空间内解决PATH问题(即 PATH ∈ L),那么 NL = L。因此,是否相信存在PATH的对数空间确定性算法,等价于是否相信 NL = L。
证明(PATH是NL完全的): 我们已经知道 PATH ∈ NL。现在需要证明,对于任意 A ∈ NL,有 A ≤_L PATH。
设 M 是一个在空间 O(log n) 内判定语言 A 的非确定性图灵机(c 是常数)。对于输入 x,我们将其归约为一个PATH实例 (G, s, t),其中 G 是 M 在输入 x 上的配置图。
- 顶点集:
G的顶点是M在输入x上的所有可能配置。 - 边集: 存在从配置
C到配置C'的边,当且仅当M在输入x上可以从配置C一步非确定性地转移到配置C'。 - 源点和目标点:
s是起始配置,t是接受配置。
那么,x ∈ A 当且仅当在配置图 G 中存在从 s 到 t 的路径。这由 M 的定义保证。
现在,关键是要证明这个归约函数 f: x → (G, s, t) 是隐式对数空间可计算的。我们需要能在对数空间内回答:
G的顶点列表中的第i个顶点(配置)是什么?- 给定两个配置
C和C',它们之间是否有边?
由于 M 使用 O(log n) 空间,其配置总数是多项式级的。因此,我们可以用多项式长度的字符串枚举所有配置。要输出第 i 个配置,只需根据 M 的配置编码规则进行构造,这可以在对数空间内完成(因为只需跟踪当前构造的配置,其大小是对数级)。要检查边 (C, C'),只需模拟 M 的一步转移,检查从 C 出发是否能到达 C',这同样只需要 O(log n) 的空间来存储和比较两个配置的相关部分。
因此,归约函数 f 是隐式对数空间可计算的。这证明了对于任意 A ∈ NL,有 A ≤_L PATH。结合 PATH ∈ NL,我们得出结论:PATH是NL完全问题。
总结

本节课我们一起学习了以下内容:
- 正式定义了非确定性对数空间类
NL,并知道它介于L和P之间。 - 为了在NL内定义“最难”的问题,我们引入了对数空间归约和隐式对数空间可计算函数的概念。
- 证明了有向图路径问题(PATH)是NL完全的。这意味着,如果能在确定性对数空间内解决PATH(即
PATH ∈ L),那么NL = L;反之,如果NL ≠ L,则PATH不存在确定性的对数空间算法。 - 这个结果将关于NL与L是否相等的深刻理论问题,与一个非常具体、直观的图论问题——有向图可达性的空间复杂度联系了起来。
022:NL = coNL 的证明

在本节课中,我们将学习一个计算复杂性理论中的重要定理:NL = coNL。这个结果由 Immerman 和 Szelepcsényi 独立证明,它表明非确定性对数空间类(NL)与其补类(coNL)是相等的。这与我们熟知的 P 与 NP 问题形成对比,是一个已知成立的深刻结论。我们将通过分析有向图不可达性(PATH 的补问题)属于 NL 来证明这一点。
核心思路:路径计数法
上一节我们介绍了有向图可达性(PATH)是 NL 完全问题。本节中,我们来看看如何证明其补问题(不可达性)也属于 NL,从而得出 NL = coNL。
证明的核心思想是路径计数。具体来说,对于一个给定的图 G、源点 s 和目标点 t,我们想要证明“不存在从 s 到 t 的路径”这一事实可以在 NL 中被验证。验证的方法是,逐步计算并验证从 s 出发在特定步数内可到达的顶点集合的大小。
我们定义以下关键对象:
- 设图 G 有 n 个顶点。
- 定义 C_i 为从源点 s 出发,在 最多 i 步 内可以到达的所有顶点的集合。
我们的目标是设计一个非确定性对数空间图灵机(NL 机器),它能验证目标顶点 t 不在 C_n 中。为此,我们需要解决两个子问题:
- 给定 C_i 的大小,如何验证一个顶点 v 不在 C_i 中?
- 如何验证我们猜测的 C_i 的大小是正确的?
子问题一:验证顶点不在 C_i 中
首先,我们注意到一个基本事实:验证一个顶点 v 在 C_i 中(即从 s 出发 i 步内可达)是 NL 问题。因为机器可以非确定性地猜测一条长度不超过 i 的路径,并在线性空间(实际上是对数空间,因为只需存储当前顶点和步数计数器)内验证。
现在,给定 C_i 的大小(记作 |C_i|),我们如何验证 v 不在 C_i 中呢?
以下是验证的步骤:
- 证书是一个按特定顺序(例如顶点编号顺序)排列的顶点列表,包含了 C_i 中的所有顶点。
- NL 机器会非确定性地“猜测”这个列表。它不需要存储整个列表,而是按顺序一次处理两个连续的顶点。
- 对于每一对猜测的顶点 (v_j, v_{j+1}),机器做两件事:
- 检查 v_j < v_{j+1}(确保顺序)。
- 利用 NL 过程验证 v_j 和 v_{j+1} 确实都在 C_i 中(即从 s 出发 i 步内可达)。
- 机器同时维护一个计数器,确保总共“看到”了 |C_i| 个顶点。
- 在整个列表验证完毕后,检查顶点 v 是否从未出现在这个列表中。
如果所有这些检查都通过,那么就证明了 v 不在 C_i 中。由于机器只需存储当前处理的一对顶点、一个计数器以及验证可达性所需的少量工作空间,整个过程在对数空间内完成。
子问题二:验证 C_i 的大小
接下来,我们需要验证我们猜测的 C_i 的大小 |C_i| 是正确的。我们采用归纳法,假设已知 |C_{i-1}| 的大小,来验证 |C_i|。
验证思路是遍历图中的所有顶点(按编号顺序),并对每个顶点 w,判断它是否属于 C_i。判断的依据是:
- 如果 w 在 C_i 中,那么它要么在 C_{i-1} 中,要么是某个在 C_{i-1} 中的顶点的邻居。
- 利用已知的 |C_{i-1}| 和子问题一的方法,我们可以验证一个顶点是否 不在 C_{i-1} 中。
具体验证 |C_i| 的步骤如下:
- 初始化一个计数器 count = 0。
- 按顺序遍历每个顶点 w(从 1 到 n):
- 非确定性地猜测 w 是否属于 C_i。
- 如果猜测 w 属于 C_i:
- 需要验证这个猜测正确。即验证:w 在 C_{i-1} 中 或者 w 的某个前驱邻居 u 在 C_{i-1} 中。这可以通过枚举 u 并利用 NL 验证可达性来完成。
- 如果验证通过,则 count 加 1。
- 如果猜测 w 不属于 C_i:
- 需要验证这个猜测正确。即验证:w 不在 C_{i-1} 中 并且 w 的所有前驱邻居都 不在 C_{i-1} 中。这正是我们子问题一解决的情况(给定 |C_{i-1}|,验证顶点不在集合中),我们可以利用它来验证 w 和它的每个邻居。
- 遍历完所有顶点后,检查最终的 count 是否等于我们声称的 |C_i|。
这个过程同样只需要对数空间:我们存储当前顶点 w、计数器 count、以及用于内部验证(如检查邻居关系、调用子问题验证过程)的临时空间。
完成证明:验证不可达性
有了以上两个构件,我们现在可以证明有向图不可达性(PATH 的补问题)属于 NL。
对于输入 (G, s, t),NL 机器的工作流程如下:
- 它非确定性地猜测一系列数字:|C_0|, |C_1|, ..., |C_n|。其中 |C_0| = 1(只有 s 本身)。
- 对于每个 i 从 1 到 n,机器使用上述“子问题二”的方法,利用猜测的 |C_{i-1}| 来验证猜测的 |C_i| 是否正确。
- 如果所有 |C_i| 的验证都通过,最后检查目标顶点 t 是否 不在 C_n 中。这可以通过“子问题一”的方法,利用已验证的 |C_n| 来验证。
- 如果验证通过,则机器接受输入,表明从 s 到 t 没有路径。
由于每一步验证都在 NL(对数空间)内完成,整个算法也在 NL 内。因此,PATH 的补问题属于 NL。
因为 PATH 是 NL 完全的,其补问题属于 NL 意味着 coNL ⊆ NL。反过来,NL ⊆ coNL 总是成立(通过补机器的定义)。因此,我们得出结论:NL = coNL。
总结
本节课中,我们一起学习了 Immerman–Szelepcsényi 定理 的证明,即 NL = coNL。我们通过以下步骤完成了证明:
- 将问题转化为验证有向图中两点不可达。
- 引入了基于步数的可达顶点集合 C_i 及其大小的概念。
- 解决了两个核心子问题:
- 给定集合大小,如何验证一个顶点不在该集合中。
- 如何利用前一步的集合大小,验证当前步集合大小的正确性。
- 通过非确定性地猜测并验证一系列集合大小,最终验证了目标顶点不可达,从而证明该问题可在 NL 内解决。

这个定理是空间复杂性理论中的一个优美结果,它展示了在对数空间层次上,非确定性对解决补问题并没有带来额外的能力。这与时间复杂性中的 P 与 NP、NP 与 coNP 等未知关系形成了鲜明对比。
023:多项式层级(Polynomial Hierarchy) 🏗️

概述
在本节课中,我们将学习如何通过量词(Quantifiers)来定义一系列新的复杂性类,即多项式层级(Polynomial Hierarchy)。我们将从回顾上节课的结论开始,然后通过一个具体问题(最小DNF)来引出新定义,并最终构建一个包含多个层级的复杂性类结构。
回顾:NL = coNL 及其推广
上一节我们证明了 NL 等于 coNL。回忆一下,NL 本质上是有向图的可达性问题,而 coNL 是有向图的不可达性问题。我们通过使用非确定性来计数路径的方法,证明了这两个类是相等的。
这意味着不可达性问题可以转化为可达性问题。基于此,我们可以将结论推广到更大的空间复杂度类。
对于所有空间函数 S(n) ≥ log n,有:
NSPACE(S(n)) = coNSPACE(S(n))
证明方法与上述类似。设 M 是一个在空间 S(n) 内判定语言 L 的非确定性图灵机。其配置图 G(M, x) 的大小是 2^O(S(n))。那么,x ∉ L 当且仅当在配置图 G 中,起始配置到接受配置之间没有路径。
因此,L 的补集问题可以归约为图不可达性问题。我们再次运用证明 NL = coNL 时的方法,可以得出 NSPACE(S(n)) 的补集也在 NSPACE(S(n)) 中。所以,对于 S(n) ≥ log n,有 NSPACE(S(n)) = coNSPACE(S(n))。
此外,根据萨维奇定理,我们知道 NSPACE(S(n)) ⊆ SPACE(S(n)^2)。因此,coNSPACE(S(n)) 也包含在 SPACE(S(n)^2) 中。
空间复杂性类的这一特性(非确定性类与其补类相等)在时间复杂性类中尚未被证明成立。
引入:通过预言机构建复杂性类
本节中,我们来看看如何通过“预言机”(Oracle)来定义新的复杂性类,从而构建一个层级结构。这在可计算性理论中已有先例:通过停机问题(Halting Problem)作为预言机,可以解决比停机问题更难的问题,从而形成一个问题的层级。
具体来说,考虑一个以停机问题 H 作为预言机的图灵机。它能解决的问题构成一个类。然后,可以再考虑以这个新类作为预言机的图灵机,解决更难的问题,如此往复,形成一个无限的层级。
计算复杂性理论中的类比是:我们能否以一个公认的难题(如SAT)为起点,构建一个严格递增的复杂性层级?这个层级被称为多项式层级(Polynomial Hierarchy),它位于 PSPACE 之内,但包含了 P、NP 和 coNP。
动机:最小DNF问题
为了直观理解,我们考虑一个优化问题:最小析取范式(Minimal DNF,简称 Min DNF)。
一个DNF公式 φ 属于 Min DNF,当且仅当不存在任何比 φ 更小的等价DNF公式。
用逻辑语言描述:
φ ∈ Min DNF ⇔ ∀ψ ( (size(ψ) < size(φ)) → ∃ assignment a (ψ(a) ≠ φ(a)) )
换句话说,对于每一个比 φ 小的DNF公式 ψ,都存在一个赋值 a 能区分 ψ 和 φ。
观察这个定义,它包含了两个量词:一个 ∀(对于所有)和一个 ∃(存在)。这使它看起来比只包含一个 ∃ 量词的 NP 类问题(如SAT)和只包含一个 ∀ 量词的 coNP 类问题(如TAUTOLOGY)都要复杂。
它像是 coNP 和 NP 的“叠加”。另一方面,一个暴力算法可以遍历所有更小的公式并检查是否存在区分赋值,这可以在多项式空间内完成,因此 Min DNF 属于 PSPACE。但它不像具有n个交替量词的量化布尔公式(QBF)问题那么难,它只有两个量词。
因此,Min DNF 问题值得拥有自己的复杂性类,这引出了多项式层级的定义。
定义:多项式层级的第二级
我们定义两个新的复杂性类:Π₂^P 和 Σ₂^P。
一个语言 L 属于 Π₂^P,如果存在一个多项式时间图灵机 M 和一个常数 c > 0,使得对于所有输入字符串 x:
x ∈ L ⇔ ∀u (|u| ≤ |x|^c) ∃v (|v| ≤ |x|^c) [ M(x, u, v) = 1 ]
这里,u 和 v 是证书字符串,其长度是输入大小的多项式倍。M 是验证器。你可以这样理解:∀u 部分类似于 coNP,∃v 部分类似于 NP,两者结合构成了 Π₂^P。
类似地,我们定义 Σ₂^P。一个语言 L 属于 Σ₂^P,如果存在一个多项式时间图灵机 M 和一个常数 c > 0,使得对于所有输入字符串 x:
x ∈ L ⇔ ∃u (|u| ≤ |x|^c) ∀v (|v| ≤ |x|^c) [ M(x, u, v) = 1 ]
这里量词的顺序反了过来:先是 ∃u(类似NP),然后是 ∀v(类似coNP)。
显然,Σ₂^P 和 Π₂^P 互为补集。因为对定义进行否定时,∃ 和 ∀ 量词会互换。
为了统一标记,我们定义:
- Σ₁^P = NP
- Π₁^P = coNP
- Σ₀^P = Π₀^P = P
下标 i 表示交替量词的个数,上标 P 表示验证器是多项式时间的。
性质与位置
根据定义,我们可以分析这些新类的一些基本性质。
首先,之前讨论的 Min DNF 问题自然属于 Π₂^P,因为它的定义直接匹配 ∀∃ 的形式。
其次,关于包含关系:
- NP ⊆ Σ₂^P 且 NP ⊆ Π₂^P(因为可以令 ∀ 部分的证书为空或忽略)。
- 同样,coNP ⊆ Σ₂^P 且 coNP ⊆ Π₂^P。
- 因此,NP ∪ coNP ⊆ (Σ₂^P ∩ Π₂^P)。
最后,关于上界。由于这些类只有固定数量的交替量词,我们可以像处理QBF一样,通过递归枚举所有可能的证书来判定,这只需要多项式空间。因此:
Σ₂^P ∪ Π₂^P ⊆ PSPACE
推广:完整的多项式层级
既然定义了两个量词的类,我们很自然地可以推广到更多交替量词,从而定义出整个多项式层级。
对于 i ≥ 1,我们定义 Σ_i^P 和 Π_i^P。
一个语言 L 属于 Σ_i^P,如果存在一个多项式时间图灵机 M 和一个常数 c > 0,使得对于所有输入 x:
x ∈ L ⇔ ∃u₁ ∀u₂ ∃u₃ ... Q_i u_i [ M(x, u₁, u₂, ..., u_i) = 1 ]
其中,Q_i 是量词,如果 i 是奇数则为 ∃,如果 i 是偶数则为 ∀。所有证书串 u_j 的长度最多为 |x|^c。
Π_i^P 的定义类似,只是量词序列以 ∀ 开始。
于是,我们得到了一系列的复杂性类:
P ⊆ NP ⊆ Σ₂^P ⊆ Σ₃^P ⊆ ... ⊆ PSPACE
P ⊆ coNP ⊆ Π₂^P ⊆ Π₃^P ⊆ ... ⊆ PSPACE
并且对于每个 i,有 Π_i^P = coΣ_i^P。
多项式层级 PH 定义为所有这些类的并集:
PH = ⋃_{i≥1} Σ_i^P = ⋃_{i≥1} Π_i^P
一个核心的开放问题是:多项式层级是否会坍缩(Collapse)?即是否存在某个 k,使得 Σ_{k+1}^P = Σ_k^P?如果成立,则整个层级会坍缩到第 k 层。普遍认为多项式层级是无限且严格的,但这尚未被证明。
总结
本节课中,我们一起学习了多项式层级(Polynomial Hierarchy)的构建。
- 我们从回顾 NL = coNL 及其在更大空间类上的推广开始。
- 接着,我们通过预言机的概念和具体的 Min DNF 问题,引出了定义新复杂性类的动机。
- 然后,我们正式定义了第二层级的类:Σ₂^P(∃∀)和 Π₂^P(∀∃),并分析了它们与 P、NP、coNP 和 PSPACE 的关系。
- 最后,我们将定义推广到任意多个交替量词,构建了完整的多项式层级 PH,它被认为是一个无限且严格递增的复杂性类序列,坐落于 PSPACE 之内。

多项式层级为我们理解介于 NP 和 PSPACE 之间的计算复杂性提供了一个精细的框架。
024:多项式层级(Polynomial Hierarchy)

在本节课中,我们将学习计算复杂性理论中的一个重要概念——多项式层级(Polynomial Hierarchy,简称PH)。我们将了解其定义、基本性质,并探讨其与P、NP等经典复杂性类的关系。
概述
多项式层级是复杂性类的一个无限层次结构,它通过交替使用存在量词(∃)和全称量词(∀)来定义,从而对NP和co-NP概念进行了系统性的推广。理解PH有助于我们把握计算问题在更复杂量化条件下的可解性。
定义与基本性质
上一节我们介绍了基于量词交替定义复杂性类的方法。本节中,我们将正式定义多项式层级及其组成部分。
首先,我们定义复杂度类 Σᵢ。对于所有非负整数 i,Σᵢ 类包含那些可以通过一个多项式时间验证机验证的语言,其验证过程涉及 i 个交替的量词,并且第一个量词是存在量词(∃)。
类似地,我们可以定义 Πᵢ 类。其定义方式与 Σᵢ 相似,但关键区别在于,第一个量词是全称量词(∀),然后量词交替出现。这与我们在 Π₂ 中的定义方式一致。
最终,多项式层级(PH) 定义为所有 Σᵢ 类(或等价地,所有 Πᵢ 类)的并集:
[
\text{PH} = \bigcup_{i \ge 0} \Sigma_i = \bigcup_{i \ge 0} \Pi_i
]
它包含了所有可能的、有限长度的量词交替方式所定义的语言。
接下来,我们看看PH的一些有趣性质,这些性质不难证明,大多直接源于定义。
以下是关于层级包含关系的一些基本事实:
- 对于所有 i,有 Σᵢ ⊆ Σᵢ₊₁。这是因为 Σᵢ₊₁ 以存在量词开始,并有 i+1 个量词,如果不使用最后一个量词,其表达能力至少与 Σᵢ 相同。反之则不必然成立。
- 同样地,对于所有 i,有 Πᵢ ⊆ Πᵢ₊₁。
- 对于所有 i,有 Πᵢ = co-Σᵢ,反之,co-Πᵢ = Σᵢ。这是因为取补集(逻辑否定)操作会将存在量词链翻转为全称量词链,反之亦然。
一个更重要的性质涉及不同层级类之间的交错包含关系:
- Σᵢ ∪ Πᵢ ⊆ Σᵢ₊₁ ∩ Πᵢ₊₁。这是因为 Σᵢ 包含于 Σᵢ₊₁(性质1),同时,Σᵢ 也包含于 Πᵢ₊₁(因为 Πᵢ₊₁ 以全称量词开始,跳过第一个全称量词后,剩下的部分类似于 Σᵢ 的定义)。对于 Πᵢ 也有类似结论。
这展示了 Σ 和 Π 类如何随着 i 的增长而“交错”增长,这也是对 NP 与 co-NP 关系(NP ∪ co-NP ⊆ Σ₂ ∩ Π₂)的推广。
多项式层级的范围与核心问题
基于上述性质,多项式层级 PH 可以等价地通过 Σᵢ 或 Πᵢ 的并集来定义,因为两者是等价的。
一个重要的事实是,多项式层级中的任何问题都可以在多项式空间(PSPACE)内解决。其证明思路与解决量化布尔公式(QBF)问题的思路相同。
然而,复杂性理论中的核心开放问题之一是关于PH的严格性:
- 我们不知道这个层级是否是严格的,即是否对于所有 i,都有 Σᵢ ⊂ Σᵢ₊₁(以及 Πᵢ ⊂ Πᵢ₊₁)。
- 我们同样不知道 Σ₁ (=NP) 和 Π₁ (=co-NP) 是否相等。
这些未知问题构成了对 P 与 NP 问题的广义推广。普遍相信(但未证明)的猜想是:多项式层级不会坍缩(PH does not collapse)。这意味着所有 Σᵢ 类(以及 Πᵢ 类)都是互不相同的,PH 是一个真正的无限层级,随着 i 增大,它能解决的问题集合也越来越大。
层级坍缩的含义与推论
“PH坍缩”是什么意思呢?如果存在某个层级 i,使得 Σᵢ = Σᵢ₊₁(或者等价地,Σᵢ = Πᵢ),那么我们就说多项式层级坍缩到了第 i 层。这意味着从第 i 层开始,增加更多的交替量词并不会带来更强的表达能力,整个 PH 就等于 Σᵢ。
基于“PH不坍缩”的猜想,我们可以推导出一些重要的分离结论。其逆否命题告诉我们:
定理:如果存在某个 i ≥ 1,使得 Σᵢ = Πᵢ,那么整个多项式层级会坍缩到第 i 层(即 PH = Σᵢ = Πᵢ)。
证明思路:
- 假设 Σᵢ = Πᵢ。
- 考虑任意一个属于 Σᵢ₊₁ 的语言 L。根据定义,L 的验证条件涉及 i+1 个量词。
- 我们可以构造一个新的语言 L‘,它由原输入 x 和第一个“证书”字符串 u₁ 组成。可以证明 L’ 属于 Πᵢ。
- 根据假设(Πᵢ = Σᵢ),L‘ 也属于 Σᵢ。
- 利用 L’ 属于 Σᵢ 这一事实,我们可以将 L 的验证条件中的量词进行合并或转化,最终证明 L 实际上属于 Σᵢ。
- 由此我们证明了 Σᵢ₊₁ ⊆ Σᵢ。结合已知的 Σᵢ ⊆ Σᵢ₊₁,得到 Σᵢ = Σᵢ₊₁。
- 通过取补集和归纳法,可以进一步证明对于所有 j ≥ i,都有 Σⱼ = Σᵢ 且 Πⱼ = Πᵢ。因此 PH 坍缩到了第 i 层。
这个定理的推论非常深刻:如果“PH不坍缩”的猜想成立,那么对于所有 i,Σᵢ 和 Πᵢ 都是不同的类。特别地,这意味着 NP ≠ co-NP。
类似地,可以证明如果 Σᵢ = Σᵢ₊₁,也会导致层级坍缩。这两种情况(Σᵢ = Πᵢ 或 Σᵢ = Σᵢ₊₁)在导致PH坍缩的意义上是等价的。
这些坍缩现象有具体的实例:
- 如果 P = NP(即 Σ₀ = Σ₁),那么 PH 会坍缩到 P(PH = P)。
- 如果 NP = Σ₂,那么 PH 会坍缩到 NP(PH = NP = co-NP)。
总结
本节课中,我们一起学习了多项式层级(PH)的核心内容:
- 定义:PH 是通过交替使用存在量词(∃)和全称量词(∀)定义的无限复杂性类层次结构,是 NP 和 co-NP 概念的自然推广。
- 基本性质:我们了解了 Σᵢ、Πᵢ 类之间的包含关系(Σᵢ ⊆ Σᵢ₊₁, Πᵢ ⊆ Πᵢ₊₁)、互补关系(Πᵢ = co-Σᵢ)以及交错包含关系。
- 核心猜想:普遍相信多项式层级是严格的、不会坍缩的,即每一层都比下一层更“小”,这是一个比 P ≠ NP 更强的猜想。
- 坍缩的后果:我们证明了如果某一层出现相等(Σᵢ = Πᵢ 或 Σᵢ = Σᵢ₊₁),将导致整个层级坍缩到该层。因此,“PH不坍缩”的猜想意味着 NP ≠ co-NP 等一系列重要的复杂性类分离结论。

多项式层级为我们理解不同量词复杂度下的计算问题提供了一个优美的框架,并将许多重要的开放问题联系在了一起。
025:多项式层级与预言机

在本节课中,我们将学习多项式层级(Polynomial Hierarchy, PH)的进一步性质,特别是其完全问题的不存在性,以及如何通过预言机(Oracle)来等价地定义多项式层级。这将帮助我们更深入地理解像 Σ₂ 这样的复杂性类。
多项式层级的坍塌与完全问题
上一节我们介绍了多项式层级 PH 的定义。本节中我们来看看如果层级中的某些类相等会发生什么。
如果对于某个 i ≥ 1,有 Σᵢ = Πᵢ,那么整个多项式层级将坍塌到该级别。这意味着如果 Σᵢ₊₁ 没有变得更大,而是等于 Σᵢ,那么同样的事情也会发生。因此,多项式层级之所以有趣,是因为如果较低级别的类发生坍塌,那么整个层级都会坍塌到那个级别。
一个特别简单的推论是:如果 P = NP,那么层级中的所有问题都可以在多项式时间内解决。显然,反之亦然。这使得 P ≠ NP 问题更加引人关注,因为它实际上表明了整个多项式层级不在 P 中。
现在,我们可以问:PH 中是否存在像 NP 完全问题那样的“最难题”?假设存在一个 PH 完全问题 E(在多项式时间归约下)。那么 E ∈ PH,而 PH 是 Σᵢ 的并集,这意味着 E ∈ Σᵢ 对于某个 i。由于 E 是 PH 完全的,这将意味着 PH ⊆ Σᵢ,从而导致 PH 坍塌。换句话说,如果 PH 不坍塌的猜想(PH 猜想)成立,那么就不存在 PH 完全问题。
因此,PH 猜想意味着 PH 完全问题不存在。这是一个有趣的结论:我们相信不存在单一的 PH 完全问题。
由于 PH 完全问题不存在,并且 PH ⊆ PSPACE,这也意味着(在 PH 猜想下)PH 是 PSPACE 的真子集。因为如果 PH = PSPACE,那么 QBF(量词布尔公式可满足性问题)将成为 PH 完全问题,这与 PH 猜想矛盾。
Σᵢ 和 Πᵢ 的完全问题
虽然没有 PH 完全问题,但我们仍然可以问是否存在 Σᵢ 完全和 Πᵢ 完全问题。直观上,它们应该存在,因为 NP 完全问题(即 Σ₁ 完全问题)是存在的。我们可以将 SAT 推广到 Σᵢ 完全问题。
以下是 ΣᵢSAT 问题的定义:
ΣᵢSAT 的实例是一个布尔合取范式(CNF)公式 φ,其变量集合被划分为 i 个互不相交的子集:U₁, U₂, ..., Uᵢ。问题是:是否存在对 U₁ 中变量的赋值,使得对于 U₂ 中变量的所有赋值,存在对 U₃ 中变量的赋值……(依此类推,交替使用 ∃ 和 ∀ 量词,共 i 层),最终使得公式 φ 为真?
用公式描述如下:
∃ U₁ ∀ U₂ ∃ U₃ ... Qᵢ Uᵢ [φ(U₁, U₂, ..., Uᵢ) = 1]
其中 Qᵢ 是 ∃(如果 i 为奇数)或 ∀(如果 i 为偶数)。
注意,Σ₁SAT 就是经典的 SAT 问题。我们的定理是:ΣᵢSAT 是 Σᵢ 完全的。类似地,我们可以定义 ΠᵢSAT(以全称量词 ∀ 开始,使用析取范式 DNF),并证明它是 Πᵢ 完全的。
证明思路与 Cook-Levin 定理类似。对于任意 L ∈ Σᵢ,存在一个多项式时间验证机 M 和常数 c,使得 x ∈ L 当且仅当 ∃ u₁ ∀ u₂ ... Qᵢ uᵢ [M(x, u₁, ..., uᵢ) 接受]。利用 Cook-Levin 构造,我们可以将图灵机 M 在给定证书 u₁, ..., uᵢ 下的计算过程,编码成一个布尔 CNF 公式 φ。这样,x ∈ L 的问题就归约到了 ΣᵢSAT 的一个实例。由于归约是确定性的多项式时间,且 ΣᵢSAT ∈ Σᵢ,因此 ΣᵢSAT 是 Σᵢ 完全的。
通过预言机定义多项式层级
为了更深入地理解 PH,特别是 Σ₂ 这样的类,我们现在通过预言机来定义它。回想一下,NP (Σ₁) 可以通过非确定型图灵机(NDTM)来定义。那么多项式层级,特别是 Σ₂,是否也对应某种特殊的图灵机计算呢?
首先,我们定义预言机类。对于两个复杂性类 C₁ 和 C₂,定义类 C₁^(C₂) 为:在可以立即解决 C₂ 中任何问题的预言机帮助下,C₁ 中的算法所能解决的问题的集合。形式化地,它是所有 C₁^L(其中 L ∈ C₂)的并集。
例如:
P^(NP):多项式时间图灵机可以调用NP预言机。NP^(NP):非确定型多项式时间图灵机可以调用NP预言机。
我们想要证明的关键定理是:对于所有 i ≥ 1,有
Σᵢ = NP^(Σᵢ₋₁)
其中 Σ₀ 定义为 P。
当 i=1 时,就是 NP = NP^P,这显然是成立的,因为给 NP 机器一个 P 预言机并不会增加其能力。
第一个有趣的情况是 i=2。我们需要证明 Σ₂ = NP^(Σ₁) = NP^(SAT)。
证明概要 (Σ₂ ⊆ NP^(SAT)):
- 设
L ∈ Σ₂。则存在多项式时间验证机M,使得x ∈ L当且仅当∃ u₁ ∀ u₂ [M(x, u₁, u₂) 接受]。 - 关注内部部分
∀ u₂ [M(x, u₁, u₂) 接受]。对于固定的x和u₁,这定义了一个新语言L‘ = { (x, u₁) | ∀ u₂, M(x, u₁, u₂) 接受 }。 - 根据定义,
L‘ ∈ Π₁(即coNP)。因此,它的补集L‘¯ ∈ Σ₁ = NP,并且可以多项式时间归约到SAT。 - 由于
SAT是NP完全的,我们可以通过SAT预言机来判断(x, u₁)是否在L‘中(只需询问(x, u₁)是否在L‘¯中,然后取反。在预言机模型中,对预言机的回答取反是允许的)。 - 因此,原始的
Σ₂条件可以重写为:x ∈ L当且仅当∃ u₁ [ (x, u₁) ∈ L‘ ],而L‘的成员资格可以通过SAT预言机在多项式时间内验证。 - 这正好描述了一个
NP机器:它非确定性地猜测u₁,然后对(x, u₁)进行多项式时间的SAT预言机调用。因此,L ∈ NP^(SAT)。
反向包含 (NP^(SAT) ⊆ Σ₂) 的证明思路类似,一个 NP^(SAT) 机器可以将其计算过程(包括非确定性选择和预言机询问)用 ∃∀ 量词来描述。这就建立了等价性。
这个定理给出了对量词的新见解:∃∀ 形式的量化对应于一个 NP 机器调用另一个 NP 机器(通过 SAT 预言机)。我们可以递归地应用这个关系来定义整个多项式层级:
Σ₀ = P
Σᵢ = NP^(Σᵢ₋₁) 对于 i ≥ 1
PH = ∪ᵢ Σᵢ
总结

本节课中我们一起学习了:
- 多项式层级的坍塌性:如果
Σᵢ = Πᵢ对于某个i成立,则整个PH坍塌到Σᵢ。这暗示着如果P = NP,则PH = P。 PH完全问题的不存在性:在PH不坍塌的猜想下,不存在PH完全问题,因此PH是PSPACE的真子集。Σᵢ和Πᵢ的完全问题:推广的SAT问题ΣᵢSAT和ΠᵢSAT分别是Σᵢ和Πᵢ的完全问题。- 预言机定义:多项式层级可以用非确定型图灵机访问低层级预言机来等价定义,即
Σᵢ = NP^(Σᵢ₋₁)。这为理解像Σ₂(∃∀)这样的类提供了直观的计算模型:一个NP机器调用一个NP预言机。
026:多项式层级与计数问题

在本节课中,我们将学习多项式层级(Polynomial Hierarchy)的结构,并探讨一个重要的计数问题——#SAT(Sharp SAT)。我们将证明多项式层级的第二级(Σ₂)等价于以NP为神谕的NP类(NP^NP),并引入计数复杂性类#P。
多项式层级的结构
上一节我们介绍了多项式层级(PH)的定义。本节中,我们将证明其第二级Σ₂与NP^NP等价。
Σ₂ ⊆ NP^NP
首先,我们证明Σ₂中的任何语言都可以被一个拥有NP神谕的非确定性图灵机(NDTM)判定。
证明思路:一个语言L属于Σ₂,意味着存在一个多项式时间验证器V,使得对于输入x,有:
∃y ∀z V(x, y, z) = 1
其中,|y|和|z|是|x|的多项式。
我们可以构造一个非确定性图灵机N,它使用一个SAT神谕(一个NP完全问题,因此等价于NP神谕)来模拟这个验证过程:
- N首先非确定性地猜测一个字符串y。
- 对于这个猜测的y,N需要验证“∀z V(x, y, z) = 1”是否成立。这等价于验证“∃z 使得 V(x, y, z) = 0”是否不成立。
- 因此,N可以向SAT神谕查询一个布尔公式φ,该公式编码了“∃z (V(x, y, z) = 0)”。如果神谕回答“否”(即公式不可满足),则说明∀z V(x, y, z) = 1成立,N接受输入x。
这个构造表明,Σ₂ ⊆ NP^NP。
NP^NP ⊆ Σ₂
接下来,我们证明反向包含关系:任何能被一个拥有NP神谕(此处具体为SAT神谕)的非确定性图灵机判定的语言,也属于Σ₂。
证明思路:设语言L ∈ NP^SAT,由一个多项式时间NDTM N判定,N可以查询SAT神谕。
考虑N在输入x上的一个计算路径。该路径涉及两部分:
- 非确定性选择:N自身做出的非确定性选择序列,记为 c₁, c₂, ..., cₘ。
- 神谕查询与回答:N向SAT神谕查询的k个布尔公式 φ₁, φ₂, ..., φₖ,以及获得的k个回答 a₁, a₂, ..., aₖ(每个aᵢ为0或1,1表示“是/可满足”,0表示“否/不可满足”)。
输入x被接受,当且仅当存在一组非确定性选择 c̄ 和一组正确的神谕回答 ā,使得N沿着这条路径接受。
验证回答 ā 的正确性需要利用SAT及其补集的性质:
- 当 aᵢ = 1 时,需要验证φᵢ是可满足的。这对应一个存在量词:∃uᵢ(赋值)使得φᵢ(uᵢ)=1。
- 当 aᵢ = 0 时,需要验证φᵢ是不可满足的。这等价于对所有赋值,公式为假:∀vᵢ,φᵢ(vᵢ)=0。
因此,整个接受条件可以形式化为一个Σ₂表达式:
∃c̄ ∃ā [ (N在路径(c̄, ā)上接受x) ∧ (∀i: 若aᵢ=1则∃uᵢ φᵢ(uᵢ)=1) ∧ (∀i: 若aᵢ=0则∀vᵢ φᵢ(vᵢ)=0) ]
这个表达式形如∃∀,因此L ∈ Σ₂。
综上,我们证明了 Σ₂ = NP^NP。通过归纳法,可以进一步证明多项式层级的每一级Σᵢ都对应一个NP神谕的塔:Σᵢ = NP^(Σᵢ₋₁)。一个核心的开放问题是P是否等于NP。如果P=NP,则整个多项式层级会坍缩到P。
计数问题与#P类
在探讨了多项式层级之后,我们转向研究位于PH和PSPACE之间的复杂性类。计数问题在这里扮演了关键角色。
动机问题:#SAT
最基本的计数问题是#SAT(读作“Sharp SAT”)。
- 定义:给定一个布尔公式φ,函数#SAT(φ)输出的是φ的可满足赋值的数量。
- 性质:这是一个函数问题,而非决策问题。我们关心的是能否高效地计算这个函数。
为了讨论函数问题的计算复杂性,我们首先定义函数版本的P类:
- FP类:指那些能被确定性图灵机在多项式时间内计算的函数集合。
一个核心问题是:#SAT ∈ FP 吗? 我们猜想答案是否定的。因为即使只是判断φ是否可满足(SAT问题)都被认为是困难的(P≠NP),那么精确计数所有解理应更加困难。
#P类的定义
由#SAT问题启发,我们定义计数复杂性类#P。
- 定义:一个函数f属于#P类,如果存在一个多项式时间非确定性图灵机M,使得对于任意输入x,f(x)等于M在输入x上的接受路径的数量。
换句话说,#P类包含了那些可以表示为“计算某个高效验证过程(NP机器)的成功路径数”的函数。
以下是关于#P的一些基本性质:
- #SAT ∈ #P:这是显然的,因为一个布尔公式的可满足赋值数量,正对应着一个验证该赋值的NP机器的接受路径数。
- FP ⊆ #P:任何在多项式时间内可计算的确定性函数,其对应的计数问题自然也属于#P(确定性机器只有一条路径)。
- 开放性问题:FP = #P 吗? 这被认为是计数版本的“P vs NP”问题。如果P≠NP,那么很可能FP≠#P。
- 与NP的关系:虽然#P处理的是计数,而NP处理的是存在性,但它们紧密相关。如果拥有一个#P神谕(即可以瞬间解决任何#P问题),那么就能在多项式时间内解决NP问题,即 NP ⊆ P^#P。
- 与PSPACE的关系:通过枚举所有可能的赋值并在多项式空间内验证,可以证明 #P ⊆ PSPACE。实际上,#SAT本身就在PSPACE内。
总结
本节课中我们一起学习了:
- 多项式层级的结构:我们证明了多项式层级的第二级Σ₂恰好等于NP^NP。这揭示了PH可以通过NP神谕的塔来刻画。
- 计数复杂性:我们引入了#SAT这个经典的计数问题,并定义了#P类,它包含那些计算NP机器接受路径数的函数。我们讨论了#P与FP、NP以及PSPACE的关系,并指出了FP = #P 是否成立是一个重要的开放性问题,与P vs NP问题密切相关。

这些概念为我们理解计算复杂性中“计数”的难度以及不同复杂性类之间的层次关系奠定了重要基础。
027:计数复杂性类与#P

在本节课中,我们将学习计数复杂性类,特别是#P类及其与决策类PP的关系。我们将从定义开始,逐步展示如何通过PP预言机计算#P完全问题,并最终理解#P的代数本质。
计数问题与#P类
上一节我们开始定义复杂性类来刻画计数问题。主要的计数问题是#SAT,这是一个函数问题。
- #SAT:输入一个布尔公式φ,输出该公式满足赋值的数量,记作 #φ。
为了刻画函数问题的效率,我们定义了类FP。
- FP:由多项式时间图灵机可计算的函数
F组成的集合。
一个开放问题是,#SAT可能不在FP中。这个问题定义了自己的复杂性类#P。
- #P:包含所有满足以下条件的函数
F:存在一个非确定性图灵机M(x, y),使得F(x)计算的是M在输入x上的接受路径数y。
因此,#SAT属于#P,并且被认为是一个困难问题。#P类被认为比NP更难。显然,FP ⊆ #P。同时,由于计数可以在与NP相同的空间内完成,所以#P ⊆ PSPACE。
#P的决策版本:PP类
现在,我们转向从#P衍生出的一个新类。#P有一个对应的决策版本,称为PP。
- PP:一个语言
L属于PP,当且仅当存在一个多项式时间非确定性图灵机M和一个常数c,使得对于所有输入x:x ∈ L当且仅当M(x, y)的接受路径数 ≥ 2^(|y|-1)。
这里的P代表“概率多项式时间”。其核心思想是:如果接受路径数超过或等于所有可能路径数的一半,则判定输入为“是”。这为“是”实例提供了一个微小的优势(恰好一半)。
一个关键的观察是:PP类中的布尔函数(即语言L)实际上计算的是对应#P函数值的最高有效位。
- 解释:如果将接受路径数用二进制表示,那么最高有效位为1当且仅当接受路径数至少占总路径数的一半。这正是PP的定义所判断的。
接下来,我们将证明一个有趣的事实:#P和PP在某种意义上是等价的。
#P与PP的等价性
我们将证明,利用PP作为预言机,可以解决#SAT问题。这意味着,如果你能计算最高有效位,那么通过将其作为子程序,你就可以计算出整个计数字符串。因此,对于一个多项式时间机器来说,#P预言机等价于PP预言机。
核心是证明第一个性质:如何利用“接受路径数是否至少一半”这一信息,计算出确切的满足赋值数量。
证明思路:
假设我们有一个布尔公式φ,变量为x1到xn。利用PP,我们可以判断满足赋值的数量 #φ 是否 ≥ 2^(n-1)(即最高有效位是否为1)。但这只是一个比特的信息。为了计算整个 #φ,我们需要找出未知的差值。
我们定义差值k为满足 k + #φ = 2^n 的最小非负整数。我们的目标是找到这个k。
构造非确定性图灵机M:
我们构造一个机器M(φ, k),它使用n+1个非确定性比特y0, y1, ..., yn,行为如下:
- 如果
y0 = 1,则M猜测n比特的赋值w。当且仅当φ(w)=1(即w是满足赋值)时接受。 - 如果
y0 = 0,则M恰好接受k个不同的字符串v(可以通过设计实现)。
根据定义,M的总接受路径数 = #φ + k。而M的总可能路径数为2^(n+1)。
利用PP进行二分搜索:
现在,我们可以利用PP预言机来查找正确的k值。我们检查条件:k + #φ ≥ 2^n 是否成立。
- 从
k=1开始,询问PP预言机。 - 如果条件不成立(即接受路径数未过半),则增加
k(例如翻倍为2、4、8...)。 - 如果条件成立,则说明当前的
k足够大或恰好相等。 - 通过这种二分搜索,最多经过
n+1次PP预言机查询,我们就能找到满足 k + #φ = 2^n 的最小k(记为k_min)。
一旦找到k_min,由于 #φ = 2^n - k_min,我们就计算出了确切的满足赋值数量。
因此,我们证明了:#SAT ∈ FP^(PP)(即在拥有PP预言机的情况下,可在多项式时间内计算#SAT)。
等价性结论:
- 上述证明并未特别依赖#SAT的性质,对于任何#P中的函数
L,都有 FP^(L) ⊆ FP^(PP)。 - 显然,FP^(PP) ⊆ FP^(#P),因为有了#P预言机(能计算所有比特),自然能计算出最高有效位。
- 结合两者,我们得到 FP^(#P) = FP^(PP)。这表明在多项式时间图灵归约下,#P和PP是等价的。
#P完全问题
我们从一个函数类#P开始,最终展示了它等价于一个决策类PP。现在,让我们进一步研究#P,特别是它的完全问题。
首先定义#P完全:
- 一个函数
f是#P-难的,如果每一个#P中的函数g都属于 FP^(f)(即都能通过多项式次调用f作为子程序来解决)。 - 如果
f既是#P-难的又属于#P,则称f是#P-完全的。
这里的归约称为图灵归约,它比我们之前见过的卡普归约更强大,允许进行多次预言机调用。
一个直接的推论是:如果某个#P-完全问题在FP中,那么整个#P类都包含在FP中。因为FP在调用FP预言机后仍然是FP。
那么,是否存在自然的#P-完全问题呢?是的,#SAT就是#P-完全的。
证明:
- #SAT ∈ #P:根据定义。
- #SAT是#P-难的:设
G是任意一个#P中的函数,它计算某个非确定性图灵机M在输入x上的接受路径数。根据库克-列文定理,M在x上的计算可以转化为一个布尔公式φ_x,使得M的接受路径数等于φ_x的满足赋值数。这个转化过程是多项式时间的。因此,要计算G(x),我们只需构造φ_x,然后调用一次#SAT预言机即可。所以,G ∈ FP^(#SAT)。由于G是任意的,故#P ⊆ FP^(#SAT)。
因此,#SAT是#P-完全的。
总结
本节课我们一起学习了计数复杂性类。
- 我们首先定义了函数类#P,它捕获了诸如计算布尔公式满足赋值数量(#SAT)这类计数问题。
- 接着,我们引入了#P的决策版本PP类,它通过判断接受路径数是否过半来做出决策,实质上计算的是计数值的最高有效位。
- 我们证明了关键等价性:在多项式时间图灵归约下,#P和PP拥有相同的计算能力(FP^(#P) = FP^(PP))。核心证明展示了如何利用PP预言机通过二分搜索精确计算出#SAT的值。
- 最后,我们探讨了#P-完全性,并证明了#SAT是一个#P-完全问题,这为理解#P的难度提供了基准。

这让我们对#P有了很好的理解:我们拥有它的完全问题、它的布尔决策版本。在接下来的课程中,我们将看到#P更精彩的代数表述。
028:Permanent问题与#P完全性

在本节课中,我们将学习一个非平凡且有趣的#P完全问题——Permanent(积和式)。这个问题因其代数性质而引人注目,并与我们熟知的Determinant(行列式)密切相关。我们将探讨它的定义、与行列式的区别、其计算复杂性,以及它为何是#P完全的。
从行列式到积和式
上一节我们介绍了#P类的基本概念。本节中,我们来看看一个具体的#P完全问题。
积和式的定义灵感来源于矩阵的行列式。对于一个n×n的矩阵A,其积和式定义为:
公式: Perm(A) = Σ_{σ ∈ S_n} Π_{i=1}^{n} A_{i, σ(i)}
其中,S_n是集合{1, 2, ..., n}上所有排列(共n!个)的对称群。这个定义意味着,我们需要对矩阵A的每一行,选取一个不同的列(由排列σ决定),然后将这些位置的元素相乘,最后对所有可能的排列求和。
请注意它与行列式的相似性。行列式的定义是:
公式: Det(A) = Σ_{σ ∈ S_n} sign(σ) * Π_{i=1}^{n} A_{i, σ(i)}
唯一的区别在于,行列式的每一项前面有一个符号sign(σ),它根据排列σ是偶排列(+1)还是奇排列(-1)来决定正负。正是这个符号的差异,使得行列式和积和式的计算复杂性截然不同。
计算复杂性的巨大差异
尽管定义中都包含n!项求和,但行列式有一个已知的多项式时间确定性算法(属于FP类)。这利用了行列式结构的对称性,在线性代数和工程中应用广泛。
然而,对于积和式,目前已知的唯一通用算法就是其定义本身,即需要枚举所有n!个排列,这需要指数时间。这是一个令人惊讶的数学事实:两个定义如此相似的问题,在计算复杂性上却天差地别。我们接下来将证明,积和式是#P完全的,这意味着它和#SAT问题一样,我们不相信存在多项式时间的精确算法。
0-1矩阵积和式属于#P
首先,我们证明0-1矩阵的积和式计算问题属于#P类。回忆一下,#P类包含那些解的数量可以在多项式时间内被非确定性图灵机验证的问题。
给定一个0-1矩阵A,其积和式Perm(A)等于满足Π_{i=1}^{n} A_{i, σ(i)} = 1的排列σ的数量。因为矩阵元素是0或1,所以乘积为1当且仅当选中的所有元素都是1。
我们可以设计一个非确定性图灵机N来验证这一点:
- N“猜测”一个排列σ。
- N在多项式时间内检查对于所有i,是否
A_{i, σ(i)} = 1。 - 如果所有检查都通过,则N接受这个猜测。
显然,这台非确定性图灵机N的接受路径数,正好就是使得乘积为1的排列σ的数量,即Perm(A)。因此,0-1矩阵的积和式计算问题属于#P。
积和式的图论解释
为了证明积和式是#P难的(即#P完全),我们需要一个图论视角。将n×n矩阵A视为一个有n个顶点的加权有向图G的邻接矩阵。顶点集为{1, 2, ..., n},从顶点i到顶点j的边的权重就是矩阵元素A_{ij}。对角线元素A_{ii}可以看作顶点i上的一个自环。
接下来,我们定义圈覆盖的概念。图G的一个圈覆盖C是一个子图,它包含所有n个顶点,并且满足每个顶点的入度和出度恰好都为1。直观地说,圈覆盖就是由若干个互不相交的有向圈(包括自环形式的圈)组成的集合,它们覆盖了所有顶点。
对于一个圈覆盖C,我们定义其权重w(C)为覆盖中所有边的权重的乘积。
关键的观察是:矩阵A的积和式等于图G所有可能的圈覆盖的权重之和。
公式: Perm(A) = Σ_{C是G的圈覆盖} w(C)
为什么这个等式成立?思路如下:
- 在积和式的定义中,每一个排列σ都唯一对应一个圈覆盖:将σ分解成循环,每个循环就对应图中的一个有向圈。该排列项
Π A_{i, σ(i)}的乘积,正好就是这个圈覆盖的权重。 - 反之,每一个圈覆盖也唯一对应一个排列(通过圈中顶点的映射关系),其权重就是积和式中对应项的值。
因此,这两个求和是等价的。这个图论解释是证明积和式#P完全性的核心工具。
实例演示
考虑一个3×3矩阵A:
A = [ 0, 1, 1;
-1, 0, 1;
-1, -1, 0 ]
其对应的有向图有三个顶点1, 2, 3。边及其权重为:1→2 (1), 2→1 (-1), 2→3 (1), 3→2 (-1), 1→3 (1), 3→1 (-1)。没有自环。
这个图有两个圈覆盖:
- 顺时针圈覆盖:1→2→3→1。权重 =
A_{12} * A_{23} * A_{31} = 1 * 1 * (-1) = -1。 - 逆时针圈覆盖:1→3→2→1。权重 =
A_{13} * A_{32} * A_{21} = 1 * (-1) * (-1) = 1。
根据公式,Perm(A) = (-1) + 1 = 0。读者可以验证,直接根据排列定义计算3! = 6项,结果也是0。
总结
本节课中我们一起学习了:
- 积和式(Permanent)的定义:
Perm(A) = Σ_{σ} Π_{i} A_{i, σ(i)},它与行列式仅相差一个符号项。 - 尽管定义相似,行列式有多项式时间算法(∈ FP),而积和式没有,且是#P完全的。
- 对于0-1矩阵,积和式属于#P类,因为其值等于一个非确定性图灵机验证排列的接受路径数。
- 积和式有一个重要的图论解释:将矩阵视为加权有向图的邻接矩阵,则积和式等于图中所有圈覆盖的权重之和,即
Perm(A) = Σ_{C} w(C)。

这个图论视角是至关重要的。在下节课中,我们将利用这个视角,完成积和式是#P完全问题的证明,即展示如何将任何一个#P问题(例如#SAT)多项式归约到积和式的计算上。这将巩固积和式作为基础性难问题的地位。
029:Permanent的图论解释与#P-完全性证明

在本节课中,我们将学习如何将矩阵的Permanent问题解释为图上的圈覆盖问题,并利用这一解释来证明0-1矩阵的Permanent问题是#P-完全的。我们将通过构造精巧的“小工具”来建立从#3SAT到Permanent的归约。
回顾:Permanent的图论解释
上一节我们介绍了Permanent的定义,并开始尝试将其解释为图上的问题。Permanent定义为一系列单项式的和。
每个单项式对应一个从1到n的排列。我们可以将这个排列分解为若干个循环,这可以可视化为一个图上的圈覆盖。这个图由其邻接矩阵E定义。
我们正在分析的例子中,顶点是1、2、3,存在带权边(没有自环)。这实际上给出了两个圈覆盖:
- 顺时针循环:1 -> 3 -> 2 -> 1,权重为1。
- 逆时针循环:1 -> 2 -> 3 -> 1,权重为-1。
因此,这个矩阵的Permanent计算为 1 + (-1) = 0。这与根据定义计算的结果一致,也符合“圈覆盖权重之和”的解释。
核心定理:0-1矩阵Permanent的#P-完全性
理解了上述解释后,我们现在可以利用它来证明一个重要的结论:0-1矩阵的Permanent问题是#P-完全的。
定理:0-1矩阵的Permanent问题是#P-完全的。
本质上,我们需要证明#3SAT可以归约到Permanent问题。也就是说,我们可以将#3SAT问题重新表述为一个Permanent计算问题。
设φ是一个包含m个子句、n个变量的3-CNF公式。我们可以假设每个子句恰好有三个文字(否则可以通过重复文字来满足此条件)。因此,总共有3m次文字出现。
我们的目标是构造一个图G(通过其邻接矩阵E),使得其带权圈覆盖的总和(即Permanent)等于公式φ的可满足赋值数量。
直接构造一个仅含0和1权重的矩阵来实现这一点非常困难。因此,我们将通过绘制图并使用“小工具”来表达变量、文字和子句来实现这个想法。
构造归约:三个核心小工具
以下是实现该想法的具体构造。我们将创建三种小工具。
1. 变量小工具 (Variable Gadget)
每个变量Xi被转换为一个图小工具Vi。
变量小工具包含m+1个自环和两个额外的顶点,用于表示变量的真值(True或False)。所有未标记边的权重均为1。
解释:
- 在圈覆盖中,如果使用了“外部边”,则必须使用“真值边”,这被解释为将变量Xi设置为True。
- 如果未使用外部边(即使用了自环),则必须使用“假值边”,这被解释为将变量Xi设置为False。
因此,变量小工具Vi的圈覆盖选择,编码了变量Xi的赋值。
2. 子句小工具 (Clause Gadget)
每个子句Cj被转换为一个图小工具Cj。
子句小工具包含三个“外部边”,对应于子句中的三个文字。其内部连接方式使得存在三种可能的圈覆盖,每种覆盖的权重均为1。
解释:
- 每种圈覆盖都“丢弃”了三条外部边中的一条。
- 被丢弃的那条边所对应的文字,被解释为在该赋值下取值为真。
- 由于至少有一个文字为真时子句才为真,因此子句小工具中存在圈覆盖,即象征着该子句被满足。
3. 连接小工具 (Connector Gadget - “Zor”)
变量小工具和子句小工具的信息需要关联起来。我们使用连接小工具Zor来实现。
如果文字Xi出现在子句Cj中,那么我们将变量小工具Vi的第j条外部边(记作边u-u')与子句小工具Cj中对应Xi的外部边(记作边v-v')通过一个Zor小工具连接。
如果出现的是否定文字¬Xi,则连接变量小工具Vi的“假值边”与子句小工具Cj中对应Xi的外部边。
Zor小工具的结构更复杂,包含权重为-1、2、3的边(未标记边权重为1)。其设计目的是确保:只有当变量赋值与子句中文字取值一致时,整个组合才能形成有效的圈覆盖贡献。
整体构图与关键性质
最终的图G‘由以下部分连接而成:
- n个变量小工具 (Vi)
- m个子句小工具 (Cj)
- 3m个连接小工具 (Zor)
现在,我们分析这些小工具组合后的关键性质。
性质1:连接小工具的总贡献为0
Zor小工具被精心设计,其所有可能圈覆盖的权重之和为0。这意味着在计算整个图的Permanent时,Zor小工具本身不会产生净贡献,它只起到“一致性检查”和“信号传递”的作用。
性质2:变量与子句小工具的贡献为1
在一致性赋值下,每个变量小工具和每个子句小工具内部都只有一种方式形成圈覆盖,且权重为1。
结论
本节课中,我们一起学习了如何将Permanent问题与图的圈覆盖问题联系起来。通过构造变量小工具、子句小工具和连接小工具(Zor),我们展示了如何将任何一个#3SAT问题实例,转化为一个计算特定图(其边权仅为0, 1, -1, 2, 3)的圈覆盖总权重(即其邻接矩阵的Permanent)的问题。

由于#3SAT是#P-完全问题,并且我们给出了从它到Permanent的多项式时间归约,这证明了0-1矩阵的Permanent问题也是#P-完全的。这是计算复杂性理论中一个深刻而优美的结果,揭示了计数问题内在的难度。
030:Permanent是#P-完全的证明(下)

在本节课中,我们将继续完成“Permanent是#P-完全问题”的证明。我们将深入分析Zor小工具如何强制变量赋值的一致性,并最终计算出矩阵的积和式,从而建立从#SAT到Permanent的归约。
Zor小工具的一致性强制
上一节我们介绍了Zor小工具的结构。本节中我们来看看它的三种可能的圈覆盖及其权重。
以下是Zor小工具中三种可能的圈覆盖及其权重计算:
- 第一种圈覆盖:使用垂直边。其权重为
6。 - 第二种圈覆盖:使用水平边(权重为-1)。其权重为
-2。 - 第三种圈覆盖:使用底部的自循环。其权重为
-3。
这三种圈覆盖的权重之和为 6 + (-2) + (-3) + (-1) = 0。这意味着,如果一个圈覆盖没有使用外部顶点对 (U, U') 或 (V, V') 中的任何一个,那么它对总权重的贡献为0,因此“不算数”。
这个性质至关重要。它意味着,在最终的大图 A' 的任何有效圈覆盖中,对于每个Zor小工具,必须恰好使用 (U, U') 或 (V, V') 这对边中的一对。这就在变量小工具和子句小工具之间强制传递了信息。
从圈覆盖到满足赋值
现在,考虑 A' 的一个圈覆盖 C。对于每个子句小工具,我们知道它“丢弃”了一个文字,假设是 x_i。这意味着在对应的Zor小工具中,边对 (V, V') 没有被使用。根据我们刚才的结论,边对 (U, U') 就必须被使用。
(U, U') 被使用意味着什么?在变量小工具中,如果外部边 (U, U') 被用于圈覆盖,那么根据变量小工具的设计,这编码了变量 x_i 被赋值为 真。
更重要的是,一旦在变量小工具中确定了 x_i 的赋值(真或假),通过所有与之相连的Zor小工具,这个赋值信息会一致地传递到所有包含 x_i 的子句中。因此,图 A' 的每个圈覆盖都唯一对应了公式 Φ 的一个一致的满足赋值。反之,给定一个满足赋值,我们也能构造出对应的圈覆盖。
计算积和式的值
我们已经建立了满足赋值和圈覆盖之间的一一对应关系。但我们的目标是计算 A' 的积和式 perm(A'),而不仅仅是对应关系。每个满足赋值对应的不是一个,而是一组圈覆盖(因为小工具内部有多种方式完成圈覆盖)。
我们需要计算每个Zor小工具在强制使用 (U, U') 或 (V, V') 时,对总权重的贡献。以使用 (U, U') 为例,经过计算,其贡献是 -2。
假设公式 Φ 有 m 个子句,每个子句有3个文字,那么总共有 3m 个Zor小工具。每个小工具独立地贡献因子 -2。因此,每个满足赋值所对应的所有圈覆盖的总权重贡献是 (-2)^(3m)。
因此,整个矩阵 A' 的积和式就是所有满足赋值贡献的总和:
perm(A') = (-2)^(3m) * (#Φ的满足赋值数)
将矩阵转化为0-1矩阵
上面的推导几乎完成了证明,但还有一个问题:我们构造的矩阵 A' 中包含 -1, 2, 3 等非0/1的权重。而定理要求是0-1矩阵。我们需要将 A' 转化为一个仅包含0和1的矩阵 A,同时保持通过 perm(A) 能计算出满足赋值数。
以下是转化的两个关键步骤:
-
模算术处理负号:首先,我们选择一个足够大的整数
N(例如N = 3m + n + 1),使得|perm(A')| < 2^N。然后,我们将所有负的条目-k替换为(2^N - k)。这样得到一个新矩阵A'',其所有条目都是非负整数。我们计算perm(A'') mod 2^N。由于perm(A'') ≡ perm(A') (mod 2^N),并且我们知道perm(A')的绝对值小于2^N,因此我们可以从perm(A'') mod 2^N的结果中恢复出perm(A')的确切值,进而得到(-2)^(3m) * (#满足赋值数)。 -
二进制展开处理非0/1整数:矩阵
A''的条目是非负整数,但可能大于1。我们将每条权重为k的边,用一个小工具替代,该小工具由多条平行的、权重为1的路径组成,其路径总数恰好为k。具体方法是利用k的二进制表示。例如,k=5 (二进制101),可以用一个包含(4条平行路径) + (1条平行路径)的子图来模拟。这个小工具只引入O(log k)个新顶点,并且只使用权重为0或1的边。
经过以上两步,我们最终得到了一个仅包含0和1的矩阵 A,其规模(顶点数)相对于原始输入公式 Φ 的大小仅是多项式级别的增加。并且,我们可以在多项式时间内,通过计算 perm(A) mod 2^N,并经过简单的乘除运算(要求域的特征不为2,以保证能除以 (-2)^(3m)),得到公式 Φ 的满足赋值数。
总结
本节课中,我们一起完成了“Permanent是#P-完全问题”的证明。
- 我们首先分析了Zor小工具,它强制圈覆盖必须在变量小工具和子句小工具之间做出特定选择,从而编码了一致的变量赋值。
- 接着,我们计算了由此构造的矩阵
A'的积和式,发现它等于(-2)^(3m)乘以原公式的满足赋值数。 - 最后,我们通过模算术和二进制展开的技巧,将带有正负整数的矩阵
A'归约到一个仅含0和1的矩阵A,并证明了通过计算perm(A)可以解出#SAT问题。


由于#SAT是#P-完全问题,这意味着任何#P中的问题都可以多项式时间归约到计算0-1矩阵的积和式问题。因此,计算0-1矩阵的积和式是#P-完全的。这个深刻的结论揭示了积和式问题内在的计算难度。
031:PH与#P的比较




概述
在本节课中,我们将比较两个新的复杂性类:多项式层级(PH)和计数类(#P)。我们将探讨它们之间的关系,并学习一个关键定理的证明,该定理揭示了PH可以通过随机化方法归约到#P。
上一节我们完成了计算0-1矩阵积和式(Permanent)问题是#P完全性的证明。现在,让我们写下这个定理。
Valiant定理
该定理由Valiant提出。我们证明了0-1矩阵的积和式(Permanent)是#P完全的。
#P完全性意味着,如果你能高效计算积和式,那么存在一个确定性的多项式时间图灵机,可以计算#P类中的任何问题。这使得积和式与行列式(Determinant)截然不同,因为#P完全性表明,在实践中高效计算积和式是没有希望的。具体来说,它至少和#P一样难,因此也比NP难(NP-hard)。
接下来,我们将比较PH和#P这两个新的复杂性类。


PH与#P的比较
PH和#P都是多项式空间(PSPACE)内的自然复杂性类。它们都是NP的自然推广。
- PH 使用了量词交替的概念,例如“存在”和“对于所有”的交替。当量词交替次数无界时,就得到了PH。
- #P 使用了计数的概念,它询问的是满足条件的字符串数量,而不是“是否存在”。
一个有趣的问题是:这两个类如何比较?它们互不相关吗?还是一个包含另一个?
在20世纪80年代,人们认为它们是不可比较的。因为PH包含NP,而NP问题可以用#P解决(通过检查计数是否大于零)。但PH中像Σ₂P(存在...对于所有...)这样的类,看起来与计数有很大不同,不清楚如何将“对于所有”量词归约到计数问题。
然而,后来的一个发现令人惊讶:它们被证明是紧密相关的。
Toda定理
最终,Toda在1991年证明了:**PH实际上包含在P#P中**。因此,如果你拥有一个#P预言机(Oracle),你就能解决多项式层级中的任何问题,不仅仅是NP,还包括NNP等等。
这个证明非常有趣,因为它出人意料地使用了随机化。请注意,这是一个关于确定性类包含关系的证明,但却通过概率方法来完成。我们接下来将进行这个漫长的证明。


总体思路
总体思路是给出一个归约。具体来说,我们将PH中的问题(例如ΣᵢSAT)归约到一个称为奇偶SAT(Parity SAT)的新问题。
奇偶SAT问题定义为:判断一个给定布尔公式φ的满足赋值(Satisfying Assignments)的数量是否为奇数。如果数量是奇数(1, 3, 5...),则是“是”实例;如果数量是偶数(0, 2, 4...),则是“否”实例。
我们定义复杂性类⊕P(Parity P):一个语言L属于⊕P,当且仅当存在一个非确定性图灵机M,使得对于所有输入x,x属于L当且仅当M在输入x上的接受路径数量是奇数。


显然,奇偶SAT问题是⊕P完全的(在多项式时间归约下)。我们将证明,NP可以随机归约到⊕P。这意味着如果NP被认为是难的,那么⊕P也是难的。
关键引理:Valiant-Vazirani引理
我们将证明以下引理(Valiant-Vazirani引理):
存在一个多项式时间图灵机A,使得:
- 如果φ是可满足的,那么A使用随机比特r,能够以高概率将φ修改为另一个布尔公式ψ,使得ψ恰好有奇数个(实际上我们将证明是唯一一个)满足赋值。
- 如果φ是不可满足的,那么ψ也将是不可满足的(即0个满足赋值),这个概率为1。
换句话说,我们将把φ变换成一个新公式ψ,使得ψ的满足赋值数量在φ可满足时为1,在φ不可满足时为0。这个变换将通过一个计算机科学中非常有用的技巧实现:哈希(Hashing)到桶中。
哈希函数的思想
基本思想是,使用哈希函数将φ的所有满足赋值映射到许多“桶”中。我们将通过矩阵乘法来实现这个哈希函数。


考虑一个k × n的二进制矩阵B(元素来自有限域F₂)和一个向量b ∈ F₂ᵏ。我们定义哈希函数h_{B,b}: F₂ⁿ → F₂ᵏ为:
h_{B,b}(x) = Bx + b
这里,x被视为一个列向量。这个线性变换将巨大的空间F₂ⁿ(大小2ⁿ)压缩到小得多的空间F₂ᵏ(大小2ᵏ)。
对于我们的应用,参数k的选择与φ的满足赋值数量有关。我们希望以高概率,在φ可满足时,恰好有一个满足赋值x被映射到特定的值(比如全零向量0ᵏ)。

哈希函数的性质
随机选择的哈希函数h_{B,b}具有以下良好性质:
- 对于任何固定的x,Pr[h_{B,b}(x) = 0ᵏ] = 1/2ᵏ。(均匀性)
- 对于任何两个不同的x和x‘,Pr[h_{B,b}(x) = h_{B,b}(x’) = 0ᵏ] = 1/2²ᵏ。(两两独立性)
这些性质对于后续的概率计算至关重要。
核心主张
设S是φ的所有满足赋值的集合,其数量|S|在区间[2ᵏ⁻², 2ᵏ⁻¹]内。那么,对于随机选择的哈希函数h_{B,b},满足以下条件的概率至少为1/8:
|{ x ∈ S | h_{B,b}(x) = 0ᵏ }| = 1
也就是说,恰好有一个满足赋值被哈希到“0桶”中。
如果我们能实现这一点,那么通过构造一个新公式ψ(x) = (φ(x) ∧ (h_{B,b}(x) = 0ᵏ)),我们就将原问题归约到了“唯一满足赋值”问题,这显然属于奇偶SAT(因为1是奇数)。
性质证明(概要)
- 性质1证明:固定x。要使得h(x)=0ᵏ,即Bx+b=0ᵏ,我们需要选择b = -Bx。由于b在2ᵏ种可能中均匀随机选择,故概率为1/2ᵏ。
- 性质2证明:我们需要Bx+b=0ᵏ且Bx‘+b=0ᵏ同时成立。这等价于Bx = Bx‘。利用条件概率或两两独立哈希函数的性质,可以算出该概率为1/2²ᵏ。
核心主张的证明需要利用这些性质,通过概率分析(例如使用包容排斥原理或第二矩方法)来估算恰好有一个元素落入指定桶的概率,最终得出概率下界为常数(1/8)。
总结
本节课我们一起学习了:
- 回顾了积和式的#P完全性。
- 比较了多项式层级(PH)和计数类(#P),它们分别通过量词交替和计数来扩展NP。
- 介绍了Toda定理:PH ⊆ P^#P,即多项式层级的问题可以通过#P预言机解决。
- 为了证明Toda定理的一部分(NP随机归约到⊕P),我们深入学习了Valiant-Vazirani引理。
- 该引理的核心思想是使用随机线性哈希函数,以常数概率将可满足公式的多个解“隔离”成唯一解,从而归约到奇偶SAT问题。
- 我们分析了这种随机哈希函数的均匀性和两两独立性,这些是概率分析的基础。

这个证明展示了随机化在解决确定性复杂性类问题中的强大作用,是复杂性理论中的一个经典范例。
032:Valiant-Vazirani引理与奇偶量化

在本节课中,我们将学习Valiant-Vazirani引理的核心证明过程,并了解如何将存在量词和全称量词统一转化为奇偶量词。这是理解多项式谱系与奇偶类之间关系的关键一步。
概率计算与性质证明
上一节我们介绍了哈希函数族及其性质,本节中我们来具体计算相关概率,并完成第三个性质的证明。
首先计算两个关键概率。第一个概率是:给定 Bx = -b 的条件下,Bx' - b = 0 的概率。由于 Bx = -b,我们可以将 -b 替换为 Bx,从而得到 Bx' - Bx = 0 这一事件。这个概率我们之前计算过,是 2^{-k}。
在第一个概率中,Bx - b 不再起作用,因为 x' 是另一个变量。因此,我们可以将这个概率写为事件 Bx' - Bx = 0 的概率,这同样是 2^{-k}。因此,我们得到总的概率为 2^{-2k}。
这就是整个证明的思路和细节。
接下来,我们转向第三个性质,这也是我们应用中最相关的一个。这个性质可以从前两个性质推导出来。
考虑随机变量 N,它被定义为在随机哈希函数下,映射到零桶的 x 的数量。这是一个随机变量,因为计数结果依赖于随机选择的哈希函数 h。当 h 改变时,这个数字 N 也会改变。
我们感兴趣的是:N 何时为0,何时为1,何时大于1。我们特别关注 N=1 的概率。
以下是计算步骤:
我们使用容斥原理来计算。首先计算 N >= 1 和 N >= 2 的概率,然后取它们的差就可以得到 N = 1 的概率。
N >= 1 的概率,根据容斥原理,至少为对所有 x 在 S 中求和 Pr[h(x)=0],减去对所有无序对 (x, x') 求和 Pr[h(x)=0 且 h(x')=0]。我们只需要一个下界,所以这个由容斥原理得到的下界是有效的。
现在我们可以简化这个表达式。根据之前的声明,第一项是 |S| * 2^{-k}。第二项涉及 C(|S|, 2) 个对 (x, x'),两者进入同一桶的概率是 2^{-2k}。这样我们就完成了 N >= 1 概率下界的估计。
接下来估计 N >= 2 的概率。这里我们需要一个上界,因为之后我们要用 N >= 1 的概率减去它,来得到 N = 1 概率的下界。N >= 2 的概率上界很简单,就是所有无序对 (x, x') 求和 Pr[h(x)=0 且 h(x')=0],即 C(|S|, 2) * 2^{-2k}。
由此,我们得到对于随机哈希函数,N = 1 的概率为:
Pr[N=1] = Pr[N>=1] - Pr[N>=2] >= |S| * 2^{-k} - 2 * C(|S|, 2) * 2^{-2k}。
可以验证,这个表达式至少是 (|S|/2^k) - (|S|/2^k)^2。现在,我们使用假设条件:S 的大小在 2^{k-2} 和 2^{k-1} 之间。这意味着 |S|/2^k 在 1/4 和 1/2 之间。
利用 x - x^2 这个函数在 x < 1/2 时是递增的性质,我们可以得到下界。代入 x = 1/4,得到值 1/4 - (1/4)^2 = 3/16 > 1/8。因此,我们得到了一个大于 1/8 的下界。这就完成了哈希函数声明中第三个性质的证明。
回到Valiant-Vazirani引理
现在让我们回到Valiant-Vazirani引理的证明。
引理声称:如果布尔公式 φ 有可满足赋值,那么我们可以(以一定的概率)将其归约到恰好只有一个可满足赋值的情况,从而使可满足赋值的个数为奇数。
设 φ 有 n 个变量。我们随机选取一个整数 k,范围在 2 到 n+1 之间。因为性质3要求 |S| >= 2^{k-2},而我们已知在 φ 可满足时 |S| >= 1,所以我们可以从 k=2 开始尝试。我们不知道具体有多少个可满足赋值,所以随机猜测 k,同时也随机选择矩阵 B 和向量 b。这共同定义了一个随机哈希函数 h(x) = Bx + b。
一旦有了这个随机哈希函数,我们就观察零桶。算法的输出是一个新的布尔公式 ψ,它包含 φ 原有的 n 个变量,并附加一个条件:x 必须映射到零桶,即 h(x) = 0。这个条件可以写成一个布尔公式,因为它是模2的线性方程,可以用与、或、非门表示。
算法 A 的功能描述如下:它输出这个新的布尔公式 ψ。
现在,立即可以得出两个结论:
- 如果
φ不可满足,那么加上h(x)=0的条件后仍然不可满足,所以ψ的可满足赋值数S'为0。 - 如果
φ可满足,设其可满足赋值集合为S,其大小至少为1。S的大小范围在1到2^n之间。哈希函数将在这个集合上施展“魔法”,使得零桶中恰好有一个元素。
让我们检查一下概率。以至少 1/n 的概率,我们能够猜中那个唯一的 k,使得 |S| 介于 2^{k-2} 和 2^{k-1} 之间。因为 k 只有大约 n 个可能值,随机尝试猜中的概率是 1/n。
在这个事件发生的条件下,根据我们刚刚证明的哈希函数性质3,以大于 1/8 的概率,我们选择的 B 和 b 能使映射到零桶的 x 的数量恰好为1。
将这两个概率相乘,我们以至少 1/(8n) 的概率选择了一个哈希函数,使得新公式 ψ 的可满足赋值数恰好为1。
因此,如果 φ 不可满足,ψ 的可满足赋值数为0(偶数)。如果 φ 可满足,则以显著概率,ψ 的可满足赋值数为1(奇数)。这就证明了Valiant-Vazirani引理的两个部分。
这个结果实际上展示了一个从SAT到“唯一可满足性问题”的随机化归约。这是一个多项式时间的随机化归约。它也表明了 NP 包含在 RP 关于“唯一解”的类中。这是Valiant-Vazirani引理的多种解读之一。
引入奇偶量词与后续目标
但我们最初的目标是什么呢?是证明多项式谱系中的定理,特别是 Σ₂^P 包含在 P^NP 中。我们能把 NP^NP 归约到奇偶类吗?这样它就能进一步归约到 P^NP。从目前的证明中我们还看不到这一点,所以我们需要继续努力。
现在,我们将反复运用这个思想,进行随机归约。我们打算用一个新的量词——奇偶量词,来替换存在量词和全称量词。因为原来的量词是交替出现的,我们难以直接归约到 P^NP。相反,我们将把它们转换成单一的量词,即即将引入的奇偶量词。
奇偶量词有自然的解释:对于变量 x,⊕x φ(x) 为真,当且仅当满足 φ(x) 的 x 的个数是奇数。
在某种意义上,我们已经展示了存在量词可以被奇偶量词替换。我们还将展示全称量词也可以被奇偶量词替换。
让我们正式定义它,因为这将成为我们的主要符号。
对于一个布尔公式 φ(x),表达式 ⊕x φ(x) 为真,当且仅当满足 φ(x) 的 x 的数量是奇数。这就是定义。
我们不再写 ∃x φ(x) 或 ∀x φ(x),而是写 ⊕x φ(x)。我们不交替使用存在和全称,而是将它们全部转换为单一的量词。
我们打算证明的结论可以表述为以下引理:
引理(奇偶归约):设 c 为一个常数。存在一个多项式时间图灵机 A(一个随机化算法),使得对于每一个具有 c 层交替的存在/全称量词的量化布尔公式 ψ,满足以下两个性质:
- 如果
ψ为真,那么Pr_r [A(ψ, r) ∈ ⊕SAT] >= 2/3。 - 如果
ψ为假,那么Pr_r [A(ψ, r) ∈ ⊕SAT] <= 1/3。
请注意,这个算法两边都可能出错(既有假阳性也有假阴性),错误率比Valiant-Vazirani引理要高,这是因为在转换全称量词时引入了误差。我们将在下次课完成这个证明。

本节课中我们一起学习了Valiant-Vazirani引理的核心证明,了解了如何通过随机哈希技术将SAT问题以一定概率归约到唯一解问题。我们还引入了奇偶量词的概念,并概述了如何利用类似思想将具有交替量词的量化布尔公式归约到奇偶可满足性问题,这是理解多项式谱系与奇偶类关系的重要基础。
033:Toda定理的证明(第二部分)

在本节课中,我们将继续学习Toda定理的证明。Toda定理指出,多项式层级(Polynomial Hierarchy)可以归约到奇偶计数类(⊕P)。上一节我们介绍了⊕P类,并利用Valiant-Vazirani引理将SAT问题归约到Unique SAT,进而归约到⊕P。本节我们将看到如何利用奇偶(Parity)量词本身,将带有交替量词(∃/∀)的布尔公式归约到⊕P问题,并处理归约过程中的概率放大问题。
奇偶量词替换
我们的目标是处理一个带有交替量词的布尔公式ψ。具体来说,我们希望将ψ转换为一个公式ψ‘,使得如果ψ为真,则ψ’以高概率属于⊕P;如果ψ为假,则ψ’以高概率不属于⊕P。这是一个双边错误(two-sided error)的随机归约。
证明思路是逐步替换量词。我们通过归纳法,将公式顶部的∃和∀量词逐一替换为奇偶量词。
考虑一个具有特定量词结构的布尔公式ψ:
ψ = ⊕_z ∃_x ∀_w φ(z, x, w)
其中,z ∈ {0,1}^L, x ∈ {0,1}^n, w ∈ {0,1}^k。
首先,我们利用Valiant-Vazirani技术将∃_x量词替换为⊕_x量词。对于随机字符串r,我们可以构造一个公式τ(x, r),使得:
- 如果
∃_x ∀_w φ(z, x, w)为真,那么以高概率(≥ 1/8),⊕_x ∀_w [φ(z, x, w) ∧ τ(x, r)]为真。 - 如果
∃_x ∀_w φ(z, x, w)为假,那么⊕_x ∀_w [φ(z, x, w) ∧ τ(x, r)]必然为假。
这样,对于单个固定的z,我们成功地将∃量词替换为了⊕量词。
概率放大问题
然而,当我们考虑最外层的⊕_z量词时,问题出现了。对于每个z,上述转换成功的概率至少为1/8。由于z有2^L种可能取值,为了保证整个公式ψ‘的正确性,我们需要对所有z的转换都成功。这导致整体成功概率急剧下降至大约(1/8)^(2^L),这对于一个高效的随机归约来说是远远不够的(我们通常要求成功概率≥ 2/3)。
因此,当前的核心问题是:如何将对于每个z的成功概率从1/8提升到一个接近1的常数?
解决方案是进行概率放大。对于一个固定的z,我们不再只进行一次Valiant-Vazirani实验(使用一个随机串r),而是独立重复进行T次实验,使用随机串r_1, r_2, ..., r_T。
以下是具体操作:
我们检查这T次实验中是否至少有一次成功。只要有一次成功,我们就认为对于这个z的转换是成功的。
成功概率分析:
- 当原公式为真时:单次实验失败的概率至多为
1 - 1/8。T次实验全部失败的概率至多为(1 - 1/8)^T。因此,至少一次成功的概率(即放大后的成功概率)为1 - (1 - 1/8)^T。通过选择足够大的T,我们可以使这个概率任意接近1。 - 当原公式为假时:根据Valiant-Vazirani引理,单次实验永远不会成功(输出为真)。因此,
T次实验的“或”结果也永远不会为真。错误概率为0。
这样,对于每个固定的z,我们成功地将转换的正确率提升到了接近1。
处理所有z的取值
接下来,我们需要考虑z在所有2^L种取值上的情况。我们希望整个公式ψ‘的成功概率(即⊕_z量词下,内部转换对于足够多的z都正确)足够高。
整体成功概率分析(当ψ为真时):
我们使用并集界限来估算误差。对于每个z,转换失败的概率至多为(1 - 1/8)^T。因为有2^L个z,所以存在某个z转换失败的总概率上界为 2^L * (1 - 1/8)^T。
因此,整体成功的概率至少为 1 - 2^L * (1 - 1/8)^T。
现在,我们选择 T = 16 * n * L(其中n是x的长度)。通过计算可以证明,此时 2^L * (1 - 1/8)^T ≤ 1/3。
因此,当原公式ψ为真时,我们构造的新公式ψ‘为真的概率至少为 1 - 1/3 = 2/3。
类似的分析也适用于原公式ψ为假的情况,可以证明ψ‘为真的概率至多为1/3。
至此,我们完成了随机归约:ψ 可以随机归约到如下形式的公式 ψ‘:
ψ‘ = ⊕_z [ (实验1成功) ∨ (实验2成功) ∨ ... ∨ (实验T成功) ]
其中每个“实验”都是应用Valiant-Vazirani变换后的公式:⊕_x ∀_w [φ(z, x, w) ∧ τ(x, r_t)]。
消除逻辑“或”操作
新的公式ψ‘中仍然包含一个逻辑“或”(∨)操作,这阻止了它成为一个纯粹的奇偶量词公式。我们的最后一步是消除这个“或”操作。
考虑一个简化问题:如何将 (⊕_x F1(x)) ∨ (⊕_y F2(y)) 转换为一个单一的奇偶量词公式?
我们引入一个关键的构造:“加一”操作。
对于一个公式F,定义F^{+1}如下:
F^{+1}(u, x) = (u=0 ∧ F(x)) ∨ (u=1 ∧ (x=0))
这个操作的效果是:将公式F的满足赋值的数量精确地增加1个。
利用这个操作,我们可以构造一个新公式。以下是具体步骤:
- 对
F1和F2分别应用“加一”操作,得到F1^{+1}和F2^{+1}。 - 将这两个新公式取合取(∧),得到
G = F1^{+1} ∧ F2^{+1}。 - 再对
G应用一次“加一”操作,得到最终公式H = G^{+1}。
现在,我们断言:
(⊕_x F1(x)) ∨ (⊕_y F2(y)) 为真 当且仅当 ⊕_{x,y,u1,u2,u3} H(x, y, u1, u2, u3) 为真。
原理简述:
- 如果
F1和F2中恰好有一个具有奇数个满足赋值(即原“或”式为真),那么F1^{+1}和F2^{+1}中也将恰好有一个为奇数。奇数与偶数的合取G是偶数。偶数再加一H是奇数。因此,最终奇偶量为真。 - 如果
F1和F2都具有偶数个满足赋值(即原“或”式为假),那么F1^{+1}和F2^{+1}都变为奇数。奇数与奇数的合取G是奇数。奇数再加一H是偶数。因此,最终奇偶量为假。 - 其他情况(如两者都为奇数)也可以通过类似分析得到一致结果。
通过这种方法,我们成功地将一个“或”连接的两个奇偶量词表达式,转换为了一个单一的、带有额外辅助变量的奇偶量词表达式。将这个技术应用于ψ‘中的大“或”式,我们就可以最终得到一个纯粹的、只包含奇偶量词的布尔公式,从而完成整个归约。
总结
本节课中,我们一起学习了Toda定理证明的核心部分:
- 奇偶量词替换:利用Valiant-Vazirani引理,将布尔公式中的存在量词(∃)替换为奇偶量词(⊕)。
- 概率放大:通过独立重复实验并取逻辑“或”的方法,将每个子问题的成功概率从常数提升到接近1,以应对外层奇偶量词带来的指数级挑战。
- 消除逻辑“或”:通过巧妙的“加一”操作构造,将逻辑“或”操作编码进一个更大的奇偶量词公式中,最终得到纯粹的⊕P问题实例。

这些步骤共同构成了从多项式层级到奇偶计数类⊕P的随机归约,是理解Toda定理的关键。
034:Toda定理的证明(第一部分)

在本节课中,我们将学习Toda定理证明的核心部分。我们将看到如何将多项式层级(PH)中的问题,通过随机归约,转化为一个仅涉及奇偶性(Parity)计数的问题。这是理解PH与计数类关系的关键一步。
从多数量词到单一奇偶性
上一节我们介绍了证明的整体框架。本节中我们来看看如何将带有交替存在和全称量词的布尔公式,归约到一个仅使用奇偶性量词的公式。
我们从一个具有交替量词的布尔公式开始。目标是将其转化为一个形式更简单的公式,同时保持其真值的奇偶性信息。核心思想是通过引入新的变量和构造,逐步“消除”量词。
以下是实现归约的关键步骤:
- 消除“或”运算符:通过归纳法,我们可以随机地将一个公式归约为另一个公式,其满足赋值的数量恰好增加1。这允许我们移除公式中的“或”运算符。
- 合并量词:利用上述构造,我们可以将形如 ∃z ∀w φ(z, x, w) 的三重量词结构,归约为仅包含两个量词的新公式 φ'(z, x, w'),其中只涉及奇偶性和存在量词。
- 转换全称量词:利用逻辑等价关系 Parity_x ∀y φ(x, y) ≡ ¬(Parity_x ∃y ¬φ(x, y))。因为对于固定的x,φ(x,y)的满足赋值数加上不满足赋值数总是偶数(等于2^|y|)。所以,如果满足赋值数是奇数,则不满足赋值数也是奇数;反之亦然。这样,我们就将“奇偶性-全称”组合转换成了“奇偶性-存在”组合。
- 递归应用:重复应用步骤2和3,可以将任意常数层(c层)的交替量词最终归约为一个单一的奇偶性量词公式 φ''(z, x, w'')。由于每次归约只引入多项式规模的膨胀,且量词层数c是常数,因此整个归约过程最终只导致公式规模的多项式膨胀。
通过这一系列变换,我们实现了从多项式层级 Σ_c^SAT 到奇偶性类 ⊕P 的随机归约。这证明了引理1:P^⊕P 可以对 ⊕P 进行双边错误归约。然而,这只是一个随机归约。要证明PH包含在 P^⊕P 中,我们需要一个确定性的多项式时间归约。
去随机化:从模2提升到模2^m
上一节我们完成了随机归约。本节中我们来看看如何将这个随机过程去随机化,从而得到确定性的结果。
核心想法是将奇偶性运算从模2算术“提升”到模2^m算术,其中m是一个较大的数。如果m大于归约中使用的随机比特数,我们就可以对所有可能的随机串进行求和。原始公式的真假将对应于这个和值是“大”还是“小”。
具体而言,我们需要一个代数引理(提升引理):
引理2:存在一个多项式时间确定性图灵机T,对于给定的布尔公式φ和自然数m,可以输出一个新公式φ',满足以下性质:
- 如果φ的满足赋值数为奇数,则φ'的满足赋值数模2^(m+1)同余于 -1。
- 如果φ的满足赋值数为偶数,则φ'的满足赋值数模2^(m+1)同余于 0。
这里,-1和1在模2下是等价的,但在更高的模数(如模4)下则不同。这个“间隙”(0 与 -1/1)正是我们去随机化的关键。当我们对所有随机串r对应的公式φ_r'的满足赋值数求和时,根据原始φ的真假,这个和值在模2^(m+1)下会落在显著不同的区间,从而允许我们确定性地判断φ的真值。
构造提升:加法与乘法
那么,如何构造这样的提升呢?证明是归纳式的,基于m进行归纳。我们需要学习如何从模2提升到模4,这是基础步骤。
我们通过定义布尔公式上的“加法”和“乘法”运算来迭代构建φ'。
以下是这些运算的定义:
- 公式加法 (F + G):引入一个新的选择变量u。新公式定义为:
(u=0 ∧ F) ∨ (u=1 ∧ G)。直观上,这分支执行:如果u=0则计算F,如果u=1则计算G。因此,新公式的满足赋值数等于F和G的满足赋值数之和。 - 公式乘法 (F * G):保持F和G的变量集合不相交。新公式简单地定义为
F ∧ G。因此,新公式的满足赋值数等于F和G的满足赋值数之积。
有了这些运算,我们就可以从初始公式φ0 = φ开始,通过加法和乘法的组合,构造出φ1,使其满足赋值数在模4下根据φ的奇偶性分别为-1或0。这正是归纳证明的起点。


本节课中我们一起学习了Toda定理证明的前半部分。我们看到了如何将PH中的问题随机归约到奇偶性问题,并介绍了通过模运算提升来实现去随机化的核心思想。下一节,我们将完成提升引理的归纳证明,从而最终将PH包含到 P^⊕P 中。
035:Toda定理的证明与去随机化

在本节课中,我们将学习如何完成Toda定理的证明。Toda定理指出,多项式层级(PH)包含于P^#P。我们将通过去随机化之前建立的随机归约来完成证明。
回顾与目标
上一节我们证明了多项式层级可以随机归约到奇偶性P类(Parity P)。这是通过将存在量词和全称量词替换为单个奇偶性量词实现的。因此,如果我们能解决#P或奇偶性集合问题,就能在随机多项式时间内解决PH中的任何问题。
然而,我们的原始目标是证明确定性的包含关系。Toda定理声称PH实际上包含于P^#P。所以,如果我们能解决#P集合问题,就能在确定性多项式时间内解决PH。那么,我们如何证明这一点呢?这就是去随机化的问题。
提升引理:放大模数
我们将通过首先放大奇偶性差异(0/1模2)到更高的模数来去随机化这个随机归约。我们将从模2提升到模2^(m+1)。这样,当我们对所有可能的随机选择求和时,公式值的幅度会变得很大或很小,从而消除了对随机选择字符串R的需求。
引理2(提升引理):给定一个布尔公式ψ,我们可以将其哈希值从模2提升到模2^(m+1)。具体来说:
- 如果满足赋值的数量是-1模2,它将提升为-1模2^(m+1)。
- 如果满足赋值的数量是0模2,它将保持为0模2^(m+1)。
我们将使用加法和乘法运算符来实现这一点。
- 加法(F + G):引入一个新变量u。当u=0时,值为F;当u=1时,值为G。这会使满足赋值的数量相加。
- 乘法(F * G):创建变量x的副本y,并取F(x)和G(y)的与(AND)。这会使满足赋值的数量相乘。
以下是构造过程:
- 初始化:令 φ₀ = ψ。这在模2意义下是正确的。
- 迭代定义:我们定义一个巧妙的公式来迭代提升模数。
这里的加法和乘法是上述定义的运算符。φ_{i+1} = 4 * (φ_i) + 3 * (φ_i)^4
这个构造的核心性质是:如果φ_i的满足赋值数量是-1模2(2i),那么φ_{i+1}的满足赋值数量就是-1模2(2(i+1))。如果起始值是0模2(2i),则保持为0模2(2(i+1))。
证明思路:通过模运算验证。假设#φ_i ≡ -1 + 2^j * q (mod 2^(2^j))。
计算4*(-1 + 2^j*q) + 3*(-1 + 2^j*q)^4,展开后,在模2(2(j+1))下,高阶项(2^(2j)的倍数)会被消去,最终结果简化为-1。对于起始值为0的情况,计算过程类似,结果保持为0。
通过归纳法,只需迭代i = ceil(log m)次,我们就能得到满足引理2要求的公式φ_i,其满足赋值数量在模2^(m+1)下具有所需性质。虽然公式的变量数和规模会增长,但增长幅度是多项式级别的(约为O(m²)),因此变换是多项式时间的。
至此,引理2的证明完成。
去随机化归约
现在,让我们回到引理2之前的问题:如何对PH到奇偶性P的归约进行去随机化?这将是完成Toda定理证明的最后一步。
证明思路:将随机比特替换为非确定性比特。
根据引理1和2,对于PH中的任意问题L,存在一个多项式时间非确定性图灵机M,以及一个多项式m(随机字符串长度),使得:
- 如果x是L的“是”实例,那么对于至少2/3的随机字符串R,M(x, R)的接受路径数为-1模2^(m+1)。
- 如果x是L的“否”实例,那么对于至多1/3的随机字符串R,M(x, R)的接受路径数为-1模2^(m+1)。
- 此外,对于所有x和R,M(x, R)的接受路径数只能是0或-1模2^(m+1)这两个值。
现在,我们构造一个新的非确定性图灵机M‘:
- M‘在输入x上,猜测一个字符串R(而不是随机掷币)。
- M‘接受当且仅当M(x, R)接受。
那么,M‘(x)的接受路径总数就是对所有R的M(x, R)的接受路径数求和:
#M'(x) = Σ_R [#M(x, R)]
由于每个#M(x, R)的值是0或-1模2^(m+1),我们可以分析总和:
- 如果x是“是”实例,至少有(2/3)*2m个R贡献-1值。因此,`#M'(x)`的幅度接近2m(很大的负数)。
- 如果x是“否”实例,至多有(1/3)*2^m个R贡献-1值。因此,
#M'(x)的幅度接近0。
这样,在“是”和“否”实例之间,#M'(x)的幅度存在一个明显的间隔。因此,计算M‘(x)的接受路径数(这是一个#P问题)就能区分x是否属于L。由于L是PH中的任意问题,我们证明了PH ⊆ P^#P。
总结
本节课中,我们一起完成了Toda定理的证明。关键步骤如下:
- 随机归约:利用奇偶性量词将PH随机归约到奇偶性P类。
- 模数提升:通过一个巧妙的公式迭代(
φ_{i+1} = 4φ_i + 3(φ_i)^4),将奇偶性值的模数从2大幅提升到2^(m+1),从而放大“是/否”实例之间的差异。 - 去随机化:将随机选择的比特串R改为非确定性“猜测”,并计算所有猜测情况下接受路径的总和。由于模数提升后产生了显著的幅度差,这个总和本身(一个#P函数)就足以判定原问题。

这个证明虽然较长,但引入了随机化作为简化工具,并巧妙地运用了哈希函数和模运算技术,是复杂性理论中的一个经典范例。
036:随机化计算资源

在本节课中,我们将学习计算复杂性理论中的随机化资源。我们将介绍概率图灵机,并定义几个重要的复杂性类:BPP、RP、coRP 和 ZPP。我们将通过具体例子理解这些概念,并探讨它们之间的关系。
随机化算法与概率图灵机
上一节我们完成了关于多项式层级(PH)的证明。本节中,我们来看看随机化作为一种计算资源。在图灵机模型中,我们称之为概率图灵机。
BPP 是我们定义的第一个基于随机化的复杂性类。它代表有界错误概率多项式时间。本质上,它描述了那些运行时间为多项式、但允许以一定概率出错的算法。你可以将其视为概率多项式时间或随机化多项式时间算法。直观上,它介于 P 和 NP 之间。
BPP 的实例
以下是两个经典的、实用的 BPP 算法例子:
1. 素数判定问题
给定一个二进制数 n,判断它是否为素数。
算法(Solovay-Strassen):
- 随机选取一个数
a。 - 计算
a^((n-1)/2) mod n。结果应为±1。 - 计算雅可比符号
(a/n),结果也为±1。 - 如果两个结果相等,则输出“是”(是素数);否则输出“否”。
这个算法具有单侧错误:对于素数 n,它永远不会出错;对于合数 n,它可能以小于 1/2 的概率出错。通过概率放大技术,我们可以将错误概率降低到 1/3 以下。这表明素数判定问题属于 coRP(稍后定义),进而也属于 BPP。
2. 多项式恒等性测试
给定一个以紧凑形式(例如算术电路)表示的 n 元多项式 F,判断它是否恒等于零多项式。
算法:
- 从域
F^n中随机选取一个点α。 - 计算
F(α)。 - 如果
F(α) = 0,则输出“是”(是零多项式);否则输出“否”。
同样,该算法也具有单侧错误:如果 F 是零多项式,则永远正确;如果 F 非零,则可能出错,但错误概率可被限制(假设域足够大)。这表明 PIT 问题属于 RP(稍后定义),进而也属于 BPP。
此外,在图论等领域还有许多随机化算法的例子,例如在无向图中寻找匹配或判断连通性。
关于概率图灵机的开放性问题
关于概率图灵机,存在几个重要的开放性问题:
- P = BPP 吗? 即,随机化对于高效算法是否必要?能否将每个概率图灵机都转换为确定性的?理论证据倾向于支持 P = BPP 的猜想。
- BPP = NP 吗? 即,概率性“证明”是否比 NP 验证者所需的非确定性证明更弱?理论证据倾向于支持 BPP ≠ NP 的猜想。事实上,如果 BPP = NP,将导致多项式层级坍缩。
单侧错误:RP 与 coRP
BPP 捕获的是双侧错误算法,即对“是”实例和“否”实例都可能出错。现在,我们来看看只允许单侧错误的算法类。
RP(随机多项式时间)的定义如下:
一个问题 L 属于 RP,如果存在一个概率图灵机 M,在多项式时间内运行,满足:
- 如果
x ∈ L(是实例),则Pr[M(x) 接受] ≥ 2/3。 - 如果
x ∉ L(否实例),则Pr[M(x) 接受] = 0。
换句话说,RP 算法在否实例上绝不出错,在是实例上允许有小于 1/3 的错误概率。
类似地,可以定义 coRP:
- 如果
x ∈ L,则Pr[M(x) 接受] = 1。 - 如果
x ∉ L,则Pr[M(x) 接受] ≤ 1/3。
即,coRP 算法在是实例上绝不出错,在否实例上允许出错。
观察:
- 之前的素数判定算法属于 coRP。
- 之前的 PIT 算法属于 RP。
- 任何 RP 或 coRP 算法自然也是 BPP 算法,因为其错误限制更严格,所以 RP ⊆ BPP 且 coRP ⊆ BPP。
- RP 问题实际上属于 NP。因为如果存在一个随机串
r使得M(x, r)接受,那么x一定是一个是实例(证书)。这个r就可以作为证书,M作为验证者。类似地,coRP ⊆ coNP。
零错误:ZPP
我们能否定义一种没有错误,但运行时间不确定的概率图灵机?答案是肯定的,这引出了 ZPP(零错误概率多项式时间)类,也称为拉斯维加斯算法。
定义:
一个问题 L 属于 ZPP,如果存在一个概率图灵机 M,满足:
M总是给出正确答案(零错误)。M的期望运行时间是输入规模的多项式。
这里的关键是,虽然最坏情况下的运行时间可能很长,但平均(期望)情况下是高效的。
RP、coRP 与 ZPP 的关系
这些随机化复杂性类之间存在紧密的联系:
命题 1:ZPP ⊆ RP ∩ coRP。
证明思路:给定一个 ZPP 算法 M(期望时间 T(n)),我们可以构造一个 RP 算法:运行 M 最多 3T(n) 步。如果 M 在此时间内完成并接受,则输出“是”;否则输出“否”。
- 对于否实例,新算法绝不会输出“是”,符合 RP 要求。
- 对于是实例,根据马尔可夫不等式,
M运行超过3T(n)步的概率 ≤ 1/3,因此新算法错误拒绝的概率 ≤ 1/3。
这就证明了L ∈ RP。类似可证L ∈ coRP。
命题 2:ZPP = RP ∩ coRP。
证明思路(反向包含):假设一个问题 L 既有 RP 算法 A,又有 coRP 算法 B。我们可以构造一个 ZPP 算法:交替运行 A 和 B。
- 如果
A接受,则输出“是”(因为A在否实例上绝不出错)。 - 如果
B拒绝,则输出“否”(因为B在是实例上绝不出错)。 - 由于
A对是实例的接受概率高,B对否实例的拒绝概率高,这个交替过程期望上会很快停止并给出正确答案。
关系总结:
- P ⊆ ZPP = RP ∩ coRP ⊆ RP ⊆ NP 且 ⊆ BPP
- P ⊆ ZPP = RP ∩ coRP ⊆ coRP ⊆ coNP 且 ⊆ BPP
- RP 和 coRP 算法被称为蒙特卡洛算法(可能出错但时间固定),ZPP 算法被称为拉斯维加斯算法(绝不出错但时间期望高效)。
总结

本节课中,我们一起学习了计算中的随机化资源。我们介绍了:
- BPP:允许双侧有界错误的多项式时间算法。
- RP 和 coRP:只允许单侧错误的算法类,并且分别与 NP 和 coNP 有包含关系。
- ZPP:零错误但期望时间为多项式的算法类,并且有 ZPP = RP ∩ coRP 这一优美性质。
这些复杂性类帮助我们理解和分类那些利用随机性来获得高效性的算法,是理论计算机科学中连接理论与实践的重要桥梁。
037:概率复杂度类的关系与概率放大

在本节课中,我们将学习两个重要的概率复杂度类——ZPP 和 RP ∩ co-RP 之间的关系,并探讨如何通过概率放大技术,将成功概率略高于1/2的算法提升到几乎必然成功。
ZPP 与 RP ∩ co-RP 的等价性
上一节我们介绍了 ZPP(零错误概率多项式时间)和 RP(随机多项式时间)及其补类 co-RP。本节中,我们将证明一个关键结论:ZPP = RP ∩ co-RP。这意味着一个语言能被零错误概率算法判定的充要条件是,它同时能被一个单侧错误的 RP 算法和一个单侧错误的 co-RP 算法判定。
证明思路
证明分为两个方向:
- ZPP ⊆ RP ∩ co-RP:我们已经通过截断一个期望多项式时间的 ZPP 算法的运行,构造出了 RP 和 co-RP 算法。
- RP ∩ co-RP ⊆ ZPP:这是本节的重点。我们将展示如何组合一个 RP 算法和一个 co-RP 算法,构造出一个 ZPP 算法。
构造 ZPP 算法
假设语言 L 同时被一个 RP 算法 M1 和一个 co-RP 算法 M2 判定,且两者都在多项式时间 n^c 内运行(c为常数)。
我们定义一个新的概率图灵机 M 如下:
算法 M 描述:
- 使用随机字符串 r,依次独立地运行 M1(x, r) 和 M2(x, r)。
- 比较两者的输出:
- 如果输出相同(同为“是”或同为“否”),则 M 输出这个共同的结果。
- 如果输出不同,则返回步骤1,使用新的独立随机字符串重复此过程。
算法正确性与期望运行时间分析
算法的核心直觉在于 RP 和 co-RP 的单侧错误特性:
- 对于 是 实例(x ∈ L):M2(来自 co-RP)不会出错,必然输出“是”。M1(来自 RP)可能出错输出“否”,但出错概率 ≤ 1/2。
- 对于 否 实例(x ∉ L):M1(来自 RP)不会出错,必然输出“否”。M2(来自 co-RP)可能出错输出“是”,但出错概率 ≤ 1/2。
因此,当两个算法输出一致时,这个结果一定是正确的。当输出不一致时,我们无法判断,只能重试。
期望运行时间分析:
考虑一个 是 实例。单次运行中,M1 出错(导致输出不一致)的概率 ≤ 1/2。由于每次运行使用独立的随机字符串,连续 t 次运行都出错的概率 ≤ (1/2)^t。
算法 M 的期望运行轮数(即步骤1的重复次数)为:
E[轮数] = Σ_{t=0}^{∞} (t+1) * (1/2)^t
这个求和是收敛的,结果为常数。因此,虽然 M 在理论上可能运行无限轮,但其期望运行时间是多项式的(因为每轮模拟 M1 和 M2 的时间是多项式 n^c)。
对于 否 实例的分析完全对称。因此,M 是一个零错误的期望多项式时间算法,即 L ∈ ZPP。
结论: 我们证明了 RP ∩ co-RP ⊆ ZPP。结合之前已证的 ZPP ⊆ RP ∩ co-RP,我们得到:
ZPP = RP ∩ co-RP
概率放大定理
上一节我们证明了 ZPP 与 RP ∩ co-RP 的等价关系。本节中,我们来看看一个非常实用的技术——概率放大。它允许我们将一个成功概率仅略高于1/2的算法,提升到成功概率指数级接近1。
问题背景
在 BPP(有界错误概率多项式时间)的定义中,我们要求算法的成功概率 ≥ 2/3。一个自然的问题是:这个常数 2/3 是必需的吗?能否用更接近 1/2 的概率,比如 1/2 + 1/n^c(其中 n 是输入大小,c 是常数)?
概率放大定理 给出了肯定的回答:只要算法在每类实例上的成功概率稳定地超过 1/2 一个逆多项式的量,我们就可以通过重复运行和多数表决,将其成功概率提升到 1 减去一个逆指数的量。
定理陈述
设有一个概率图灵机 M 判定语言 L,满足对于某个常数 c > 0 和所有输入 x:
- 若 x ∈ L,则
Pr[M(x) 接受] ≥ 1/2 + 1/|x|^c - 若 x ∉ L,则
Pr[M(x) 拒绝] ≥ 1/2 + 1/|x|^c
那么,对于任意常数 d > 0,存在另一个概率图灵机 M',使得对于所有输入 x:
- 若 x ∈ L,则
Pr[M'(x) 接受] ≥ 1 - 2^{-|x|^d} - 若 x ∉ L,则
Pr[M'(x) 拒绝] ≥ 1 - 2^{-|x|^d}
并且 M' 的运行时间是 |x| 的多项式。
构造与算法思想
构造新算法 M' 的思路非常简单直接:
算法 M‘ 描述:
- 对于输入 x,将原始算法 M 独立运行 k 次,得到输出 y1, y2, ..., yk(每个是“是”或“否”)。
- 输出这 k 个结果中的多数值(即出现次数超过 k/2 的那个值)。为保证平局,通常取 k 为奇数。
关键在于如何选择重复次数 k,以及如何分析多数表决后的成功概率。这需要用到概率论中的 切尔诺夫界。
简要分析
设随机变量 Xi 表示第 i 次运行的结果是否正确(正确为1,错误为0)。则 Xi 是独立的,且其期望值 E[Xi] ≥ 1/2 + 1/n^c(其中 n = |x|)。
我们关心的是总和 S = Σ_{i=1}^{k} Xi。多数表决成功等价于 S > k/2;失败等价于 S ≤ k/2。
通过应用切尔诺夫界,我们可以证明,当选择 k = O(n^{2c+d}) 时,失败概率 Pr[S ≤ k/2] 可以被上界为 2^{-n^d}。这意味着,通过多项式次数的重复,我们可以将错误概率从逆多项式级别(如 1/2 - 1/n^c)降低到逆指数级别(如 2{-nd})。
核心公式(切尔诺夫界的一种形式):
对于独立同分布的随机变量 X1...Xk,满足 E[Xi] = μ,且 0 ≤ Xi ≤ 1,对于任意 0 < δ < 1,有:
Pr[ ΣXi ≤ (1-δ)μk ] ≤ exp(-δ²μk / 2)
在我们的设定中,μ = 1/2 + ε,其中 ε = 1/n^c。通过设置合适的 δ 和 k,即可得到所需的指数级小错误概率。
总结与开放性问题
本节课中我们一起学习了:
- ZPP 与 RP ∩ co-RP 的等价性:我们通过构造性的证明,展示了如何将一对单侧错误算法组合成一个零错误期望多项式时间算法,从而确立了 ZPP = RP ∩ co-RP 这一重要等式。
- 概率放大定理:我们了解到,在概率计算中,成功概率不需要是像 2/3 这样的固定常数。只要算法拥有一个逆多项式的优势(即成功概率 ≥ 1/2 + 1/poly(n)),我们就可以通过多项式次数的独立重复和多数表决,将成功概率指数级放大到几乎为1。这使得 BPP 类的定义对具体的成功概率常数不敏感。
最后,领域内一些重要的开放性问题包括:
- P = ZPP? 这是 P vs NP 问题的一个弱化版本,目前未知。
- P = BPP? 普遍认为 BPP = P,即所有有效的概率算法都可以被确定化算法高效模拟,但这尚未被证明。
- NP 与 BPP 的关系:NP 是否包含在 BPP 中?或者反之?这些关系也尚未明确。

这些问题的解答将深刻影响我们对计算本质的理解。
038:概率图灵机与BPP类

在本节课中,我们将学习概率图灵机相关的复杂性类,特别是BPP类。我们将探讨其成功概率的重要性,并学习如何通过概率放大技术来增强算法的可靠性。最后,我们将了解BPP类在多项式层级中的位置。
概率复杂性类回顾
上一节我们介绍了概率图灵机,并定义了几个复杂性类,如BPP、ZPP、RP和co-RP。这些类的定义取决于算法允许的错误类型。我们推测这些类在计算难度上远低于PP类。
虽然PP类也被称为概率多项式时间,但它并非一个实用的复杂性类。我们目前研究的这些类(如BPP)更为实用。其中,ZPP被定义为RP与co-RP的交集,我们推测它更接近P类。类似地,RP、co-RP和BPP也各有其特性。
成功概率的重要性
一个关键问题是:算法成功概率为2/3或错误概率为1/3这一设定有多重要?我们声称,只要成功概率与1/2的差距是多项式可逆的,那么这个具体的概率值就不那么重要。
具体来说,如果成功概率满足 P ≥ 1/2 + 1/n^c(其中c是常数),或者错误概率满足 P ≤ 1/2 - 1/n^c,那么具体的概率值影响不大。这是因为我们可以通过概率放大技术来显著改善性能。
概率放大定理
定理指出:如果一个概率图灵机M的成功概率相对于1/2有至少 1/n^c 的优势,那么我们可以构造一个新的图灵机M‘,将其成功概率放大到无限接近1(具体来说,可以接近到 1 - 1/2{nd})。
构造方法如下:定义M‘为重复运行原始图灵机M k 次,每次使用独立同分布的随机字符串,然后对k次运行的结果进行多数表决。假设k为奇数,则多数结果即为超过k/2次相同的结果。
为了分析错误概率,我们定义一个指示变量 X_i:
- X_i = 1 如果第i次实验正确。
- X_i = 0 如果第i次实验错误。
我们关心的是多数表决出错的概率,即正确结果出现次数少于k/2的概率。这等价于 ΣX_i < k/2 的概率。
切尔诺夫界的应用
切尔诺夫界是概率论中的一个基本且重要的不等式。它指出:对于k个独立同分布的布尔随机变量 X_1, ..., X_k,每个变量取1的概率为p,取0的概率为1-p。那么,对于任意介于0和1之间的分数δ,这些变量平均值偏离其期望值p超过δ的概率很小。
切尔诺夫界公式为:
Pr[ |(ΣX_i)/k - p| > δ ] ≤ e^{-δ²pk/4}
随着k增大,这个概率以指数速度趋近于0。这正是我们降低错误概率所需要的工具。
在我们的应用中,p = 1/2 + 1/n^c。我们希望平均值偏离期望值超过 δ = 1/n^c 的概率很小。根据切尔诺夫界,这个概率小于 e^{- (1/n^{2c}) * p * k / 4}。
如果我们选择 k = 8n^{d+2c},经过简化,可以证明错误概率被降低到小于 1/2{nd}。这就完成了概率放大的证明。
切尔诺夫界有一个优美的基础证明,它利用了马尔可夫不等式以及对 e^{tΣX_i} 的期望进行处理。虽然我们在此不展开证明,但它是概率论课程的标准内容。
BPP与多项式层级
为了进一步理解BPP,我们将其与其他复杂性类进行比较。
目前,BPP ⊆ NP 是否成立尚属未知。然而,我们可以证明一个更强的结论:BPP ⊆ Σ₂ ∩ Π₂。也就是说,BPP包含在多项式层级的第二级中,具体是 NP^NP 与其补集的交集。这显示BPP比PP、#P等类要“容易”得多。
我们将证明由Sipser和Gács在1983年提出的定理:BPP ⊆ Σ₂。由于BPP对其补集封闭(co-BPP = BPP),由此可立即推出 BPP ⊆ Π₂,因此 BPP ⊆ Σ₂ ∩ Π₂。
定理证明思路
设L是一个BPP问题,存在一个随机多项式时间算法(图灵机M)。假设M使用长度为m(m是n的多项式,即m = n^c)的随机字符串。通过概率放大,我们可以确保:
- 如果x ∈ L,则M接受x的概率 ≥ 1 - 2^{-n}。
- 如果x ∉ L,则M接受x的概率 ≤ 2^{-n}。
定义“好”的随机字符串集合 S:
S = { r ∈ {0,1}^m | M(x, r) 接受 }
那么:
- 若x ∈ L,则 |S| ≥ (1 - 2^{-n}) * 2^m。
- 若x ∉ L,则 |S| ≤ 2^{-n} * 2^m。
集合S的大小在“是”实例和“否”实例之间存在巨大差距。我们的目标是在Σ₂(即∃∀量词)框架内检验这种大小差距。
构造图与扩张性质
我们在随机字符串空间 {0,1}^m 上定义一个图 G_U,其性质取决于一个大小为k的集合U。
- 顶点:所有长度为m的比特串(共2^m个)。
- 边:对于顶点s和s‘,如果存在 u_i ∈ U,使得 s‘ = s ⊕ u_i(⊕表示按位异或),则(s, s’)之间存在一条边。
这样定义的图G_U是一个正则图,每个顶点的度数都为 k = |U|。我们后续将设定 k = m/n。
对于任意顶点子集S,定义 Γ_U(S) 为S在图G_U中的邻居集合(所有通过一条边可达的顶点)。
核心在于以下两个关于图扩张性质的断言:
- 小集合断言:如果 |S| ≤ 2^{m-n},那么对于所有大小为k的集合U,其邻居集合 Γ_U(S) 都不可能覆盖整个顶点空间(即 Γ_U(S) ≠ {0,1}^m)。
- 大集合断言:如果 |S| ≥ (1 - 2^{-n}) * 2^m,那么存在一个大小为k的集合U,使得其邻居集合覆盖整个空间(即 Γ_U(S) = {0,1}^m)。
这两个断言体现了“是”实例与“否”实例的关键区别,并且其表述本身就包含了 ∀U 和 ∃U 的量词,这正是Σ₂类所允许的形式。
断言证明概要
- 断言1证明:由于每个顶点最多有k个邻居,因此邻居集合的总大小最多为 |S| * k。代入 |S| ≤ 2^{m-n} 和 k = m/n,可得 |Γ_U(S)| ≤ (m/n) * 2^{m-n}。当n足够大时,这个值严格小于顶点总数 2^m。因此,无论U如何选择,邻居集合都不可能覆盖所有顶点。
- 断言2证明:其证明依赖于概率方法。我们随机选取一个大小为k的集合U,然后计算对于给定的超大集合S,其邻居集合未能覆盖某个特定顶点v的概率。通过联合界对所有顶点v进行求和,可以证明存在一个U使得覆盖成立的概率大于0,从而这样的U必然存在。
完成归约
综合以上两个断言,我们可以将语言L的判定条件用Σ₂形式描述出来:
x ∈ L ⇔ ∃U (|U|=k) ∀v ∈ {0,1}^m [ v ∈ Γ_U(S_x) ]
其中 S_x 是使得M接受x的随机字符串集合。由于检查“v ∈ Γ_U(S_x)”可以在多项式时间内完成(只需检查是否存在s ∈ S_x和u ∈ U使得v = s ⊕ u,而检查s ∈ S_x即运行M(x,s)),因此整个谓词位于P中。这就证明了 L ∈ Σ₂,从而 BPP ⊆ Σ₂。
总结
本节课我们一起学习了以下内容:
- 回顾了BPP、RP、ZPP等概率复杂性类。
- 理解了对于BPP类算法,只要成功概率与1/2有多项式可逆的差距,具体的概率值(如2/3)并不关键。
- 学习了概率放大技术,通过重复实验和多数表决,并借助切尔诺夫界,可以将算法的错误概率指数级降低。
- 探讨了BPP在多项式层级中的位置,证明了BPP ⊆ Σ₂ ∩ Π₂。这一定理的证明巧妙地构造了一个图,并利用其扩张性质将集合大小比较问题转化为一个可以用 ∃∀ 量词描述的问题。

这些概念展示了随机化算法的鲁棒性及其在计算复杂性理论中的优雅地位。
039:BPP与多项式层级

在本节课中,我们将学习BPP(有界错误概率多项式时间)类与多项式层级(PH)之间的关系。具体来说,我们将证明一个关键结论:BPP ⊆ Σ₂ ∩ Π₂。这意味着任何BPP中的问题,都可以用多项式层级的第二层(即Σ₂和Π₂的交集)来描述。课程将包含一个巧妙的概率论证,并引入随机化归约的概念。
证明概述:BPP ⊆ Σ₂ ∩ Π₂
我们想证明,对于任意语言 L ∈ BPP,都存在一个多项式时间验证器,使得 L 可以用 Σ₂ 的形式表达。证明的核心思想是构造一个“好”的字符串集合 S,并利用概率方法证明存在一小部分“见证点”,使得整个空间都能被这些点的邻域覆盖。
核心构造与定义
设 L ∈ BPP。根据BPP的定义,存在一个多项式时间概率图灵机 M,对于输入 x 和随机串 r,满足:
- 若 x ∈ L,则 Pr[ M(x, r) 接受 ] ≥ 1 - 2^{-n}
- 若 x ∉ L,则 Pr[ M(x, r) 接受 ] ≤ 2^{-n}
这里 n = |x|,r 的长度 m 是 n 的多项式。
对于固定的输入 x,我们定义集合 S 为所有使得 M(x, r) 接受的随机串 r 的集合:
S = { r ∈ {0,1}^m | M(x, r) 接受 }
根据BPP的定义,集合 S 的大小性质截然不同:
- 若 x ∈ L,则 |S| ≥ (1 - 2^{-n}) * 2^m
- 若 x ∉ L,则 |S| ≤ 2^{-n} * 2^m
我们的目标是利用 S 的这种大小差异来区分 x 是否属于 L。
邻域与覆盖的关键概念
我们引入一个关键操作:对于字符串 r 和 u,定义 r ⊕ u 为它们的按位异或。
对于集合 S 和点 u,定义 u 关于 S 的邻域为:Γ_u(S) = { r ⊕ u | r ∈ S }。
这相当于将集合 S 平移了 u。
对于一个点集 U = {u₁, u₂, ..., u_k},定义 U 关于 S 的联合邻域为所有这些邻域的并集:Γ_U(S) = ∪_{i=1}^{k} Γ_{u_i}(S)。
我们的证明将围绕以下两个核心论断展开。
论断一:当 x ∉ L 时,S 很小
上一节我们定义了集合 S。本节我们来看第一个简单但关键的观察。
若 x ∉ L,则 S 非常小。具体来说,|S| ≤ 2^{m-n}。因此,对于任意点集 U(无论 U 如何选取),其联合邻域 Γ_U(S) 的大小最多是 k 个 S 的大小的并集。由于 S 本身很小,即使取并集,其大小也远小于整个空间 {0,1}^m。
公式描述:
若 x ∉ L,则对于任意 U,有 |Γ_U(S)| ≤ k * |S| ≤ k * 2^{m-n}。
只要我们选择 k = m/n,就有 |Γ_U(S)| ≤ m/n * 2^{m-n} << 2^m。这意味着 Γ_U(S) 不可能 覆盖整个空间 {0,1}^m。
论断二:当 x ∈ L 时,存在小U覆盖整个空间
上一节我们看到,当 x ∉ L 时,任何 U 都无法覆盖整个空间。本节我们将证明,当 x ∈ L 时,情况完全不同:存在一个大小仅为 k = m/n 的点集 U,使得其联合邻域 Γ_U(S) 覆盖整个空间 {0,1}^m。
由于我们对 S 的内部结构一无所知,只知道它很大(|S| ≥ (1-2{-n})2m),因此无法系统地构造出这样的 U。我们转而使用概率方法:我们随机选取 k 个点 U = {u₁, u₂, ..., u_k},然后计算 Γ_U(S) 覆盖整个空间的概率。
以下是分析步骤:
- 定义坏事件:对于空间中任意一个点 r ∈ {0,1}^m,定义事件 E_r 为:r 不在 Γ_U(S) 中。等价地,对于所有 i,r 都不在 Γ_{u_i}(S) 中,即 r ⊕ u_i ∉ S。
- 计算单个事件的概率:固定一个 r 和一个 u_i。事件“r ⊕ u_i ∉ S”发生的概率,等于随机选取的 u_i 不属于集合 { r ⊕ s | s ∈ S } 的概率。这个目标集合的大小就是 |S|。因此:
Pr[ r ⊕ u_i ∉ S ] = 1 - |S| / 2^m ≤ 2^{-n} (因为 |S|/2^m ≥ 1-2^{-n})。 - 计算联合事件的概率:由于 u₁, ..., u_k 是独立随机选取的,事件 E_r(即所有 k 个条件同时失败)的概率为:
Pr[E_r] ≤ (2{-n})k = 2^{-k*n}。
我们选择 k = m/n,则 Pr[E_r] ≤ 2^{-m}。 - 应用并集界限:存在某个 r 使得坏事件 E_r 发生的概率,最多是所有 r 的坏事件概率之和:
Pr[ ∃ r, E_r 发生 ] ≤ Σ_{r ∈ {0,1}^m} Pr[E_r] ≤ 2^m * 2^{-m} = 1。
注意,这个上界是 1,这本身不能证明概率小于1。但关键在于,我们计算的是“存在坏事件”的概率上界为1。概率方法告诉我们,如果“不存在坏事件”(即覆盖成功)的概率 > 0,那么这样的 U 就必然存在。 - 证明存在性:实际上,我们可以更精确地计算“覆盖成功”的概率:
Pr[ Γ_U(S) = {0,1}^m ] = 1 - Pr[ ∃ r, E_r ] ≥ 1 - 1 > 0。
由于这个概率是正数(尽管可能很小),因此必然存在至少一组具体的 U = {u₁, ..., u_k},使得 Γ_U(S) 覆盖整个空间。
这就完成了论断二的证明。
结论:L ∈ Σ₂
综合论断一和论断二,我们得到:
-
若 x ∈ L:则存在一个大小为 k = m/n 的点集 U,使得对于所有的 r ∈ {0,1}^m,都存在某个 u_i ∈ U,满足 r ⊕ u_i ∈ S。
用逻辑公式表达:∃ U, ∀ r, ∃ i, ( M(x, r ⊕ u_i) 接受 )。
这正是 Σ₂ 的形式(∃ ∀)。 -
若 x ∉ L:则对于所有点集 U,都存在某个 r,使得对于所有 u_i ∈ U,都有 r ⊕ u_i ∉ S。
用逻辑公式表达:∀ U, ∃ r, ∀ i, ( M(x, r ⊕ u_i) 拒绝 )。
这是上面命题的否命题,属于 Π₂ 的形式(∀ ∃)。
因此,我们证明了 L ∈ Σ₂ ∩ Π₂。由于 L 是BPP中的任意语言,所以 BPP ⊆ Σ₂ ∩ Π₂。
推论与随机化归约
这个结果有深刻的含义。它表明BPP包含在多项式层级的第二层内。一个自然的推论是:如果BPP包含一个NP难问题,那么整个多项式层级将会坍缩。
因为如果 NP ⊆ BPP,结合 BPP ⊆ Σ₂,就得到 NP ⊆ Σ₂。而我们知道 PH ⊆ P^NP,如果NP包含在Σ₂中,会导致多项式层级坍缩到第二层。更实际地说,这将意味着我们可以用高效的随机算法来求解SAT等NP完全问题。
为了形式化地讨论这类“用随机算法解决难问题”的可能性,我们需要引入随机化归约的概念。
随机化归约与算子
随机化归约是确定性归约的随机版本。
定义:语言 A 随机化多项式时间归约到语言 B(记作 A ≤_{RP} B),如果存在一个多项式时间概率图灵机 M,使得对于所有输入 x:
Pr[ (x ∈ A) ⇔ (M(x) ∈ B) ] ≥ 2/3
其中概率来自 M 的随机抛币。
基于此,我们可以定义作用于复杂性类上的 BP· 算子。
定义:对于复杂性类 C,定义 BP·C 为所有可以随机化多项式时间归约到 C 中某个问题的语言集合。
例如:
- BP·NP:所有能随机化归约到SAT问题的语言集合。
- 显然有 NP ⊆ BP·NP(只需忽略随机性即可)。
- 一个重要的性质是:co(BP·NP) = BP·coNP。
类似地,我们可以为空间受限的类定义随机化版本。
定义:
- BPL:存在对数空间概率图灵机,以至少2/3的概率判定的语言集合(双侧错误)。
- RL:存在对数空间概率图灵机,满足:若输入是“是”实例,则以至少2/3的概率接受;若是“否”实例,则总是拒绝(单侧错误)。
总结
本节课中我们一起学习了:
- BPP ⊆ Σ₂ ∩ Π₂ 的证明,该证明巧妙地利用了集合大小差异和概率方法。
- 证明的核心是:当输入为“是”实例时,大的随机串集合 S 可以被一小部分平移(通过点集 U)所覆盖;当为“否”实例时,则不可能。
- 这一结果意味着BPP位于多项式层级的低层,如果NP问题能在BPP内解决,将导致多项式层级坍缩。
- 我们引入了随机化归约和 BP· 算子的形式化定义,它们帮助我们描述和构建包含随机性的复杂性类,例如 BP·NP、BPL 和 RL。

这些概念揭示了随机化计算与经典确定性计算层级之间深刻而有趣的联系。
040:随机归约与图同构问题

在本节课中,我们将要学习随机归约的概念,并探讨一个经典问题——图同构问题。我们将看到如何利用随机化和哈希函数,将图非同构问题归约到其看似相反的问题上,从而证明它属于一个有趣的复杂性类。
随机归约的定义
上一节我们介绍了确定性归约。本节中,我们来看看随机归约。
我们说问题A可以随机多项式时间归约到问题B,如果存在一个随机多项式时间算法,能将问题A的输入x转换为问题B的一个输入f(x),并且满足:
- 如果x是A的“是”实例,则f(x)是B的“是”实例的概率很高(远高于1/2)。
- 如果x是A的“否”实例,则f(x)是B的“否”实例的概率很高。
我们通常将“很高”固定为2/3,但正如之前所见,这个概率可以通过重复运行算法来放大。因此,只要概率与1/2的差距超过某个逆多项式,并且远离1(例如,1减去某个逆指数函数),就可以满足要求。
随机复杂性类
基于随机归约,我们可以定义一系列复杂性类。
以下是几个重要的随机复杂性类定义:
- BP · NP:这是NP的随机化版本,包含了那些可以通过随机多项式时间归约到集合S的问题。
- BP · coNP:这是coNP的随机化版本。
- BPL:这是由概率图灵机在对数空间内解决,并允许双侧错误(即“是”和“否”实例都可能以一定概率被误判)的问题集合。
- RL:这是BPL的单侧错误版本。对于“是”实例,机器以至少2/3的概率接受;对于“否”实例,机器总是拒绝。
可以立即证明以下包含关系:L ⊆ RL ⊆ BPL。其中L ⊆ RL是因为确定性对数空间算法可以看作是没有随机位的RL算法。RL ⊆ BPL则是定义上的直接包含。
一个不那么显然的事实是 BPL ⊆ P。其核心思想是:由于对数空间机器只能使用O(log n)个随机位,其所有可能的随机选择总数是多项式级别的。因此,一个多项式时间算法可以枚举所有可能的随机选择,计算接受路径的比例,从而确定性地模拟BPL算法。
图同构问题简介
现在,我们来看一个具体的问题——图同构问题。
图同构问题定义如下:给定两个图G1和G2,判断它们是否同构,即是否存在一个顶点重标号方案,使得两个图完全相同。其补问题图非同构则是判断两个图是否不同构。
关于图同构问题,我们已知:
- GI ∈ NP:因为如果存在同构映射,验证者可以在给定该映射(作为证书)后,在多项式时间内验证。
- GNI ∈ coNP:因为它是GI的补问题。
然而,一些关键问题仍然开放:
- GI 是否属于 P?(即是否存在高效确定性算法)
- GI 是否属于 coNP?(等价于GNI是否属于NP?)
- GI 是否属于 BPP?(即是否存在高效随机算法)
一个重要的突破是,Babai在2015年证明了 GI ∈ 拟多项式时间,即时间复杂度约为 \(2^{O(\log^c n)}\),这介于多项式时间和指数时间之间,但更接近前者。
接下来,我们将证明一个稍弱但非常有趣的结果:GNI ∈ BP · NP。这意味着图非同构问题属于NP的随机化版本。
证明GNI ∈ BP · NP
我们的目标是构造一个协议,使得当两个图不同构时,存在一个简短的“证书”,使得一个随机多项式时间验证者能以高概率接受;而当它们同构时,无论提供什么证书,验证者都以高概率拒绝。
证明的核心思想是利用同构与非同构图对在“邻居”数量上的差异。
构造集合S
首先,我们固定顶点数n。定义集合S为所有有序对(H, π)的集合,其中:
- H是一个n个顶点的图。
- H与G1或G2同构。
- π是图H的一个自同构(即H到自身的一个同构映射)。
我们记录π是为了精确计算S的大小。现在来计算|S|。
情况1:G1与G2同构。
此时,与G1同构的图H,也必然与G2同构。这样的图H有多少个?所有n个顶点的图共有 \(2^{\binom{n}{2}}\) 个,但其中与G1同构的图的数量是:\(n! / |\text{Aut}(G1)|\),这里 \(n!\) 是所有可能的顶点置换,除以 \(|\text{Aut}(G1)|\)(G1的自同构数)是因为不同的置换可能产生相同的图。
对于每个这样的H,我们在S中存储的不是一个H,而是一个对(H, π),其中π是H的一个自同构。H的自同构数正好等于 \(|\text{Aut}(G1)|\)。因此,对于每个同构类,贡献的对数为:\((n! / |\text{Aut}(G1)|) * |\text{Aut}(G1)| = n!\)。
所以,当G1与G2同构时,|S| = n!。
情况2:G1与G2不同构。
此时,与G1同构的图H的集合,和与G2同构的图H的集合是不相交的(因为如果H同时与两者同构,则G1与G2同构,矛盾)。
与G1同构的图对(H, π)贡献了 n! 个元素。
与G2同构的图对(H, π)也贡献了 n! 个元素。
因此,当G1与G2不同构时,|S| = 2n!。
我们得到了一个关键的差距:非同构时集合S的大小是同构时的两倍。
利用哈希函数检测大小差异
现在的问题转化为:我们能否设计一个随机协议,来检测一个集合(此处是S)的大小是n!还是2n!?这正是BP · NP类擅长的事情。
我们使用哈希函数来压缩并探测集合大小。回忆在之前P与Parity-P的归约中使用的哈希函数族:
\(h_{B, b}(x) = Bx + b \mod 2\)
其中B是一个随机k×m布尔矩阵,b是一个随机k维布尔向量。它将一个m长的比特串x映射为一个k长的比特串。
哈希函数具有以下性质:对于一个固定集合S(大小为|S|)和一个随机选择的哈希函数h,考虑事件“存在某个x∈S,使得h(x)=0”(即0向量在S中有原像)。
- 该事件发生的概率 至少 为 \(|S|/2^k - \binom{|S|}{2}/2^{2k}\)。
- 该事件发生的概率 至多 为 \(|S|/2^k\)。
直观理解:每个x映射到0的概率是\(1/2^k\),有|S|个元素,所以期望是\(|S|/2^k\)。上界由此直接可得。下界需要减去碰撞(多个x映射到0)的概率,这大约正比于\(|S|^2/2^{2k}\)。
协议设计
现在我们应用这个性质到我们的集合S。我们选择参数k,使得 \(2^{k-1} < 2n! \leq 2^k\)。这意味着 \(2^k\) 大约是S大小上界(2n!)的两倍。
分析:
- 如果G1与G2同构,则 |S| = n!。此时,存在原像的概率上界为 \(|S|/2^k \leq n! / 2^k\)。由于 \(2^k \geq 2n!\),我们有 \(n! / 2^k \leq 1/2\)。
- 如果G1与G2不同构,则 |S| = 2n!。此时,存在原像的概率下界为 \(|S|/2^k - \binom{|S|}{2}/2^{2k}\)。代入|S|=2n!,并利用 \(2^k \approx 2n!\),经过计算(具体代数展开见附图),可以证明这个下界大于某个常数(例如 > 1/3)。
因此,我们得到了一个可检测的差距。
最终的BP · NP协议如下:
- 验证者(Arthur)随机选择一个哈希函数 \(h_{B,b}\)(即随机选择矩阵B和向量b)。
- 验证者将(B, b)发送给证明者(Merlin)。
- 证明者需要找到一个“证据”:一个图H和一个置换π,使得(H, π) ∈ S 并且 \(h(编码(H, π)) = 0\)。如果找不到,则发送“失败”。
- 验证者检查证明者发来的(H, π)是否确实满足:(a) H与G1或G2同构(这可以在NP内验证,因为同构映射可以作为证书的一部分),且(b) \(h(编码(H, π)) = 0\)。
判断:
- 如果证明者能提供有效的(H, π),则验证者接受(认为G1和G2不同构)。
- 否则,验证者拒绝。
正确性分析:
- 当G1和G2不同构时,|S|较大,哈希函数将S中元素映射到0的概率较高。因此,存在一个证据(H, π)的概率很高。一个全能的证明者(Merlin)能找到它并提供给验证者,使得验证者以高概率接受。
- 当G1和G2同构时,|S|较小,哈希函数将S中元素映射到0的概率较低(≤1/2)。因此,不存在这样的证据的概率很高。无论证明者发送什么,都无法通过验证(除非他碰巧猜中一个极低概率的原像),所以验证者以高概率拒绝。
这正是一个BP · NP算法所需要的性质:对于“是”实例(GNI),存在一个多项式大小的证书,使得随机验证者高概率接受;对于“否”实例,无论什么证书,验证者都高概率拒绝。
总结
本节课中我们一起学习了:
- 随机归约的定义,它允许归约过程有较小的错误概率。
- 基于随机归约定义的复杂性类,如 BP · NP、BPL 和 RL,并了解了它们之间的一些基本包含关系。
- 图同构 与 图非同构 问题的定义及其在复杂性理论中的地位。
- 通过一个巧妙的构造,证明了 GNI ∈ BP · NP。证明的核心在于:
- 构造一个集合S,其大小在“同构”与“非同构”两种情况下相差一倍。
- 利用哈希函数的随机性质,设计一个交互协议(Merlin-Arthur协议),使验证者能够以高概率区分这两种情况,从而将图非同构问题归约到一个NP类的问题上。


这个结果是交互式证明系统早期的重要成果之一,展示了随机性和交互如何帮助验证某些看似比NP更难的问题。
041:图同构问题的复杂性分析

在本节课中,我们将学习如何利用概率方法和复杂性类之间的关系,来证明图非同构问题属于 BPP^NP 类,并探讨图同构问题不可能是NP难问题的理论证据。
概率分析:集合大小与映射概率
上一节我们介绍了图非同构问题的核心思路。本节中,我们来看看如何通过分析集合大小与哈希映射概率的关系来构造证明。
当集合 S 的规模非常大时,我们希望给出概率的下界。我们希望证明这个概率是足够好的。
我们得到以下表达式:S / (2^(2k)) * (1 - S / (2^(2k+1)))。其中,S 现在是 n! / 2^(2k)。因此,表达式变为 n! / 2^(2k) * (1 - n! / 2^(2k+1))。
让我们进一步简化这个表达式。它大于等于 2p(根据 p 的定义)乘以 (1 - 1/4)。因为括号内减去的项 n! / 2^(2k) 小于等于 1/4。由此我们得到 3p / 2。
我们得出的结论是:当 S 较小时,概率低于 p;当 S 较大时,概率高于 3p / 2。这里存在一个概率间隙,概率相差超过50%。这个概率指的是:S 中某个元素映射到像空间中零点的概率。
这个概率间隙可以通过常规的概率放大技术进一步扩大。我们可以通过多次重复实验来放大各自的概率。
以下是放大过程的核心步骤:
- 我们使用大约 1/p^3 次重复实验和多个哈希函数。
- 重复多次后,统计有多少次 S 中的元素映射到了零点。
- 当计数大于等于 5p/4 次(即 p 和 3p/2 的平均值)时,我们就得到了显著的结果。
因此,最终的协议是:选取大量独立同分布的哈希函数,检查 S 中是否有元素映射到零点,并且这种情况是否在显著多于 p 次的情况下发生。当这种情况发生时,我们就有一定把握认为集合 S 的规模很大。
构建随机化证明系统
上一节我们分析了概率间隙,本节我们将利用它来构建一个完整的随机化证明系统。
当图是非同构时,这种“显著多于”的情况预期会发生。因此,当图是非同构时,这样的“证书”是存在的。这正是我们为 GNI 问题定义的 MA 类证明系统。
应用切尔诺夫边界,我们可以分别得到小于等于 1/3 和大于等于 2/3 的概率,具体取决于图对 (G1, G2) 是否属于 GNI。
- 如果图是同构的,那么集合 S 较小,因此在多次哈希函数中找到映射元素的概率也较小。
- 如果图是非同构的,那么集合 S 较大,因此概率也较大。
这样就得到了概率上的间隙。
另外需要注意,验证一个给定的 x 是否属于集合 S 可以在 NP 内完成。因为 S 的定义要求检查每个元素是否与给定的图之一同构,以及 π 是否是一个自同构,所有这些都可以在 NP 内验证。因此,这很容易是一个 NP 问题。
这意味着我们有一个从图非同构问题到 BPP^NP 的随机化多项式时间规约。这证明了 GNI 属于 BPP^NP 类。这就完成了 Goldwasser-Sipser 定理的证明:对于图非同构问题,存在一个小的证书来证明非同构性。
图同构问题的复杂性含义
上一节我们证明了图非同构问题属于 BPP^NP,本节我们来看看这对图同构问题本身的复杂性意味着什么。
我们已经证明,图非同构问题(以及图同构问题)属于 NP ∩ coNP 的随机化版本。认证一个同构是容易的,在随机性的假设下,认证非同构的存在也是容易的。
那么,这意味着图同构问题是容易的还是困难的?NP ∩ coNP 的性质暗示图同构问题不可能是“最困难”的那类问题。尽管在 Babai 提出拟多项式时间算法之前,我们并没有快速的图同构算法,但现在我们将给出理论证据,表明 GI 确实不是NP难问题。
如果 GI 是NP难的,那么多项式层级会坍缩到第二层。这是一个强有力的理论证据,表明 GI 不可能是NP难的,因此也不可能是NP完全的。
证明思路:反证法与层级坍缩
假设不成立,即假设 GI 是NP难的。这意味着 GNI 是 coNP 难的。核心思路是利用 GNI ∈ BPP^NP 这一事实,将 Π₂ 问题转化为 Σ₂ 问题,从而实现层级的转换。
由于 GNI 是 coNP 难的,我们可以将任何 coNP 实例(例如一个带有全称量词的公式)规约到 GNI。然后,再利用 GNI ∈ BPP^NP,可以将这个 GNI 实例随机化地转化为一个 NP 类型的实例,但会引入一个“对于大多数随机串”的量词。
现在的技术挑战在于,我们需要将“存在 x,对于大多数 r,存在 a ...”中的量词顺序进行翻转,将“对于大多数 r”提到最前面。如果能够做到这一点,我们就可以利用 BPP 包含于 Σ₂ ∩ Π₂ 的结果,将“大多数”量词转化为“对于所有,存在”的形式,从而最终得到一个 Π₂ 实例。
这样,我们就成功地将一个 Σ₂ 实例转化为了一个 Π₂ 实例。如果 GI 是NP难的,这种转化就意味着 Σ₂ 和 Π₂ 的等价,从而导致多项式层级坍缩到第二层。这构成了一个矛盾,因此原假设不成立。
我们可以将这个过程想象成一个矩阵,其中行索引是随机串 r,列索引是候选解 x。翻转量词本质上就是改变我们审视这个矩阵的视角,这将是下一讲详细讨论的内容。

本节课中我们一起学习了如何通过概率方法证明图非同构问题属于 BPP^NP,并深入探讨了这一结果如何作为图同构问题不是NP难问题的理论证据。核心在于,如果 GI 是NP难的,将导致多项式层级的不合理坍缩,从而反证其不可能性。
042:图同构非NP难性的证明与布尔电路简介


在本节课中,我们将学习如何证明图同构问题不太可能是NP难问题,并初步了解一种超越图灵机的计算模型——布尔电路。
概述
上一节我们介绍了图同构问题属于BP·NP类。本节中,我们将基于此假设,通过一系列逻辑转换,证明如果图同构问题是NP难问题,将导致多项式层级在第二级塌陷。这是一个不太可能发生的结果,从而为图同构问题“不太难”提供了理论证据。证明完成后,我们将引入一种新的计算模型——布尔电路,它允许算法随输入规模变化而变化。
证明的核心思路
假设图同构问题是NP难问题,那么它同时也是coNP难问题。我们将利用这一点,将一个Σ₂(存在-任意)形式的语句,通过归约和量词转换,最终变成一个Π₂(任意-存在)形式的语句。如果成功,就意味着Σ₂ ⊆ Π₂,从而导致多项式层级在第二级塌陷。
然而,这里存在一个复杂之处:我们已知图同构属于BP·NP,而非简单的NP。这意味着归约过程中会引入随机性(“大多数”量词),使得证明比基本思路更复杂。
证明步骤详解
步骤一:初始归约
我们从Σ₂集合的一个实例ψ开始,其形式为:∃x ∀y φ(x, y)。
由于假设图同构是coNP难问题,我们可以将∀y量词后面的部分归约到一个图非同构实例。因此,ψ被转换为:∃G (G是一个图非同构实例)。
步骤二:利用BP·NP性质
已知图同构属于BP·NP。这意味着图非同构实例G可以被替换为:∃a (多项式时间图灵机T在输入(G, r, a)上接受),并且这个陈述对大多数随机串r成立。
因此,ψ现在等价于:∃G [大多数r ∃a T(G, r, a) = 1]。
我们得到了一个包含∃、大多数和∃量词的公式。
步骤三:交换量词
我们的目标是交换“∃G”和“大多数r”的位置。如果能将公式变为“大多数r ∃G ...”,那么我们就可以利用BP·NP的性质将“大多数”替换为“∀∃”,从而将Σ₂语句变成Π₂语句。
我们通过一个矩阵来分析:行代表随机串r,列代表图G。如果ψ为真,则存在一列G,使得大多数行满足条件。这自然意味着,对大多数行r,存在某个G(可能就是原来那个)满足条件。因此,量词交换在ψ为真时成立。
难点在于证明当ψ为假时,交换后的语句也为假。ψ为假意味着:∀G,大多数r [∃a T(G, r, a) = 1] 不成立。即,对每个G,大多数r会拒绝(无论a取何值,T都输出0)。
为了完成交换,我们重新定义“大多数”:要求成立的概率超过 1 - 1/(2^(2n)),即错误率呈指数级小。设随机串r的长度m远大于输入规模n。通过概率放大和计数论证,可以证明,在这种情况下,“∀G,大多数r拒绝”意味着“大多数r,∀G拒绝”。因此,量词交换在ψ为假时也成立。
综上,我们证明了ψ等价于:大多数r ∃G ∃a T(G, r, a) = 1。
步骤四:消除“大多数”量词
最后,我们利用BP·NP ⊆ Π₂的标准证明方法,将“大多数r”量词替换为“∀s₁ ∃s₂”的量化形式。
于是,ψ最终被转换为:∀s₁ ∃s₂ ∃G ∃a T'(s₁, s₂, G, a) = 1。这正是Π₂语句的形式。
结论
因此,我们展示了任何Σ₂语句都可以在多项式时间内归约为Π₂语句。这意味着Σ₂ ⊆ Π₂,从而Σ₂ = Π₂,导致多项式层级在第二级塌陷。这是一个极强的、被认为不太可能发生的结论。所以,我们最初的假设(图同构是NP难问题)很可能是错误的。

这个证明技巧为许多同构类问题的非困难性提供了理论证据。它表明问题可能不“难”,但并未给出解决问题的具体算法。
引入新模型:布尔电路
随着课程接近尾声,我们将开始学习比图灵机更强大的计算模型。图灵机刻画了可由单一算法解决的所有问题,该算法不随输入规模n无限增长而改变。现在,我们考虑一种模型:允许为不同的输入规模n使用完全不同的算法。
这种模型非常强大,因为算法之间可能毫无关联,在实践中可能难以实现,但它能提供重要的理论见解。一个优雅的建模方式源自现实世界的布尔电路。
布尔电路定义
一个在n个变量上的布尔电路C是一个有根树,其组成部分如下:
- 叶子节点:是输入变量x₁, x₂, ..., xₙ。
- 内部节点:是逻辑门,类型包括AND(与)、OR(或)、NOT(非)。
- 根节点:是输出。对于需要输出多位字符串的函数,可以有多个输出节点(即多个根)。
计算从叶子(输入)流向根(输出)。
电路示例
例如,两变量异或函数 XOR(x₁, x₂) 可以用以下电路实现:
输出 = (x₁ AND NOT x₂) OR (NOT x₁ AND x₂)
其电路图是一个树形结构,顶部是OR门,它连接两个AND门,每个AND门再连接相应的输入或其否定。
电路的资源参数
与图灵机有时间和空间资源类似,电路有以下主要资源参数:
- 扇入:一个门可以接受的输入线数量。
- 扇出:一个门的输出可以驱动的后续门数量。
- 规模:电路中门和连线的总数。
- 深度:从任意输入到输出节点的最长路径上的门数。
一个重要观察
对于任意一个n比特的布尔函数f,总存在一个布尔电路来计算它,其规模最多为 O(2^n · n)。证明思路是:由于只有2^n种可能的输入组合,电路可以枚举所有输入并直接给出对应输出。
总结

本节课我们一起学习了如何证明图同构问题不太可能是NP难问题,其核心是通过归约和量词操作,推导出若该问题为NP难将导致多项式层级塌陷的矛盾。随后,我们引入了布尔电路这一非均匀计算模型,它允许算法随输入规模变化,并定义了其基本结构和资源参数。在接下来的课程中,我们将基于布尔电路定义新的复杂性类。
043:电路复杂度与P/poly类

在本节课中,我们将学习布尔函数电路复杂度的基本上下界,并利用这些结果证明一个非均匀计算模型下的层次定理。最后,我们将定义P/poly类,并探讨其与P类的关系。
电路复杂度的上界与下界
上一节我们介绍了电路模型。本节中,我们来看看布尔函数电路复杂度的两个基本结论:一个上界和一个下界。
上界:所有函数都有较小电路
首先,我们证明一个上界:任何定义在n个输入比特上的布尔函数,都存在一个规模不大的电路来计算它。
结论:对于任意布尔函数 ( f: {0,1}^n \rightarrow {0,1} ),都存在一个电路 ( C ) 来计算它,且该电路的规模(门数量)至多为 ( 2^n \times n ) 的常数倍。
证明思路:构造一个电路,直接枚举所有可能的 ( 2^n ) 个输入组合,并为每个输入组合硬编码其对应的输出值。这可以通过一个深度较浅的电路实现,其规模约为 ( O(2^n \cdot n) )。这个构造表明,没有函数需要比这更大的电路。
下界:存在需要大电路的函数
然而,上述上界是否紧呢?是否存在一些函数,其电路规模真的需要接近 ( 2^n ) 这么大?这就是下界问题。
下界问题:是否存在一个显式的布尔函数族 ( {f_n} ),使得计算 ( f_n ) 所需的电路规模至少是 ( \Omega(2^n / n) )?
这是一个困难的问题。如果我们不要求函数是“显式”或“自然”的,那么可以很容易地证明这样的函数大量存在。
结论(非显式下界):存在一个布尔函数 ( f_n: {0,1}^n \rightarrow {0,1} ),其电路规模至少为 ( \Omega(2^n / n) )。事实上,如果随机选择一个布尔函数,那么几乎所有布尔函数都需要如此大的电路规模。
证明思路(计数法):
- 函数数量:定义在n比特上的布尔函数总数为 ( 2{2n} )。
- 电路数量:规模为S的电路总数至多为 ( S^O(S) )(考虑电路图的结构和连线方式)。
- 比较数量:当 ( S ) 约等于 ( 2^n / n ) 时,规模不超过S的电路总数 ( S^O(S) ) 远小于函数总数 ( 2{2n} )。
- 得出结论:由于电路数量少于函数数量,必然存在某些函数无法被任何规模小于 ( \Omega(2^n / n) ) 的电路计算。这类证明只表明“存在”这样的函数,但并未给出具体的构造,因此是“非显式”的。
电路复杂度层次定理
利用上述上界和下界,我们可以证明一个关于电路复杂度的层次定理,它类似于图灵机的时间层次定理,但证明更为简洁。
定理(非均匀层次定理):设 ( T(n) ) 和 ( T'(n) ) 是两个函数,且满足 ( T'(n) = \omega(T(n) \cdot \log^2 T(n)) )。那么,由规模不超过 ( T(n) ) 的电路族可判定的语言类,严格包含于由规模不超过 ( T'(n) ) 的电路族可判定的语言类。记作:
[
\mathsf{SIZE}(T(n)) \subsetneq \mathsf{SIZE}(T'(n))
]
证明思路:
- 选取中间参数:根据条件,可以选取一个整数 ( L ),使得以下关系成立:
[
T(n) \lesssim \frac{2^L}{L} \quad \text{且} \quad 2^L \cdot L \lesssim T'(n)
]
这利用了 ( T'(n) ) 比 ( T(n) ) 足够大这一条件。 - 构造分离函数:
- 根据下界结论,存在一个L比特的函数 ( g_L ),其电路规模大于 ( 2^L / L )。
- 根据上界结论,该函数 ( g_L ) 可以被一个规模约为 ( 2^L \cdot L ) 的电路计算。
- 完成分离:将 ( g_L ) 嵌入到一个定义在n比特(n > L)的函数 ( f_n ) 中(例如,忽略多余的输入位)。那么:
- ( f_n \in \mathsf{SIZE}(T'(n)) ),因为 ( 2^L \cdot L \leq T'(n) )。
- ( f_n \notin \mathsf{SIZE}(T(n)) ),因为 ( T(n) \leq 2^L / L < ) 计算 ( g_L ) 所需的最小规模。
因此,( f_n ) 将这两个复杂度类分离开来。
定义P/poly类
现在,我们可以定义电路复杂性理论中一个非常重要的类:P/poly。
定义(P/poly):P/poly 是所有存在多项式规模电路族的语言构成的类。即:
[
\mathsf{P/poly} = \bigcup_{k \in \mathbb{N}} \mathsf{SIZE}(n^k + k)
]
以下是关于P/poly的两个基本性质:
性质1:P ⊆ P/poly
任何可以在多项式时间内被图灵机判定的语言,也可以被多项式规模的电路族判定。直观上,可以将图灵机在固定输入长度n上的运行过程“展开”成一个布尔电路,该电路的规模与运行时间成多项式关系。
性质2:P/poly 包含不可计算的语言
这是非均匀模型(电路族)与均匀模型(图灵机)的关键区别。由于对每个输入长度n,电路 ( C_n ) 都可以完全不同,我们可以为每个n“硬编码”一个答案。例如,可以构造一个电路族,使得电路 ( C_n ) 输出1当且仅当n在图灵机停机问题某个实例的编码范围内。这样得到的语言在P/poly中,但它是不可计算的。

本节课中我们一起学习了:
- 布尔函数电路复杂度的基本上下界:上界为 ( O(2^n \cdot n) ),下界(非显式)为 ( \Omega(2^n / n) )。
- 利用计数法证明下界的思想。
- 电路复杂度中的层次定理:只要资源函数 ( T'(n) ) 比 ( T(n) \cdot \log^2 T(n) ) 增长得快,更大的电路规模就能解决更多问题。
- 定义了复杂度类 P/poly,并了解到它包含P类,但也包含一些不可计算的问题,这体现了非均匀计算模型的强大与奇特之处。
044:非均匀计算与Karp-Lipton定理

在本节课中,我们将学习非均匀计算模型,特别是P/poly复杂性类。我们将看到它如何通过布尔电路或带“建议”的图灵机来定义,并探讨其强大的计算能力。最后,我们将介绍一个关键定理——Karp-Lipton定理,它揭示了如果SAT问题能被多项式大小的电路解决,将会导致多项式层级(PH)的塌缩。
布尔电路与P/poly类
在上一节课中,我们定义了布尔电路,并研究了那些可以通过规模随输入长度n增长的多项式大小电路族来解决的问题集合。这个集合构成了一个复杂性类,称为SIZE[T(n)]。
我们还证明了电路规模的层次定理,其证明方法与确定性时间层次定理不同,主要依赖于计数论证。通过收集所有多项式规模(poly(n))的电路族,我们得到了P/poly复杂性类。这是多项式时间(P)在电路模型下的类比,但使用的是布尔电路而非图灵机。
我们证明了P包含于P/poly。证明思路如下:对于一个属于P的语言L,存在一个多项式时间图灵机M。对于每个固定的输入长度n,我们可以将M在长度为n的所有输入上的计算过程,模拟成一个布尔电路C_n。由于M的运行步数是n的多项式,因此构造出的电路C_n的规模也是多项式级的。所以,所有高效的算法实际上都存在于P/poly中。
非均匀性的强大能力
然而,P/poly是以非均匀方式定义的,这意味着对于不同的输入长度n和n+1,我们可以使用完全不同的电路。这种非均匀性赋予了它惊人的能力。
例如,考虑一个一元语言L,它由所有满足特定条件的字符串1^n组成(例如,n编码了一个会停机的图灵机)。这个L是不可计算的(因为它归约到了停机问题)。但是,我们可以构造一个平凡的常数规模电路族{C_n}:对于每个n,如果1^n在L中,则C_n恒输出1,否则恒输出0。这个电路族“解决”了不可计算的问题!
这展示了非均匀性的威力:我们虽然不知道如何实际构造出每个C_n(因为这需要知道停机问题的答案),但这样的电路族在数学上是存在的。因此,P/poly能够解决不可计算的问题,因为它允许我们将答案“硬编码”进电路里。
带建议的图灵机:P/poly的等价定义
P/poly也可以用图灵机来等价定义,即带建议的图灵机模型。这比预言机图灵机弱,但比非确定性图灵机在某些方面更强。
我们定义:一个判定问题L属于DTIME[T(n)]/a(n),如果存在一个图灵机M,使得对于每个输入长度n,都存在一个建议字符串α_n(长度为a(n)),满足对于所有长度为n的输入x,M在输入(x, α_n)上在T(|x|)时间内运行,并正确判定x是否属于L。
关键点在于,建议α_n仅依赖于输入长度n,而不依赖于具体的输入x。这与NP证书(依赖于具体实例)不同。
利用这个定义,我们可以将P/poly重新定义为所有常数c, d下,DTIME[nc]/nd的并集。以下是证明两个定义等价的命题:
命题:由多项式规模布尔电路定义的P/poly,等于由带多项式时间与多项式长度建议的图灵机定义的类(即 ∪_{c,d} DTIME[n^c]/n^d)。
证明概要:
- (电路 => 图灵机) 如果
L ∈ P/poly,则存在多项式规模电路族{C_n}。我们可以将电路C_n的描述作为建议字符串α_n给一个通用图灵机M。M收到输入x和建议α_n(即电路C_n)后,直接模拟C_n(x)即可。由于电路规模是多项式,其描述长度也是多项式;模拟电路计算所需时间也是多项式。因此L在DTIME[n^c]/n^d中。 - (图灵机 => 电路) 如果
L ∈ DTIME[n^c]/n^d,则存在图灵机M和长度不超过n^d的建议函数α(n)。对于每个固定的n,我们将建议字符串α_n硬编码到一个电路中。这个电路模拟M在所有长度为n的输入x上的行为(因为建议已固定)。由于M的运行时间是n^c,将其计算过程转换为电路会产生一个规模为多项式的电路。因此L ∈ P/poly。
至此,我们建立了非均匀高效电路与非均匀高效(带建议)图灵机之间的等价性。
Karp-Lipton定理
一个自然的问题是:如此强大的带建议图灵机(或多项式规模电路)能否高效解决像SAT这样的NP难问题?这个问题至今未解。但Karp和Lipton在1982年证明了一个非常重要的定理,它给出了一个强烈的理论证据,表明SAT很可能不在P/poly中。
Karp-Lipton定理:如果 SAT ∈ P/poly,那么多项式层级(PH)会塌缩到第二层,即 PH = Σ₂^P = Π₂^P。
这并不意味着P=NP,但它意味着整个多项式层级(包含无数层)将坍缩到Σ₂^P(存在-对于所有)和Π₂^P(对于所有-存在)这一层。这是一个非常不可能的后果,因此被视为SAT不属于P/poly的有力证据。
证明思路:
- 自可归约性:假设SAT有多项式规模电路族
{C_m}。SAT是自可归约的,这意味着如果你有一个能解决SAT判定问题(是否存在满足赋值)的黑盒,你可以通过多次询问这个黑盒来找到一个具体的满足赋值(搜索问题)。具体做法是:先固定第一个变量为0,询问公式是否可满足;根据答案,你就能确定第一个变量在某个满足赋值中应取何值。然后依次确定后续变量。 - 利用电路进行搜索:我们可以利用假设中存在的SAT电路
C_m来扮演这个黑盒的角色,从而构造一个在多项式时间内找到满足赋值的算法(需要用到电路C_m作为建议)。 - 塌缩Π₂到Σ₂:考虑一个典型的Π₂^P完全问题:
∀u ∃v φ(u, v)(对于所有u,是否存在v使得公式φ成立)。要判定这个问题,利用步骤2中的能力:给定u,我们可以找到(或确认不存在)一个满足的v。这允许我们将一个“对于所有-存在”的量词描述,转换成一个“存在(一个电路/算法)-对于所有”的描述,从而证明该问题也在Σ₂P中。这就推出了Π₂P ⊆ Σ₂^P,进而导致PH塌缩到第二层。
推论与意义:
Karp-Lipton定理表明,证明NP ⊈ P/poly(即NP问题不能被多项式电路解决)是分离P与NP的一条可行途径。因为如果SAT在P/poly中,会导致PH塌缩(这被认为极不可能);反之,如果证明了SAT不在P/poly中,那么由于P ⊆ P/poly,自然就有P ≠ NP。因此,“SAT ∉ P/poly”是一个比“P ≠ NP”更强的猜想,研究布尔电路的复杂性下限成为了攻克P vs NP难题的核心方向之一。
总结

本节课我们一起学习了:
- P/poly复杂性类的两种等价定义:多项式规模的非均匀布尔电路族,以及多项式时间运行的带多项式长度建议的图灵机。
- 非均匀模型的强大能力,它甚至允许“解决”某些不可计算问题,这是通过为每个输入长度硬编码答案实现的。
- 重要的Karp-Lipton定理:如果SAT ∈ P/poly,则多项式层级(PH)会塌缩至第二层(Σ₂^P)。这为“SAT不属于P/poly”提供了强有力的证据,并指出通过证明电路下限来分离P和NP是一条重要的研究路径。
045:SAT与电路复杂性

概述
在本节课中,我们将学习SAT问题与布尔电路复杂性之间的深刻联系。我们将探讨如果SAT问题存在多项式大小的电路,将会导致多项式层级(Polynomial Hierarchy)的坍塌。此外,我们还将了解这一结论的推论,以及如何将图灵机与电路模型联系起来,并初步接触并行计算的概念。
从SAT到电路
上一节我们介绍了计算复杂性的一些基本概念。本节中,我们来看看如果可满足性问题(SAT)可以被多项式大小的布尔电路族解决,会引发什么后果。
假设SAT存在多项式大小的电路族 {C_m}。对于任意布尔公式 Φ,其编码为字符串 u,我们可以将组合 u ∘ Φ 输入到电路 C_m 中(其中 m 是实例的大小)。电路将正确输出1,当且仅当公式 Φ 是可满足的。
利用电路寻找赋值
既然电路 C_m 可以判断可满足性,我们还可以利用它来实际找到一个满足的赋值 v。以下是具体的步骤:
- 首先,验证 C_m(u ∘ Φ) = 1,确认公式是可满足的。
- 固定第一个变量 v₁。我们尝试将其设为0,构造新公式 Φ[v₁=0],并再次使用电路 C_m 检查 u ∘ Φ[v₁=0] 是否可满足。
- 如果 C_m(u ∘ Φ[v₁=0]) = 1,则说明存在一个满足赋值且 v₁=0。
- 如果结果为0,则根据第一步的结论,必然存在满足赋值且 v₁=1。
- 在确定了 v₁ 的值后,我们固定它,并对第二个变量 v₂ 重复步骤2的过程。
- 以此类推,对公式中的所有 n 个变量依次进行赋值。
最终,我们将得到一个完整的满足赋值 v = (v₁, v₂, ..., vₙ)。
构造输出赋值的电路
我们可以将上述寻找赋值的算法转化为一个新的电路 C‘_m。这个电路以 u ∘ Φ 作为输入,并直接输出一个满足赋值 v。
C‘_m(u ∘ Φ) = v,其中 v 是 Φ 的一个满足赋值。
这意味着,如果存在满足赋值 v,那么电路 C‘_m 就能将其计算出来。
复杂性类别的转换
现在,我们可以重新表述SAT问题的定义。原始的SAT问题表述涉及量词:对于所有编码 u,存在一个赋值 v,使得 Φ(u, v) 接受。
利用电路 C‘_m,我们可以将上述“存在 v”的量词,转化为“存在一个多项式大小的电路 C‘_m”。因为电路是固定大小的对象,这个“存在”量词现在作用于电路上。于是,SAT问题的表述变为:存在一个电路 C‘_m,使得对于所有编码 u,Φ(u, C‘_m(u)) 都接受。
这实现了一个关键转换:我们将一个“∀∃”形式的命题,转换成了一个“∃∀”形式的命题。在复杂性理论中,这恰好将SAT从NP类(可看作∃P)提升到了Σ₂类(即∃∀P)。
因此,如果 SAT ∈ P/poly(即有多项式电路),则意味着 NP ⊆ Σ₂。这进而会导致多项式层级(PH)坍塌至Σ₂层。这就是著名的卡普-利普顿定理(Karp–Lipton Theorem)的核心证明思路。
扩展推论:EXPTIME与电路
假设一个更强的条件成立:所有EXPTIME中的问题都有多项式大小的电路。那么,利用类似的思路,我们可以证明 EXPTIME 也将包含于 Σ₂ 中。
证明思路相似:
- 设 L ∈ EXPTIME,则存在一个指数时间图灵机 M 判定 L。
- 假设 L 有多项式电路,那么存在一个电路族 {C_n},它可以计算 M 在输入 x 上运行时,第 i 步格局(configuration)的第 j 个比特。
- 判断 x ∈ L 等价于验证 M 在输入 **x$ 上的整个计算历史是否合法且最终接受。我们可以用量词描述:对于所有计算步骤 i 和所有比特位置 j,电路 C_n 输出的相邻步骤的格局转换是合法的(符合 **M$ 的转移函数)。
- 由于电路 C_n 本身是存在的(但我们不知道是哪一个),我们可以用量词表述为:存在一个电路 C,使得对于所有的 i 和 j,合法性检查均通过。
因此,L 的判定条件可以写成一个“∃∀”的形式,即 L ∈ Σ₂。如果 EXPTIME ⊆ Σ₂,结合已知的包含关系,将导致 PH = Σ₂ = PSPACE = EXPTIME 等一系列我们认为不成立的等式。这为“EXPTIME ⊈ P/poly”这一猜想提供了理论证据。
当然,NP ⊈ P/poly 和 EXPTIME ⊈ P/poly 仍然是未被证明的著名猜想。
电路的第三种视角:并行计算
图灵机或传统算法是顺序计算模型,一步接一步地执行。而并行计算则允许多个操作同时进行。我们如何形式化地描述高效的并行计算呢?
我们说一个问题 L 拥有高效的并行算法,如果对于所有长度为 n 的输入 x:
- 可以在 多对数时间内解决,即时间为 poly(log n)。
- 使用的处理器数量是多项式级别的,即 poly(n) 个。
这意味着,当输入规模 n 增长时,所需时间增长极慢(远小于 n),但可以动用大量处理器来同时处理输入的不同部分。
示例:两个 n 比特整数的加法。
- 顺序算法需要 O(n) 时间。
- 使用 O(n) 个处理器的并行算法,可以在 O(log n) 时间内完成。这体现了并行计算的巨大优势。
在下节课中,我们将看到布尔电路恰好是刻画这类并行计算能力的自然模型。

总结
本节课我们一起学习了:
- 卡普-利普顿定理的证明思路:如果SAT有多项式电路,则多项式层级会坍塌至Σ₂。
- 该定理的推论:如果EXPTIME有多项式电路,也会导致类似的不太可能发生的复杂性类坍塌,这为相关猜想提供了证据。
- 布尔电路模型的另一个重要解释:它是描述高效并行计算(多对数时间、多项式数量处理器)的理想模型。我们将在后续课程中深入探讨这一点。
046:并行计算与P完全性

在本节课中,我们将学习布尔电路如何作为并行计算的自然模型,并基于此定义重要的复杂度类NC和AC。我们还将探讨这些类之间的关系,以及它们与经典空间类(如L和NL)的联系。最后,我们将引入P完全性的概念,以理解P类中最困难的问题。
布尔电路与并行计算
上一节我们讨论了布尔电路及其在证明某些复杂性类坍塌时扮演的角色。本节中,我们来看看布尔电路的另一个重要应用:建模并行计算。
图灵机是顺序计算的模型,它一次只执行一步操作。相比之下,并行算法希望使用多个处理器同时工作。布尔电路为此提供了一个自然的模型:
- 我们可以将每个逻辑门(如与门、或门、非门)视为一个处理器。
- 门之间的连线代表处理器间的通信连接。
- 电路的深度对应于并行计算的时间。
- 电路的规模(即门的数量)对应于处理器的数量。
因此,一个高效的并行算法可以定义为具有以下特性的电路:
- 规模:多项式级别,即
规模 ≤ n^c(c为常数)。 - 深度:多对数级别,即
深度 ≤ (log n)^d(d为常数)。
例如,两个n位数的加法,顺序算法需要O(n)时间,但使用O(n)个处理器,可以在O(log n)深度(即O(log n)时间)内完成。
定义复杂度类 NC 和 AC
基于上述思想,我们可以形式化地定义并行计算的复杂度类。这些类以研究者尼古拉斯·皮彭杰命名。
类 NC^d
对于常数 d ≥ 0,一个语言 L 属于 NC^d,当且仅当:
存在一个常数 c > 0 和一个 L-一致(或对数空间一致)的电路族 {C_n},使得对于输入长度 n:
- 规模:
size(C_n) ≤ n^c。 - 深度:
depth(C_n) ≤ (log n)^d。 - 扇入:每个门的输入数量(扇入)为常数(通常为2)。
- 计算正确性:对于所有
x ∈ {0,1}^n,x ∈ L当且仅当C_n(x) = 1。
这里,“L-一致”意味着电路 C_n 的连接关系可以由一个对数空间图灵机生成,这保证了电路本身是易于描述的。
类 AC^d
类 AC^d 的定义与 NC^d 几乎完全相同,唯一的区别在于对扇入的限制:
- 在 AC^d 中,门的扇入是无界的(Unbounded),允许一个门连接多达电路规模那么多的输入线。
类 NC 和 AC
通过取不同深度参数的并集,我们得到两个更广义的类:
- NC = ∪_{d≥0} NC^d
- AC = ∪_{d≥0} AC^d
直观上,NC 代表了那些存在高效并行算法(多项式规模、多对数深度、常数扇入)的问题集合。
NC、AC 与 P 类的关系
以下是这些复杂度类之间的基本包含关系:
- NC^d ⊆ AC^d:因为常数扇入是无界扇入的特例。
- AC^d ⊆ NC^{d+1}:任何扇入为
k的门,可以通过一个深度为O(log k)、扇入为2的二叉树结构来模拟。由于电路总规模为多项式,k ≤ poly(n),因此模拟增加的深度为O(log n),这恰好使深度参数d增加1。 - NC ⊆ AC ⊆ P:所有NC/AC电路都可以被一个图灵机在多项式时间内顺序模拟(例如,按拓扑顺序计算每个门的输出),因此它们都包含于 P 中。
一个核心的未解问题是:NC 是否等于 P?
这等价于问:是否每一个多项式时间的可解问题,都存在一个高效的并行算法? 我们普遍认为 NC ≠ P,即存在一些本质上难以并行化的问题。
作为练习,可以尝试证明以下严格包含关系:
- NC^0 ⊊ AC^0
- AC^0 ⊊ NC^1
(提示:考虑奇偶校验函数,它可以在NC1中计算,但无法在AC0中计算。)
NC^1 与空间复杂度类的关系
电路的深度与计算所需的空间有着深刻的联系。具体来说,我们有如下重要定理:
定理:NC^1 ⊆ L ⊆ NL ⊆ AC^1
证明思路
-
NC^1 ⊆ L:
- 目标是:给定一个深度为
O(log n)的电路C和输入x,用对数空间图灵机计算C(x)。 - 采用深度优先的递归计算:从输出门开始,要计算其值,需要先递归地计算其两个输入门的值。
- 空间消耗的递归式为:
S(L) = S(L-1) + O(1),其中L是当前递归深度(最大为O(log n))。 - 解得
S(L) = O(log n),即仅需对数空间。
- 目标是:给定一个深度为
-
L ⊆ NL:
- 这是平凡的,因为确定性对数空间图灵机是非确定性图灵机的特例。
-
NL ⊆ AC^1:
- 设
L ∈ NL,由非确定性图灵机M在O(log n)空间内判定。 - 构造
M在输入x上的格局图。顶点是M的所有可能格局(数量N ≤ poly(n)),边表示一步合法转移。 - 问题归结为:判断起始格局
C_start能否在N步内到达接受格局C_accept。这等价于计算该图邻接矩阵A的N次布尔幂A^N,并检查(C_start, C_accept)位置的元素是否为1。 - 通过重复平方法计算
A^N:计算A, A^2, A^4, A^8, ...。这需要O(log N) = O(log n)次矩阵乘法。 - 每次布尔矩阵乘法可以用无界扇入的电路层来实现。整个计算过程可以组织成深度为
O(log n)、扇入无界的电路,因此L ∈ AC^1。
- 设
这些包含关系表明,NC^1 和 AC^1 构成了对数空间计算能力的一个“夹逼”,而它们都包含在 NC^2 中。
P 完全性理论
既然我们相信 NC ≠ P,那么P类中哪些问题“最不可能”属于NC(即最难以并行化)呢?这引出了P完全性的概念。
定义
- P困难:一个问题
B是 P困难 的,如果 P 中的每一个问题A都可以对数空间归约到B(记作A ≤_L B)。 - P完全:如果一个问题
B既是 P困难 的,又属于 P,则称B是 P完全 的。
这里使用对数空间归约而非多项式时间归约,是为了使归约本身比P类更弱,从而确保归约不会赋予问题额外的计算能力。它意味着存在一个对数空间图灵机,能够按需输出 B 的实例的任何一个比特。
意义
P完全问题是 P 类中“最难”的问题。如果任何一个P完全问题被证明属于 NC,那么将导致 P = NC,这与普遍猜想相悖。因此,寻找自然的P完全问题,有助于我们识别那些本质上似乎是顺序的、难以并行化的问题。
一个经典的P完全例子是电路值问题:给定一个布尔电路及其输入,计算电路的输出值。
总结
本节课中我们一起学习了:
- 如何用布尔电路(多项式规模、多对数深度)来形式化定义高效的并行计算,并由此引出了复杂度类 NC 和 AC。
- NC、AC 与 P 类的关系,以及 NC = P? 这个核心开放问题。
- 深度与空间的联系:NC^1 ⊆ L ⊆ NL ⊆ AC^1,揭示了并行时间与顺序空间之间的对应。
- P完全性的定义与意义,它帮助我们理解P类中那些最可能无法被高效并行化的问题。

这些概念为理解计算问题的并行潜力奠定了坚实的基础。
047:P完全问题与电路评估

在本节课中,我们将学习P完全问题的概念,并深入探讨一个关键的P完全问题——电路评估问题。我们将理解为什么这类问题被认为是“难以并行化”的,并探索电路在定义更高复杂性类别的完全问题中的作用。
P完全问题的定义与意义
上一节我们介绍了P类和NC类,本节中我们来看看P完全问题的定义及其重要性。
一个语言L是P完全的,需要满足两个条件:
- L ∈ P。
- 对于P类中的每一个问题A,都存在一个对数空间归约(log-space reduction),使得A ≤_L L。
P完全问题的核心意义在于其“并行化难度”。如果一个P完全问题本身属于NC类(即存在高效的并行算法),那么P类中的每一个问题都将拥有高效的并行算法,这意味着NC = P。然而,普遍认为NC ≠ P。因此,P完全问题不太可能被高效并行化。同理,如果P完全问题能在对数空间(L)内解决,则P = L,而这也被认为是极不可能的。
因此,P完全问题在“难以并行化”的意义上是“困难”的。
电路评估问题:一个P完全问题
理解了P完全问题的含义后,我们引入一个具体的P完全问题:电路评估问题。
电路评估问题定义如下:
- 输入:一个布尔电路
C和一个输入字符串x。 - 问题:判断电路
C在输入x上的输出是否为1,即C(x) = 1是否成立。
直观上,要解决这个问题,必须模拟整个电路的计算过程。
我们将证明电路评估问题是P完全的。证明分为两部分:证明它属于P类,以及证明它是P困难的(即P中任何问题都可归约到它)。
证明电路评估 ∈ P
这部分相对简单。给定一个电路 C 和输入 x,图灵机可以按照电路的结构,从输入门开始逐层计算,最终得到输出值。由于电路大小是输入规模的多项式,这个模拟过程可以在多项式时间内完成。因此,电路评估问题确实属于P类。
证明电路评估是P困难的
这是证明的关键。我们需要证明,对于P类中的任意问题 L,都存在一个对数空间归约,将其转换为电路评估问题。
以下是证明思路:
- 设
L是P类中的一个问题,存在一个多项式时间图灵机M判定它。 - 回忆库克-莱文归约(Cook-Levin reduction)的核心思想:图灵机
M的每一步计算都可以转化为一个常量大小的逻辑电路(或公式)。这一步的转换只依赖于图灵机的有限状态控制和读写头位置。 - 假设
M是“ oblivious ”的(其读写头的移动模式仅依赖于输入长度n,而不依赖于具体的输入内容x)。这是一个可以经过标准化达成的假设。 - 由于
M在输入x(|x|=n)上的运行时间是n^c(c为常数),那么整个计算过程就由n^c个这样的常量电路串联而成。将这些电路连接起来,我们就得到了一个大小为n^c的大电路C_M,它精确模拟了M在所有长度为n的输入上的计算过程。 - 现在,对于具体的输入
x,我们构造电路评估问题的实例:电路就是C_M,输入就是x。显然,C_M(x) = 1当且仅当M接受x,即x ∈ L。 - 关键点在于,这个归约过程(构造
C_M)只需要对数空间。归约器只需要存储当前步骤的计数器i(i最大为n^c,其二进制表示长度为O(log n)),并根据i和M的固定规则,动态生成第i步对应的那个常量电路。它不需要将整个巨大的电路C_M存储下来。
通过以上步骤,我们实现了 L ≤_L CircuitEvaluation。由于 L 是P类中任意选取的问题,这便证明了电路评估是P困难的。
结合两部分,电路评估问题是P完全的。
推论:电路可满足性问题
从上述讨论中,我们可以得到一个自然的推论:电路可满足性问题(Circuit SAT)。
电路可满足性问题定义如下:
- 输入:一个布尔电路
C。 - 问题:是否存在一个输入赋值
x,使得C(x) = 1?
以下是关于该问题的两个事实:
- Circuit SAT ∈ NP:非确定性图灵机可以“猜测”一个赋值
x,然后在多项式时间内验证C(x)是否等于1。 - Circuit SAT 是NP完全的:经典的3-SAT问题可以轻易地归约到Circuit SAT(因为每个3-CNF公式本身就是一个电路)。更一般地,任何NP问题都可以通过库克-莱文归约转化为一个电路的可满足性问题。
因此,我们有两个核心的电路问题:
- Circuit Evaluation(电路评估):P完全,核心是给定输入,计算输出。
- Circuit SAT(电路可满足性):NP完全,核心是是否存在一个输入,使输出为真。
迈向更高复杂性类:简洁电路
电路的概念不仅帮助我们理解P和NP,还能自然地扩展到更高的复杂性类别,如PSPACE和PH。为此,我们需要引入“简洁电路”(Succinct Circuit)的概念。
一个电路 C 被称为是简洁的,如果存在一个多项式时间算法,使得对于给定的门索引 i(以二进制表示),该算法能快速输出第 i 个门的类型以及它与其他门的连接关系。
形式化地说,存在一个算法 A,对于任意门索引 i(|i| = n),在 poly(n) 时间内输出:
- 第
i个门的类型(如AND, OR, NOT, INPUT)。 - 第
i个门的第j个输入所连接的前驱门的索引。
关键点:简洁电路本身的大小(门和边的数量)可能是指数级的(例如 2^(n^c)),但我们无法直接存储它。我们只能通过高效的算法 A 来“按需”访问其局部结构。
基于此,我们定义简洁电路可满足性问题(Succinct Circuit SAT):
- 输入:一个以简洁形式描述的电路
C(即提供访问其局部结构的算法A)。 - 问题:这个(指数级大的)电路
C是否是可满足的?
可以证明,简洁电路可满足性问题是NEXPTIME完全的。
- 属于 NEXPTIME:非确定性图灵机可以猜测一个指数长度的赋值
x,然后在指数时间内模拟这个巨大的电路C来验证C(x)=1。由于电路是简洁的,每一步模拟(访问某个门的信息)只需要多项式时间。 - 是 NEXPTIME困难的:对于任何NEXPTIME中的问题
L,我们可以利用类似库克-莱文归约的思想,将判定L的指数时间图灵机的计算过程,转化为一个指数大小但结构描述非常简洁的电路。这个归约过程本身可以在多项式时间内完成。于是,L被归约到了简洁电路可满足性问题。
总结与展望
本节课中我们一起学习了:
- P完全问题的定义及其在“并行化难度”上的重要意义。
- 一个具体的P完全问题——电路评估问题,并详细分析了其证明过程,其中关键地运用了库克-莱文归约和对数空间归约的概念。
- 作为自然推论,引入了NP完全的电路可满足性问题。
- 为了研究像NEXPTIME这样的更高复杂性类,我们引入了简洁电路的概念,并指出简洁电路可满足性问题是NEXPTIME完全的。

电路为不同复杂性类别提供了统一而强大的描述框架。从P完全的电路评估,到NP完全的电路可满足性,再到NEXPTIME完全的简洁电路可满足性,这一系列问题清晰地展示了计算复杂性层次的攀升。电路的概念将继续帮助我们理解和定义更复杂的类别,如多项式层次(PH)、计数类(#P)以及多项式空间(PSPACE,其完全问题通常涉及量化的布尔公式,可视为特殊电路)。希望本课程为你打下了坚实的基础,鼓励你进一步探索计算复杂性理论的深层内容。

浙公网安备 33010602011771号