假设有一天,人类遇见了上帝,问了上帝一个问题:
答案是肯定的!!根据 Levin's Universal Search Algorithm,我们可以得出如下定理:
定理:假设存在一个已知常数
(事实上,如果不知道这个常数
这个是我上复杂度理论课的时候老师讲到的一个定理。看到这个定理的时候我觉得很厉害,因为我们可以假设
但当我看了这个定理的证明后,我的希望破灭了。在我看来,这是个典型的理论上很有用但实际上什么用都没有的定理。很大概率上,倾尽全宇宙的能量来跑这个算法,都跑不出来。
这个算法是基于 Levin's Universal Search Algorithm。各位其实不用了解这个 Levin 的东西到底是什么(其实我也不太懂),只需要知道这个算法需要包含巨大的常数。定理的证明如下:
证明:如果我们能在
那现在根据我们的假设,有一个图灵机,输入是一个布尔表达式
其中接受和拒绝其实就是我们算法的输出(到底
算法分析:假设图灵机
- 如果
可以被满足,在进行我们上述算法的时候,都会模拟到这个图灵机,而且这个图灵机是能在时间内解决问题的,所以我们的算法也可以找到这个解,并且接受。
- 如果
不能被满足,那么无论如何也不可能找到一个满足的解,我们的算法自然会拒绝。
所以我们的算法是正确的。等等,你问我对于长度小于
算法运行时间(复杂度):很明显,有
嗯?这好像复杂度确实是对的啊。但且慢,其中有一步实要枚举图灵机。图灵机怎么枚举呢?本质上还是枚举图灵机编码,也就是枚举字符串。其实一般枚举字符串的话,我们都会按照字符串长度从小到大枚举,这样才能保证枚举到所有字符串。而一个在多项式时间内解决
(upd:上面这一段略微有点问题。如果按照枚举字符串的方式枚举图灵机的话,最后的时间复杂度应该就不是多项式时间了,这段是我的一个失误。也很容易修正:可以将算法里“模拟编号为i的图灵机”改为“模拟编码为i的二进制编码的图灵机,如果不是合法编码就什么都不做”。或者,其实枚举图灵机也不一定要枚举字符串?因为只需要枚举字符集大小和状态个数,再枚举转移函数就可以了。这两种方法应该都行,只是后面一种不太容易分析其运行时间。这块还有别的想法的欢迎在评论区指出~)
OK,那这个定理讲完了。怎么样,是不是感觉被坑了?复杂度理论的世界就是这样,处处都有惊喜,而有时候这个惊喜挂在天上了,怎么够也够不到。
后记
其实如果真的能遇见上帝,而且只能问一个问题的话,我不建议大家问那个问题,因为如果上帝回答
这个定理其实让我想起了一个可计算性方面的一个定理,大概意思是说所有可以被证明的命题组成的集合是图灵可识别的。方法就是,枚举所有证明,看这些证明到底能不能证明这个命题。因为证明的本质也是字符串,字符串可以编码,所以所有证明也是可以枚举的。真是体现了一种暴力美学啊。
另外想说的是,本篇文章里面的牵扯到具体复杂度的部分可能不是很严谨。毕竟本篇文章不是学术论文,不想加一堆复杂的项来增大理解起来的难度,所以请大家多多包涵,不要对待那些数字太认真。
最后,这个专栏是叫《计算理论导引》笔记,但这个内容其实是那本书里没有的。最近我已经基本读完了那本书,开始看别的了。本来其实想发自己看的时候的笔记上来的,但觉得整理起来还是太麻烦且浪费时间了,就只发了一些比较有名的内容。以后还是会发TCS的东西,但估计跟这本书关系不大了。目前我还在想专栏到底要不要改名,改的话改成什么名字(虽然好像也没几个人在看)。如果对文章、专栏等有任何建议欢迎在评论区留言。下次文章再见!