物理学家列夫·兰道(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技巧,而我们拥有可以用编程语言客观地测量其长度的功能。