Números de Fibonacci
Los números de Fibonacci comienzan con f(1) = 1
y f(2) = 1
(algunos incluyen f(0) = 0
, pero esto es irrelevante para este desafío. Entonces, para n > 2
, f(n) = f(n-1) + f(n-2)
.
El reto
Su tarea es encontrar y generar el n
enésimo número positivo que se puede expresar como productos de los números de Fibonacci. Puede elegir que sea indexado 0 o indexado, lo que más le convenga, pero debe especificar esto en su respuesta.
Además, su respuesta debe calcular el centésimo término en un tiempo razonable.
Casos de prueba
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
Referencias
code-golf
number-theory
fibonacci
Monja permeable
fuente
fuente
7
no se puede expresar como el producto de los números de Fibonacci. Por lo tanto, el1
número requerido de st es1
, el2
nd es2
, ..., el6
th es6
, pero el7
th es8
.corresponding product
" es solo para aclarar. Su código solo necesita generar el "result
".Respuestas:
Gelatina ,
26242321 bytesPruébalo en línea!
Cómo funciona
fuente
Julia, 79 bytes
Pruébalo en línea!
Fondo
En Problemas y soluciones avanzadas, H-187: Fibonacci es un cuadrado , el proponente muestra que
donde L n denota el n º número Lucas , y que - por el contrario - si
entonces n es un número de Fibonacci ym es un número de Lucas.
Cómo funciona
Definimos el operador binario
<|
para nuestros propósitos. No está definido en las versiones recientes de Julia, pero el analizador aún lo reconoce como operador.Cuando se llama con un solo argumento ( n ),
<|
inicializa k como 1 . Mientras que n es positivo, resta ! K ( 1 si k es un producto de los números de Fibonacci, 0 si no) de n y recursivamente se llama a sí mismo, incrementa k en 1 . Una vez que n alcanza 0 , se ha encontrado la cantidad deseada de productos, por lo que<|
devuelve el valor anterior de k , es decir, ~ -k = k - 1 .El operador unario
!
, redefinido como una prueba para productos de número de Fibonacci, logra su tarea de la siguiente manera.Si k = 1 , k es un producto de los números de Fibonacci. En este caso, elevamos el valor de retorno de
any(...)
a la potencia ~ -k = k - 1 = 0 , por lo que el resultado será 1 .Si k> 1 , el resultado será el valor de
any(....)
, que devolverá verdadero si y solo si el predicado√(5i^2+[4,-4])%1∋k%i<!(k÷i)
devuelve verdadero para algún entero i tal que 2 ≤ i ≤ k .Las condiciones encadenadas en el predicado se mantienen si
k%i
pertenece√(5i^2+[4,-4])%1
yk%i
es menor que!(k÷i)
.√(5i^2+[4,-4])%1
toma la raíz cuadrada de 5i 2 + 4 y 5i 2 - 4 y calcula sus residuos módulo 1 . Cada módulo es 0 si el número correspondiente es un cuadrado perfecto y, de lo contrario , un número positivo menor que 1 .Como
k%i
devuelve un número entero, solo puede pertenecer a la matriz de módulos si k% i = 0 (es decir, k es divisible por i ) y al menos uno entre 5i 2 + 4 y 5i 2 - 4 es un cuadrado perfecto (es decir, i es un número de Fibonacci).!(k÷i)
llama recursivamente a 1 con el argumento k ÷ i (división entera), que será mayor que 0 si y solo si k ÷ i es un producto de los números de Fibonacci.Por inducción ,! Tiene la propiedad deseada.
fuente
Python, 90 bytes
La función principal
g
genera el productok
th Fibonacci, 1 indexado. Calculag(100)
como315
casi al instante. Va así con una receta recursiva general de contar númerosn
buscandok
instancias que satisfagan la funciónf
. Cada una de esas instancias reduce el recuento requeridok
hasta que alcanza0
.La función auxiliar
f
prueba que un número sea un producto de Fibonacci. Genera recursivamente los números de Fibonacci en sus argumentos opcionalesa
yb
. Produce "yes" si alguno de los siguientes es verdadero:n<2
. Esto implican==1
, el producto trivial)n%a<f(n/a)
. Esto requieren%a==0
yf(n/a)==True
, es decir,n
es un múltiplo del número de Fibonaccia
, y eliminar este factora
todavía produce un producto de Fibonacci.n-a>0<f(n,b,a+b)
, equivalente an>a and f(n,b,a+b)
. Comprueba que el número actual de Fibonacci que se está probando no es al menosn
, y funciona un número mayor de Fibonacci. Gracias a Dennis por guardar 2 bytes usando el cortocircuito de desigualdad en lugar deand
.La función
g
puede ser un byte más corta comosi
g(k)
siempre es a lo sumok*k
, lo que no estoy seguro es asintóticamente cierto. Un límite de2**k
suficientes, pero luegog(100)
lleva demasiado tiempo. Quizás en cambio el recursivo deg
se pueda hacerf
.fuente
g(k)
excedek*k
cuándok = 47000
y más.Perl 6 ,
9593 bytes(Índice basado en 0)
Prueba:
Explicación:
fuente
Python 3,
175170148 bytesGracias a @Dennis por -22 bytes
Toma información de STDIN e imprime en STDOUT. Esto es un índice. Calcular el término 100 toma aproximadamente una décima de segundo.
Cómo funciona
Pruébalo en Ideone
fuente
Python 2,
120107 bytesPruébalo en Ideone .
Cómo funciona
Inicializamos F como la tupla (2, 3) (la primera de dos número mayor Fibonacci que 1 ), k como 0 y n como un número entero lee de STDIN.
Si bien n es positivo, hacemos lo siguiente:
Anexar el siguiente número de Fibonacci, calculado como F [k] + F [-1] , es decir, la suma de los dos últimos elementos de F a la tupla F .
Incremento k .
Resta g (k) de n .
g devuelve 1 si y solo si k es un producto de números de Fibonacci, por lo que una vez que n alcanza 0 , k es el número n de Fibonacci y lo imprimimos en STDOUT.
g logra su propósito de la siguiente manera.
Si k es 1 , es un producto de los números de Fibonacci y
1/k
se asegura de que devolvamos 1 .Si k es mayor que 1 , que llamamos
g(k/i)
recursivamente para todos los números de Fibonacci i en F .g(k/i)
prueba recursivamente si k / i es un producto con número de Fibonacci. Sig(k/i)
devuelve 1 e i divide k uniformemente, k% i = 0 y la condición sek%i<g(k/i)
cumple, entonces g devolverá 1 si y solo si hay un número de Fibonacci tal que k sea el producto de ese número de Fibonacci y otro producto de los números de Fibonacci.fuente
JavaScript (ES6), 136
De esta manera, jugué bastante lento, calculando el término 100 en aproximadamente 8 segundos en mi PC.
Menos golf y más rápido también (evitando
eval
)Prueba
fuente
Haskell, 123 bytes
Muy vago, mucho infinito!
Posiblemente no sea el camino más corto, pero tuve que probar este enfoque, una generalización de un método bastante conocido para calcular la lista de números de Hamming.
f
es la lista de números de Fibonacci a partir de 2. Por brevedad, digamos que un lol (lista de listas) es una lista infinita de listas infinitas ordenadas, ordenadas por sus primeros elementos.m
es una función para fusionar un lol, eliminando duplicados. Utiliza dos funciones auxiliares infix.?
inserta una lista ordenada infinita en un lol.#
elimina un valor de un lol que puede aparecer como encabezado de las primeras listas, reinsertando la lista restante con?
.Finalmente,
l
está la lista de números que son productos de números de Fibonacci, definidos como 1 seguidos de la fusión de todas las listas obtenidas al multiplicarl
por un número de Fibonacci. La última línea establece la función requerida (como de costumbre sin vincularla a un nombre, así que no la copie como está) usando!!
para indexar en la lista, lo que hace que la función sea indexada en 0.No hay problema para calcular el número 100 o 100,000.
fuente
Casco , 13 bytes
Tenga en cuenta que Husk es más nuevo que este desafío. Sin embargo, y la función más útil para este golf (
Ξ
) no se crearon con este desafío en mente.Pruébalo en línea!
Versión más eficiente para 14 bytes:
Pruébalo en línea!
fuente
Python 2,
129128125123121 bytesPruébalo en Ideone .
fuente