Visto que houve muitos desafios normais de Fibonacci, decidi que talvez fosse interessante calcular a constante recíproca de Fibonacci - a saber, a soma dos recíprocos da sequência de Fibonacci.
O desafio é calcular a constante recíproca de Fibonacci com o número de séries de Fibonacci para usar o dígito dado como entrada, ou seja, uma entrada de 10 meios para calcular com base nos recíprocos dos 10 primeiros números de Fibonacci. No provável caso de empate, o código mais curto vence.
O vencedor será escolhido em três semanas através das regras padrão do código de golfe.
φ
está embutido. (não APL para variar)Respostas:
K (19)
(ou 17 se você pular a definição como uma função)
Testado em Kona.
Basicamente, ele gera os primeiros x valores da sequência de fibonacci em uma matriz (sem o uso de componentes internos), divide 1 por cada valor de toda a matriz, transpõe e resume.
(graças a @tmartin pelo melhor método de soma)
fonte
{+/*+%x(|+\)\|!2}
Perl - 35 bytes
Uso da amostra:
Análise Adicional
É interessante notar que a soma
é convergente. Supondo que desejássemos calcular alguns milhares de dígitos, a abordagem ingênua é quase suficiente. A convergência é bastante lenta no início, mas acelera rapidamente, de modo que 1000 dígitos levam apenas cerca de 4800 termos. Uma implementação de exemplo de Python pode ser:
que após um segundo ou mais produz:
(Os últimos quatro dígitos não convergem completamente, mas vamos ignorá-lo por enquanto.)
Vamos tentar acelerar um pouco a convergência. Um truque padrão é usar a transformação de Euler . Após expansão e simplificação, isso produz um resultado melhor:
Deveria ser bastante claro por que isso converge mais rapidamente; cada termo tem 3 termos no denominador em vez de apenas um. O cálculo de 1000 dígitos requer apenas 1600 (um terço do número) de termos:
Resultado:
(Aqui, novamente, os últimos 4 dígitos não convergem.)
Ainda não terminamos. Se combinarmos termos adjacentes, terminamos com o seguinte:
A fatoração de cada termo do restante da soma fornece a expressão aninhada:
Agora estamos chegando a algum lugar. Observe que os numeradores seguem OEIS A206351 (com exceção do primeiro termo, que é dobrado):
e os denominadores seguem OEIS A081016 (alterado por um termo):
Cada um deles tem relações de recorrência muito simples, a saber:
e
respectivamente. Juntando tudo, descobrimos que precisamos de apenas 800 iterações para 1000 dígitos:
quais saídas:
(Aqui, finalmente, os últimos 4 dígitos convergem corretamente.)
Mas isso ainda não é tudo. Se observarmos os valores intermediários para s , descobrimos que ele converge para um valor completamente diferente antes de convergir no ponto de convergência real. O motivo para isso é o seguinte:
Resolvendo para um s estável , descobrimos que:
Como essa é uma raiz simples, podemos usar o Método de Newton para chegar até lá e depois pular em um ponto muito mais tarde na iteração. Apenas cerca de 400 dígitos de precisão são necessários (como as de b e c valores não são maiores do que qualquer que de qualquer forma), que pode ser alcançada com apenas 7 iterações, enquanto poupando 320 iterações do ciclo principal:
A saída é idêntica à anterior, o tempo de execução é de cerca de 0,02s no meu sistema usando o PyPy v2.1. Embora precise de um décimo do número de iterações que o original, é significativamente mais rápido que 10x devido à multiplicação e divisão por termos muito menores. Eu não acho que muito mais possa ser alterado, embora eu ficaria feliz em ser mostrado errado.
fonte
Mathematica (32 caracteres sem Fibonacci interno)
Aqui eu usei a fórmula de arredondamento para números de Fibonacci
Onde
φ
está a proporção áurea.fonte
Kona (
2521)Provavelmente poderia ser reduzido por especialistas, mas ainda estou aprendendo o idioma.
O último não demorou mais que os outros.
fonte
%
como a função inversa ao invés de fazer1.%
-{+/%(x(|+\)\1 1)[;1]}
por 21 caracteresf 0
resulta em1.0
,f 1 -> 2.0
e assim por diante.Mathematica
3024Com 6 caracteres salvos, graças a ybeltukov.
Antes de adicionar os termos:
Com adição incluída:
fonte
Fibonacci
éListable
:) Pode ser reduzido paraTr[1/Fibonacci@Range@#]&
APL, 21 caracteres / bytes *
Exemplo
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
*: APL pode ser escrito na sua própria (legado) de conjunto de caracteres de byte único que mapeia símbolos APL para os 128 valores de bytes superiores. Portanto, para fins de pontuação, um programa de N caracteres que usa apenas caracteres ASCII e símbolos APL pode ser considerado como N bytes.
fonte
Javascript, 33
Entrada:
n = 10
Baseado no meu primeiro post no Perl, aqui está o resultado diretamente do Google Chrome Console .
fonte
K, 22
...
fonte
GTB , 35
É executado em uma calculadora TI-84
1
dentroY
e0
dentroX
N
como entradaFor
loopX
Y
dentroZ
eX+Y
dentroY
Z
emX
For
ciclofonte
BC - 116
chame r (n) com n para resolver. A precisão pode ser definida arbitrariamente, portanto, esta é a solução mais precisa.
fonte
PERL,
6243Editar:
Depois de mais algum tempo analisando meu código, pude salvar 19 caracteres:
fonte
Quarto, 64
uso:
fonte
Python (
5551)No modo interativo:
fonte
Perl 6 , 27 bytes
Experimente online!
alternativamente
Experimente online!
fonte
Japonês
-mx
, 6 bytesTente
fonte
C # (.NET Core) , 66 bytes
Experimente online!
Não é possível usar carros alegóricos por imprecisão.
Exemplo em que input = 8:
Ungolfed:
fonte
RPL (HP 49G / G + / 50g), 50 bytes
Exemplos:
10 -> 3.33046904076
11 -> 3.34170499582
30 -> 3.35988372158
55 -> 3.35988566622
Em teoria, a soma dos primeiros 55 dígitos daria 12 dígitos corretos. O último dígito deve ser '4' em vez de '2'. Isso deve ser corrigido adicionando os termos ao contrário, mas o código seria um pouco mais longo.
Se a constante fosse calculada com 1000 casas decimais usando a definição, a soma deveria ser realizada pelo menos nos primeiros 4790 termos, o que levaria muito tempo no HP 50g, se possível. Para esta tarefa, é necessário um método mais eficiente, como o usado no seguinte programa RPL (464 bytes, soma de verificação # 207Eh) cujo argumento é o número desejado de casas decimais:
1000 RFC ->
3)3598856662431775531720113029189271796889051337319684864955538153251303189966833836154162164567900872970453429288539133041367890171008836795913517330771190785803335503325077531875998504871797778970060395645092153758927752656733540240331694417992939346109926262579646476518686594497102165589843608814726932495910794738736733785233268774997627277579468536769185419814676687429987673820969139012177220244052081510942649349513745416672789553444707777758478025963407690748474155579104200675015203410705335285129792635242062267537568055761955669720848843854407983324292851368070827522662579751188646464096737461572387236295562053612203024635409252678424224347036310363201466298040249015578724456176000319551987905969942029178866949174808096746523682654086938399069873211752166957063859411814553647364268782462926166650100098903804823359519893146150108288726392887669917149304053057745574321561167298985617729731395370735291966884327898022165047585028091806291002444277017460241040417786069190065037142835294
(22 min 23 s, na verdadeira HP 50g)
Para mil dígitos, os 50 primeiros termos da série e outros 50 termos de uma fração contínua são avaliados, dois de cada vez em apenas 25 iterações (48 termos de cada um seriam suficientes). Um programa DECIMAL BASIC equivalente leva apenas 10 milissegundos no meu computador (CPU Intel® Core® Duo E4700 a 2,6 GHz).
fonte
JAEL,
97 bytesAlterar os diacríticos de um caractere para outro me deu 1 byte
Ainda trabalhando na codificação SBCS.
Explicação (gerada automaticamente):
fonte
u.
. No tópico de um SBCS, você pode ter problemas porque seus documentos listam mais de 600 comandos ou combinações de comandos e um idioma do SBCS pode ter apenas 256 comandos de byte único. Por outro lado, há um grande número de um inútil um traduções para ...Gelatina , 5 bytes
Experimente online!
Como funciona
fonte
cQuents ,
1311 bytesExperimente online!
Explicação
fonte