Perl - 35 bytes
print!map$\-=1/($%+=$.=$%-$.),0..<>
Uso de la muestra:
$ echo 10 | perl inv-fib-sum.pl
3.34170499581934
Análisis mas extenso
Es interesante notar que la suma
es convergente Suponiendo que quisiéramos calcular unos pocos miles de dígitos, el enfoque ingenuo es casi suficiente. La convergencia es bastante lenta al principio, pero se acelera rápidamente, por lo que 1000 dígitos solo toman alrededor de 4800 términos. Una implementación de Python de muestra podría ser:
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))
que después de un segundo más o menos sale:
33598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142832933
(Los últimos cuatro dígitos no convergen del todo, pero lo ignoraremos por ahora).
Intentemos acelerar un poco la convergencia. Un truco estándar es usar la transformación de Euler . Después de la expansión y la simplificación, esto produce un mejor resultado:
Debería ser bastante evidente por qué esto converge más rápidamente; cada término tiene 3 términos en el denominador en lugar de solo uno. Calcular 1000 dígitos solo requiere 1600 (un tercio de los términos):
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)))
Salida:
3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142834500
(Aquí nuevamente, los últimos 4 dígitos no convergen).
Aún no hemos terminado. Si combinamos términos adyacentes, terminamos con lo siguiente:
Factorizar cada término del resto de la suma da la expresión anidada:
Ahora estamos llegando a alguna parte. Observe que los numeradores de siguen OEIS A206351 (con la excepción del primer término, que se duplica):
y los denominadores siguen OEIS A081016 (desplazado por un término):
Cada uno de estos tiene relaciones de recurrencia muy simples, a saber:
y
respectivamente. En conjunto, descubrimos que solo necesitamos 800 iteraciones por 1000 dígitos:
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
que salidas:
3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142835294
(Aquí, finalmente, los últimos 4 dígitos convergen correctamente).
Pero eso todavía no es todo. Si observamos los valores intermedios para s , encontramos que converge a un valor completamente diferente antes de converger en el punto de convergencia real. La razón de esto es la siguiente:
Resolviendo un s estable , encontramos que:
Debido a que esta es una raíz simple, podemos usar el Método de Newton para llevarnos la mayor parte del camino y luego saltar a un punto mucho más tarde en la iteración. Sólo alrededor de 400 dígitos de precisión son necesarios (como los b y c valores no son cualquier mayor que el de todos modos), que se puede conseguir con sólo 7 iteraciones, mientras que el ahorro 320 iteraciones del bucle principal:
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
La salida es idéntica a la anterior, el tiempo de ejecución es de aproximadamente 0.02s en mi sistema usando PyPy v2.1. Aunque necesita una décima parte del número de iteraciones que el original, es significativamente más rápido que 10x debido a la multiplicación y división por términos mucho más pequeños. No creo que se pueda modificar mucho más, aunque estaría feliz de que me muestren mal.
φ
hay una construcción. (no APL para un cambio)