Exiba os poderes de Phi com precisão de Fibonacci


9

Escreva um código que use um número inteiro não negativo n e produza a enésima potência de Phi (ϕ, a proporção áurea, aproximadamente 1,61803398874989) com o mesmo número de dígitos decimais que o enésimo número de Fibonacci.

Seu código deve produzir a sequência correta de dígitos para todas as entradas com no mínimo 10 (55 dígitos decimais). A saída deve ser decimal legível por humanos. Você pode optar por arredondar o último dígito para o valor mais próximo ou truncar o valor. Especifique qual o seu código usa.

n e saída, até 10, arredondando para baixo:

 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 e saída, até 10, arredondando para o valor mais próximo:

 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

O sétimo número de Fibonacci é 13; portanto, a saída para n = 7, ϕ 7 tem 13 casas decimais. Você não deve truncar zeros à direita que exibam poucos dígitos; veja a saída 6 na primeira tabela, que termina em um único zero para manter a precisão decimal em 8 dígitos.

Talvez como um bônus, diga qual é o número mais alto que seu programa pode gerar corretamente.


E os idiomas que não conseguem lidar com tantas casas decimais? Eu tenho uma solução Pyth de 24 bytes aqui que só funciona até n = 7, pois não consigo exibir mais de 15 casas decimais. Devo postá-lo de qualquer maneira?
Denker

@ DenkerAffe Claro, você pode publicá-lo, mas com uma nota dizendo que não é válido porque não pode executar os três últimos casos de teste. Pode ser uma inspiração para alguém adicionar precisão à sua resposta!
CJ Dennis

Respostas:


3

dc, 26 bytes

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

Devido à precisão inicial de 99 dígitos após a vírgula, isso funcionará na entrada 11 . Uma precisão dinâmica (ou estática mais alta) é possível, mas elevaria a contagem de bytes.

Casos de teste

$ 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

Como funciona

Como a saída desejada é φ n , podemos calcular o número de Fibonacci F (n) como ⌊φ n ÷ √5 + 0,5⌋ com pouco esforço 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.

0

Mathematica, 50 bytes

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

Solução básica. Arredonda para o valor mais próximo. Ainda verificando o valor mais alto que não fará com que meu computador fique sem memória. A entrada 32funciona, mas leva 45 minutos e usa 16GiB de RAM. No entanto, dado tempo e memória infinitos, isso poderia, teoricamente, ser executado por qualquer valor.


11
Você postaria a saída, por favor? Preciso trapacear e usar sua saída para adicionar os últimos casos de teste. Qual o caminho que você está contornando? Para baixo ou para o mais próximo? "Recursos infinitos" é bom o suficiente. Não exijo que você fique sem memória!
CJ Dennis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.