
最简单形式的数据压缩任务可以与数字及其符号有关。 数字可以用数字表示(数字
11表示
“十一” ),数学表达式(1048576表示
“二十分之
二” ),字符串表达式(99999表示
“五分之九” ),专有名词(666表示
“ 野兽的数目” ,
“图灵的去世年份” (适用于1954年),或它们的任意组合。 对话者可以明确确定适合哪种说话的任何指定都是合适的。 显然,告知对话者
“阶乘八”比等效的称呼
“四千三百二十二十”更为有效。 这就提出了一个逻辑问题:给定数字的最短名称是什么?
哲学家贝特朗·罗素(Bertrand Russell)在1908年发表了
《贝里悖论》 ,该书解决了对面的数字表示法问题:
最小的数字是什么,表明哪80个字母不够用?这样的数字必须存在:在80个俄语字母和空格中,您总共可以指定34
80个数字,这意味着使用80个字母您最多可以指定34
80个数字。 因此,不能以这种方式指定不超过34
80的特定数字。
这意味着名称
“最小的80个字母不够用”将对应于该数字,其中只有78个字母! 一方面,这个数字必须存在。 另一方面,如果该数字存在,则其名称与之不符。 矛盾!
消除此矛盾的最简单方法是引用口头指定的非正式性。 就像,如果在符号中只允许一组特定的表达式,则
“最少80个字母不足的数字”将不是有效的名称,而
“阶乘8”类型的实际有用的名称将仍然有效。
是否存在正式的方法来描述对数字的操作的顺序(算法)? 有很多,它们被称为编程语言。 我们将使用打印必要数字的程序(例如,在Python中)来代替语言符号。 例如,对于五个九,
print("9"*5)
程序
print("9"*5)
合适的。 对于给定的数量,我们将继续对最短的程序感兴趣。 这种程序的长度称为
Kolmogorov数的复杂度 。 这是可以压缩给定数字的理论极限。
现在可以考虑一个类似的问题,而不是Berry悖论:
千字节程序不足的最小数字是多少?我们将以与以前相同的方式进行争论:存在
256,1024千字节的文本,这意味着在千字节程序中最多可以显示
256,224个数字。 这意味着不能以这种方式推导出不大于256
1024的某个数字。
但是我们用Python编写了一个程序,该程序会生成所有可能的千字节文本,将其启动以执行,如果它们打印了某个数字,则会将该数字添加到可访问的字典中。 在检查了所有256
1024个可能性之后,无论花费多长时间-程序都会查找字典中没有的最小数字并显示该数字。 显然,这样的程序将适合千字节代码-并且将输出无法在千字节程序中显示的数字!
现在有什么收获? 它不能再归因于符号的非正式性!
如果您对我们的程序需要一个天文数字的内存感到困惑-包含256
1024个元素的字典(或位图)-那么您可以在没有它的情况下执行相同的操作:对于256
1024个数字中的每一个,都可以遍历所有256
1024个程序,直到找到合适的程序为止。 没关系,这样的枚举会持续很长时间:从数字和程序中检查少于(256
1024 )
2对后,它将结束并找到非常喜欢的数字。
还是不会结束? 确实,在将要尝试的所有程序中,会有“
while True: pass
(以及它的功能对应物)通过-并且检查该程序不会超出范围!
与Berry悖论不同,当时的问题在于符号的非正式性,在第二种情况下,我们对
“停止问题”进行了精心掩饰的重新表述。 事实是,根据程序,不可能在有限的时间内确定其结论。 特别是,Kolmogorov的复杂度是无法
计算的 :没有一种算法可以让给定的数字找到输出该数字的最短程序的长度。 这意味着Berry问题没有解决方案-对于给定的数字,找到最短单词指定的长度。