Python - 191 Bayt
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 daha hızlı sürüm - 206 bayt
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]))
Giriş stdin'den alınır. N = 5000 çıktısı , ikinci komut dosyasıyla (veya birincisiyle 60 saniye) yaklaşık 14 saniye sürer.
Örnek kullanım:
$ 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
Kullanılan formül aşağıdaki gibidir:
burada A , n olup , n inci Alternatif Numarası resmi büyüklükte bir dizi alternatif permütasyon sayısı olarak tanımlanabilir, N (Ayrıca bkz: A000111 ). Alternatif olarak sekans Teğet Sayılar bileşimin ve Kiriş numaralar gibi tanımlanabilir ( bir 2n = S , n , A 2n + 1 = T , n ), daha sonra ayrıntılı bilgi.
Küçük düzeltme faktörü c n , n büyüdükçe hızla 1'e yakınlaşır ve şu şekilde verilir:
For n = 1 , değerlendirmek için bu miktarlar Leibniz Serisi . Π 10 ½ olarak yaklaşık olarak , gerekli terim sayısı şu şekilde hesaplanabilir:
daha küçük n değerleri önemli ölçüde daha fazlasını gerektirse de , bu değer 17'ye yaklaşır (yuvarlanır) .
A n'nin hesaplanması için birkaç algoritma ve hatta açık bir formül vardır, ancak hepsi n ile kuadratiktir . Başlangıçta Seidel'in Algoritmasının bir uygulamasını kodladım , ancak pratik olmak için çok yavaş görünüyor. Her yineleme ek bir terimin saklanmasını gerektirir ve terimler çok hızlı bir şekilde artar ("yanlış" tür O (n 2 ) ).
İlk komut dosyası, Knuth ve Buckholtz tarafından orijinal olarak verilen bir algoritmanın bir uygulamasını kullanır :
Tüm k = 1 için T 1, k = 1 olsun.
Müteakip T değerleri nüks ilişkisi ile verilir:
T n + 1, k = 1/2 [ (k - 1) T n, k-1 + (k + 1) T n, k + 1 ]
Bir n daha sonra T ile verilir n 1
(ayrıca bakınız: A185414 )
Açıkça belirtilmemesine rağmen, bu algoritma hem Teğet Sayıları hem de Sekant Numaralarını aynı anda hesaplar. İkinci senaryo, Brent ve Zimmermann tarafından bu algoritmanın n'nin paritesine bağlı olarak T veya S'yi hesaplayan bir varyasyonunu kullanır . İyileştirme n / 2 ile kuadratiktir , bu nedenle ~ 4x hız artışı.