Números de Fibonacci
Números de Fibonacci começar com f(1) = 1
e f(2) = 1
(alguns inclui f(0) = 0
mas isso é irrelevante para este desafio. Então, para n > 2
, f(n) = f(n-1) + f(n-2)
.
O desafio
Sua tarefa é encontrar e n
gerar o -ésimo número positivo que pode ser expresso como produto dos números de Fibonacci. Você pode optar por torná-lo indexado em 0 ou 1, o que melhor lhe convier, mas você deve especificar isso em sua resposta.
Além disso, sua resposta deve calcular o 100º termo em um tempo razoável.
Casos de teste
n result corresponding product (for reference)
1 1 1
2 2 2
3 3 3
4 4 2*2
5 5 5
6 6 2*3
7 8 2*2*2 or 8
8 9 3*3
9 10 2*5
10 12 2*2*3
11 13 13
12 15 3*5
13 16 2*2*2*2 or 2*8
14 18 2*3*3
15 20 2*2*5
16 21 21
17 24 2*2*2*3 or 3*8
18 25 5*5
19 26 2*13
20 27 3*3*3
100 315 3*5*21
Referências
code-golf
number-theory
fibonacci
Freira Furada
fonte
fonte
7
não pode ser expresso como o produto dos números de Fibonacci. Portanto, o primeiro1
número necessário é1
, o2
nd é2
, ..., o6
th é6
, mas o7
th é8
.corresponding product
" é apenas para esclarecimento. Seu código precisa apenas gerar o "result
".Respostas:
Geléia ,
26242321 bytesExperimente online!
Como funciona
fonte
Julia, 79 bytes
Experimente online!
fundo
Em Problemas e soluções avançados, H-187: Fibonacci é um quadrado , o proponente mostra que
em que L n indica o n th número Lucas , e que - por outro lado - se
então n é um número de Fibonacci e m é um número de Lucas.
Como funciona
Definimos o operador binário
<|
para nossos propósitos. Ele é indefinido nas versões recentes do Julia, mas ainda é reconhecido como operador pelo analisador.Quando chamado com apenas um argumento ( n ),
<|
inicializa k como 1 . Enquanto n é positivo, subtrai ! K ( 1 se k é um produto dos números de Fibonacci, 0 se não) de n e se chama recursivamente, aumenta k em 1 . Quando n atingir 0 , a quantidade desejada de produtos foi encontrada,<|
retornando o valor anterior de k , ou seja, ~ -k = k - 1 .O operador unário
!
, redefinido como um teste para produtos com número de Fibonacci, realiza sua tarefa da seguinte maneira.Se k = 1 , k é um produto dos números de Fibonacci. Nesse caso, aumentamos o valor de retorno
any(...)
para a potência ~ -k = k - 1 = 0 , então o resultado será 1 .Se k> 1 , o resultado será o valor de
any(....)
, que retornará true se e somente se o predicado√(5i^2+[4,-4])%1∋k%i<!(k÷i)
retornar true para algum número inteiro i, de modo que 2 ≤ i ≤ k .As condições encadeadas no predicado retêm se
k%i
pertencem√(5i^2+[4,-4])%1
ek%i
são menores que!(k÷i)
.√(5i^2+[4,-4])%1
toma a raiz quadrada de 5i 2 + 4 e 5i 2 - 4 e calcula seus resíduos módulo 1 . Cada módulo é 0 se o número correspondente for um quadrado perfeito e um número positivo menor que 1 caso contrário.Como
k%i
retorna um número inteiro, ele só pode pertencer à matriz de módulos se k% i = 0 (ou seja, k é divisível por i ) e pelo menos um entre 5i 2 + 4 e 5i 2 - 4 é um quadrado perfeito (ou seja, i é um número de Fibonacci).!(k÷i)
recursivamente chama 1 com o argumento k ÷ i (divisão inteira), que será maior que 0 se e somente se k ÷ i for um produto dos números de Fibonacci.Por indução ! tem a propriedade desejada.
fonte
Python, 90 bytes
A principal função
g
gera ok
produto Fibonacci, indexado em 1. Ele calculag(100)
que315
quase que instantaneamente. Isso ocorre com uma receita recursiva geral de contagem de números,n
procurandok
instâncias que satisfazem a funçãof
. Cada uma dessas instâncias diminui a contagem necessáriak
até atingir0
.A função auxiliar
f
testa um número por ser um produto de Fibonacci. Ele gera recursivamente os números de Fibonacci em seus argumentos opcionaisa
eb
. Emite "yes" se qualquer um dos seguintes for verdadeiro:n<2
. Isso implican==1
, o produto trivial)n%a<f(n/a)
. Isso requern%a==0
ef(n/a)==True
, ou seja,n
é um múltiplo do número de Fibonaccia
, e a remoção desse fatora
ainda produz um produto de Fibonacci.n-a>0<f(n,b,a+b)
, equivalente an>a and f(n,b,a+b)
. Verifica se o número atual de Fibonacci sendo testado não é pelo menosn
e se existe um número maior de Fibonacci. Agradecemos a Dennis por salvar 2 bytes usando o curto-circuito da desigualdade em vez deand
.A função
g
pode ser um byte mais curto quantose
g(k)
é sempre no máximok*k
, o que não tenho certeza é assintoticamente verdadeiro. Um limite de2**k
basta, mas depoisg(100)
leva muito tempo. Talvez, em vez disso, o recursivo deg
possa ser feitof
.fonte
g(k)
excedek*k
quandok = 47000
e acima.Perl 6 ,
9593 bytes(Índice baseado em 0)
Teste:
Explicação:
fonte
Python 3,
175170148 bytesGraças a @Dennis por -22 bytes
Pega a entrada de STDIN e imprime em STDOUT. Este é um indexado. A computação do 100º termo leva aproximadamente um décimo de segundo.
Como funciona
Experimente no Ideone
fonte
Python 2,
120107 bytesTeste em Ideone .
Como funciona
Inicializamos F como a tupla (2, 3) (os dois primeiros números de Fibonacci maiores que 1 ), k como 0 e n como um número inteiro lido em STDIN.
Enquanto n é positivo, fazemos o seguinte:
Acrescentar o próximo número de Fibonacci, calculado como F [k] + F [-1] , isto é, a soma dos dois últimos elementos de F para o tuplo F .
Incremento k .
Subtraia g (k) de n .
g retorna 1 , se e somente se k é um produto de números de Fibonacci, assim uma vez que n atinge 0 , k é o n th número de Fibonacci e imprimi-lo para stdOut.
g atinge seu objetivo da seguinte maneira.
Se k for 1 , é um produto dos números de Fibonacci e
1/k
garante que retornemos 1 .Se k é maior que 1 , que chamamos
g(k/i)
de forma recursiva para todos os números de Fibonacci i em F .g(k/i)
testa recursivamente se k / i é um produto com número de Fibonacci. Seg(k/i)
retornar 1 e i dividir k uniformemente, k% i = 0 e a condição fork%i<g(k/i)
mantida, então g retornará 1 se e somente se houver um número de Fibonacci tal que k seja o produto desse número de Fibonacci e outro produto dos números de Fibonacci.fonte
JavaScript (ES6), 136
É bem lento assim, calculando o termo 100 em cerca de 8 segundos no meu PC.
Menos golfe e mais rápido também (evitando
eval
)Teste
fonte
Haskell, 123 bytes
Muito preguiçoso, muito infinito!
Possivelmente não da forma mais curta, mas eu tive que tentar essa abordagem, uma generalização de um método bastante conhecido para calcular a lista de números hamming.
f
é a lista de números de fibonacci a partir de 2. Por uma questão de brevidade, digamos que um lol (lista de listas) é uma lista infinita de listas infinitas ordenadas, ordenadas pelos seus primeiros elementos.m
é uma função para mesclar um lol, removendo duplicatas. Ele usa duas funções auxiliares de infix.?
insere uma lista classificada infinita em um lol.#
remove um valor de um lol que pode aparecer como cabeçalho das primeiras listas, reinserindo a lista restante com?
.Finalmente,
l
é a lista de números que são produtos de números de fibonacci, definida como 1, seguida pela mesclagem de todas as listas obtidas pela multiplicaçãol
por um número de fibonacci. A última linha indica a função necessária (como de costume, sem vinculá-la a um nome, portanto, não a copie como está) usando!!
para indexar na lista, o que torna a função indexada em 0.Não há problema em calcular o número 100 ou 100.000.
fonte
Casca , 13 bytes
Observe que Husk é mais novo que esse desafio. No entanto, ele e a função mais útil para este golfe (
Ξ
) não foram criados com esse desafio em mente.Experimente online!
Versão mais eficiente para 14 bytes:
Experimente online!
fonte
Python 2,
129128125123121 bytesTeste em Ideone .
fonte