归约小记
问题和计算能力
问题
我们定义为 串到 串的映射,在多项式意义下,可以定义为 串到 的映射,即所有问题都是判定问题。
后者也被称为语言,一个语言可以用一个集合 表示,里面存储了所有被判定为 的输入。
图灵机
程序是一个自动机,附有无限长的内存和一个指针。
输入是纸带的初始状态,输出是结束状态。
自动机的每个节点存储:若当前指针指向 ,则下一步向左/向右,当前指针的值变成什么,自动机走向哪个节点,以及是否停机。
显然一个图灵机可以用一个 串编码。
带真随机数生成器的图灵机的计算能力 与 带无限内存的现代电子计算机 的计算能力相当,显然我们可以把一个现代 cpp 程序进行一些不改变多项式性的改写。
对于时间复杂度的表示:我们所说的多项式是关于输入长度成多项式关系,而不是某个输入数值。
停机问题
图灵机的可用内存和自动机编号都是有限的,显然若某个图灵机两次到达相同的状态,那么此后它还会一直循环这个过程,也就是说图灵机是有可能无法停机的。
问题 1:给定图灵机 ,判断其是否存在一个输入使得它能停机,这个问题是否能用图灵机在有限时间内给出判断。
不存在。
证明:假设存在 ,则我们构造 :当 判断其停机时,死循环,否则停机。
则 是不合形式逻辑的。
问题 2:给定图灵机 和输入 ,判断 的运行是否能停机,这个问题是否能用图灵机在有限时间内给出判断。
不存在。
仍然假设存在 。
我们尝试套用刚刚的证明方法,但我们发现硬套的话,我们会得到 的无限嵌套,显然违背了程序的有限性。
考虑更巧妙的套用方法,定义 表示若 判断停机,死循环,否则停机。
则 是不合形式逻辑的。
归约
将 A 归约到 B 的意思是我们可以用 B 做 A,即 A 的计算难度弱于 B,计算难度的意义上,这是一个偏序关系。
为了方便,我们记作 A < B 或 B > A,即计算难度上的大于小于。
我们可以进行映射归约,即一个问题只能调用一次另一问题,也可以进行图灵归约,多项式次数内调用即可。
通常来说,归约时写明调用的次数即可。
指数归约
问题类:P/NP/NPC/NP-Hard
多项式复杂度可以解决的问题称作 问题。
多项式复杂度可以验证的判定问题称作 问题。
若一个问题不弱于所有的 问题,则我们称其为 。
若一个 问题不弱于所有的 问题,则我们称其为 ,简称 。
解决了 问题就可以在多项式复杂度内解决所有的 问题,从而证明 ,目前人类没有发现 或 的决定性证据。

