计算理论入门
导语
本文力求在万字篇幅内尽可能清晰地介绍计算理论的基本概念和最新发展。
普通科学读物总是逻辑清晰环环相扣,但是这实在把读者累坏了。本文作为心疼读者的二逼科学读物,目标是希望读者在看不懂第一章的情况下仍有可能把第二章看下去。对于涉及到的新兴专业术语,作者将做出尝试性的汉语翻译,用汉语的语法、汉语的风格、汉语的词汇展现全文。
可计算性问题
现实生活中有很多计算类的问题,考试要计算成绩,购物要计算价格,与佳人约会要算好时间,出门旅行要算好乘车方案。计算的结果不局限于数字,也可以是方案,可以是图像,可以是子弹穿过木块的运动轨迹,也可以是组成新款计算机的电路设计。只要一份答案可以用语言描述,它就可能是某个计算过程的结果。
可是世界上并不是所有问题都能算出结果。姑娘的头发有多少根,这个问题很难,但是交给机器做,一根一根数,数一根拔一根,总是能数完的。这个问题就可计算。但是姑娘明天心情如何,这个问题就根本没办法计算了。事实上就连她们自己也弄不清楚。
那么,什么问题是可计算的?什么问题是不可计算的?我们能不能在数学上给“可计算”下一个精确定义,然后用数学手段研究万事万物的可计算性?
历史
这个问题的源头早在17世纪就被提出来了。欧洲大陆近现代数学的共同导师莱布尼茨,在发明了相当完善的微积分体系后,马不停蹄地试图再发明出一套数学机制来判断任何逻辑陈述的真假。但是这个问题的难度已经远远超出了莱布尼茨的时代,首先,莱布尼茨缺乏数学工具去描述逻辑陈述本身;其次,也没有成熟的逻辑知识去帮助他理解逻辑。但是他已经隐隐地感受到,有必要创造出一种“形式语言”来描述问题。
世界上最后一个通晓所有数学领域的数学家希尔伯特,用他的天才智慧和完美主义创造了完善的希尔伯特公理体系,构建了完整的逻辑规则,在一阶逻辑上找到了既可靠又完备的演绎系统。1928年,在逻辑学基础上,他正式提出了这个问题,数学史上大名鼎鼎的判定问题,德语Entscheidungsproblem,英语Decision Problem:我们能不能找到一种算法来判定一切一阶逻辑陈述的真假?
“算法”“一阶逻辑”这样的字眼实在晦涩费解,事实上算法我们就可以理解为一种可行的方法或机制,而一阶逻辑是数学中公理系统的标准形式逻辑,大部分判断句都可以用一阶逻辑的陈述来表达。而那种经常会产生悖论的“整数和偶数一样多”这类蕴含着“无穷大”概念的判断,则不在一阶逻辑范畴之内。这些给数学和逻辑添麻烦的魂淡问题,我们今天就先不理会了。
所以我们可以用更形象的语言来描述这个问题,这个问题是在问我们,我们能不能造出来一个黑箱子,做对这世上一切判断题?
咦?这个问题看起来强度有点弱啊,我们刚才是可以数女生头发数目的,我们是可以做解答题计算题的,可是这个判定问题只对判断题有要求。
没关系,很多计算题也可以转化成判断题。我们只要不断地向黑箱子问:“她有1根头发吗?”“她有2根头发吗?”……只要你寿命够长能把问题问完,总有一天,你会得到正确答案。一上来就直接考虑计算题,对我们而言太难了,所以我们先从判断题开始吧。
形式语言与图灵机
语言
莱布尼茨需要一种工具来描述问题。描述问题,当然需要语言。什么语言呢?中文?Engish?二进制数码1111111111?printf(“C++”)?吙煋呅?都不是。下面我要隆重推出高端大气上档次的形式语言,一大波定义即将袭来,大家耐耐性子,文科生也能看懂的~
直观上说,语言都是字符串组成的,这里的语言也不例外。我们假设字母表Σ为任意有限集合,
定义:语言
举个例子,假设字母表
全
图灵机
阿兰·图灵,英国杰出的同性恋数学家,二战时德军密码的破译者,计算机科学的宗师,在1936年5月发表了一篇划时代的论文《论可计算数及其在判定问题中的应用》。判定问题就是我们上文提到的希尔伯特判定问题;可计算数,就是我们上文提到的可以计算出来的答案。图灵为了解决这个问题,发明出了一台惊世骇俗的机器模型,说只要是这台机器能计算的,就是可计算的;这台机器能判定的,就是可判定的。此机一出,判定问题彻底终结,江湖人称“图灵机”。
说到这图灵机啊,结构十分简单。一条长长的纸带,一个读写头,读写头指向纸带上的一个格子,可以在纸带上自由地左右移动,这就没了,和我们这一代人小时候常见的磁带机差不多。当然了,也有区别。纸带是无限长,划分成无限多个格子,每个格子里可以填一个字符。这里也可以填
- 把x改写成字符y
- 向左或者右移动一格
- 把自己的状态切换为某个
这种决定不是读写头一拍脑袋想的,而是我们事先设计好的。我们事先就决定好了一台图灵机的字母表
好了,一台图灵机的结构就这么简单。让我们来看几个例子吧。
识别与判定
我们假设图灵机有两个停止状态
定义:如果存在一台图灵机可以接受语言
定义:如果存在一台图灵机可以接受
我们现在把
证明:构造一个图灵机
这个例子太简单,大家可以试试看怎么构造图灵机判定所有回文串的集合
此外,这个世界上还有很多奇葩问题——或者说语言——是只能识别不能判定的。比如说大名鼎鼎地停机问题:给定一台图灵机和一个输入串,让图灵机能在这个输入串上运行,请问这台图灵机能停下吗?
我们可以很容易地识别出能停下的情况,只要模拟这台图灵机的运行情况就可以了,一旦停下就对外声称这个图灵机可以在这个输入下停止;但是如果不停呢?对不起,数学家已经证明,没法识别。
理论、算法、应用
我们现在手头已经有了语言和图灵机这两大工具,已经可以开始建设计算机科学的理论大厦了。在这之前,我认为非常有必要提一提理论的意义。
昨天小师妹段萌软就问,理论是神马?理论可以吃吗?
很遗憾,大部分第一流的理论研究不仅不能吃,甚至都是没有“用”的。它离我们的现实生活实在太遥远,写不出百度也造不出 QQ,不能让我们的选课快上一秒,也不会让情侣间少丢几条短信情话。
理论研究的问题往往是,“如果明天的天气可以预测,那么女孩儿的心情也可以预测”这种命题?这个问题如果证明了,就是理论界的重大突破,我们只要能预测天气,就能猜对女孩儿心思了。多么美妙啊!可是,现实中大家既不能预测天气也不能预测女孩儿的心思,所以这个命题不管被证明还是被推翻,对于我们的现实生活一点帮助都没有。大家和妹子交往,还是要看天吃饭。
哎,我把理论说得也太不堪。事实上理论不仅对于现实有深远指导价值,其本身蕴含的智慧更是人类精神文明的伟大见证。
计算机科学的宏伟格局,理论、算法、应用,三位一体,缺一不可。
譬如我们想为广大懒助教提供一个自动批改试卷选择题的程序,这一程序就是应用。为了做出这个应用,我们需要设计一个识别正确答案的算法,而理论告诉我们这个问题是可判定的,我们一定能找出一个算法解决问题。
应用有时会驱动理论的发展,譬如,如果助教希望这个程序还能够批阅解答题,那么我们就需要为解答题设计新的算法,这可太难了,我们的程序得能理解语义才行。能否让程序去理解自然语言的语义,这就是一个理论问题了。只有理论解决,我们才能够提出切实可行的算法,来实现这一应用。
相反,理论的进步也可以指导应用的发展。比如,理论告诉我们,一个问题是不可解的,那我们设计算法时就可以避开这个地雷。又如,理论告诉我们,在二维平面上随机游走会无限次经过原点,那么我们在设计算法的时候,就可以设计回到原点后程序的种种行为,不用担心无法返回。
诚然,理论是一切方法和应用的基石,就像物理理论是电灯、电脑、汽车、楼房的基石一样。没有理论支持,我们也可能造出电灯泡。但有了理论支持,我们就能知道电灯的原理,就可以研发各种新款电灯。另一方面,理论还能证明使用电灯既不会导致核爆也不会导致怀孕,这样大家用起来才安心,才能确保在重要场合使用电灯不会带来一些难以预料的副作用。
然而,大部分理论就像我前文所说,是基本上没用的。理论就像法拉第口中的婴儿,只有长大了才能彰显出独特的价值。
计算的时间复杂度
P vs NP
任何计算过程都需要耗费时间与空间。对于图灵机而言,读写头移动的次数就是消耗的时间,读写头走过的纸带格子数就是占用的空间。如果输入串的长度为
对于那些可以在多项式时间内得到判定的语言,他们组成的集合就是
至于那些可以在多项式时间内得到验证的语言,它们的集合就叫做
什么叫验证?什么叫
问题:OrangeCLK 期末论文写不完了,想找人代写。可是这事儿可绝对不能让老师知道,所以一定要找他的死党。OrangeCLK 是个 geek,他居然用数字来表示他和朋友间的好感度。他说了,只有好感度超过 100 的朋友才算死党,现在给你一份包含陈力坤所有朋友好感度信息的数据表格
这是一道不折不扣的判断题,而且它在多项式时间内就能做完,图灵机只要一一扫过那些数据,数数有没有
我们看到,给定输入
问题:OrangeCLK 提高了对代写人选的要求,他们不仅都要和 OrangeCLK 关系好,彼此好感度也要超过 100 才行,否则可能会内讧。还是给出好感数据表
先来浇一盆冷水,傻×的 OrangeCLK 死活也找不到这个问题的多项式解法。于是他就捉急了,因为他的智商只能做多项式时间的运算。这时候有一位大神告诉他,咦,你挑这
所有可以借助验证串在多项式时间内验证的语言,组成了集合
我们很在乎多项式,因为多项式是我们可以承受的计算时间。多项式之上是指数,指数级的时间复杂度是几乎没有实际计算价值的。举个例子,如果一个问题对于长度为
很显然,
这就是世界闻名的
太重要了,可也太难了,我们既找不到方法在多项式时间内就能判定 OrangeCLK 能否找齐代写论文的人,也不能证明这样的方法不存在。天下所有的
NPC,问题归约
我们都聊到
我们看到,代写论文问题被归约到了
下面我要公布一个让你合不拢下巴的事实:所有
啥?没震惊?那我换个说法,只要我们在多项式时间内解决了
原来
科学家们已经发现了一大堆
NP 难
这货英文名叫
这玩意儿坑在哪儿呢?学术界到现在对于
前面讲到我们只讨论判断题,判定问题。现在呢,我们可以考虑解答题了,专业叫法,搜索问题。
图灵机做判断题,无非是停机,并且停在一个接受/拒绝的状态上,根据停机状态来判定答案。而搜索问题要怎么应对呢?这需要图灵机在纸带上写出答案。输入“2+2”,要能输出“4”。简而言之,除了是/非类型的问题,就是搜索问题,意指在茫茫大海中寻找答案。
既然名字叫
乍一看和
但是,总有那么些问题是大家公认属于
这里宕开一笔,年幼时看科学,总觉得科学与艺术不同。艺术是审美和表达,充满了主观的想象与个人的判断;而科学是客观和真理,奠基于严密的逻辑和重复的实验。年岁渐长,见识益多,渐渐觉得艺术有十分客观之处,科学也有十分主观之处。审美是有一定普适标准的,音乐、美术、文学、戏剧,美好的作品总是蕴含着跨越种族跨越国界的共同感动。科学也根本不客观,科学的理论到底是建立在条条假设上的逻辑推导和计算演绎,不同人观念不同,持有的先验假设不同,构建出的理论体系也就不一样。相信哪个理论,选择哪个理论,是一件很主观的事,也是一件随着历史流变的事。艺术感动人心,科学可以证伪。这是二者在我心中最核心的价值。
计算理论的发展
刚才探讨的只是计算理论的基石,计算理论主要包括包括形式语言自动机图灵机、可计算性、计算复杂度三个部分。广义说来,算法设计、计算经济学、计算生物学、机器学习理论等都属于理论范畴。刚才我们探讨了计算复杂度的时间维度,事实上也有空间复杂度的相关研究,类似于时间,我们有(PSPACE),(LOGSPACE)(简称L)等复杂类。
除了图灵机外,另一个常用的计算模型是电路,研究电路的复杂性很多时候比图灵机方便实用,这也是研究的重大方向。
姚期智教授提出了通信复杂性这个领域,描述交换信息、多机器共同运算的复杂性。
现实生活中由于很多问题得不到完美的解决,人们创造性地发明了很多近似算法和随机算法来解决问题。这些算法不一定能得到最优解,但是离最优解差得不远。那么为了度量算法解和最优解的差距,为了度量得出正确解的概率,为了给这些算法一个理论基石,关于近似算法和随机算法那的理论研究也就顺理成章了。
除了电路、通信、近似、随机,广大理论计算机科学研究者还在努力开拓新的领域,把问题归约到越来越遥远的地方。虽然大部分难题都尚未取得进展,但是已经阐发出很多实用算法,对我们的世界改变良多。
量子计算理论也有不错的发展,取得了一系列诸如
就我个人看来,物理理论也好,计算理论也好,都基于数学但是有超出数学的部分。给全所有定理,数学也无法预测复杂系统的运动情况;给定所有运算规则和其实状态,数学也未必能预测某些问题的计算结果。计算领域和物理领域一样,有一些数学无法解释预测的现象。很多数学家不相信的东西,我们可以选择去相信、去实验。在数学力所不及的地方架起计算理论的新结构,发现计算的规律,是一件多么具有挑战性的事啊!
鸣谢
- 感谢 John Steinberger 的 Brutal and Swift Introduction to Computer Science课程。
- 感谢Michael Sipser的名著Introduction to the Theory of Computation。
- 感谢课程指导老师王跃宣。
- 感谢与我讨论NP-Hard定义的寿鹤鸣。
- 感谢段萌软提出她对理论的看法。
- 感谢读者!