Python表达式花园数

文章描述了一个特殊的Python函数f(n),它基于一系列特定字符构建字符串并用eval()计算,寻找最大的正整数结果。随着n的增加,f(n)的增长率呈现阶跃式变化,模拟了大数的生成过程。通过比较f(n)与阿伏伽德罗常数、古戈尔数、不可说不可说转和庞加莱数,展示了f(n)在一定步长后能超过这些大数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)>庞加莱数。
### Python 表达式的用法与示例 #### 什么是表达式? 在编程语言中,表达式是由变量、运算符以及调用函组成的语句,其计算结果返回一个值。Python 支持多种类型的表达式,包括算术表达式、比较表达式、逻辑表达式等。 #### 算术表达式 算术表达式涉及值之间的基本学运算。常见的算术运算符有加(`+`)、减(`-`)、乘(`*`)、除(`/`)、取模(`%`)和幂(`**`)[^1]。 ```python a = 10 + 5 * 2 b = (7 + 8) / 3 c = 9 % 4 d = 2 ** 3 print(a, b, c, d) ``` 这段代码展示了如何利用不同的算术运算符构建表达式并打印它们的结果。 #### 比较表达式 比较表达式用来判断两个值之间是否存在某种关系,比如相等(`==`)、不等于(`!=`)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)。这些表达式通常用于条件控制结构中[^2]。 ```python x = 10 y = 20 if x != y and x < y: print("x 不等于 y 并且 x 小于 y") elif x >= y or x == y: print("x 大于等于 y 或者 x 等于 y") else: print("其他情况") ``` 此例子说明了怎样运用布尔逻辑来组合多个比较表达式形成复杂的条件测试。 #### 逻辑表达式 逻辑表达式由逻辑运算符连接而成,主要包括 `and`, `or`, 和 `not`. 这些运算符允许创建更复杂的关系描述,常被应用于决策流程里[^3]. ```python is_raining = True has_umbrella = False go_outside = not is_raining or has_umbrella print(go_outside) ``` 这里展示了一个简单的场景模拟——当不下雨或者携带伞具时才外出活动。 #### 列表推导式作为特殊形式的表达式 除了上述提到的基础类型外,在Python中还存在一种特殊的表达方式叫做列表推导式(List Comprehension),它可以简洁高效地生成新的列表对象. ```python numbers = [1, 2, 3, 4] squares = [n*n for n in numbers if n > 2] print(squares) ``` 上面的例子定义了一组列,并通过列表推导的方式快速筛选出符合条件的据项平方后的集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值