Calcola le ultime cifre del numero di Graham


13

Il numero di Graham termina in un 7. È un numero enorme, in teoria che richiede più informazioni da archiviare rispetto alle dimensioni dell'universo stesso. Tuttavia è possibile calcolare le ultime cifre del numero di Graham.

Le ultime cifre sono:

02425950695064738395657479136519351798334535362521
43003540126026771622672160419810652263169355188780
38814483140652526168785095552646051071172000997092
91249544378887496062882911725063001303622934916080
25459461494578871427832350829242102091825896753560
43086993801689249889268099510169055919951195027887
17830837018340236474548882222161573228010132974509
27344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380
03222348723967018485186439059104575627262464195387

Il tuo programma potrebbe non contenere questi (o numeri simili), ma deve calcolarli. Deve calcolare almeno 200 cifre.

Uscita su stdout. Tempo di esecuzione di un massimo di 2 minuti su hardware decente. Vince il programma più breve.


Quante cifre devono essere stampate?
Wile E. Coyote,

@Dogbert D'oh. Ho perso questo. 200 o più andrebbero bene.
Thomas O

Ruby non calcolerà nemmeno 3**7625597484987mentre Python lo fa :)
Gnibbler

@gnibbler, umm come? il risultato avrebbe più di 3 trilioni di cifre.
Wile E. Coyote,

1
@Dogbert, dato abbastanza memoria e tempo Python andrà avanti per calcolarlo usando i suoi longs. Ruby non farà nemmeno 3 ** 5000000. sembra avere un limite
gnibbler

Risposte:


9

dc - 21 caratteri

[3z202>xO200^|]dsxxrp

Questo richiede circa un minuto sul mio computer e richiederebbe molto più tempo per valori superiori a 200. Non genera zero iniziali.

Ecco una versione leggermente più lunga ma più veloce (26 caratteri):

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

4

Haskell, 99

Prestazioni non stellari, ma riesce a calcolare 500 cifre in un minuto sul mio hardware decennale.

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

(a proposito, mi piacerebbe conoscere le sue prestazioni su hardware più moderno)


Ci vogliono circa 19 secondi per funzionare sul mio PC. In una nota a margine, questo non stampa uno 0 iniziale prima dell'output.
Wile E. Coyote,

Sì, è buggy su tutti i numeri di cifre con zeri iniziali. Calcola solo per 501 ;-) Grazie per il benchmark. L'hai eseguito interpretato o compilato?
JB

L'ho compilato con ghc -o g.exe g.hs. Non sono sicuro che sia il modo migliore per compilare.
Wile E. Coyote,

Ho appena eseguito ghc -O3 graham.hs Le opzioni badass consigliate dal documento online sembrano essere -O2 -fvia-C. (e sembra che il mio GHC sia già in ritardo di alcune versioni)
JB

Sembra funzionare alla stessa velocità con entrambi -O3e -O2 -fvia-C, in circa 18,3 secondi.
Wile E. Coyote,

3

Python - 41 caratteri

499 cifre

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

500 cifre

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

1
Stai utilizzando la consapevolezza che la 500a cifra dal retro è uno 0.

1
@Tim Il problema richiede "200 cifre o più". Basta codificare un conteggio che funzioni ed essere fatto con esso. (o lascialo come tale: stampa 499 cifre ed è abbastanza buono per la domanda che viene posta)
JB

@JB: Certo, sarei soddisfatto del 499 se lo 0 fosse lasciato fuori. Ora, tuttavia, si presume che una cifra specifica sia 0.

@ user475 - In base alle proprietà delle torri di potenza, se stai calcolando le ultime (d) cifre e il risultato è inferiore a (d) cifre, le cifre mancanti (a sinistra) devono essere "0". Quindi è OK aggiungere la cifra "0" mancante, ma dovrebbe essere fatto esaminando la lunghezza del risultato e aggiungendo il numero appropriato di "0".
Kevin Fegan,

3

Python - 62 59 55 caratteri

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

Dura circa 12 secondi sul mio PC.

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 nativo è un assassino :-)
JB

Puoi usare10**500
gnibbler l'

@JB, questa è l'unica ragione per cui ho usato Python per questa voce :)
Wile E. Coyote

@gnibbler, aggiornato, grazie! Sono nuovo di Python :)
Wile E. Coyote,

0

Assioma, 63 byte

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

ungolf e risultato

--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 significa che il numero len è> 200 ma anche men che non ha 0 prima ...


0

Headsecks, 602 byte

(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

Stampa le ultime 200 cifre.

Rimuovere le nuove righe prima di eseguire.


Come dovremmo eseguirlo?
caird coinheringaahing il

Assolutamente no idea (l'ho appena tradotto da BF). Ma ho cercato "headecks" su github e sembra che ci siano alcune implementazioni (anche se il collegamento all'implementazione di riferimento sembra essere morto).
Esolanging Fruit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.