Python - 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]))
อินพุตถูกนำมาจาก stdin เอาต์พุตสำหรับn = 5000ใช้เวลาประมาณ 14 วินาทีด้วยสคริปต์ที่สอง (หรือ 60 วินาทีกับสคริปต์แรก)
ตัวอย่างการใช้งาน:
$ 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 THสลับหมายเลขซึ่งสามารถกำหนดอย่างเป็นทางการเป็นจำนวนพีชคณิตสลับกับชุดของขนาดที่n (ดูเพิ่มเติมที่: A000111 ) อีกวิธีหนึ่งสามารถกำหนดลำดับเป็นองค์ประกอบของตัวเลขแทนเจนต์และตัวเลข Secant ( A 2n = S n , A 2n + 1 = T n ), เพิ่มเติมในภายหลัง
ปัจจัยการแก้ไขขนาดเล็กc nเข้าหา1อย่างรวดเร็วเมื่อnกลายเป็นใหญ่และได้รับจาก:
สำหรับn = ที่ 1จำนวนนี้เพื่อประเมินLeibniz ซีรีส์ ประมาณπเป็น10 ½จำนวนคำที่ต้องการสามารถคำนวณได้ดังนี้:
ซึ่งรวมกัน (ปัดขึ้น) ถึง17แม้ว่าค่าที่น้อยกว่าของn จะต้องการมากกว่านั้น
สำหรับการคำนวณของnมีขั้นตอนวิธีการหลายและแม้กระทั่งสูตรอย่างชัดเจน แต่ทั้งหมดของพวกเขากำลังสองโดยn ฉันเขียนโค้ดการใช้งานอัลกอริทึมของ Seidelแต่ดูเหมือนจะช้าเกินกว่าจะใช้งานได้จริง การวนซ้ำแต่ละครั้งจะต้องมีคำศัพท์เพิ่มเติมเพื่อจัดเก็บและข้อกำหนดเพิ่มขึ้นอย่างรวดเร็วมาก ( O "ผิด" ชนิดO (n 2 ) )
สคริปต์แรกใช้การนำไปใช้ของอัลกอริทึมที่ได้รับจากKnuth และ Buckholtz :
ให้ T 1, k = 1 สำหรับทุก k = 1..n
ค่าที่ตามมาของ T ถูกกำหนดโดยความสัมพันธ์ที่เกิดซ้ำ:
T n + 1, k = 1/2 [ (k - 1) T n, k-1 + (k + 1) T n, k + 1 ]
nจะได้รับแล้วโดย T n 1
(ดูเพิ่มเติมที่: A185414 )
แม้ว่าจะไม่ได้ระบุไว้อย่างชัดเจนอัลกอริทึมนี้จะคำนวณทั้งตัวเลขแทนเจนต์และตัวเลข Secant พร้อมกัน สคริปต์ที่สองใช้รูปแบบของขั้นตอนวิธีนี้โดยเบรนท์และซิมเมอซึ่งจะคำนวณทั้งTหรือSทั้งนี้ขึ้นอยู่กับความเท่าเทียมกันของn การปรับปรุงเป็นกำลังสองโดยn / 2ดังนั้นการปรับปรุงความเร็ว ~ 4x