Skip to content

信息、熵和计算复杂度

信息熵:如何量化信息?

一个最直观最简单的解释

  • 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\)
  • 乘法:重复加法
  • 指数:重复乘法
  • 条件语句:直接利用循环语句的条件

图灵机:解决可计算问题

  • 组成部分:磁带、控制器、读写头
    • 磁带只有空白 b1,几个 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==