Python 59 ไบต์
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
พิมพ์ออก 1,000 หลัก มากกว่าเล็กน้อยที่ต้องการเล็กน้อย 5. แทนที่จะใช้การวนซ้ำตามที่กำหนดมันใช้สิ่งนี้:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
6637
(ตัวหารสุด) สามารถสูตร:
ตัวเลข * 2 * บันทึก2 (10)
สิ่งนี้แสดงถึงการลู่เชิงเส้น แต่ละซ้ำลึกจะผลิตหนึ่งบิตไบนารีมากขึ้นของปี่
อย่างไรก็ตามหากคุณยืนยันในการใช้เอกลักษณ์ tan -1การลู่เข้าที่คล้ายกันสามารถทำได้ถ้าคุณไม่สนใจปัญหาจะแตกต่างกันเล็กน้อย ดูที่ผลรวมบางส่วน:
4.0, 2.66667, 3.46667, 2.89524, 3.33968, 2.97605, 3.28374, ...
เห็นได้ชัดว่าแต่ละเทอมกระโดดข้ามไปมาทั้งสองข้างของจุดบรรจบกัน ชุดนี้มีการบรรจบกัน นอกจากนี้แต่ละคำศัพท์จะอยู่ใกล้กับจุดบรรจบมากกว่าคำก่อนหน้าคือ มันเป็นเสียงเดียวอย่างแน่นอนด้วยความเคารพต่อจุดบรรจบของมัน การรวมกันของคุณสมบัติทั้งสองนี้แสดงว่าค่าเฉลี่ยเลขคณิตของคำศัพท์สองคำที่อยู่ใกล้กันนั้นอยู่ใกล้กับจุดบรรจบกันมากกว่าคำศัพท์ใดคำหนึ่ง เพื่อให้คุณมีความคิดที่ดีขึ้นเกี่ยวกับสิ่งที่ฉันหมายถึงพิจารณาภาพต่อไปนี้:
ซีรี่ส์ด้านนอกเป็นต้นฉบับและซีรีย์ด้านในพบได้โดยการหาค่าเฉลี่ยของแต่ละคำที่อยู่ใกล้เคียง ความแตกต่างที่น่าทึ่ง แต่สิ่งที่โดดเด่นอย่างแท้จริงคือซีรีย์ใหม่นี้ยังมีคอนเวอร์เจนซ์แบบสลับและเป็นแบบโมโนโทนิกที่เกี่ยวกับจุดบรรจบของมัน ซึ่งหมายความว่ากระบวนการนี้สามารถนำมาใช้ซ้ำแล้วซ้ำอีกโฆษณาคลื่นไส้
ตกลง. แต่อย่างไร
คำจำกัดความบางอย่างเป็นทางการ Let P 1 (n)เป็นn THระยะของลำดับแรกP 2 (n)เป็นn THระยะของลำดับที่สองและในทำนองเดียวกันP k (n) n THระยะเวลาของk THลำดับตามที่ระบุไว้ข้างต้น .
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, ... ]
ไม่น่าแปลกใจที่ค่าสัมประสิทธิ์เหล่านี้เป็นไปตามสัมประสิทธิ์ทวินามและสามารถแสดงเป็นแถวเดียวของสามเหลี่ยมปาสคาล เนื่องจากแถวใด ๆ ของสามเหลี่ยมปาสคาลนั้นมีความสำคัญในการคำนวณจึงสามารถหาอนุกรม 'ลึก' แบบสุ่มได้โดยการหาผลรวมnส่วนแรกคูณด้วยแต่ละคำที่สอดคล้องกันในแถวลำดับที่ kของสามเหลี่ยมปาสกาลและหารด้วย2 K-1
ด้วยวิธีนี้ความแม่นยำของจุดลอยตัวแบบ 32 บิตเต็มรูปแบบ (ทศนิยม 14 ตำแหน่ง) สามารถทำได้เพียง 36 รอบโดยที่ผลรวมบางส่วนยังไม่ได้รวมอยู่ในตำแหน่งทศนิยมที่สอง เห็นได้ชัดว่านี่ไม่ใช่การเล่นกอล์ฟ:
# 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
หากคุณต้องการความแม่นยำโดยพลการสิ่งนี้สามารถทำได้ด้วยการดัดแปลงเล็กน้อย ที่นี่อีกครั้งคำนวณ 1,000 หลัก:
# 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
ค่าเริ่มต้นของpเริ่มใหญ่ขึ้น2 10เพื่อต่อสู้กับผลกระทบของการหารจำนวนเต็มของs / dเมื่อdกลายเป็นใหญ่ขึ้นทำให้ตัวเลขสองสามหลักสุดท้ายไม่มาบรรจบกัน แจ้งให้ทราบที่นี่อีกครั้งว่า3318
:
ตัวเลข * บันทึก2 (10)
จำนวนการทำซ้ำเดียวกันกับอัลกอริทึมแรก (ลดลงครึ่งหนึ่งเนื่องจากtลดลง1แทนที่จะเป็น2ซ้ำในแต่ละครั้ง) สิ่งนี้บ่งบอกถึงการลู่เข้าเชิงเส้น: ไบนารี่บิตหนึ่งของpiต่อการวนซ้ำ ในทั้งสองกรณีต้องใช้การคำนวณซ้ำ 3318 ครั้งเพื่อคำนวณ 1,000 หลักของpiซึ่งเป็นโควต้าที่ดีกว่า 1 ล้านซ้ำในการคำนวณ 5
p=lambda:3.14159