Python 59 byte
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
Ini mencetak 1000 digit; sedikit lebih dari yang dibutuhkan 5. Alih-alih menggunakan iterasi yang ditentukan, ia menggunakan ini:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
Itu 6637
(yang terdalam denominator) dapat dirumuskan sebagai:
digit * 2 * log 2 (10)
Ini menyiratkan konvergensi linier. Setiap iterasi yang lebih dalam akan menghasilkan satu lagi bit biner pi .
Jika , bagaimanapun, Anda bersikeras menggunakan tan -1 identitas, konvergensi yang sama dapat dicapai, jika Anda tidak keberatan akan tentang masalah sedikit berbeda. Melihat jumlah parsial:
4.0, 2.66667, 3.46667, 2.89524, 3.33968, 2.97605, 3.28374, ...
jelas bahwa setiap istilah melompat bolak-balik ke kedua sisi titik konvergensi; seri memiliki konvergensi bolak-balik. Selain itu, setiap istilah lebih dekat ke titik konvergensi daripada istilah sebelumnya; itu benar-benar monoton sehubungan dengan titik konvergensi. Kombinasi kedua sifat ini menyiratkan bahwa rata-rata aritmatika dari dua suku tetangga lebih dekat ke titik konvergensi daripada salah satu dari istilah itu sendiri. Untuk memberi Anda gagasan yang lebih baik tentang apa yang saya maksud, pertimbangkan gambar berikut:
Seri luar adalah asli, dan seri dalam ditemukan dengan mengambil rata-rata dari masing-masing istilah tetangga. Perbedaan yang luar biasa. Tapi apa yang benar-benar luar biasa, adalah bahwa seri baru ini juga memiliki konvergensi bergantian, dan benar-benar monoton sehubungan dengan titik konvergensi. Itu berarti bahwa proses ini dapat diterapkan berulang kali, ad nauseum.
Baik. Tapi bagaimana caranya?
Beberapa definisi formal. Misalkan P 1 (n) menjadi suku ke- n dari urutan pertama, P 2 (n) menjadi suku ke- n dari urutan kedua, dan demikian pula P k (n) suku ke- n dari urutan ke- k seperti yang didefinisikan di atas .
P 1 = [P 1 (1), P 1 (2), P 1 (3), P 1 (4), P 1 (5), ...]
P 2 = [(P 1 (1) + P 1 (2)) / 2, (P 1 (2) + P 1 (3)) / 2, (P 1 (3) + P 1 (4)) / 2, (P 1 (4) + P 1 (5)) / 2, ...]
P 3 = [(P 1 (1) + 2P 1 (2) + P 1 (3)) / 4, (P 1 (2) + 2P 1 (3) + P 1 (4)) / 4, (P 1 (3) + 2P 1 (4) + P 1 (5)) / 4, ...]
P 4 = [(P 1 (1) + 3P 1 (2) + 3P 1 (3) + P 1 (4)) / 8, (P 1 (2) + 3P 1 (3) + 3P 1 (4) + P 1 (5)) / 8, ...]
Tidak mengherankan, koefisien ini mengikuti persis koefisien binomial, dan dapat dinyatakan sebagai satu baris tunggal Segitiga Pascal. Sejak baris sewenang-wenang Segitiga Pascal adalah sepele untuk menghitung, sebuah sewenang-wenang 'dalam' seri dapat ditemukan, hanya dengan mengambil pertama n parsial jumlah, kalikan masing-masing dengan istilah yang sesuai dalam k th deretan Segitiga Pascal, dan membaginya dengan 2 k-1 .
Dengan cara ini, presisi titik mengambang 32-bit penuh (~ 14 tempat desimal) dapat dicapai hanya dengan 36 iterasi, di mana titik jumlah parsial bahkan belum bertemu di tempat desimal kedua. Ini jelas bukan golf:
# used for pascal's triangle
t = 36; v = 1.0/(1<<t-1); e = 1
# used for the partial sums of pi
p = 4; d = 3; s = -4.0
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print "%.14f"%x
Jika Anda menginginkan presisi yang sewenang-wenang, ini dapat dicapai dengan sedikit modifikasi. Di sini sekali lagi menghitung 1000 digit:
# used for pascal's triangle
f = t = 3318; v = 1; e = 1
# used for the partial sums of pi
p = 4096*10**999; d = 3; s = -p
x = 0
while t:
t -= 1
p += s/d; d += 2; s *= -1
x += p*v
v = v*t/e; e += 1
print x>>f+9
Nilai awal p mulai 2 10 lebih besar, untuk menetralkan efek pembagian bilangan bulat dari s / d ketika d menjadi lebih besar, menyebabkan beberapa digit terakhir tidak bertemu. Perhatikan di sini lagi itu3318
itu juga:
digit * log 2 (10)
Jumlah iterasi yang sama dengan algoritma pertama (dibelah dua karena t berkurang 1 bukannya 2 setiap iterasi). Sekali lagi, ini menunjukkan konvergensi linier: satu bit biner pi per iterasi. Dalam kedua kasus, 3318 iterasi diperlukan untuk menghitung 1000 digit pi , sebagai kuota sedikit lebih baik dari 1 juta iterasi untuk menghitung 5.
p=lambda:3.14159