如何用编程语言(特别是python)表示格雷厄姆的数字?

时间:2015-07-26 01:31:26

标签: math numbers biginteger

我是编程的新手,我想知道如何在python中表示格雷厄姆的数字(我决定学习的语言是我的第一个)。我可以在现实生活中向人们展示如何在某种程度上获得格雷厄姆的数字,但对于任何不知道它是什么的人来说,就是这样。

所以想象你有一个3.现在我可以使用^(向上箭头)代表3的幂。所以3 ^ 3 = 27. 3 ^^ 3 = 3 ^ 3 ^ 3 = 3 ^(3 ^ 3)= 3 ^ 27 = 7625597484987.3 ^^^ 3 = 3 ^ 7625597484987 =可怕的大数字。现在我们可以看到,每次添加向上箭头时,数字都会变得非常大 现在想象3 ^^^^ 3 = 3 ^(3 ^ 7625597484987)......这个数字是愚蠢的大。

所以现在我们有3 ^(3 ^ 7625597484987),我们将这个叫做G1。那是3 ^^^^ 3(3个之间的4个箭头)。

现在G2基本上是3,它们之间有G1个箭头。无论数字3 ^(3 ^ 7625597484987)是多少,是G2的2 3之间的箭头数。所以这个数字有3 ^(3 ^ 7625597484987)个箭头。

现在G3在2 3之间有G2个箭头。我们可以看到这个数字(G3)非常庞大。愚蠢的巨大。因此每个G在当前G之前具有由G表示的箭头数。

一遍又一遍地执行此操作,将前一个“G”箭头放入下一个数字。这样做直到G64,这是格雷厄姆的号码。

现在这是我的问题。你如何表示“某个事物的数量(在这种情况下为箭头)是下一个G中的箭头数量”?你如何表示在编程中“进入”下一个字符串的东西的数量。如果我不能在python中这样做,请发布可能的语言。感谢任何回复。

3 个答案:

答案 0 :(得分:2)

这是递归定义的数字的示例,可以使用基本情况递归情况表示。这两种情况捕获了"每个输出都是根据规则' ____,'之前的输出计算的。除了第一个是____。"

一个简单的规范将是阶乘,它使用基础案例1! = 1(或有时0!= 1)和递归情况n! = n *(n-1)! (当n> 1时)。或者,以类似代码的方式,f(1)= 1并且f(n)= n * f(n-1)。有关如何编写行为类似的函数的更多信息,请找一个好的资源来学习递归。

格雷厄姆数字定义中的G1,G2,G3等就像这些对先前结果的调用一样。你需要一个函数来表示一个"箭头"所以你可以调用它们中的任意数量。所以要将你的心智模型翻译成代码:

  

" [...]我们称之为[3 ^^^^ 3] G1。 [...]'特定事物的数量(在这种情况下为箭头)是下一个G'中的箭头数量。 [...]"

让上述函数为arrow(n)= 3 ^^^ ... ^ 3(其中有n个箭头)。然后得到格雷厄姆的数字,你的基本情况将是G(1)=箭头(4),你的递归情况将是G(n)=箭头(G(n-1))(当n> 1时)。

请注意,arrow(n)也将有一个递归定义(参见Knuth's up-arrow notation),如您所示,但没有通过计算前一个输出(强调添加)来描述:

  

3 ^ 3 = 27

     

3 ^^ 3 = 3 ^ 3 ^ 3 = 3 ^(3 ^ 3)= 3 ^ 27 = 7625597484987

     

3 ^^^ 3 = 3 ^ 7625597484987 =可怕的大号。

您可以将其描述为"除了第一个[箭头(1)](仅为3)之外,每个输出[arrow(n)]与前一个输出的幂相比为3。"我将从描述到定义的翻译留作练习。

(另外,我希望你实际上并不想代表格雷厄姆的数字,而只是它的计算,因为它对于Python或任何计算机来说都太大了。)

答案 1 :(得分:1)

class GrahamsNumber(object):
    pass

G = GrahamsNumber()

对于大多数目的而言,这与任何其他人一样代表格雷厄姆的数字。当然,你不能对G做任何有用的事情,但是在大多数情况下你也无法对格雷厄姆的数字做任何有用的事情,所以它准确地反映了真实的用例。 / p>

如果您确实有一些特定的用例(并且它们可行),那么可以定制一个表示来允许这些用例;但是我们无法猜出你希望能用G做什么,你必须明确拼写出来。

答案 2 :(得分:0)

为了好玩,我在python中实现了hyperoperator作为模块hyperop,我的一个例子是格雷厄姆的数字:

def GrahamsNumber():
    # This may take awhile...
    g = 4
    for n in range(1,64+1):
        g = hyperop(g+2)(3,3)
    return g

魔法在递归中,松散地表达为H[n](x,y) = reduce(lambda x,y: H[n-1](y,x), [a,]*b)

要回答您的问题,此功能(理论上)将计算相关数字。由于这个程序永远不会在宇宙热死之前完成,你可以从"功能中获得更多的理解。本身比实际值。