Python 59 byte
print reduce(lambda x,p:p/2*x/p+2*10**999,range(6637,1,-2))
Điều này in ra 1000 chữ số; nhiều hơn một chút so với yêu cầu 5. Thay vì sử dụng phép lặp theo quy định, nó sử dụng điều này:
pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + 5/11*(2 + ...)))))
6637
( Mẫu số trong cùng) có thể được định dạng là:
chữ số * 2 * log 2 (10)
Điều này ngụ ý một sự hội tụ tuyến tính. Mỗi lần lặp sâu hơn sẽ tạo ra thêm một bit nhị phân của pi .
Nếu , tuy nhiên, bạn nhấn mạnh vào việc sử dụng tan -1 bản sắc, một sự hội tụ tương tự có thể đạt được, nếu bạn không nhớ đi về vấn đề hơi khác nhau. Nhìn vào các khoản tiền một phần:
4.0, 2.66667, 3.46667, 2.89524, 3.33968, 2.97605, 3.28374, ...
Rõ ràng là mỗi thuật ngữ nhảy qua lại ở hai bên của điểm hội tụ; chuỗi có sự hội tụ xen kẽ. Ngoài ra, mỗi thuật ngữ gần với điểm hội tụ hơn thuật ngữ trước đó; nó hoàn toàn đơn điệu đối với điểm hội tụ của nó. Sự kết hợp của hai tính chất này ngụ ý rằng trung bình số học của bất kỳ hai thuật ngữ lân cận nào gần với điểm hội tụ hơn chính các thuật ngữ đó. Để cho bạn biết rõ hơn về ý tôi, hãy xem xét hình ảnh sau:
Chuỗi bên ngoài là bản gốc, và chuỗi bên trong được tìm thấy bằng cách lấy trung bình của mỗi thuật ngữ lân cận. Một sự khác biệt đáng chú ý. Nhưng điều thực sự đáng chú ý là loạt phim mới này cũng có sự hội tụ xen kẽ, và hoàn toàn đơn điệu đối với điểm hội tụ của nó. Điều đó có nghĩa là quá trình này có thể được áp dụng nhiều lần, quảng cáo.
Đồng ý. Nhưng bằng cách nào?
Một số định nghĩa chính thức. Đặt P 1 (n) là số hạng thứ n của dãy thứ nhất, P 2 (n) là số hạng thứ n của dãy thứ hai và tương tự P k (n) số hạng thứ n của thứ thứ k dãy như được định nghĩa ở trên .
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, ...]
Không có gì đáng ngạc nhiên, các hệ số này tuân theo chính xác các hệ số nhị thức và có thể được biểu thị dưới dạng một hàng của Tam giác Pascal. Kể từ khi một dòng độc đoán của Tam giác Pascal là tầm thường để tính toán, một cách tùy tiện 'sâu' loạt có thể được tìm thấy, chỉ đơn giản bằng cách lấy đầu tiên n khoản tiền một phần, nhân mỗi bằng thuật ngữ tương ứng trong k thứ dãy Tam giác Pascal, và chia cho 2 k-1 .
Theo cách này, có thể đạt được độ chính xác của dấu phẩy động 32 bit đầy đủ (~ 14 vị trí thập phân) chỉ với 36 lần lặp, tại thời điểm đó, tổng một phần thậm chí không hội tụ ở vị trí thập phân thứ hai. Điều này rõ ràng là không chơi gôn:
# 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
Nếu bạn muốn độ chính xác tùy ý, điều này có thể đạt được với một chút sửa đổi. Ở đây một lần nữa tính 1000 chữ số:
# 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
Giá trị ban đầu của p bắt đầu lớn hơn 2 10 , để chống lại các hiệu ứng phân chia số nguyên của s / d khi d trở nên lớn hơn, làm cho một vài chữ số cuối cùng không hội tụ. Thông báo ở đây một lần nữa 3318
cũng là:
chữ số * log 2 (10)
Số lần lặp tương tự như thuật toán đầu tiên (giảm một nửa vì t giảm 1 thay vì 2 lần lặp). Một lần nữa, điều này chỉ ra sự hội tụ tuyến tính: một bit nhị phân pi trên mỗi lần lặp. Trong cả hai trường hợp, 3318 lần lặp được yêu cầu để tính 1000 chữ số pi , vì hạn ngạch tốt hơn một chút so với 1 triệu lần lặp để tính 5.
p=lambda:3.14159