Perl - 35 byte
print!map$\-=1/($%+=$.=$%-$.),0..<>
Sử dụng mẫu:
$ echo 10 | perl inv-fib-sum.pl
3.34170499581934
Phân tích sâu hơn
Thật thú vị khi lưu ý rằng tổng
là hội tụ. Giả sử chúng tôi muốn tính toán vài nghìn chữ số hoặc hơn, cách tiếp cận ngây thơ là gần như đủ. Sự hội tụ ban đầu khá chậm, nhưng tăng tốc nhanh, do đó 1000 chữ số chỉ mất khoảng 4800 thuật ngữ. Một triển khai Python mẫu có thể là:
a=[1,1]
for i in range(4800):a=[a[0]+a[1]]+a
z=10**1000
print sum(map(lambda i:z/i,a))
mà sau một giây xuất ra:
33598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142832933
(Bốn chữ số cuối không hoàn toàn hội tụ, nhưng chúng ta sẽ bỏ qua điều đó ngay bây giờ.)
Hãy cố gắng tăng tốc độ hội tụ một chút. Một mẹo tiêu chuẩn là sử dụng Biến đổi của Euler's . Sau khi mở rộng và đơn giản hóa, điều này tạo ra một kết quả đẹp hơn:
Nó khá rõ ràng tại sao điều này hội tụ nhanh hơn; mỗi thuật ngữ có 3 thuật ngữ trong mẫu số thay vì chỉ một. Tính 1000 chữ số chỉ mất 1600 (một phần ba số thuật ngữ):
a=[1,1]
for i in range(1601):a=[a[0]+a[1]]+a
z=10**1000
print sum(map(lambda i:(-1)**i*z/(a[i]*a[i+1]*a[i+2]),range(1601)))
Đầu ra:
3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142834500
(Ở đây một lần nữa, 4 chữ số cuối cùng không hội tụ.)
Chúng ta vẫn chưa hoàn thành. Nếu chúng tôi kết hợp các thuật ngữ liền kề, chúng tôi sẽ kết thúc bằng các điều sau:
Bao thanh toán cho mỗi thuật ngữ từ phần còn lại của tổng kết cho biểu thức lồng nhau:
Bây giờ chúng tôi đang nhận được ở đâu đó. Lưu ý rằng các tử số theo OEIS A206351 (ngoại trừ thuật ngữ đầu tiên, được nhân đôi):
và mẫu số theo OEIS A081016 (được thay đổi bởi một thuật ngữ):
Mỗi trong số này có quan hệ tái phát rất đơn giản, cụ thể là:
và
tương ứng. Đặt tất cả lại với nhau, chúng tôi thấy rằng chúng tôi chỉ cần 800 lần lặp cho 1000 chữ số:
b,c=[16,3,1],[273,40,3]
for i in range(800):b,c=[7*b[0]-b[1]-4]+b,[7*c[0]-c[1]-1]+c
s=z=10**1000
for x,y in zip(b,c):s=(z+s)*x/y
print s
đầu ra nào:
3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142835294
(Ở đây, cuối cùng, 4 chữ số cuối cùng hội tụ chính xác.)
Nhưng đó vẫn chưa phải là tất cả. Nếu chúng ta quan sát các giá trị trung gian cho s , chúng ta thấy rằng nó hội tụ đến một giá trị khác hoàn toàn trước khi hội tụ vào điểm hội tụ thực tế. Lý do cho điều này là như sau:
Giải quyết cho một s ổn định , chúng tôi thấy rằng:
Bởi vì đây là một gốc đơn giản, chúng ta có thể sử dụng Phương pháp của Newton để đưa chúng ta đến gần đó, và sau đó nhảy vào một điểm sau đó trong vòng lặp. Chỉ cần khoảng 400 chữ số chính xác (vì giá trị b và c không lớn hơn giá trị nào), có thể đạt được chỉ với 7 lần lặp, trong khi lưu 320 lần lặp của vòng lặp chính:
b,c=[16,3,1],[273,40,3]
for i in range(480):b,c=[7*b[0]-b[1]-4]+b,[7*c[0]-c[1]-1]+c
z=10**1000;s=z/17
for i in range(7):s-=(s*s+s*z-z*z/16)/(2*s+z)
for x,y in zip(b,c):s=(z+s)*x/y
print s
Đầu ra giống hệt với lần trước, thời gian chạy khoảng 0,02 giây trên hệ thống của tôi bằng PyPy v2.1. Mặc dù nó cần 1/10 số lần lặp như ban đầu, nhưng nó nhanh hơn đáng kể so với 10 lần do nhân và chia cho các số hạng nhỏ hơn nhiều. Tôi không nghĩ nhiều hơn có thể được điều chỉnh từ nó, mặc dù tôi rất vui khi được hiển thị sai.
φ
là một nội dung. (không phải APL cho một sự thay đổi)