Tính các chữ số cuối của Số Graham


13

Số của Graham kết thúc bằng 7. Đây là một con số khổng lồ, theo lý thuyết đòi hỏi nhiều thông tin để lưu trữ hơn kích thước của chính vũ trụ. Tuy nhiên, có thể tính được một vài chữ số cuối của số Graham.

Một vài chữ số cuối cùng là:

02425950695064738395657479136519351798334535362521
43003540126026771622672160419810652263169355188780
38814483140652526168785095552646051071172000997092
91249544378887496062882911725063001303622934916080
25459461494578871427832350829242102091825896753560
43086993801689249889268099510169055919951195027887
17830837018340236474548882222161573228010132974509
27344594504343300901096928025352751833289884461508
94042482650181938515625357963996189939679054966380
03222348723967018485186439059104575627262464195387

Chương trình của bạn có thể không chứa những (hoặc số tương tự), nhưng phải tính toán chúng. Nó phải tính toán 200 chữ số trở lên.

Đầu ra cho thiết bị xuất chuẩn. Thời gian chạy tối đa 2 phút trên phần cứng tốt. Chương trình ngắn nhất sẽ thắng.


Có bao nhiêu chữ số nên được in?
Dogbert

@Dogbert D'oh. Tôi đã bỏ lỡ nó. 200 hoặc nhiều hơn sẽ tốt.
Thomas O

Ruby thậm chí sẽ không tính toán 3**7625597484987trong khi Python thì :)
gnibbler

@gnibbler, umm thế nào? kết quả sẽ có hơn 3 nghìn tỷ chữ số.
Dogbert

1
@Dogbert, được cung cấp đủ bộ nhớ và thời gian Python sẽ tiếp tục tính toán nó bằng cách sử dụng nó lâu. Ruby thậm chí sẽ không làm 3 ** 5000000. dường như có một số giới hạn trong đó
gnibbler

Câu trả lời:


9

dc - 21 ký tự

[3z202>xO200^|]dsxxrp

Việc này mất khoảng một phút trên máy tính của tôi và sẽ mất nhiều thời gian hơn cho các giá trị lớn hơn 200. Nó không tạo ra các số 0 hàng đầu.

Đây là phiên bản dài hơn một chút nhưng nhanh hơn (26 ký tự):

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

4

Haskell, 99

Hiệu suất không phải là xuất sắc, nhưng nó quản lý để tính toán 500 chữ số trong một phút trên phần cứng cũ hàng thập kỷ của tôi.

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, tôi rất muốn nghe về hiệu suất của nó trên phần cứng hiện đại hơn)


Mất khoảng 19 giây để chạy trên PC của tôi. Mặt khác, điều này không in số 0 trước đầu ra.
Dogbert

Phải, đó là lỗi trên tất cả các chữ số với các số 0 đứng đầu. Chỉ cần tính toán cho 501 ;-) Cảm ơn điểm chuẩn. Bạn đã chạy nó giải thích hoặc biên dịch?
JB

Tôi biên dịch nó với ghc -o g.exe g.hs. Không chắc chắn nếu đó là cách tốt nhất để biên dịch.
Dogbert

Tôi chỉ chạy ghc -O3 graham.hs Các tùy chọn badass được đề xuất từ ​​tài liệu trực tuyến dường như -O2 -fvia-C. (và có vẻ như GHC của tôi đã có một vài bản phát hành phía sau)
JB

Nó dường như đang chạy ở cùng tốc độ với cả hai -O3-O2 -fvia-C, trong khoảng 18,3 giây.
Dogbert

3

Python - 41 ký tự

499 chữ số

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

500 chữ số

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

1
Bạn đang sử dụng kiến ​​thức rằng chữ số thứ 500 từ phía sau là 0. Nó sẽ đưa ra câu trả lời sai cho, giả sử, 200.

1
@Tim Vấn đề yêu cầu "200 chữ số trở lên". Chỉ cần hardcode một số lượng hoạt động và được thực hiện với nó. (hoặc để nguyên như vậy: nó in ra 49 chữ số và đủ tốt cho câu hỏi như đã hỏi)
JB

@JB: Chắc chắn, tôi sẽ hài lòng với 499 nếu số 0 bị bỏ lại. Tuy nhiên, bây giờ, nó giả sử rằng một chữ số cụ thể là 0.

@ user485 - Theo tính chất của tháp năng lượng, nếu bạn đang tính các chữ số (d) cuối cùng và kết quả là ít hơn (d) chữ số, thì các chữ số bị thiếu (ở bên trái) phải là "0". Vì vậy, bạn có thể thêm chữ số "0" bị thiếu, nhưng nên thực hiện bằng cách kiểm tra độ dài của kết quả và thêm số "0" thích hợp.
Kevin Fegan

3

Python - 62 59 55 ký tự

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

Mất khoảng 12 giây trên PC của tôi.

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 bản địa là một kẻ giết người :-)
JB

Bạn có thể sử dụng10**500
gnibbler

@JB, đó là lý do duy nhất tôi sử dụng Python cho mục này :)
Dogbert

@gnibbler, cập nhật, cảm ơn! Tôi mới biết về Python :)
Dogbert

0

Tiên đề, 63 byte

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

ungolf và kết quả

--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 có nghĩa là số len là> 200 nó cũng không có số 0 trước ...


0

Headecks, 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

In 200 chữ số cuối cùng.

Vui lòng xóa các dòng mới trước khi chạy.


Làm thế nào chúng ta phải chạy nó?
caird coinheringaahing

Hoàn toàn không có ý tưởng (tôi chỉ dịch cái này từ BF). Nhưng tôi đã tìm kiếm "headecks" trên github và có vẻ như có một vài triển khai (mặc dù liên kết thực hiện tham chiếu dường như đã chết).
Esolanging Fruit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.