常见 NPC:
- SAT、最小覆盖问题/精确覆盖问题。
- 2-SAT 计数/最大化成立子句个数/最大化变量成立个数。
- 子集和问题( 的特例也是 NPC)、背包问题、装箱问题/多背包问题/多机调度问题。
- 一般图最大团/最大独立集、有向图/无向图最长简单路径、有向图/无向图 哈密顿回路/路径、TSP、最大割。
下面说几个方便证明的,可以参考其中优秀的构造思路。
SAT is NPC
对图灵机的每个时刻进行编码压缩,不难发现图灵机的运算过程可以写成逻辑表达式,且我们可以故意留空一些输入。
SAT 的意思是判断逻辑表达式组是否有解。
如此,如果我们会 SAT 问题,且对于一个问题有一个多项式时间内的验证算法,我们对其进行 SAT 就可以得到一个多项式的判定算法,即 。
3-SAT = SAT
这里的等号其实不严谨,但我们可以说明每个规模为 的 SAT 问题都能转化为规模为 的 3-SAT 问题。
首先将 SAT 写成 的形式(每个 都可能是 ),然后考虑每个长式的表达式树,考虑新建几个变量来承载中间过程即可,现在我们只需描述 ,等号也是好描述的,。
精确覆盖问题 is NPC
问题形式:给定 个集合,值域为 ,判断是否能够选出一些子集恰好覆盖全集。
考虑归约 3-SAT,SAT 中的一个变量就是该问题中的一个集合。
可以构造变量的取反,直接在某一位只有他俩有值即可。
考虑直接构造每个子式的真值表,对于一个大小为 的子式,一定有 种取值是合法的,我们用 位来承载该子式,对于涉及的三个变量我们分别在 位设为 ,然后新增 个额外集合,它们的第 位都是 ,前三位是 种合法取值的补集,这样就限制好了。
一般图最大团/最大独立集 is NPC
原图的最大团是补图的最大独立集,下文用最大独立集来说明,我们仍然归约 3-SAT。
令一个点为一个变量。
可以构造变量的取反,直接连一条边。
对于一个子式 ,我们构造一个新点 连向 ,则若三者选至少一个可得 不选,再次新建 的反面 ,我们希望 尽可能成立,所以重复 次把 的复制连向 。
判断最大独立集是否等于 即可, 为子句数, 为变量数。
哈密顿回路 is NPC
归约 3-SAT。
先来证明有向图版本。
考虑用两个点 表示一个变量,从左走到右表示 ,从右走到左表示 ,考虑 ,只要三者任一成立,该限制就满足。
于是我们新增一个 表示该子式, 就表示 时可以”捎上“这个子式,若需要多次用到 ,我们就用一条长链表示 ,从左向右遍历这条链表示 ,从右向左表示 ,这样就有捎带多个子式的能力了。
问题:会不会有 这种”串门“事件发生呢,你发现此时 所有的入边()都遍历过了,不可能存在哈密顿回路,同理一条链不可能从中间拐走不遍历完,就算从另一侧再次遍历也会因为”回路“的限制走不回去。
连边上,我们还要加上”链头、链尾 向每个 链头、链尾 连双向边“。
无向图版本,考虑一个哈密顿回路的翻转仍然是哈密顿回路,所以如果要复刻有向图,关键在于头接尾、尾接头。
将一个点拆成入点、中点、出点,用无向边顺次连接,这样如果到了入点却不遍历中点和出点,那么中点即使又被出点访问也出不去了,构造完成。
同理,最长简单路和 tsp 显然可以用来判断哈密顿回路。
多项式归约
多项式归约的主要方向有:矩乘、 卷积、SETH 及其衍生物(OV)、3SUM/3XOR。
矩阵乘法
链 mex
mex 的二分版本可以做到查询是否有两个集合并起来为全集,规约 OV。
链颜色数
区间加减 全局 0 的个数
改为加减 1
小 Z 的袜子
也就是区间相等对数。
可以归约到
区间逆序对
大于号算一遍,小于号算一遍,得到区间相等对,归约到小 Z 的袜子。
能否用区间相等对去做区间逆序对?
SETH 强指数时间假设
假设的内容:SAT 问题不存在多项式解法,且其指数解法的复杂度不低于 ,注意这里说的并不是 3-SAT 而是任意 SAT。
OV 的归约依赖于此。
OV > SETH
多项式归约,有两个主要的方向:01 矩阵乘法和 OV。
3SUM/3XOR
判断能否选出三个数的 和/异或 等于 。
目前没有发现低于平方的做法,值域很小时有 FFT 做法(arc185_c)。
4SUM
3SUM < 4SUM,归约方法考虑足够大的量 ,是往集合中扔一个 ,并且原来的每个数加上 。
4SUM 可以做到平方,把所有数对扔进哈希表即可。
行列斜线加([NOI2023] 方格染色)
考虑无限拉长每条线,不平行的线一定相交,则询问全局和就可以得到三线共点的个数。
考虑代数意义、横线是 ,竖线是 ,斜线是 ,于是若有三线共点,则 ,归约 3SUM。