Perl - 35 byte
print!map$\-=1/($%+=$.=$%-$.),0..<>
Penggunaan sampel:
$ echo 10 | perl inv-fib-sum.pl
3.34170499581934
Analisis lebih lanjut
Sangat menarik untuk dicatat bahwa jumlahnya
konvergen. Andaikata kita ingin menghitung beberapa ribu digit atau lebih, pendekatan naif itu hampir mencukupi. Konvergensi pada awalnya cukup lambat, tetapi mempercepat dengan cepat, sehingga 1000 digit hanya membutuhkan sekitar 4800 istilah. Contoh implementasi Python mungkin:
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))
yang setelah satu atau dua keluaran:
33598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142832933
(Empat digit terakhir tidak cukup konvergen, tapi kami akan mengabaikannya untuk saat ini.)
Mari kita coba sedikit mempercepat konvergensi. Trik standar adalah dengan menggunakan Transform Euler . Setelah ekspansi dan penyederhanaan, ini menghasilkan hasil yang lebih bagus:
Seharusnya cukup jelas mengapa ini bertemu lebih cepat; setiap istilah memiliki 3 istilah dalam penyebut daripada hanya satu. Menghitung 1000 digit hanya membutuhkan istilah 1600 (sepertiga lebih banyak):
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)))
Keluaran:
3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142834500
(Di sini lagi, 4 digit terakhir tidak bertemu.)
Kami belum selesai. Jika kami menggabungkan istilah yang berdekatan, kami berakhir dengan yang berikut:
Anjak setiap istilah dari sisa penjumlahan memberikan ekspresi bersarang:
Sekarang kita pergi ke suatu tempat. Perhatikan bahwa pembilang dari mengikuti OEIS A206351 (dengan pengecualian dari istilah pertama, yang dua kali lipat):
dan penyebutnya mengikuti OEIS A081016 (digeser satu istilah):
Masing-masing memiliki hubungan perulangan yang sangat sederhana, yaitu:
dan
masing-masing. Menyatukan semuanya, kami menemukan bahwa kami hanya membutuhkan 800 iterasi untuk 1000 digit:
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
yang keluaran:
3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142835294
(Di sini, akhirnya, 4 digit terakhir bertemu dengan benar.)
Tapi itu masih belum semuanya. Jika kita mengamati nilai-nilai perantara untuk s , kami menemukan bahwa nilai itu konvergen ke nilai yang berbeda sepenuhnya sebelum konvergen pada titik konvergensi yang sebenarnya. Alasan untuk ini adalah sebagai berikut:
Pemecahan untuk stabil s , kita menemukan bahwa:
Karena ini adalah root sederhana, kita dapat menggunakan Metode Newton untuk membawa kita ke sebagian besar jalan ke sana, dan kemudian melompat pada titik yang jauh lebih belakangan dalam iterasi. Hanya diperlukan sekitar 400 digit presisi (karena nilai b dan c tidak lebih besar dari itu), yang dapat dicapai hanya dengan 7 iterasi, sekaligus menghemat 320 iterasi dari loop utama:
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
Output identik dengan yang sebelumnya, runtime sekitar 0,02s pada sistem saya menggunakan PyPy v2.1. Meskipun perlu sepersepuluh jumlah iterasi seperti aslinya, ini jauh lebih cepat dari 10x karena mengalikan dan membaginya dengan istilah yang jauh lebih kecil. Saya tidak berpikir banyak yang bisa diubah, meskipun saya akan senang ditampilkan salah.
φ
builtin. (bukan APL untuk perubahan)