Dado que ha habido una gran cantidad de desafíos normales de Fibonacci, decidí que podría ser interesante calcular la constante de Fibonacci recíproca , es decir, la suma de los recíprocos de la secuencia de Fibonacci.
El desafío es calcular la constante de Fibonacci recíproca con el número de series de Fibonacci para usar el dígito dado como entrada, es decir, una entrada de 10 medios para calcular en función de los recíprocos de los primeros 10 números de Fibonacci. En el caso probable de un empate, gana el código más corto.
El ganador será elegido en tres semanas a través de reglas estándar de código de golf.
φ
hay una construcción. (no APL para un cambio)Respuestas:
K (19)
(o 17 si omite definirlo como una función)
Probado en Kona.
Básicamente, genera los primeros valores x de la secuencia de Fibonacci en una matriz (sin usar componentes integrados), divide 1 por cada valor de toda la matriz, la transpone y la resume.
(gracias a @tmartin por el mejor método de suma)
fuente
{+/*+%x(|+\)\|!2}
Perl - 35 bytes
Uso de la muestra:
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:
que después de un segundo más o menos sale:
(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):
Salida:
(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:
que salidas:
(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:
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.
fuente
Mathematica (32 caracteres sin Fibonacci incorporado)
Aquí utilicé la fórmula de redondeo para los números de Fibonacci
¿Dónde
φ
está la proporción áurea?fuente
Kona (
2521)Probablemente podría ser reducido por expertos, pero todavía estoy aprendiendo el idioma.
El último en realidad no tomó más tiempo que los demás.
fuente
%
como función recíproca en lugar de hacerlo1.%
,{+/%(x(|+\)\1 1)[;1]}
durante 21 caracteresf 0
resultados en1.0
,f 1 -> 2.0
y así sucesivamente.Mathematica
3024Con 6 personajes guardados gracias a ybeltukov.
Antes de agregar los términos:
Con la adición incluida:
fuente
Fibonacci
esListable
:) Se puede reducir aTr[1/Fibonacci@Range@#]&
APL, 21 caracteres / bytes *
Ejemplo
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ *: APL puede escribirse en su propio juego de
caracteres de un solo byte (heredado) que asigna símbolos APL a los valores superiores de 128 bytes. Por lo tanto, para fines de puntuación, un programa de N caracteres que solo usa caracteres ASCII y símbolos APL puede considerarse que tiene N bytes de longitud.
fuente
Javascript, 33
Entrada:
n = 10
Basado en mi primera publicación en Perl, aquí está el resultado directamente de la Consola Google Chrome .
fuente
K, 22
...
fuente
GTB , 35
Se ejecuta en una calculadora TI-84
1
enY
y0
enX
N
como entradaFor
bucleX
Y
enZ
yX+Y
enY
Z
enX
For
ciclofuente
BC - 116
llame a r (n) con n para resolver. La precisión se puede establecer de forma arbitraria, por lo que esta es la solución más precisa.
fuente
PERL,
6243Editar:
Después de más tiempo mirando mi código, pude guardar 19 caracteres:
fuente
Adelante, 64
uso:
fuente
Pitón (
5551)En modo interactivo:
fuente
Perl 6 , 27 bytes
Pruébalo en línea!
Alternativamente
Pruébalo en línea!
fuente
Japt
-mx
, 6 bytesIntentalo
fuente
C # (.NET Core) , 66 bytes
Pruébalo en línea!
No se pueden usar flotadores debido a la imprecisión.
Ejemplo donde input = 8:
Sin golf:
fuente
RPL (HP 49G / G + / 50g), 50 bytes
Ejemplos:
10 -> 3.33046904076
11 -> 3.34170499582
30 -> 3.35988372158
55 -> 3.35988566622
En teoría, la suma de los primeros 55 dígitos daría 12 dígitos correctos. El último dígito debe ser '4' en lugar de '2'. Esto debería solucionarse sumando los términos al revés, pero el código sería un poco más largo.
Si la constante se calculara a 1000 decimales utilizando la definición, la suma debería realizarse al menos a los primeros 4790 términos, lo que tomaría demasiado tiempo en el HP 50g, si es posible. Para esta tarea se requiere un método más eficiente, como el utilizado en el siguiente programa RPL (464 bytes, suma de comprobación # 207Eh) cuyo argumento es el número deseado de lugares decimales:
1000 RFC ->
3)3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142835294
(22 min 23 seg, en el HP 50g real)
Para mil dígitos se evalúan los primeros 50 términos de la serie más otros 50 términos de una fracción continua, dos a la vez en solo 25 iteraciones (sin embargo, 48 términos de cada uno habrían sido suficientes). Un programa DECIMAL BASIC equivalente toma solo 10 milisegundos en mi computadora (Intel (R) Core (TM) Duo CPU E4700 @ 2.6 GHz).
fuente
JAEL,
97 bytesCambiar los signos diacríticos de un personaje a otro me dio 1 byte
Todavía estoy trabajando en la codificación SBCS.
Explicación (generada automáticamente):
fuente
u.
. Sobre el tema de un SBCS, puede tener problemas porque sus documentos enumeran más de 600 comandos o combinaciones de comandos, y un lenguaje SBCS solo puede tener 256 comandos de un solo byte. Por otro lado, hay una gran cantidad de traducciones inútiles uno a uno ...Jalea , 5 bytes
Pruébalo en línea!
Cómo funciona
fuente
cQuents ,
1311 bytesPruébalo en línea!
Explicación
fuente