Oblicz ostatnie cyfry numeru Grahama

13

Liczba Grahama kończy się na 7. Jest to liczba ogromna, teoretycznie wymagająca więcej informacji do przechowywania niż rozmiar samego wszechświata. Można jednak obliczyć kilka ostatnich cyfr liczby Grahama.

Ostatnie kilka cyfr to:

02425950695064738395657479136519351798334535362521
43003540126026771622672160419810652263169355188780
38814483140652526168785095552646051071172000997092
91249544378887496062882911725063001303622934916080
25459461494578871427832350829242102091825896753560
43086993801689249889268099510169055919951195027887
17830837018340236474548882222161573228010132974509
27344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380
03222348723967018485186439059104575627262464195387

Twój program może nie zawierać tych (lub podobnych liczb), ale musi je obliczyć. Musi obliczyć 200 cyfr lub więcej.

Wyjście na standardowe wyjście. Czas działania maksymalnie 2 minuty na przyzwoitym sprzęcie. Najkrótszy program wygrywa.

Thomas O
źródło
Ile cyfr należy wydrukować?
Dogbert
@Dogbert D'oh. Tęsknie za tym. 200 lub więcej byłoby w porządku.
Thomas O
Ruby nawet nie oblicza, 3**7625597484987podczas gdy Python robi :)
gnibbler
@gnibbler, umm jak? wynik miałby więcej niż 3 tryliony cyfr.
Dogbert
1
@Dogbert, biorąc pod uwagę wystarczającą ilość pamięci i czasu, Python rozpocznie obliczenia na podstawie swoich długich czasów. Ruby nawet nie zrobi 3 ** 5000000. wydaje się, że ma tam jakiś limit
gnibbler

Odpowiedzi:

9

dc - 21 znaków

[3z202>xO200^|]dsxxrp

To zajmuje około minuty na moim komputerze i zajęłoby dużo dłużej dla wartości większych niż 200. Nie generuje zer wiodących.

Oto nieco dłuższa, ale szybsza wersja (26 znaków):

[3rAz^|dz205>x]dsxxAz6-^%p
3[3rAz^|dz202>x]dsxxAz3-^%p # or an extra character for a few less iterations
Nabb
źródło
4

Haskell, 99

Wydajność nie jest gwiezdna, ale udało mi się obliczyć 500 cyfr w ciągu minuty na moim dziesięcioletnim sprzęcie.

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

(przy okazji, chciałbym usłyszeć o jego wydajności na bardziej nowoczesnym sprzęcie)

JB
źródło
Uruchomienie na moim komputerze zajmuje około 19 sekund. Na marginesie, to nie drukuje wiodącego 0 przed wyjściem.
Dogbert
Tak, jest błędny we wszystkich liczbach z wiodącymi zerami. Wystarczy obliczyć za 501 ;-) Dzięki za test. Czy uruchomiłeś to zinterpretowane lub skompilowane?
JB
Kompilowałem to ghc -o g.exe g.hs. Nie jestem pewien, czy to najlepszy sposób na kompilację.
Dogbert
Właśnie uruchomiłem ghc -O3 graham.hs Zalecane opcje badass z dokumentu online wydają się być -O2 -fvia-C. (i wygląda na to, że mój GHC ma już kilka wydań)
JB
Wydaje się, że działa z tą samą prędkością z obu -O3i -O2 -fvia-C, w około 18,3 sekundy.
Dogbert
3

Python - 41 znaków

499 cyfr

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

500 cyfr

x=3;exec'x=pow(3,x,10**500);'*500;print'0'+`x`
gnibbler
źródło
1
Korzystasz ze świadomości, że 500. cyfra z tyłu to 0. Dałoby to złą odpowiedź, powiedzmy, 200.
1
@Tim Problem wymaga podania „200 lub więcej cyfr”. Po prostu zakoduj licznik, który działa i gotowe. (lub zostaw to jako takie: drukuje 499 cyfr i to wystarczy na zadane pytanie)
JB
@JB: Jasne, byłbym zadowolony z 499, gdyby 0 zostało pominięte. Teraz jednak zakłada, że ​​konkretna cyfra to 0.
@ user475 - Według właściwości wież energetycznych, jeśli obliczasz ostatnie (d) cyfry, a wynik jest mniejszy niż (d) cyfry, wówczas brakujące cyfry (po lewej) muszą być „0”. Można więc dodać brakującą cyfrę „0”, ale należy to zrobić, sprawdzając długość wyniku i dodając odpowiednią liczbę „0”.
Kevin Fegan
3

Python - 62 59 55 znaków

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

Na moim komputerze trwa około 12 sekund.

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$
Dogbert
źródło
3
Natywny powmod jest zabójcą :-)
JB
Możesz użyć10**500
gnibbler
@JB, to jedyny powód, dla którego użyłem Pythona do tego wpisu :)
Dogbert
@gnibbler, zaktualizowano, dziękuję! Jestem nowy w Pythonie :)
Dogbert
0

Aksjomat, 63 bajty

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

golf i wynik

--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 oznacza, że ​​liczba len wynosi> 200, to też oznacza, że ​​najpierw nie ma żadnych 0 ...

RosLuP
źródło
0

Zagłówki, 602 bajty

(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

Drukuje ostatnie 200 cyfr.

Usuń znaki nowej linii przed uruchomieniem.

Esolanging Fruit
źródło
Jak mamy to uruchomić?
caird coinheringaahing
Absolutnie nie mam pojęcia (właśnie przetłumaczyłem to z BF). Ale przeszukałem „headsecks” na githubie i wygląda na to, że istnieje kilka implementacji (chociaż odnośnik do referencyjnej implementacji wydaje się być martwy).
Esolanging Fruit