信息、熵和计算复杂度¶
信息熵:如何量化信息?¶
一个最直观最简单的解释
- 1 bit 的信息可以表示 2 个状态的差异:开和关、0 和 1、是和否......
- 2 bit 的信息可以表示 4 个状态的差异:00、01、10、11
通过类推我们知道:
- 具有 \(N\) 个不同状态的系统可以表示 \(log_2 N\) bit 的信息
这就定义了信息的量。这应该是最最简单理解信息的量的方式,一定程度上解释了 \(\log_2\) 的来历。
计算理论:哪些问题可以解决?¶
简单语言¶
事实上,只需要三条语句就能定义一种语言,和 C 一样强大。这三条语句是:递增、递减、循环语句。
接下来我们开始构建现代语言的一些语句:
- 赋值为 \(0\):循环递减
- 赋值为 \(n\):执行 \(n\) 次递增
- 将 \(X\) 赋给 \(Y\):将 \(Y\) 置 \(0\),每次循环递减 \(X\) 并递增 \(Y\),直到 \(X\) 为 \(0\)
- 加法:每次循环递减 \(X\) 并递增 \(Y\),直到 \(X\) 为 \(0\)
- 乘法:重复加法
- 指数:重复乘法
- 条件语句:直接利用循环语句的条件
图灵机:解决可计算问题¶
- 组成部分:磁带、控制器、读写头
- 磁带只有空白
b
和1
,几个1
就表示整数几(不是二进制) - 控制器是一个有限状态自动机,能根据输入从一个状态转移到另一个状态
- 有
x/y/RLN
三类指令,使用这三类指令为图灵机编写程序
- 磁带只有空白
为控制器设计状态转移表,就相当于为现代计算机设计的指令集。这个图灵机可以模拟上面讲的简单语言,比如递增语句:
- 四个状态:开始、右移、左移、停机
- 五条指令:从
b
开始右移,移过所有的1
,到达右边的b
并改写为1
,回到左边的b
,停机
邱奇 - 图灵论题
图灵机能模拟简单语言的三个基本语句,但它能解决一台计算机能解决的所有问题吗?
这个论题不能被证明,但有支持:没有发现图灵机不能模拟的算法,且数学上已证明的计算机模型都和图灵机等价。
哥德尔数:任意程序都能用一个正整数表示¶
所有的程序都可以用一个无符号数表示。对于上面的简单语言的所有符号,可以使用十六进制表示。那么一个递增程序 incr X
就表示为 \(175\)。
- 简单语言编写的一切程序都能用按这样的规则表示为一个整数
- 翻译是可逆的
- 但并不是所有整数都能解释为合法程序
停机问题:能否测试所有程序是否会终止?¶
为什么会产生这样的问题
如果存在这样的程序,就可以节省大量的时间:我们不需要运行这个程序就能知道它是否会终止。
然而,这样的程序被证明不可能存在。停机问题是不可解问题。
反证法:假设存在这样的程序 test
能够接受任意程序 P
(用它的哥德尔数作为输入),如果程序终止,则 test
输出 1
,否则 0
- 创建一个程序
strange
,它的开始是程序test
,末尾是一个空循环,测试变量是X
,即test
的输出。这个程序也用P
作为输入。
这个程序的行为是:
- 如果
P
终止,进入循环体,strange
不终止 - 如果
P
不终止,不进入循环体,strange
终止
这下好了,如果把 strange
输入 strange
,则有:
- 如果
strange
终止,则strange
不终止 - 如果
strange
不终止,则strange
终止
矛盾,因此假设不成立。停机问题是不可解的。
问题的复杂度:要花多长时间解决?¶
所有的问题作如下分类:
- 不可解问题
- 可解问题
- 多项式问题
- 非多项式问题
量子计算理论¶
上面的计算理论都是传统的,这门课不怎么在意。量子计算机解决 BQP 问题,这些问题传统解法不可解,但是使用量子计算机,可以在有限错误界限的多项式时间内解决。
==todo==