Mostrar poderes de Phi con precisión Fibonacci

9

Escriba un código que tome un número entero no negativo n y genere la enésima potencia de Phi (ϕ, la proporción áurea, aproximadamente 1.61803398874989) con el mismo número de dígitos decimales que el enésimo número de Fibonacci.

Su código debe producir la secuencia correcta de dígitos para todas las entradas de hasta al menos 10 (55 dígitos decimales). La salida debe ser decimal legible por humanos. Puede elegir redondear el último dígito al valor más cercano o truncar el valor. Por favor, especifique cuál usa su código.

n y salida, hasta 10, redondeando hacia abajo:

 0   1
 1   1.6
 2   2.6
 3   4.23
 4   6.854
 5  11.09016
 6  17.94427190
 7  29.0344418537486
 8  46.978713763747791812296
 9  76.0131556174964248389559523684316960
10 122.9918693812442166512522758901100964746170048893169574174

n y salida, hasta 10, redondeando al valor más cercano:

 0   1
 1   1.6
 2   2.6
 3   4.24
 4   6.854
 5  11.09017
 6  17.94427191
 7  29.0344418537486
 8  46.978713763747791812296
 9  76.0131556174964248389559523684316960
10 122.9918693812442166512522758901100964746170048893169574174

El séptimo número de Fibonacci es 13, por lo que la salida para n = 7, ϕ 7 , tiene 13 decimales. No debe truncar los ceros finales que mostrarían muy pocos dígitos; vea la salida para 6 en la primera tabla, que termina en un solo cero para mantener la precisión decimal en 8 dígitos.

Tal vez como un bono, diga cuál es el número más alto que su programa puede generar correctamente.

CJ Dennis
fuente
¿Qué pasa con los idiomas que no pueden manejar tantos lugares decimales? Obtuve una solución Pyth de 24 bytes que solo funciona hasta n = 7, ya que no puedo mostrar más de 15 decimales. ¿Debo publicarlo de todos modos?
Denker
@DenkerAffe Claro, puedes publicarlo pero con una nota que dice que no es válido porque no puede hacer los últimos tres casos de prueba. ¡Puede ser una inspiración para alguien agregar precisión a su respuesta!
CJ Dennis

Respuestas:

3

cc, 26 bytes

99k5v1+2/?^d5v/.5+0k1/k1/p

Debido a la precisión inicial de 99 dígitos después de la coma, esto funcionará con la entrada 11 . Es posible una precisión dinámica (o estática más alta), pero elevaría el recuento de bytes.

Casos de prueba

$ for ((i = 0; i < 11; i++)) { dc -e '99k5v1+2/?^d5v/.5+0k1/k1/p' <<< $i; }
1
1.6
2.6
4.23
6.854
11.09016
17.94427190
29.0344418537486
46.978713763747791812296
76.0131556174964248389559523684316960
122.9918693812442166512522758901100964746170048893169574174

Cómo funciona

Como la salida deseada es φ n , podemos calcular el número de Fibonacci F (n) como ⌊φ n ÷ √5 + 0.5⌋ con poco esfuerzo adicional.

99k                         Set the precision to 99.
   5v                       Compute the square root of 5.
     1+                     Add 1.
       2/                   Divide by 2.
                            This pushes the golden ratio.
         ?                  Read the input from STDIN.
          ^                 Elevate the golden ratio to that power.
           d                Push a copy.
            5v/             Divide it by the square root of 5.
               .5+          Add 0.5.
                  0k        Set the precision to 0.
                    1/      Divide by 1, truncating to the desired precision.
                            This pushes F(n).
                      k     Set the precision to F(n).
                       1/   Divide by 1, truncating to the desired precision.
                         p  Print.
Dennis
fuente
0

Mathematica, 50 bytes

N[GoldenRatio^#,2^#]~NumberForm~{2^#,Fibonacci@#}&

Solución básica Redondea al valor más cercano. Todavía verifico el valor más alto que no hará que mi computadora se quede sin memoria. La entrada 32funciona, pero tarda 45 minutos y usa 16GiB de RAM. Sin embargo, dado el tiempo y la memoria infinitos, en teoría esto podría funcionar para cualquier valor.

LegionMammal978
fuente
1
¿Publicarías la salida por favor? Necesito hacer trampa y usar su salida para agregar los últimos casos de prueba. ¿De qué manera estás redondeando? ¿Abajo o al más cercano? "Recursos infinitos" es lo suficientemente bueno. ¡No necesito que te quedes sin memoria!
CJ Dennis