《computational complexity》笔记:基本复杂度类

《computational complexity》作为理论计算的基础,对我这种初学者来说,值得精读并做一些笔记。笔记主要用于整理和记录自己的理解。

the computational model

最初的目标是构造一个计算的模型。这个模型可以看作一个集合,这个集合中的每个元素相当于某一个具体问题的解决方案,也就是一个“程序”;这个集合整体就是一个计算模型,也就是一个可以运行任何“程序”的“计算机”。所以构造一个计算模型的目标,分别从程序和计算机的角度就是要规定程序如何表达和程序如何运行。
直观上来说“计算”就是已有一些“数据”和一些的“草稿纸”,按照“解题思路”每次在数据和稿纸中拿出一些数据进行计算,将结果写在稿纸上或写在“答题纸”上。构造的计算模型应该符合这一直觉。
我们还希望这个模型具有“通用性”,也就是研究“计算”可以建立在这个模型基础上,而非将计算这个本质的概念特殊化,将“可计算”等问题的研究限定在当今世界中。这样,理论计算才能成为一门永恒的科学,而非日新月异的技术。

turing machine

图灵机的一些细节

一个图灵机可以看作一个程序。
纸带和针头(数据草稿纸):多个纸带,纸带上面每个位置可以写单个字符,每条纸带有一个针头,每次可以向左或向右移动一个单位,也可不动。有一个输入纸带,表示给定的数据;一个输出纸带,在运行结束时输出纸带上的值就代表输出结果;其他纸带均用于存储中间运算的结果。设有k个纸带,纸带上字符集大小为Γ
状态(临时记忆):状态只是一个抽象的数,但作为一个临时的记忆,可以存储的东西种类很多,例如“程序进行到第几步了”,“上一秒从纸带读入的数据是哪些”等等,但因为只是一个数,可以认为记录的信息量是关于读入O(1)的。状态是集合Q的一个元素。
计算一步的过程:从每个纸带的针头处读取一个元素,再根据读取的元素和目前的状态决定下一个状态,这些针头处的值如何修改,以及每个针头分别如何移动,或者选择结束计算(达到了终止状态qhalt)。那么整个计算的运行时间就可以看作这样的计算的步数。
转移函数(解题思路):由于修改和移动完全取决于针头处的值和目前的状态,因此可以将每次计算看作一个函数δ:Q×ΓkQ×Γk1×{L,S,R}k
值得注意的是,“状态”这个数不是可有可无的,比如说我想将纸带的某个位置的值x移到纸带末尾,那么我在移动的每一步“必须要记住x的值”,这个值是无法在纸带的读入中得到的,所以必须要将x的值作为一个临时记忆放在状态里以便转移。

定义的普遍性

先定义一个图灵机的运行时间:如果对于所有长度为n的输入,运行时间不超过T(n),则称运行时间为T(n)
可以从以下几点中感受图灵机模型定义的普遍性:字符集大小的任意性,纸带条数的任意性,纸带可以是双向延伸也可以是单向延伸。这里的任意性说的是在一种模型下的任一程序,可以对应到另一模型下的一个程序使得输出相同,且运行时间不慢太多。

对于任意k+2个纸带的图灵机,运行时间T(n),存在三个纸带的图灵机得到相同的结果,运行时间kT(n)logT(n)

证明:将用于草稿的k个纸带变成一个纸带,字符集Γ变成Γk,然后k个针头的移动转化成k条纸带分别平移,直接暴力平移是kT(n)2的。优化每条纸带的平移可以优化到T(n)logT(n),算法如下:类似倍增的方法,以针头为中间点,左右从中间向两边按2,4,8,...,2k,...依次分块,保证2k的块内有效元素个数为2k2k10,其他元素用空字符填充,且对称(块大小相同的两个块)内有效元素个数之和为2k。以左移距离,先找到右侧第一个有效元素数不为0的块2t,那么右侧2,4,8,...,2t1这些块为空。将2t块内的2t1个元素取出,依次放到针头处,2,4,8,...,2t1这些块各填满一半,对于左侧,进行相反的操作,将针头处,2,4,8,...,2t1这些块的元素各拿出一半,放到2t处。例如|oooo|aa|i|oo|bcdd|变为|ooaa|oi|b|co|ddoo|。注意到如果访问到2k块,单次复杂度为O(2k),但此后至少2k1内不会再访问到2k1块,因此每块均摊复杂度O(T(n))

图灵机对现代计算机程序的模拟:将现代计算机程序编译为机器语言后,大致只有三种操作:(a)将内存中的信息写入有限大小的寄存器 (b)将寄存器中的信息写入内存 (c)将寄存器中两个数取出运算得到第三个数。可以将内存和寄存器分别设计为两个纸带,而加法乘法等运算也可以通过图灵机实现。这样一个现代程序就转变成了一个图灵机。

