计算格雷厄姆数的最后一位数字


13

格雷厄姆的数字以7结尾。从理论上讲,这是一个庞大的数字,需要存储的信息比宇宙本身的大小还要多。但是,可以计算格雷厄姆数字的最后几位数。

最后几位数字是:

02425950695064738395657479136519351798334535362521
43003540126026771622672160419810652263169355188780
38814483140652526168785095552646051071172000997092
91249544378887496062882911725063001303622934916080
25459461494578871427832350829242102091825896753560
43086993801689249889268099510169055919951195027887
17830837018340236474548882222161573228010132974509
27344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380
03222348723967018485186439059104575627262464195387

您的程序可能不包含这些(或相似的数字),但必须计算它们。它必须计算200位数或更多。

输出到标准输出。在适当的硬件上,运行时间最长为2分钟。最短的程序获胜。


应该打印几位数?
Wile E. Coyote

@Dogbert D'oh。我错过了。200或更多都可以。
Thomas O

Ruby甚至不会计算,3**7625597484987而Python 会计算:)
gnibbler

@gnibbler,嗯?结果将超过3万亿个数字。
Wile E. Coyote

1
@Dogbert,如果有足够的内存和时间,Python将继续使用它的longs进行计算。Ruby甚至不会做3 ** 5000000。似乎有某种限制
gnibbler 2011年

Answers:


9

dc-21个字符

[3z202>xO200^|]dsxxrp

在我的计算机上,这大约需要一分钟,而对于大于200的值,则需要花费更长的时间。它不会输出前导零。

这是一个稍长但更快的版本(26个字符):

[3rAz^|dz205>x]dsxxAz6-^%p
3[3rAz^|dz202>x]dsxxAz3-^%p # or an extra character for a few less iterations

4

哈斯克尔(99)

性能不是很出色,但是在我使用了十年的硬件上,它可以在一分钟内计算出500位数字。

f a b|b==0=1|odd b=mod(a*f a(b-1))m|0<1=f(mod(a^2)m)$div b 2
main=print$iterate(f 3)3!!500
m=10^500

(顺便说一句,我很想听听它在更现代的硬件上的性能)


在我的PC上运行大约需要19秒。顺便说一句,这不会在输出前打印前导0。
Wile E. Coyote

是的,所有数字的前导零都是错误的。只需计算501 ;-)感谢基准测试。您运行它的解释或编译?
JB

我用编译ghc -o g.exe g.hs。不确定这是否是最佳编译方式。
Wile E. Coyote

我刚运行ghc -O3 graham.hs 过在线文档中推荐的badass选项似乎是-O2 -fvia-C。(而且看来我的GHC已经落后了几个版本)
JB

-O3和的情况下-O2 -fvia-C,它似乎以相同的速度运行,大约需要18.3秒。
Wile E. Coyote

3

Python-41个字符

499位数字

x=3;exec'x=pow(3,x,10**500);'*500;print x

500个数字

x=3;exec'x=pow(3,x,10**500);'*500;print'0'+`x`

1
您正在使用的知识,从后面的第500位为0。这将给出错误的答案,比如说,200

1
@Tim问题要求输入“ 200位数或更多”。只需硬编码一个有效的计数并用它完成即可。(或保留原样:它打印499位数字,足以解决所问的问题)
JB

@JB:当然,如果不包括0,我会对499感到满意。然而现在,它假设一个具体的数字是0

@ user475-根据功率塔的属性,如果要计算最后(d)个数字,而结果小于(d)个数字,则丢失的数字(左侧)必须为“ 0”。因此可以添加丢失的“ 0”数字,但是应该通过检查结果的长度并添加适当的数字“ 0”来完成。
凯文·费根

3

Python- 62 59 55个字符

x=3
for i in range(500):x=pow(3,x,10**500)
print"0%d"%x

在我的PC上大约需要12秒。

sh-3.1$ time python cg_graham.py
02425950695064738395657479136519351798334535362521430035401260267716226721604198
10652263169355188780388144831406525261687850955526460510711720009970929124954437
88874960628829117250630013036229349160802545946149457887142783235082924210209182
58967535604308699380168924988926809951016905591995119502788717830837018340236474
54888222216157322801013297450927344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380032223487239670184851864390591
04575627262464195387

real    0m11.807s
user    0m0.000s
sys     0m0.015s
sh-3.1$

3
本地powmod是杀手::-)
JB

您可以使用10**500
gnibbler 2011年

@JB,这是我在此条目中使用Python的唯一原因:)
Wile E. Coyote

@gnibbler,更新,谢谢!我是Python的新手:)
Wile E. Coyote

0

公理,63字节

f()==(r:=3;d:=10^203;for i in 1..203 repeat r:=powmod(3,r,d);r)

高低不平和结果

--This find the Graham's number follow the algo found in wiki
--http://en.wikipedia.org/wiki/Graham%27s_number
ff()==
   r:=3; d:=10^203
   for i in 1..203 repeat r:=powmod(3,r,d)
   r

(3) -> a:=f()::String
   (3)
  "8871783083701834023647454888222216157322801013297450927344594504343300901096
  92802535275183328988446150894042482650181938515625357963996189939679054966380
  03222348723967018485186439059104575627262464195387"
                                                             Type: String
(4) -> #a
   (4)  203
                                                    Type: PositiveInteger

#a = 203表示数字len> 200也就意味着它也没有先为0 ...


0

头颈,602字节

(h@HP0&Y+h8h (hx0RWc@4vYcx#@#PJ"B?[#CPx (h Lx$2(pl2YL;KD:T{9$2j<
 LSSh,ZT l2I<Pp,@4SX`,:xtc@T",($)<cKT\lbBAy44,dQl[yL"l+i,;9<*j0P
|)lD[+`\RBi!< LaD(LHPLyt{{@\iADRQdHTZQIT3[X`DB*`X$Cxh$*(T0$| ,[;
4:bit0DqAqi!lCYQ)<Ad(|1<$R4l+#tZrLPDatC[d*@0pDclJbh0|#S9<JRy!TP0
D+!|qiTXp<r$##Atj,B1ts;HLJ"Xp44I4cK4@|Q,4JI$|hp$Zyd+yl:y<s#\pD:9
4RDK,A!<X \cqLZ" h,kHp|qLRQIDh,+StZbL+{(|jqqL;9L"(xd"<s$8\:x,CY\
z0T[,(XdcxlbaD*D;+tDj\JIi4k[)LPDLBzP@DSc$jL $s4BjQ19|;!)|9t;TaQA
dLzit[0@l2!)I$,0P@$y<L4pLPLStQT"!a| $+8(DZ`00t ,RtX4C@$yQ11|KI\"
`|2<k3|R(Dyi<)LshTrzQ$sp D+DRbH|Q$CqT0D;AA\jdXd"ppdK3LzZl#\Bl`@t
k$*,11qTK+Xp|rqDZXp4{C!<Y4

打印最后200位数字。

请在运行前删除换行符。


我们应该如何运行它?
Caird coinheringaahing

绝对不知道(我只是从BF翻译过来的)。但是我在github上搜索了“ headsecks”,看起来好像有一些实现(尽管参考实现链接似乎已经死了)。
硕果累累
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.