पायथन - 191 बाइट्स
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 तेज संस्करण - 206 बाइट्स
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]))
इनपुट स्टड से लिया गया है। N = 5000 के लिए आउटपुट दूसरी स्क्रिप्ट (या पहले के साथ 60s) के साथ लगभग 14s लेता है।
नमूना उपयोग:
$ 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
उपयोग किया गया सूत्र निम्नलिखित है:
जहां एक n है n वें अदल-बदल कर संख्या है, जो औपचारिक रूप से आकार के एक सेट पर बारी क्रमपरिवर्तन की संख्या के रूप में परिभाषित किया जा सकता है n (: यह भी देख A000111 )। वैकल्पिक रूप से, अनुक्रम को स्पर्शरेखा संख्याओं और सेकेंड संख्याओं ( A 2n = S n , A 2n + 1 = T n ) की संरचना के रूप में परिभाषित किया जा सकता है , उस पर बाद में।
छोटा सुधार कारक c n तेजी से 1 में परिवर्तित होता है क्योंकि n बड़ा हो जाता है, और इसके द्वारा दिया जाता है:
के लिए n = 1 , का मूल्यांकन करने के लिए इस मात्रा में लाइबनिट्स श्रृंखला । लगभग ½ 10 π के रूप में , आवश्यक शब्दों की संख्या की गणना इस प्रकार की जा सकती है:
जो कि 17 में परिवर्तित (गोल) हो जाता है , हालांकि n के छोटे मानों में काफी अधिक की आवश्यकता होती है।
ए एन की गणना के लिए कई एल्गोरिदम हैं, और यहां तक कि एक स्पष्ट सूत्र भी है, लेकिन वे सभी एन द्वारा द्विघात हैं । मैंने मूल रूप से सेडेल के एल्गोरिथ्म के कार्यान्वयन को कोडित किया था , लेकिन यह व्यावहारिक होने के लिए बहुत धीमा हो जाता है। प्रत्येक पुनरावृत्ति को संग्रहीत करने के लिए एक अतिरिक्त शब्द की आवश्यकता होती है, और बहुत तेज़ी से परिमाण में वृद्धि होती है ( ओ (एन 2 ) का "गलत" प्रकार )।
पहली स्क्रिप्ट मूल रूप से नूथ और बकहोल्त्ज़ द्वारा दिए गए एल्गोरिथ्म के कार्यान्वयन का उपयोग करती है :
सभी को = 1. एन के लिए टी 1, के = 1 दें
T के बाद के मान पुनरावृत्ति संबंध द्वारा दिए गए हैं:
T n + 1, k = 1/2 [ (k - 1) T n, k-1 + (k + 1) T n, k + 1 ]
एक n को तब T n, 1 द्वारा दिया जाता है
(यह भी देखें: A185414 )
हालांकि स्पष्ट रूप से नहीं कहा गया है, यह एल्गोरिथ्म एक साथ स्पर्शरेखा संख्याओं और सेकंड संख्याओं की गणना करता है। दूसरी स्क्रिप्ट ब्रेंट और ज़िमरमन द्वारा इस एल्गोरिथ्म की भिन्नता का उपयोग करती है , जो कि n की समता के आधार पर या तो T या S की गणना करती है । सुधार n / 2 से द्विघात है , इसलिए ~ 4x गति में सुधार है।