至此我们可以感受到,将可解决的问题定义为在有限时间内可解,或是在多项式时间内可解,那么在图灵机模型上可以解决的问题(存在一种图灵机可解决)都不比任何计算机少。除了加入随机化,或考虑量子计算模型,计算的研究都可以基于图灵机模型进行。

oblivious turing machine 对于相同的输入长度,每个时刻针头的位置相同,也就是针头位置的移动只与读入的长度有关,与读入的数据无关。一种简单的实现方式是针头所在的位置用特殊字符标记,每次针头都从纸带最左端移到最右端再移回来,复杂度是O(T(n)2)。oblivious turing machine性质更好,在之后NP问题的规约中有一些应用。如果某问题存在一个图灵机可解,那么一定存在oblivious turing machine可解,但为什么不直接用oblivious turing machine作为计算模型,我的理解是由于判定一个图灵机是否是oblivious turing machine似乎非平凡,因此会导致转移函数对应到计算模型时会有困难,影响之后的二进制表示等。

图灵机的二进制表示 一个很重要的观察是,如果我们规定字符集大小和纸带数量,那么转移函数可以映射到图灵机(只不过有的图灵机会runtime error,可以定义RE为直接输出0),而转移函数也可由二进制来编码,规定编码方式后二进制串可以映射到转移函数(不合法编码要求的可以定义为直接输出0的图灵机)。那么一个图灵机也可以作为另一个图灵机的输入和输出。将图灵机M的二进制表示记做M(2),二进制串s对应的图灵机为Ms。另外,一个二进制串可以映射到一个图灵机,但任何一个图灵机的转移函数可以有无穷种,因此可以对应到无穷个二进制串,这个细节在以后的证明中会带来很多方便。

universal turing machine 利用图灵机的二进制表示,可以将图灵机作为输入1, 图灵机的输入作为输入2,设计一个图灵机计算其他图灵机的运算结果。这个图灵机也相当于一个程序,但可以运行其他程序,似乎有点像操作系统的概念。具体实现就是用三个工作纸带,分别表示需要需要模拟的程序的二进制表示,模拟的程序的纸带,和目前的状态,再利用O(T(n)logT(n))的合并纸带的算法,就可以得到O(T(n)logT(n))的结果。

可解问题

不可计算问题

存在图灵机上不可解问题。即存在一个函数L:{0,1}{0,1},不存在任何图灵机M使得M(α)=L(α)对所有α成立。

证明:利用图灵机的二进制表示。令UC(α)Mα(α)结果的第一位的逆,如果Mα(α)运行中发生错误,或者死循环,则UC(α)=0。那么假设UC可解,即UC(α)=T(α),而UC(T(2))T(T(2)),因此矛盾。

我有一个证明存在不可计算问题的想法,因为可能存在多个图灵机解决同一判定问题,但不存在一个图灵机解决多个判定问题,因此可以从基数的角度来思考。{0,1}是所有长度有限的二进制串,可以对应到自然数,因此是可数集,基数与N相同,那么L:{0,1}{0,1}的总数就是2N;而单纸带字符集大小为2的图灵机算法由δ:Q×{0,1}2Q×{0,1}×{L,S,R}2决定,Q是有限集,对于大小为|Q|=n,图灵机的个数是c(18n)4n,是有限集,可数个有限集的并生然是可数集,基数与N相同,因此我们知道可解决的问题(或者说算法个数)是可数的。由于2N=RN的基数不同,因此一定存在不可解问题。在第三章就可以看到,上述不可计算问题的构造本质是“对角化”,最初就是一个证明实数不可数的方法。(另外,线性可解的问题也是无穷个,因为输出读入串的第n位显然存在线性算法,那么线性可解的问题和可解的问题基数相等,存在一一映射,那么这个映射的本质是什么呢?)

停机问题不可解。停机问题定义为:给定一个程序和输入,判断程序是否终止。

证明:假设停机问题可解。那么存在图灵机T可解UC问题,T的执行过程为,先利用停机问题的图灵机判定Mα(α)是否停机,如果不停机直接输出0,否则利用universal turing machine来模拟并将结果的第一位取反,这样得到UC的解,与上一定理矛盾。

