グラハム数の最後の桁を計算します


13

グラハムの数は7で終わります。理論的には、宇宙自体のサイズよりも多くの情報を保存する必要があります。ただし、グラハム数の最後の数桁を計算することは可能です。

最後の数桁は次のとおりです。

02425950695064738395657479136519351798334535362521
43003540126026771622672160419810652263169355188780
38814483140652526168785095552646051071172000997092
91249544378887496062882911725063001303622934916080
25459461494578871427832350829242102091825896753560
43086993801689249889268099510169055919951195027887
17830837018340236474548882222161573228010132974509
27344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380
03222348723967018485186439059104575627262464195387

プログラムにはこれら(または同様の数)が含まれていない場合がありますが、計算する必要があります。200桁以上を計算する必要があります。

stdoutへの出力。適切なハードウェアでの最大実行時間は2分です。最短のプログラムが勝ちます。


何桁印刷する必要がありますか?
ドグバート

@Dogbert D'oh。私は逃しました。200以上であれば問題ありません。
トーマスO

Rubyは計算すらしませんが3**7625597484987、Pythonは計算します:)
ニブラー

@gnibbler、ええと?結果は3兆桁以上になります。
ドグバート

1
@Dogbert、十分なメモリと時間が与えられると、Pythonはlongを使用して計算を進めます。Rubyは3 ** 5000000さえ実行しません。そこに何らかの制限があるようです
ニブラー

回答:


9

dc-21文字

[3z202>xO200^|]dsxxrp

これは私のコンピューターで約1分かかり、200を超える値の場合はかなり長くかかります。先行ゼロは出力されません。

少し長いですが、より高速なバージョン(26文字)を次に示します。

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

4

ハスケル、99

パフォーマンスは素晴らしいものではありませんが、10年前のハードウェアで500桁を1分間で計算できます。

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を出力しません。
ドグバート

うん、それはすべての桁数に先行ゼロのバグがある。501だけを計算してください;-)ベンチマークをありがとう。解釈またはコンパイルして実行しましたか?
JB

でコンパイルしましたghc -o g.exe g.hs。それが最適なコンパイル方法であるかどうかはわかりません。
ドグバート

私はちょうど走ったghc -O3 graham.hs オンラインドキュメントから推奨ワルオプションがあるように見えます-O2 -fvia-C。(と私のGHCはすでに背後のいくつかのリリースであるように見える)
JB

これは、両方で同じ速度で動作しているようだ-O3-O2 -fvia-C、周りの18.3秒に。
ドグバート

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
ニブラー

私は:)このエントリのためのPythonを使用する唯一の理由です@JB、
Dogbert

@gnibbler、更新、ありがとう!私はPythonが初めてです:)
ドッグバート

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

ヘッドデッキ、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桁を印刷します。

実行する前に改行を削除してください。


どのように実行するのですか?
共産主義のケアリング

まったくわからない(これをBFから翻訳したばかりだ)。しかし、私はgithubで「headsecks」を検索しましたが、いくつかの実装があるように見えます(ただし、参照実装リンクは死んでいるようです)。
エソランジングフルーツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.