Hitung 500 digit pi

25

Tulis program untuk menghitung 500 digit pi pertama, memenuhi aturan di bawah ini:

  • Panjangnya harus kurang dari 500 karakter.
  • Itu tidak dapat menyertakan "pi", "math.pi" atau konstanta pi serupa, juga tidak dapat memanggil fungsi perpustakaan untuk menghitung pi.
  • Ini tidak boleh menggunakan angka "3", "1" dan "4" secara berurutan.
  • Itu harus dijalankan dalam waktu yang wajar (di bawah 1 menit) pada komputer modern.

Program terpendek menang.

Thomas O
sumber
Untuk memeriksa apakah digit Anda benar: eveandersson.com/pi/digits
Nellius
Apakah kami diizinkan mencetak lebih dari 500 digit dengan kehilangan keakuratan setelah 500 yang pertama?
Alexandru
@Alexandru, saya kira begitu tapi saya lebih suka melihatnya terpotong.
Thomas O
@ Joey tidak ada fungsi perpustakaan UNTUK MENGHITUNG PI - Saya akan menganggap Anda dapat menggunakan apa pun dari perpustakaan kecuali konstanta / fungsi PI.
Aurel Bílý
1
Bisakah kita menggunakan pustaka HTTP untuk mengunduh situs web "digit pi"? ;-)
dan04

Jawaban:

11

Golfscript - 29 karakter

6666,-2%{2+.2/@*\/9)499?2*+}*

Saya akan posting analisis nanti

gnibbler
sumber
5
Bisakah Anda menjelaskan cara kerjanya?
Thomas O
65
"Saya akan memposting analisis nanti". (menunggu 3 tahun) ....
Justin
14
"Saya akan posting analisis nanti" * menunggu lebih dari 6 tahun *
Erik the Outgolfer
1
@EriktheOutgolfer saya akan memposting itu. : P
Christopher
1
"Saya akan posting analisis nanti" (menunggu 8 tahun)
Jono 2906
8

Mathematica (34 karakter): (tanpa "curang" dengan trigonometri)

N[2Integrate[[1-x^2]^.5,-1,1],500]

Jadi, untuk menjelaskan keajaiban di sini:
Integrate[function, lower, upper]memberi Anda area di bawah kurva "fungsi" dari "lebih rendah" ke "atas". Dalam kasus ini, fungsi itu adalah [1-x^2]^.5, yang merupakan rumus yang menggambarkan setengah bagian atas lingkaran dengan jari-jari 1. Karena lingkaran memiliki jari-jari 1, ia tidak ada untuk nilai x lebih rendah dari -1 atau lebih tinggi dari 1. Oleh karena itu, kami menemukan luas setengah lingkaran. Ketika kita kalikan dengan 2, maka kita mendapatkan area di dalam lingkaran jari-jari 1, yang sama dengan pi.

Stack Tracer
sumber
Mungkin Anda harus memasukkan, dalam jawaban Anda, penjelasan mengapa ini bekerja (untuk mereka yang bukan siswa matematika).
Justin
ide bagus Saya akan memastikannya saat ini. Saya akan memberikan penjelasan dasar tentang matematika yang terlibat.
Stack Tracer
Mungkin Anda bisa mempersingkat: ubah sqrt[1-x^2]ke(1-x^2)^.5)
Justin
dan saya dapat menghapus * setelah 2. Mathematica luar biasa.
Stack Tracer
4

Python (83 karakter)

P=0
B=10**500
i=1666
while i:d=2*i+1;P=(P*i%B+(P*i/B+3*i)%d*B)/d;i-=1
print'3.%d'%P
Soulman
sumber
3

PARI / GP, 14

\p500
acos(-1)

Anda dapat menghindari trigonometri dengan mengganti baris kedua dengan

gamma(.5)^2

atau

(6*zeta(2))^.5

atau

psi(3/4)-psi(1/4)

atau

4*intnum(x=0,1,(1-x^2)^.5)

atau

sumalt(k=2,(-1)^k/(2*k-3))*4
Charles
sumber
2

bc -l (22 = 5 baris perintah + 17 program)

scale=500
4*a(1)
Alexandru
sumber
5
Aturan mengatakan "juga tidak dapat memanggil fungsi perpustakaan untuk menghitung pi."
Peter Taylor
@Peter Masalahnya saya kira, adalah bahwa "fungsi perpustakaan" tidak selalu istilah yang didefinisikan dengan baik, dan itu hanya bertambah buruk ketika Anda mengatakan "untuk menghitung Pi", karena Anda dapat menggunakannya untuk menghitung hasil antara, misalnya Sqrt () dalam jawaban Alexandru.
Dr. belisarius
Saya pikir ini curang karena atan menghitung 1/4 pi tetapi ini adalah solusi yang menarik.
Thomas O
1
@ Thomas O: jika ini curang, di mana batasnya?
JB
2

Mathematica (17 byte)

N[ArcCos[-1],500]

Bukti validitas .

Pemurah
sumber
1

Python3 136

Menggunakan formula Madhava .

from decimal import *
D=Decimal
getcontext().prec=600
p=D(3).sqrt()*sum(D(2-k%2*4)/3**k/(2*k+1)for k in range(1100))
print(str(p)[:502])

Python3 164

Gunakan formula ini .

from decimal import *
D=Decimal
getcontext().prec=600
p=sum(D(1)/16**k*(D(4)/(8*k+1)-D(2)/(8*k+4)-D(1)/(8*k+5)-D(1)/(8*k+6))for k in range(411))
print(str(p)[:502])
Alexandru
sumber
1

Mathematica - 50

½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]
desir
sumber
1

Pyth , 21

u+/*GHhyHy^T500r^3T1Z

Gunakan algoritma ini: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))ditemukan dalam komentar jawaban Golfscript.

isaacg
sumber
Ini tidak layak mendapatkan downvote ...
Beta Decay
Jawaban ini salah, menghasilkan 34247779 ... yang, setahu saya, bukan pi.
orlp
@ orlp rOperasi baru-baru ini diubah dengan cara yang merusak jawaban ini. Ubah 1ke 0, dan itu akan bekerja di Pyth saat ini.
isaacg
0

Aksioma, 80 byte

digits(503);v:=1./sqrt(3);6*reduce(+,[(-1)^k*v^(2*k+1)/(2*k+1)for k in 0..2000])

untuk referensi https://tuts4you.com/download.php?view.452 ; itu akan menjadi approssimation ke 6 * arctg (1 / sqrt (3)) =% pi dan itu akan menggunakan ekspansi seri untuk arctg

  3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 592307816
  4 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 505822317
  2 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 442881097
  5 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 454326648
  2 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 917153643
  6 7892590360 0113305305 4882046652 1384146951 9415116094 3305727036 575959195
  3 0921861173 8193261179 3105118548 0744623799 6274956735 1885752724 891227938
  1 8301194913 01
RosLuP
sumber
0

JavaScript, 68 byte

i=1n;x=3n*(10n**520n);p=x;while(x>0){x=x*i/((i+1n)*4n);i+=2n;p+=x/i}

Cobalah online!

Yehuda Schwartz
sumber