Numéros de Fibonacci
Les nombres de Fibonacci commencent par f(1) = 1
et f(2) = 1
(certains comprennent , f(0) = 0
mais cela n'a aucune importance à ce défi. Ensuite, pour n > 2
, f(n) = f(n-1) + f(n-2)
.
Le défi
Votre tâche consiste à trouver et à sortir le n
-ième nombre positif qui peut être exprimé en tant que produits des nombres de Fibonacci. Vous pouvez choisir de le rendre indexé 0 ou 1, selon ce qui vous convient le mieux, mais vous devez le spécifier dans votre réponse.
De plus, votre réponse doit calculer le 100e terme dans un délai raisonnable.
Cas de test
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
Les références
code-golf
number-theory
fibonacci
Leaky Nun
la source
la source
7
ne peut pas être exprimé comme le produit des nombres de Fibonacci. Par conséquent, le1
st nombre requis est1
, le2
nd est2
, ..., le6
th est6
, mais le7
th est8
.corresponding product
" est juste pour clarification. Votre code n'a besoin que de sortir le "result
".Réponses:
Gelée ,
26242321 octetsEssayez-le en ligne!
Comment ça marche
la source
Julia, 79 octets
Essayez-le en ligne!
Contexte
Dans Advanced Problems and Solutions, H-187: Fibonacci est un carré , le proposant montre que
où L n désigne le n ème nombre de Lucas , et que - inversement - si
alors n est un nombre de Fibonacci et m est un nombre de Lucas.
Comment ça marche
Nous définissons l'opérateur binaire
<|
pour nos besoins. Il n'est pas défini dans les versions récentes de Julia, mais est toujours reconnu comme opérateur par l'analyseur.Lorsqu'il est appelé avec un seul argument ( n ),
<|
initialise k comme 1 . Alors que n est positif, il soustrait ! K ( 1 si k est un produit des nombres de Fibonacci, 0 sinon) de n et s'appelle récursivement, incrémente k de 1 . Une fois que n atteint 0 , la quantité souhaitée de produits a été trouvée,<|
renvoie donc la valeur précédente de k , c'est-à-dire ~ -k = k - 1 .L'opérateur unaire
!
, redéfini comme un test pour les produits de nombres de Fibonacci, accomplit sa tâche comme suit.Si k = 1 , k est un produit des nombres de Fibonacci. Dans ce cas, nous élevons la valeur de retour de
any(...)
à la puissance ~ -k = k - 1 = 0 , le résultat sera donc 1 .Si k> 1 , le résultat sera la valeur de
any(....)
, qui retournera vrai si et seulement si le prédicat√(5i^2+[4,-4])%1∋k%i<!(k÷i)
retourne vrai pour un entier i tel que 2 ≤ i ≤ k .Les conditions chaînées dans le prédicat tiennent si elles
k%i
appartiennent à√(5i^2+[4,-4])%1
etk%i
sont inférieures à!(k÷i)
.√(5i^2+[4,-4])%1
prend la racine carrée de 5i 2 + 4 et 5i 2 - 4 et calcule leurs résidus modulo 1 . Chaque module est 0 si le nombre correspondant est un carré parfait, et un nombre positif inférieur à 1 sinon.Puisque
k%i
renvoie un entier, il ne peut appartenir au tableau de modules que si k% i = 0 (c'est-à-dire que k est divisible par i ) et au moins un parmi 5i 2 + 4 et 5i 2 - 4 est un carré parfait (c'est-à-dire, i est un nombre de Fibonacci).!(k÷i)
appelle récursivement 1 avec l'argument k ÷ i (division entière), qui sera supérieur à 0 si et seulement si k ÷ i est un produit des nombres de Fibonacci.Par induction ,! a la propriété souhaitée.
la source
Python, 90 octets
La fonction principale
g
affiche lek
produit Fibonacci, indexé 1. Il calculeg(100)
comme315
presque instantanément. Il en va de même avec une recette récursive générale de comptage des nombres à lan
recherche dek
instances qui satisfont la fonctionf
. Chacune de ces instances réduit le nombre requisk
jusqu'à ce qu'il atteigne0
.La fonction auxiliaire
f
teste un certain nombre pour être un produit Fibonacci. Il génère récursivement les nombres de Fibonacci dans ses arguments optionnelsa
etb
. Il renvoie "oui" si l'une des conditions suivantes est vraie:n<2
. Cela impliquen==1
, le produit trivial)n%a<f(n/a)
. Cela nécessiten%a==0
etf(n/a)==True
, c'est-à-dire qu'iln
s'agit d'un multiple du nombre de Fibonaccia
, et la suppression de ce facteura
donne toujours un produit Fibonacci.n-a>0<f(n,b,a+b)
, équivalent àn>a and f(n,b,a+b)
. Vérifie que le nombre de Fibonacci en cours de test ne l'est pas au moinsn
, et qu'un nombre de Fibonacci supérieur fonctionne. Merci à Dennis pour 2 octets d'économie en utilisant le court-circuit d'inégalité au lieu deand
.La fonction
g
peut être un octet plus courte carsi
g(k)
est toujours au plusk*k
, ce qui, je ne suis pas sûr, est asymptotiquement vrai. Une limite de2**k
suffit, maisg(100)
prend trop de temps. Peut-être qu'au lieu de cela, la récursivitég
peut être effectuéef
.la source
g(k)
dépassek*k
quandk = 47000
et au-dessus.Perl 6 ,
9593 octets(Index basé sur 0)
Tester:
Explication:
la source
Python 3,
175170148 octetsMerci à @Dennis pour -22 octets
Prend l'entrée de STDIN et imprime vers STDOUT. C'est un index. Le calcul du 100e terme prend environ un dixième de seconde.
Comment ça marche
Essayez-le sur Ideone
la source
Python 2,
120107 octetsTestez-le sur Ideone .
Comment ça marche
Nous initialisons F comme le tuple (2, 3) (les deux premiers nombres de Fibonacci supérieurs à 1 ), k comme 0 et n comme un entier lu à partir de STDIN.
Alors que n est positif, nous faisons ce qui suit:
Ajouter le prochain nombre de Fibonacci, calculé comme F [k] + F [-1] , c'est-à-dire la somme des deux derniers éléments de F au tuple F .
Incrément k .
Soustrayez g (k) de n .
g renvoie 1 si et seulement si k est un produit des nombres de Fibonacci, donc une fois que n atteint 0 , k est le n ème nombre de Fibonacci et nous l'imprimons sur STDOUT.
g atteint son objectif comme suit.
Si k est 1 , c'est un produit des nombres de Fibonacci, et
1/k
s'assure que nous retournons 1 .Si k est supérieur à 1 , nous appelons
g(k/i)
récursivement tous les nombres de Fibonacci i dans F .g(k/i)
teste récursivement si k / i est un produit de nombre de Fibonacci. Sig(k/i)
renvoie 1 et i divise k également, k% i = 0 et la conditionk%i<g(k/i)
est vérifiée, donc g renverra 1 si et seulement s'il y a un nombre de Fibonacci tel que k est le produit de ce nombre de Fibonacci et un autre produit de nombres de Fibonacci.la source
JavaScript (ES6), 136
Golf assez lent de cette façon, calculant le terme 100 en environ 8 secondes sur mon PC.
Moins golfé et plus rapide aussi (éviter
eval
)Tester
la source
Haskell, 123 octets
Très paresseux, infini!
Ce n'est peut-être pas la manière la plus courte, mais j'ai dû essayer cette approche, une généralisation d'une méthode assez bien connue pour calculer la liste des nombres parasites.
f
est la liste des nombres de fibonacci à partir de 2. Par souci de concision, disons qu'un lol (liste de listes) est une liste infinie de listes infinies ordonnées, ordonnées par leurs premiers éléments.m
est une fonction pour fusionner un lol, en supprimant les doublons. Il utilise deux fonctions d'assistance infixe.?
insère une liste triée infinie dans un lol.#
supprime une valeur d'un lol qui peut apparaître en tête des premières listes, réinsérant la liste restante avec?
.Enfin,
l
est la liste des nombres qui sont des produits des nombres de fibonacci, définie comme 1 suivie de la fusion de toutes les listes obtenues en multipliantl
par un nombre de fibonacci. La dernière ligne indique la fonction requise (comme d'habitude sans la lier à un nom, donc ne la copiez pas telle quelle) en utilisant!!
pour indexer dans la liste, ce qui rend la fonction indexée 0.Il n'y a aucun problème à calculer le 100e ou 100 000e nombre.
la source
Husk , 13 octets
Notez que Husk est plus récent que ce défi. Cependant, il et la fonction la plus utile pour ce golf (
Ξ
) n'ont pas été créés avec ce défi à l'esprit.Essayez-le en ligne!
Version plus efficace pour 14 octets:
Essayez-le en ligne!
la source
Python 2,
129128125 125123121 octetsTestez-le sur Ideone .
la source