值得一提的是,不可解问题的研究受到哥德尔不完备定理的启发很大。希尔伯特提出的猜想是构建一个公理系统,任何可以形式化的命题都可以通过推导证真或证伪(complete,完备性),且不存在某个命题既真又伪(sound,一致性),且这个公理系统可以证明自己complete and sound。哥德尔不完备定理否定了这一猜想。哥德尔定理有两条:包含皮亚诺公理的系统如果是一致的,那么不是完备的;包含皮亚诺公理的系统不能自证一致性。
如果反过来用停机问题来证明哥德尔不完备定理也是可行的。包含皮亚诺公理的系统中一定存在+,×,=,>,,,¬,,,那么图灵机的运行过程可以用这些符号形式化地写出,令ϕ(α,x,t)表示Mα(x)是否在t步以内停机,停机问题可以被表示为t:ϕ(α,x,t)=1,由于任何命题可以在有限步内证真或真伪,那么可以按照长度枚举所有证明过程(假设证明过程也可以写成一个数字串),这个算法一定可以在有限步内得到停机问题的解。

P复杂度类

复杂度类就是不同计算资源可解决问题的集合,例如可解问题的类,就是图灵机可以解决的问题集合;多项式时间可解问题的类,就是多项式运行时间的图灵机可解的问题集。

语言(language)L定义为fL:{0,1}{0,1}fL(x)=1xL。之后对复杂度类的讨论基本都建立在language这样的判定性问题上。

DTIME复杂度类和P复杂度类:LDTIME(T(n))定义为存在一个图灵机和常数c运行时间不超过为cT(n)可以求解fLP=c1DTIME(nc)

之前已经说明了,P复杂度类不受计算模型的影响,利用图灵机定义出的P的集合大小不小于任何确定性的计算模型。P复杂度类可以被看作实践中可解的问题集合,我认为P复杂度类之所以用多项式nc定义,是因为在实际程序设计中,“for循环”往往是程序实现的主体,尤其是在非指数级的问题中(指数级的问题可以认为是难解的),所以用nc作为基准更方便判断一个问题是否存在高效算法。实际上这个基准具体是什么并不重要,因为只是作为一个增长趋势的大体区间,如果能找到一个函数列fc,使得limn+fc(n)/nc=t常数,那么P=c1DTIME(fc(n))。例如(1+sinn)n就不在P内,因为在一些n处会达到指数级,因此P类的核心是,对任意n(等价于除了有限个正数以外的任意数),对任意长度为n的输入,效率都很高,正所谓“最坏情况”。
我认为这个复杂度类依然有其局限性,因为其定义的“可高效计算”,只是人为地用多项式增长趋势作为标准,是否有可能在未来会存在一些应用广泛的算法复杂度为T(n)=O(n10),虽然现在来看多项式算法的复杂度主要源于循环嵌套,但存在可能,T(n)是一类特殊但简洁的函数,其增长的趋势通过计算以后发现介于O(n9)O(n10)之间,那么这类函数实际也是难以计算的。因此对于“易于计算”计算的概念,可能还需要更为本质的定义。

NP and NP completeness

这一章的内容部分在《算法导论》上有介绍,这里就简单概括一下。

NP复杂度类:LNP当且仅当存在多项式运行时间的图灵机M,存在多项式p使得xLu{0,1}p|x|s.t.M(x,u)=1,此时u被称为证书(certificate)

非确定性图灵机(NDTM):有两个转移函数δ0,δ1,和特殊状态qacceptQ,每一步可以任选转移函数进行转移,设M为NDTM,M(x)=1当且仅当存在一种转移函数的选择情况,使得最终可以达到状态qaccept。NDTM的运行时间为T(n)当且仅当对任意输入x{0,1}和任意转移函数的选择,在T(n)步内,要么达到终止状态,要么达到qhalt要么达到qaccept

NTIME复杂度类:LNTIME(T(n))定义为存在一个NDTM和常数c运行时间不超过为cT(n)可解L

定理:NP=c1NTIME(nc)

证明:对于LNTIME(nc),可以将每次转移函数的选择作为certificate,那么certificate长度也是多项式级别的,因此LNP;对于LNP,直接用NDTM来写一串certificate,之后就当成TM运行即可。

EXP复杂度类:EXP=c1DTIME(2nc)。易得PNPEXP

NEXP复杂度类:NEXP=c1NTIME(2nc),易得EXPNEXP

定理:若P=NP,则EXP=NEXP

证明:这里用到了"padding technique",即通过添加无意义的0延长读入的长度来降低算法复杂度。若LNEXPLNTIME(2nc),令Lpad={<x,02nc>:xL},则LpadNPLpadP,那么解决L问题只需用一个多项式时间的TM来解决Lpad,因此LEXP

coNP复杂度类:coNP:={L:L¯NP}

