그레이엄 수의 마지막 자릿수 계산


13

Graham의 수 는 7로 끝납니다. 이론적으로는 우주 자체의 크기보다 더 많은 정보를 저장해야합니다. 그러나 그레이엄 수의 마지막 몇 자리를 계산할 수 있습니다.

마지막 몇 자리는 다음과 같습니다.

02425950695064738395657479136519351798334535362521
43003540126026771622672160419810652263169355188780
38814483140652526168785095552646051071172000997092
91249544378887496062882911725063001303622934916080
25459461494578871427832350829242102091825896753560
43086993801689249889268099510169055919951195027887
17830837018340236474548882222161573228010132974509
27344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380
03222348723967018485186439059104575627262464195387

프로그램에 이러한 (또는 유사한 숫자)가 포함되어 있지는 않지만 계산해야합니다. 200 자리 이상을 계산해야합니다.

표준 출력으로 출력합니다. 괜찮은 하드웨어에서 최대 2 분의 실행 시간. 최단 프로그램이 이깁니다.


몇 자리 숫자를 인쇄해야합니까?
Wile E. Coyote

@Dogbert D' oh. 나는 그것을 놓쳤다. 200 이상이 좋습니다.
Thomas O

루비는 3**7625597484987파이썬이 계산 하는 동안 조차 계산 하지 않습니다 :)
gnibbler

@gnibbler, 음 어떻게? 결과는 3 조 개가 넘습니다.
Wile E. Coyote

1
@Dogbert, 충분한 메모리와 시간이 주어지면 파이썬은 오랫동안 사용하여 계산합니다. 루비는 3 ** 5000000도하지 않습니다. 거기에 일종의 한계가있는 것 같습니다
gnibbler

답변:


9

dc-21 자

[3z202>xO200^|]dsxxrp

컴퓨터에서 약 1 분 정도 걸리며 200보다 큰 값의 경우 시간이 훨씬 오래 걸립니다. 선행 0을 출력하지 않습니다.

다음은 약간 길지만 빠른 버전입니다 (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 자리를 계산할 수 있습니다.

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

(btw, 더 현대적인 하드웨어에서의 성능에 대해 듣고 싶습니다)


내 PC에서 실행하는 데 약 19 초가 걸립니다. 참고로, 이것은 출력 전에 선행 0을 인쇄하지 않습니다.
Wile E. Coyote

그렇습니다. 앞의 0으로 모든 숫자에 버그가 있습니다. 501에 대해서만 계산하십시오. ;-) 벤치 마크에 감사드립니다. 해석되거나 컴파일 된 상태로 실행 했습니까?
JB

나는 그것을 컴파일했다 ghc -o g.exe g.hs. 그것이 최선의 컴파일 방법인지 확실하지 않습니다.
Wile E. Coyote

방금 실행 ghc -O3 graham.hs 했습니다 온라인 문서에서 권장되는 불량 옵션은 -O2 -fvia-C입니다. (그리고 내 GHC는 이미 몇 가지 릴리스 인 것 같습니다)
JB

그것은 모두 같은 속도로 실행 것으로 보인다 -O3-O2 -fvia-C주변 18.3 초.
Wile E. Coyote

3

파이썬-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 's 여야합니다. 따라서 누락 된 "0"숫자를 추가해도 괜찮지 만 결과 길이를 검사하고 적절한 수의 "0"을 추가하여 수행해야합니다.
Kevin Fegan

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

나는 :)이 항목에 대한 파이썬을 사용하는 유일한 이유 @JB,
책략 E. 코요테

@gnibbler, 업데이트, 감사합니다! 나는 :) 파이썬에 새로 온
책략 E. 코요테

0

공리, 63 바이트

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

ungolf와 결과

--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 자리를 인쇄합니다.

실행하기 전에 줄 바꿈을 제거하십시오.


어떻게 운영해야합니까?
caird coinheringaahing

전혀 몰라요 (BF에서 이것을 번역했습니다). 그러나 github에서 "headsecks"를 검색했는데 몇 가지 구현이있는 것처럼 보입니다 (참조 구현 링크가 죽은 것처럼 보입니다).
Esolanging 과일
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.