【B++】Python表达式花园数

Python表达式花园数:
假设有一个python函数f(n),它会把所有长度为n的,由字符列表S=[' ', '!', '"', '%', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', '<', '=', '>', '[', ']', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '}']中的字符组成的字符串全部用eval()函数计算一遍,并把所得结果中最大的正整数作为输出。但该程序的运行过程必须满足以下要求:

  • 假设运行这个函数所用的机器的内存和算力极大,大到在无视物理限制的同时能保证算出所需的f(n)。
  • f的参数必须为正整数,否则返回空值。
  • 字符串的运行顺序由S中元素的排列顺序决定。比如在计算f(2)时,所运算的字符串依次为' '' !'' %'、……、'}}'
  • 遇到计算不了的字符串就跳过计算,比如遇到死循环、遇到未定义变量、报错或无法在有限的时间内得出结果的语句。
  • 当字符串中包含’exec’时则跳过,以避免结果复杂化。
  • 当字符串中包含’id’时则跳过,以避免内存极大时id函数对结果产生的影响。
  • 当字符串的运算结果震荡或发散时也跳过。当字符串的长度等于其调用f时的参数时,如eval(‘f(4)’),定义其结果为震荡的;当字符串的长度大于其调用f时的参数时,如eval(‘f(5)’),定义其结果为发散的。
  • 当n增加时,f(n)的增长率呈阶梯式增长:对连续的几个n,f(n)的增长率相同;当n继续增大到某一值时,运算符或关键字的加入使得增长率突增。这也可称为“量变引起质变”。
    该程序的性质包括:

为保护系统安全,S不含下划线和反斜杠等符号。

  • S不含大写字母,所以可借助它们命名一些在计算过程中必需的变量。
  • 参与计算的字符串中可使用的函数只有f和在字符串内部定义的匿名函数。
  • 给新变量赋值的字符串在eval()中不起作用,而在exec()中才起作用。
  • 满足以上条件的机器大概率会使用类似于sympy库的符号计算方式,且结果很大时输出的不是具体的数值,而是相应的大数增长率。
  • Python表达式花园数是大数花园数的一种具有许多约束条件的极特殊的情形。如果将其中的eval函数换成exec函数,则称为“Python代码花园数”。
  • 为了保险起见,在下文中用“≥”来估算f(n)的下界。

f(1)≥9=9,显然。
f(2)≥99=99,显然。
f(3)≥999=999。此时双目运算符开始起作用,但不影响结果。
f(4)≥9**9=99。左移位符号和乘方符号开始起作用,但左移位的增长率比不上乘方。
f(5)≥9**99=999,与f(4)同理。但当计算机内存极大时,eval(‘id(0)’)也可能极大,因此可在eval的函数映射参数中将id函数映射为空值。
f(6)≥9**999=9999 。幂的大小基本取决于其指数。
f(7)≥9**f(6)= 9 9 999 9^{9^{999}} 99999,此时递归和乘方的组合使指数的层数增加。
f(8)≥99**f(7)= 9 9 9 9 999 99^{9^{9^{999}}} 9999999>9↑↑4,与f(7)同理。
f(9)≥999**f(8)>9↑↑5。
f(10)≥f(9)**f(9)>9↑↑(5+5-1)=9↑↑9。
f(11)≥f(9)**f(10)>9↑↑(5+9-1)=9↑↑13。
f(12)≥f(11)**f(11)>9↑↑25。
f(13)≥f(12)**f(12)>9↑↑49。
f(14)≥9*f(13)**f(13)>9↑↑97。
f(15)≥9**f(14)**f(14)>9↑↑(1+97×2-1)=9↑↑194。
f(16)≥eval("9**9"*999)>9↑↑1000。
f(17)≥eval("9**9"*f(9))>9↑↑9↑↑5>5↑33。
f(18)≥eval("9**9"*f(17))>9↑↑5↑33。
f(19)≥eval("eval("9**9"*f(9))"*f(9))>9↑↑(3×1555-2)=9↑↑4663。
……
f(78)≥(lambda g:g(g,9))(lambda f,n:eval("f(f,"*b+f"{n}"+f",{n-1})"*b)if n else 9**b)=9↑109>G(1)=3↑43。

其它
python有可以迭代的匿名函数。高德纳箭头算式A↑CB用python字符串表示为lambda g:g(g,A,B,C))(lambda f,a,b,n:a**b if n<2 else eval(f"f(f,{a},"*(b-1)+str(a)+f",{n-1})"*(b-1)))

习题

  1. 当n为多少时,f(n)可以超过阿伏伽德罗常数、古戈尔、不可说不可说转和庞加莱数(以 为单位的庞加莱回归时间)?
  • 因为阿伏伽德罗常数NA<7×1023<999≤f(5),所以f(5)>NA
  • 因为古戈尔=10100<9999≤f(6),所以f(6)>古戈尔数。
  • 因为不可说不可说转< 1 0 4 × 1 0 37 10^{4×10^{37}} 104×1037< 9 9 99 9^{9^{99}} 9999≤f(7),所以f(7)>不可说不可说转。
  • 因为庞加莱数< 1 0 1 0 1 0 1 0 1 0 130 10^{10^{10^{10^{10^{130}}}}} 1010101010130< 9 1.1 ⋅ 9 1.1 ⋅ 9 1.1 ⋅ 9 1.1 ⋅ 9 1.1 ⋅ 130 9^{1.1·9^{1.1·9^{1.1·9^{1.1·9^{1.1·130}}}}} 91.191.191.191.191.1130< 9 9 1.2 ⋅ 9 1.1 ⋅ 9 1.1 ⋅ 9 1.1 ⋅ 130 9^{9^{1.2·9^{1.1·9^{1.1·9^{1.1·130}}}}} 991.291.191.191.1130< 9 9 9 1.3 ⋅ 9 1.1 ⋅ 9 1.1 ⋅ 130 9^{9^{9^{1.3·9^{1.1·9^{1.1·130}}}}} 9991.391.191.1130< 9 9 9 9 1.4 ⋅ 9 1.1 ⋅ 130 9^{9^{9^{9^{1.4·9^{1.1·130}}}}} 99991.491.1130< 9 9 9 9 9 1.5 ⋅ 130 9^{9^{9^{9^{9^{1.5·130}}}}} 999991.5130<9↑↑7<f(10),所以f(10)>庞加莱数。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值