另外一个等价定义是:LcoNP当且仅当存在图灵机M,多项式p,对所有xL都有u{0,1}p|x|,M(x,u)=0。多项式时间的NDTM无法解决所有coNP问题,coNP和NP的定义也本质不同,因此NP和coNP是不同的复杂度类。直觉上NP和coNP可以互相“规约”是错误的,因为这里所谓的“规约”是在假定P=NP,即NP问题存在高效算法的基础上的。
对比可以发现NP复杂度类中的问题L,别人很容易向你证明xL(只需要给出certificate即可),而很难让人相信xL;而coNP复杂度类中的问题相反,容易证明xL而难证xL
可以同样使用Cook-Levin Theorem的证明过程,将LcoNP转化为是否对所有取值都不满足CNF表达式,即SAT问题的补属于coNP-complete。

规约和NP-Completeness

规约就是用较小运算资源(比如说研究NP时使用P的资源等)实现问题的转化,规约大概有两个作用:对不同复杂度类而言,考虑其他资源是否可解决complete问题即可在不同复杂度类中更方便地讨论包含关系,例如若TQBFNP,则PSPACE=NP;对不同问题而言,规约会使得在复杂度类的层面上问题的“难度”可以比较,例如若LpSAT,则LNP。这两个作用分别需要用到两个定理的证明:如果LaLLP,则LP;如果LaLLaL,则LaL

规约(reductions):称language L{0,1}多项式时间Karp reducible到language L{0,1},记做LpL,当且仅当存在多项式时间内可计算的函数f:{0,1}{0,1}使得xLf(x)L

可以证明这个规约满足上述两个性质。

NP-hardness and NP-completeness:称L为NP-hard当且仅当LNP:LpL,称L为NP-complete当且仅当LNPL为NP-hard。

我们可以看到,如下问题就是NP-completeness:{<α,x,n,t>:u{0,1}n,Mα(x)=1intsteps},传入nt是为了方便输出0的情况的终止。对任意问题,令α=M(2)n=p(|x|)t=T(|x|)即可归约到该问题。

Cook-Levin Theorem:SAT和3SAT是NP-complete问题

证明:首先对于任意f:{0,1}n{0,1}n个01变量对应的函数),存在一个CNF表达式长度不超过n2n(长度定义为运算个数),即对每个f(x1,...,xn)=f(y1,...,yn)=01in(xiyi)。那么对每个NP问题,存在对应的图灵机M,找到M对应的双纸带、二进制的oblivious图灵机M,尝试将M的运行过程用CNF表达式写出。具体地,对于长度为n的读入,可以先用任意certificate运行一遍M得到每一步图灵机两个针头的位置。对于任意certificate,第i步的“输入”可以表示为zi=(qi,tape1,ai,tape2,bi),即状态和两个针头的读入,状态由第i1步决定,而aibi已知,对应的值分别由读入和上次在qi处写值的第previ步决定,因此可以写成zi=f(zi1,zprevi,tape1,ai)。把tape1的certificate部分以及每个zi作为变量,构造CNF表达式。zi的二进制表示位数是O(1)的,因此利用f(x1,...,xn)=f(y1,...,yn)=01in(xiyi)zi=f(zi1,zprevi,tape1,ai)的表达式长度也是O(1)的,最终CNF的大小是多项式级别的。证明了任意NP问题都可以规约到SAT,SAT是NP-complete。
要证明3SAT也是NP-complete,只要证明SAT可规约到3SAT。对于长度超过3的表达式1inyi,可加入新的变量z,将其写成(y1y2z)(z¯3inyi),不断进行下去就可以写成3CNF的形式。

另外可以发现,Cook-Levin Theorem的证明过程的规约,实际上可以建立languageL中元素的certificate和对应的SAT问题的certificate的关系,也就是如果能够找到xL的certificate,也可以在多项式时间内找到f(x)SAT的certificate,反之亦然,满足这一性质的规约称为Levin reduction。利用这个性质,我们可以得到如下定理,说明了NP问题虽然定义在判定性问题上,但如果所有NP问题的判定性版本存在高效算法,那么需要输出certificate的查找版本也存在高效算法。

如果P=NP,那么对于任何LNP,存在一个图灵机T,使得对所有xLT(x)均可输出一个x的certificate。

证明:如果P=NP,那么SAT问题可解。将L转化为SAT问题,而SAT问题可以通过依次对xi找到t=0,1使得xi=t后有解,令xi=t并更新CNF表达式,进而找到SAT问题的certificate,再利用Levin reduction的性质还原出x的certificate。(由于给定x和certificate前几位判断之后certificate是否有解仍然是NP问题,因此也可以用这个问题的多项式运行时间的解来按位确定x的certificate)。

diagnalization

