Python - 191 Bytes
t=i=1L;k=n=input();f=2000*20**n;A=range(n+1)
for k in range(2,n):A=[(A[j-1]+A[j+1])*j>>1for j in range(n-k+1)];f*=k
while k:k=(1-~i*n%4)*f/A[1]/i**n;t+=k;i+=2
print sum(map(int,`t`[-n-4:-4]))
~ 4x versi lebih cepat - 206 byte
t=i=1L;k=n=input();f=2000*20**n;A=[0,1]+[0]*n
for k in range(1,n):
f*=k
for j in range(-~n/2-k+1):A[j]=j*A[j-1]+A[j+1]*(j+2-n%2)
while k:k=(1-~i*n%4)*f/A[1]/i**n;t+=k;i+=2
print sum(map(int,`t`[-n-4:-4]))
Input diambil dari stdin. Output untuk n = 5000 membutuhkan sekitar 14 detik dengan skrip kedua (atau 60 detik dengan yang pertama).
Penggunaan sampel:
$ echo 1 | python pi-trunc.py
1
$ echo 2 | python pi-trunc.py
14
$ echo 3 | python pi-trunc.py
6
$ echo 4 | python pi-trunc.py
13
$ echo 5 | python pi-trunc.py
24
$ echo 50 | python pi-trunc.py
211
$ echo 500 | python pi-trunc.py
2305
$ echo 5000 | python pi-trunc.py
22852
Rumus yang digunakan adalah sebagai berikut:
di mana A n adalah n th Alternating Nomor , yang dapat secara formal didefinisikan sebagai jumlah permutasi bolak pada satu set ukuran n (lihat juga: A000111 ). Atau, urutannya dapat didefinisikan sebagai komposisi Bilangan Tangen dan Bilangan Garis Potong ( A 2n = S n , A 2n + 1 = T n ), lebih lanjut tentang itu nanti.
Kecil faktor koreksi c n cepat konvergen ke 1 sebagai n menjadi besar, dan diberikan oleh:
Untuk n = 1 , ini sama dengan mengevaluasi Leibniz Series . Mendekati π sebagai 10 ½ , jumlah istilah yang diperlukan dapat dihitung sebagai:
yang konvergen (dibulatkan ke 17) , meskipun nilai yang lebih kecil dari n membutuhkan lebih banyak.
Untuk perhitungan A n ada beberapa algoritma, dan bahkan rumus eksplisit, tetapi semuanya adalah kuadrat oleh n . Saya awalnya mengkodekan implementasi Algoritma Seidel , tetapi ternyata terlalu lambat untuk praktis. Setiap iterasi membutuhkan jangka tambahan untuk disimpan, dan istilah meningkatkan besarnya sangat cepat (yang "salah" jenis O (n 2 ) ).
Script pertama menggunakan implementasi algoritma yang awalnya diberikan oleh Knuth dan Buckholtz :
Misalkan T 1, k = 1 untuk semua k = 1..n
Nilai T selanjutnya diberikan oleh relasi rekurensi:
T n + 1, k = 1/2 [ (k - 1) T n, k-1 + (k + 1) T n, k + 1 ]
A n kemudian diberikan oleh T n, 1
(lihat juga: A185414 )
Meskipun tidak secara eksplisit dinyatakan, algoritme ini menghitung Bilangan Tangen dan Bilangan Secant secara bersamaan. Script kedua menggunakan variasi dari algoritma ini oleh Brent dan Zimmermann , yang menghitung T atau S , tergantung pada paritas n . Peningkatan kuadrat oleh n / 2 , maka peningkatan kecepatan ~ 4x.