苏联车牌和Kolmogorov的复杂性

图片


物理学家列夫·兰道(Lev Landau)与苏联数字进行了一场智力竞赛[ 1 ]。 平板电脑的形式为两个数字,一个破折号,两个另外的数字和一些字母。

游戏规则


他的工作是将数学运算符应用于破折号两侧的数字,以便可以用等号代替破折号。 例如,如果您选择44-74号牌,则解决方案之一是

4! + 4 = 7 * 4

请注意,我们可以插入运算符,例如+* ,但不添加数字。

是否为每种可能的车牌都有解决方案? 这取决于您允许使用的运算符。

您可以通过对两边应用小数部分运算{x}来简化游戏,因为整数的小数部分为零。 您可以基于分数运算符显然不是高中的数学运算来禁止分数运算符,或者仅因为它会使游戏变得无趣而禁止它。
该翻译得到EDISON Software的支持,该公司投资于有前途的初创公司 ,并开发各种云服务

一站式解决方案


事实证明,从观察到

√(n + 1)=秒反正切√n。

如果一侧比另一侧大,则上面的公式会立即给出解决方案。 例如,车牌号为89-88的解决方案是

√89=秒反正切√88。

如果差异较大,则可以重复应用该公式。 例如,我们可以两次应用公式来获得

√(n + 2)=秒反正切√(n + 1)=秒反正切secarctan√n

因此35-37的可能解决方案是

sec arctan sec arctan√35=√37。

柯尔莫哥罗夫的复杂性


鉴于始终有解决方案,我们可以通过找到最简单的解决方案使游戏变得更加有趣。 我们对这意味着什么有直观的了解。 对于我们的示例44-74,第一个解决方案

4! + 4 = 7 * 4

比通用解决方案更简单

sec arctan sec arctan ...√44=√74

这将需要使用割线和反正切线30次。

对象的Kolmogorov复杂度是用于创建对象的最短计算机程序的长度。 我们可以计算应用于每一侧数字的函数的Kolmogorov复杂度,以衡量解决方案的复杂程度。

为了找出答案,我们需要指出我们所拥有的编程语言,而且它看起来并不那么简单。 如果我们将数学符号视为一种编程语言,那么我们想数一数! 像一个字符,而arctan像六个字符? 这似乎不正确。 如果将“ arctan”写为“ atn”,我们将使用更少的字符而无需创建其他解决方案。

Python代码复杂度


为了使事情更客观,我们可以考虑实际计算机程序的长度,而不是将数学符号表示为一种编程语言。 假设我们选择了Python。 然后是我们的两个车牌解决方案44-74计算的几个功能。

from math import sqrt, cos, atan def f(): sec = lambda x: 1/cos(x) y = sqrt(44) for _ in range(30): y = sec(atan(y)) return y def g(): return sqrt(77) 

我们可以通过计算每个函数的字符数来衡量函数f和g的复杂性。 但是仍然有困难。

进口呢? 它的长度必须与f相乘,因为它使用了所有导入的语句,但是g使用了一个较短的语句,仅导入了sqrt。 从根本上说,我们是否还要导入一个库?

另外,由于精度有限,上述两个功能不能给出完全相同的结果。 我们可以想象我们导入的函数是无限精确的,但是实际上我们并没有使用Python,而是使用了理想的Python版本。

循环呢? 这引入了新的数字3和0,因此违反了Landau游戏的规则。 那么我们应该在计算复杂度之前展开吗?

思想实验


Kolmogorov的复杂性是一个非常有用的概念,但它比您在实践中所能计算的更多的是一种心理实验。 我们可以想象用最短的程序来计算某些东西,但是我们很少知道我们真的找到了这样的程序。 在实践中,我们所能知道的就是上限。

从理论上讲,您可以列出给定长度的所有Turing机器或给定长度的所有Python程序,并找到执行该任务的最短的Turing机器,但是列表的长度会随着长度的增加而呈指数增长。

但是,如果我们要解决上述一些困难,则可以计算特定程序的持续时间。 通过查看谁可以在固定的时间内提供更简单的解决方案,我们可以使Landau成为两个人的游戏。

回兰道


如果我们在运算符集中允许使用正弦和度数,那么B.S. Gorobets是一种通用解决方案。 对于n≥6,n! 360的倍数,依此类推

sin(n!)°= 0。

如果n小于6,则其两位数表示从零开始,因此我们可以将数字相乘得到零。

如果我们禁止先验功能,我们将阻止Gorobets技巧,而我们拥有可以用编程语言客观地测量其长度的功能。

Source: https://habr.com/ru/post/zh-CN439296/


All Articles