证明实数不可数有一个著名的证明:将实数写成无限二进制小数,如果实数可数,那么可以将实数排成一列a1,a2,...,那么翻转(将x变为1xai的小数点后第i位作为新实数的第i位,那么这个实数与任何ak在第k位都不同,因此矛盾。在证明存在不可解问题中提到,图灵机是可数的,问题基数与实数相同,因此可以用上述对角化证明。而这个对角化有了实际含义,假设所有language均可解,将这些language按照图灵机二进制表示的大小顺序排成一列a1,a2,...,其中ai可被Mi解决(如果Mi不能解决任何问题,即Mi会在一些输入中不停机,可以跳过这个ai,不影响所有问题在a中出现),那么令L={i:1Mi,i=1},这个language不能被任何Mk解决,至少在k处错误。实际上第一章的UC就是这里的L

Time Hierarchy Theorem:若f(n)logf(n)=o(g(n)),则DTIME(f(n))DTIME(g(n))

证明:这个非常重要的定理说的是更多的时间资源一定可以解决更多的问题。对于上述对角化有个很直观的想法,就是假设允许运行时间为“无限”,那么“运行时间无限的图灵机”可以解决停机问题,即直接模拟任何图灵机“无穷步”(这个其实容易想象,比如说数学归纳法对任意nN可以在有限步内证明成立,但证明所有nN都成立则需要“无穷”步),那么就证明了“无限时间”可以比“有限时间”解决更多的问题。从对角化来看,如果强调xUC当且仅当Mx(x)在“有限”步内输出0,假设存在一个可以在“无穷”步后输出结果的图灵机也可以写成二进制的形式α,那么此时的对角化无法导出矛盾,因为如果Mα(α)在无穷步后输出0,但由于不能在有限步内输出,因此αUC,答案并没有错误,因此解决UC问题的无穷时间图灵机可以逃过对角化的矛盾,但有限步不行。
那么尝试修改上述的说明。令f(n)=o(h(n))h(n)logh(n)=O(g(n))h(n)=g(n)/logg(n)即可。我们令运行时间不超过xL当且仅当Mx(x)h(n)步内输出0。那么LDTIME(f(n)),因为对任意cf(n)运行时间的图灵机,会导出对角化的矛盾,在自己的二进制位处的输出与L不符;而可用universal turing machine模拟Mx(x)运行前h(n)步的情况,从而得到LDTIME(h(n)logh(n))
另外,这里的f(n)g(n)需要是短时间可构造函数(time-constructible function),即g(n)需要在关于g(n)的多项式时间内计算出来,否则h(n)无法显式地计算就无法确定模拟时步数上限。

Nondeterministic Time Hierachy Theroem:若f(n+1)logf(n+1)=o(g(n)),则NTIME(f(n))NTIME(g(n))

证明:这个定理不同的一点在于NP问题的补不是NP问题(不能用NDTM解决),所以要用到lazy diagonalization技巧。再次回顾最初的对角化,其实我们不一定要翻转对角线上的元素,我们只要能构造一个函数,每一行都有一个元素与之不同即可,可以把对角化的过程想象成这样:我们从短到长确定每个xL是否满足,依次对于阶段i,要让Mi不能计算L,因此只需要在有限的区间(可以是x的区间也可以是|x|的区间)内确定一个M(i)(x)xL结果不统一的,然后用剩下的x进入i+1的阶段。
注意到¬NTIME(f(n))DTIME(2f(n)),那么我们在用universal turing machine模仿时,如果允许用指数级的时间就可以取反。令h(n)=g(n)/logg(n)h(s(i+1))=2h(s(i)),令L只考虑全为1的情况(即只需要对每个n判断长度为n的全1串是否在L内,其他串均不在L内),利用(s(i),s(i+1)]来拒绝Mi。令全1串x的长度在(s(i),s(i+1))xL当且仅当M(i)(x+1)h(x)步内输出1或不停机,而1s(i+1)L当且仅当M(i)(1s(i)+1)h(s(i+1))=2h(s(i))步内输出0。由于Mi的答案,是L(s(i),s(i+1))上的答案右移一位,而Mis(i)+1的答案与Ls(i+1)的答案不同(如果运行时间低于h),因此MiNTIME(f(n))是无法解决该区间的问题;相反,如下图灵机属于NTIME(g(n)),对于(s(i),s(i+1))区间的问题直接用类似的universal nonderministic turing machine来模拟,在s(i+1)处则爆搜h(s(i))的每一步,再将结果取反,由于h(s(i+1))=2h(s(i)),可以解决问题。

Ladner's Theroem(NP intermediate languages):如果PNP,则存在LNPPL不为NP-complete。

证明1:以下是Ladner本人用lazy diagonalization的证明。L不为NP-complete当且仅当不存在任何一个多项式时间可计算的函数f使得xSAT当且仅当f(x)L(这也说明所有NP-complete问题可以通过图灵机来枚举)。延续上一个定理证明的思路,利用SAT来构造L,阶段2i1来使得多项式时间图灵机Mi不可解决L,阶段2i使得多项式时间图灵机Mi对应的可计算函数不能将SAT规约为L,另外还需要保证LNP。那么对于奇数阶段,我们直接令长度区间[l,r]内的所有L就是对应长度的SAT,要求Mi不能解决这个区间内的问题,那么r有界,否则Mi可解决SAT;对于偶数阶段,令L不包括长度[l,r]内的串,那么r有界,否则任意长的SAT问题可多项式时间归约到长度有限的串,SAT可被解决。具体而言,令L={x:xSAT,g(|x|)mod2=1}g(|x|)就对应阶段2i12i,要是LNP需使得g(n)可在多项式时间内计算,那么当存在长度不超过logn的SAT可以解决该阶段时,就令g(n+1)=g(n)+1,否则g(n+1)=g(n),那么只需要求出所有长度不超过log|x|的SAT问题,就可以求出g(1)...g(|x|)。最后一个细节是求g的时候需要用Mi运行长度不超过log|x|的SAT问题,因此必须要保证Mi的复杂度不能太大,解决方案是重排Mi,令Mix上的的运行时间不超过i|x|i,具体构造就是考虑将原本Mi运行时间超过i|x|i加入一个“队列”,算g的复杂度不超过(logn)g(n),在(logn)g(n)接近n时令g(n+1)=g(n)即可。
证明2:以下是书上给出的对SAT做padding的证明。思路是如果对SAT问题padding上过长的0,那么就属于P;如果padding的过短,那么就属于NP-complete。令L={x+1+0f(|x|)|x|1:xSAT}(即把长度n的SATpad到f(n)),令f(n)=ng(n)g(n)对应阶段i,即要让多项式时间MiL矛盾。当Mi与长度不超过logn(类似上一证明,为保证f可计算不能直接用n)的二进制串矛盾时令g(n+1)=g(n)+1,否则g(n+1)=g(n)。那么阶段i对应n的区间不可能有界,否则可将SAT直接pad到多项式长度后用Mi解决SAT问题。另外,L不可能是NP-complete,否则由SAT归约到L,再去掉padding部分规约回SAT,规模减小很多,递归下去即可解决SAT问题。具体地,设长度为n的SAT问题归约到O(nc)L,则令g(k)=2c,若先规约再去掉pad之后的长度超过k,则n被转化到至多n1/2的问题,最终归约到有界的SAT问题中。为了快速计算f,也需要用上一证明中的Mi来重排。书上等价的描述是令g(n)为最小的i<loglogn,使得Mi运行时间不超过i|x|i(此处用到任何一个图灵机有无穷种二进制表达方式这一细节)且可解决所有长度不超过logn的问题,如果不存在则令g(n)=loglogn,这样的定义更清楚,但似乎构造的本质是分阶段让Mi不可计算L的本质被掩盖了。

对角化的局限性

本章的最后,阐述了对角化的局限性,即对角化无法证明PNP。对角化其实只使用了图灵机的两个性质:存在universal turing machine和可便捷地实现图灵机与二进制串的互相转化,而图灵机还有许多其他性质,例如Cook-Levin Theorem用到的存在oblivious turing machine,即每一步只取决于极少的步数,并影响极少的步数。而只用到这两个性质的模型不止图灵机一个,不同的模型就对应不同的P和NP,例如接下来定义的oracle turing machine,一些oracle turing machine会导致P=NP,一些则导致PNP,这也就意味着只使用这两个性质不可能证出P是否与NP相等,否则oracle turing machine也只会出现一种情况。
O{0,1}为oracle,定义oracle turing machineMO表示一类图灵机,增加一个新纸带和三种状态qyes,qno,qquery,每次进入qquery时,就会根据新增的纸带中的串是否属于O直接跳转到qyesqno。直观理解就是可以多次询问languageO在一些位置的值,例如任何coNPPSAT内。oracle turing machine满足上述两个性质,PONPO是把O作为oracle时定义的复杂度类。令O={<M,x,1n>:M(x)=1 computes in 2n steps},那么PO=EXP=NPO;要让PONPO,对于S,令L={1n:s{0,1}n,sS},那么对所有S都有LNPS,用之前的思路按照多项式运行时间的Mi划分阶段,令Mi运行时间T(n),存在2n>T(n),且n大于之前其他M取的n,那么MiS无法查出长度为n的所有串,那么对所有查询都返回no,并根据MiS(1n)来决定未查的串的实际情况,得到LPS
只使用图灵机的这两个性质证明出的结论称为relativizing results。简而言之就是对角化只能够证明出relativizing results,而PNP并非这样的结果。

Space complexity

SPACE and NSPACE:令language L满足LSPACE(s(n)),当且仅当存在常数c和一个图灵机M,使得M解决所有长度为n的问题除读入纸带外至多访问过不超过cs(n)个纸带的位置。LNSPACE(s(n)),当且仅当存在c和NDTMM,使用的纸带位置不超过cs(n)

SATPSPACE,因此可以得到NPPSPACE

图灵机的转移函数的定义域,即图灵机每步“可见”的数值可以作为这一步的一种“状态”,但这种状态是可以循环的,只要纸带其他处的值或纸带针头位置不同。我们可以用更直观的方式定义一种“状态”,这样的状态能够包含图灵机在某一步的全部信息。定义图灵机M在某一固定输入的configuration graphs,图的每个节点对应图灵机的某一步,其中的信息包括纸带所有位置的值,针头的位置,当前的状态q,根据转移函数可得下一步,下一步对应的节点作为该步对应节点的后继。停机的TM和任意选择转移函数的情况下都停机的NDTM对应的图都无环。若在长度为n上的输入,除了读入纸带外使用了S(n)的空间,configuration graph的节点数不超过O(n2S(n)),如果S(n)logn,则直接对图搜索可得NSPACE(S(n))DTIME(2O(S(n)))

Space Hierarchy Theorem:若f(n)=o(g(n))SPACE(f(n))SPACE(g(n))

证明与DTIME Hierarchy相同,而且universal turing machine消耗的空间是常数倍的。

PSPACE=c1SPACE(nc)NPSPACE=c1NSPACE(nc)L=SPACE(logn)NL=NSPACE(logn)

我们很少讨论sublogarithmic space,主要原因是低于对数的空间无法进行计数运算,例如目前读入纸带针头的位置都无法记录,连L={1m+0+1m}都无法解决,也不存在universal turing machine。不过也可能解决一些非平凡的language,例如L={1(2)+#+2(2)+#+...+#+n(2)},只计数只需要至多记到n(2)的长度,即logn,因此可在O(loglogn)内解决。

PSPACE完全问题

这里涉及到了更复杂的规约,由于NLPNPPSPACE,我们定义PSPACE上的规约可以使用不同的计算资源来定义,取决于我们想研究PPSPACE还是NPPSPACE。这里仍然使用Karp reduce,类似NP-complete地定义出PSPACE-complete。一般最容易找到地complete问题就是NDTM的运行结果:{<M,w,n>:NDTM M accepts w in spacen}。language TQBF定义为所有由,,¬,,构成的存在解的布尔表达式,这种表达式也一定可以写成Q1x1...Qnxnϕ(x1,...,xn)Qiϕ是CNF表达式(如果不是CNF表达式也可以在多项式时间内转化为多项式长度的CNF表达式,至少可以将表达式写成图灵机,再用cook-levin定理)。

TQBF是PSPACE-complete

证明:设有n个变量,ϕ的长度为m,直接爆搜所有变量的取值即可在空间O(n+m)内解决。对于任意PSPACE问题,利用configuration graph来构造TQBF:令G(C,C)表示若读入纸带给定,C的下一步是否为CG可以用以CC为变量的多项式长度的CNF表达式写出,那么设G(C,C)=1,可以写成C0,...,CT,i<T,G(Ci,Ci+1)=1,但T可能是指数级;用倍增,令ψi(C,C)表示至多2iC是否可以走到Cψi(C,C)=C,ψi1(C,C)ψi1(C,C),这个表达式又会达到指数级;再用一些技巧,将表达式写成ψi(C,C)=CD1D2,((D1=CD2=C)(D1=CD2=C))ψi1(D1,D2),设原空间复杂度T(n),每次增加O(T(n))个变量描述C,D1,D2,空间复杂度变为O(T(n)2)

由于总可以把Q1,...,Qn写成,,...交替的形式,那么TQBF问题的一个现实场景就是棋类的对弈,即是否存在一个先手必胜的策略。对于NPPSPACE的直觉,也就来自于"games harder than puzzles"。

Savitch's Theorem:对任何space-constructible function S(n)lognNSPACE(S(n))SPACE(S(n)2)

证明:注意到上一命题的证明过程,对NPSPACE也成立,因此可以直接得到PSPACE=NPSPACE。直接用上一个证明的方法,设M=log|G|=O(S(n)),求ψM(S,T)可直接爆搜每一个i对应的C,递归的深度是O(M),且每次记录i只需O(M)个bit。

NL完全问题

要讨论LNL就会自然地引出NL完全问题,那么这时的规约必须只能使用对数空间。然而对数空间会导致连多项式大小的输出都无法完成,因此有了隐式对数空间可计算(implicitly logspace computable)的概念。

implicitly logspace computable:f:{0,1}{0,1}是隐式对数空间可计算的,定义为存在c使得对所有x|f(x)||x|c,并且Lf={(x,i):f(x)i=1}LLf={(x,i):i|f(x)|}BlC定义为存在这样的f使得xB当且仅当f(x)CCNL-complete定义为CNL且所有BNL满足BlC

两个隐式对数计算的函数复合还是隐式对数计算的,只需要在外层的函数访问读入纸带时开一个新的纸带来模仿内层函数计算该位即可。利用这个性质可以说明规约满足我们的两个要求。很容易说明PATH={<G,s,t>:t can be reached from s in directed graph G}是NL-complete,只记录目前节点编号,一次考虑每条出边,两个转移函数分别考虑走或不走,可以得到PATHNL;对于其他ANLA的configuration graph的邻接矩阵是implicitly logspace computable的,节点数是关于输入长度的多项式,可以归约到多项式长度的PATH问题。

接下来我们希望找到利用certificate的NL等价定义。注意到NDTM每步的选择本身就与一个从左往右每个位置只能读一次的certificate一一对应,certificate是否只能读一次不影响NP复杂度类,为了让certificate的含义更加直观我们没有要求只读一次。但如果在定义NL时也不要求只读一次,定义出的复杂度类就是NP:首先,如果由多项式时间规约换成对数空间规约,SAT问题仍然是NP-complete,只需要在对数空间求出oblivious turing machine某一步的zi对应的布尔表达式,那么只需要在第一遍模拟时用计数器存针头位置,第二遍模拟时算出previ即可;之后,SAT属于这样新定义出的复杂度类,因为在给定变量取值的情况下,仅需要对数空间就可以检验表达式是否合法。为了避免这种情况,我们必须要求对数空间的certificate作为新的纸带,针头只能向右移动,即每个位置只能被读入一次。仍然要求certificate的长度是关于输入多项式级的。

NL等价定义:languageLNL当且仅当存在TMM和多项式p,使得对所有x{0,1}xLu{0,1}p(|x|),M(x,u)=1

最后研究一下coNL复杂度类。PATHcoNL,但实际上有PATHNL,因此coNL=NL

Immerman-Szelepcsényi Theorem:PATHNL

证明:构造certificate的思路就是确定从起点开始走至多i步能到达的点集Ci,又因为内存限制和certificate每位只能访问一次,不过可以只利用集合大小|Ci|归纳构造。假设已经证明了|Ci1|=k,接下来证明|Ci|。对每个点uCi,直接给出一条从su长度不超过i的路径;对每个点uCi,按从小到大的顺序利用路径证明vCi1,程序只需要检查uvv没有到u的边,这些v的个数是k即可。

那么对所有S(n)logn,都可以证出NSPACE(S(n))=coNSPACE(S(n))。只需要对用padding techinique,设LcoNSPACE(S(n))L¯NSPACE(S(n))(L¯)padNL(L¯)padNLLpadNLLNSPACE(S(n))

Polynomial Hierarchy

Time space tradeoff for SAT: 定义TISP(T(n),S(n))O(T(n))运行时间和O(S(n))运行空间的图灵机可计算的language。SATTISP(n1.1,n0.1)

证明:只需证NTIME(n)TISP(n1.2,n0.2)。分别说明TISP(n12,n2)Σ2TIME(n8)和若NTIME(n)DTIME(n1.2)Σ2TIME(n8)NTIME(n9.6),第一部分可以按n6将configure graph分块证明,第二部分将转化为¬再用NDTM即可。

Boolean circuits

布尔电路和图灵机一样,都是计算模型。研究不同计算模型的原因是各种模型对应不同现实应用场景,且不同问题问题在这些模型中研究的难度也不一样。图灵机似乎是一个相对复杂的计算模型,例如一个图灵机是否停机甚至是不可解问题,但布尔电路看起来要直观很多。

布尔电路(boolean circuits):n个输入的布尔电路是一个有向无环图,有n个入度为0的点(sources)表示n个01变量,其他节点(gates)上写有,,¬,入度分别为2,2,1,所有点出度任意,存在一个出度为0的点作为输出节点(sink)。每个节点的出边传递的数是入边的数进行节点上的运算得到的结果,对于x{0,1}n,输出结果C(x)是输出节点的运算结果。电路的大小(size)为图上的节点数,电路的深度(depth)为sources到sink的最长路长度。

circuit families:T(n)size circuit families定义为布尔电路的序列CnnN,且存在常数c,使得对所有n|Cn|cT(n)
复杂度类P/poly:令SIZE(T(n))为languageL满足存在T(n)size circuit familiesCnnN,使得xLC|x|(x)=1P/poly=c1SIZE(nc)

posted @   crasysky  阅读(370)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示