计算 3↑↑↑3(在 Python 中)

Posted

技术标签:

【中文标题】计算 3↑↑↑3(在 Python 中)【英文标题】:Computing 3↑↑↑3 (In Python) 【发布时间】:2016-10-14 21:33:12 【问题描述】:

我在 Graham's Number 上做一个演示,我想计算前几个 ↑(即 3↑3、3↑↑3 和 3↑↑↑3),让他们知道它有多大在这么短的时间内得到。我根据箭头符号的定义在python中写了一些简单/直接的代码,如下所示:

def arrow2(a,b):
    c=1
    for i in np.arange(b):
        c=a**c
    return c

def arrow3(a,b):
    c=1
    for i in np.arange(b):
        c=arrow2(a,c)
    return c

虽然使用了“长”整数(无限)和 numpy 数组(无限),但代码在运行时自然会占用太多内存,并且需要很长时间来处理。有针对这个的解决方法吗? (或者有人已经知道答案了吗?)谢谢!

【问题讨论】:

这和常用的“大数据”其实没什么关系。 【参考方案1】:

来自Wikipedia:

假设您想将这个数字(称为N)存储在计算机上,即以二进制形式。这将需要k 位,其中2^k ~ N。这意味着k 本身非常大(只需将2^k 与末​​端的塔进行比较),太大而无法存储在世界上所有的硬盘上。

【讨论】:

只是注意到 3↑↑↑3 太大了,即使宇宙中的每个电子都可以用来存储它的一个位,我们甚至无法存储其二进制表示的很大一部分。这反过来又比世界上所有的硬盘驱动器都大得不可思议。人类经验中没有任何东西与如此庞大的数字有任何有意义的关系。所以,到目前为止,OP 应该用 C 重写他们的代码 ;-)【参考方案2】:

扩展我的评论,我只想充实一点掌握这么大的数字是多么无望。

我假设你已经知道了

3 ↑↑↑ 3 =
3 ↑↑ (3 ↑↑↑ 2) =
3 ↑↑ (3 ↑↑ 3) =
3 ↑↑ (3 ↑ 3 ↑ 3) =
3 ↑↑ (3 ↑ 27) =
3 ↑↑ 7625597484987

所以这归结为研究3 ↑↑ i 的增长。让我们看看它是如何增长的:

3 ↑↑ 0 = 1
3 ↑↑ 1 = 3**(3↑↑0) = 3**1 = 3
3 ↑↑ 2 = 3**(3↑↑1) = 3**3 = 27
3 ↑↑ 3 = 3**(3↑↑2) = 3**27 = 7625597484987
3 ↑↑ 4 = 3**(3↑↑3) = 3**7625597484987 = ...?

我们已经超出了大多数个人计算机上可以计算的极限。

>>> import math
>>> math.log10(3) * 3**27
3638334640024.0996

这是3 ↑↑ 4 的以 10 为底的对数,表明后者有超过 3 万亿(十进制)位数。即使使用每个十进制数字 4 位的自定义编码,也需要超过 1.5 TB 的磁盘空间来存储它 - 并且很少有计算机有足够的 RAM 来以简单的方式计算它。

然后3 ↑↑ 5 又被 3 提升到数万亿位数的幂。我们通常使用的单词和符号已经不足以真正了解它到底有多大,而且没有足够的 RAM 或磁盘空间来处理它。

而我们最多只能到3 ↑↑ 5!要达到3 ↑↑ 7625597484987 = 3↑↑↑3,还有 万亿 层。这超出了人类的理解范围。虽然,是的,无限多个整数甚至更大;-)

【讨论】:

出于某种原因,我已经知道它有多大可笑,但即便如此,它实际上有多大仍然让我感到惊讶。

以上是关于计算 3↑↑↑3(在 Python 中)的主要内容,如果未能解决你的问题,请参考以下文章

在Python中计算交易指标

用python计算S=1+3x/1*2-5*x^2/2*3?

如何在 Python 3.5.1 中使用 *args 在列表中进行计算

(最简单)在同一台计算机上使用 Python 3.6 和 3.7 的方法?

Python 3 计算 CSV 中的行数

python自己做计算器