Trouver les numéros manquants dans la séquence de Fibonacci Mod K


20

Inspiré par cette question Math.SE .

Contexte

La séquence de Fibonacci (appelée F) est la séquence, commençant de 0, 1telle sorte que chaque nombre ( F(n)) (après les deux premiers) est la somme des deux avant ( F(n) = F(n-1) + F(n-2)).

Une séquence de Fibonacci mod K (appelée M) est la séquence des nombres de Fibonacci mod K ( M(n) = F(n) % K).

On peut montrer que la séquence de Fibonacci mod K est cyclique pour tout K, car chaque valeur est déterminée par la paire précédente, et il n'y a que K 2 paires possibles d'entiers non négatifs tous deux inférieurs à K. Parce que la séquence de Fibonacci mod K est cyclique après sa première paire de termes répétée, un nombre qui n'apparaît pas dans le mod K de la séquence de Fibonacci avant que la première paire de termes répétée n'apparaisse jamais.

Pour K = 4

0 1 1 2 3 1 0 1 ...

Pour K = 8

0 1 1 2 3 5 0 5 5 2 7 1 0 1 ...

Notez que pour K = 8, 4 et 6 n'apparaissent pas avant la répétition 0 1, donc 4 et 6 n'apparaîtront jamais dans le mod 8 de la séquence de Fibonacci.

Défi

Étant donné un entier K strictement supérieur à 0, sortez tous les entiers non négatifs inférieurs à K qui n'apparaissent pas dans le mod K. de séquence de Fibonacci.

Règles

  • Les failles par défaut sont interdites .

  • E / S par défaut .

  • Les programmes ou fonctions sont acceptables .

  • Vous pouvez supposer que K s'adaptera à votre type d'entier natif ( dans des limites raisonnables ).

  • S'il y a des nombres non négatifs inférieurs à K qui n'apparaissent pas dans le mod K de séquence de Fibonacci, votre programme / fonction devrait sortir tous ces nombres de manière raisonnable.

  • S'il n'y a pas d'entiers non négatifs inférieurs à K qui n'apparaissent pas dans le mod K de séquence de Fibonacci, votre programme / fonction peut l'indiquer en renvoyant une liste vide, en n'imprimant rien, en produisant une erreur, etc.

  • L'ordre n'a pas d'importance.

  • C'est le , donc la réponse la plus courte dans chaque langue l'emporte.

Cas de test

Générez des cas de test en ligne!

Cas de test non vides

  8 [4, 6]
 11 [4, 6, 7, 9]
 12 [6]
 13 [4, 6, 7, 9]
 16 [4, 6, 10, 12, 14]
 17 [6, 7, 10, 11]
 18 [4, 6, 7, 9, 11, 12, 14]
 19 [4, 6, 7, 9, 10, 12, 14]
 21 [4, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 19]
 22 [4, 6, 7, 9, 15, 17, 18, 20]
 23 [4, 7, 16, 19]
 24 [4, 6, 9, 11, 12, 14, 15, 18, 19, 20, 22]
 26 [4, 6, 7, 9, 17, 19, 20, 22]
 28 [10, 12, 14, 16, 18, 19, 23]
 29 [4, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27]
 31 [4, 6, 9, 12, 14, 15, 17, 18, 19, 22, 25, 29]
 32 [4, 6, 10, 12, 14, 18, 20, 22, 26, 28, 30]
 33 [4, 6, 7, 9, 15, 17, 18, 20, 24, 26, 27, 28, 29, 31]
 34 [4, 6, 7, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 27, 28, 30]
 36 [4, 6, 7, 9, 10, 11, 12, 14, 16, 18, 20, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32]
 37 [9, 10, 14, 17, 20, 23, 27, 28]
 38 [4, 6, 7, 9, 10, 11, 12, 14, 15, 16, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 29, 31, 32, 33, 36]
 39 [4, 6, 7, 9, 15, 17, 19, 20, 22, 24, 30, 32, 33, 35]
...
200 [4, 6, 12, 14, 20, 22, 28, 30, 36, 38, 44, 46, 52, 54, 60, 62, 68, 70, 76, 78, 84, 86, 92, 94, 100, 102, 108, 110, 116, 118, 124, 126, 132, 134, 140, 142, 148, 150, 156, 158, 164, 166, 172, 174, 180, 182, 188, 190, 196, 198]
...
300 [6, 18, 30, 42, 54, 66, 78, 90, 102, 114, 126, 138, 150, 162, 174, 186, 198, 210, 222, 234, 246, 258, 270, 282, 294]
...
400 [4, 6, 10, 12, 14, 20, 22, 26, 28, 30, 36, 38, 42, 44, 46, 52, 54, 58, 60, 62, 68, 70, 74, 76, 78, 84, 86, 90, 92, 94, 100, 102, 106, 108, 110, 116, 118, 122, 124, 126, 132, 134, 138, 140, 142, 148, 150, 154, 156, 158, 164, 166, 170, 172, 174, 180, 182, 186, 188, 190, 196, 198, 202, 204, 206, 212, 214, 218, 220, 222, 228, 230, 234, 236, 238, 244, 246, 250, 252, 254, 260, 262, 266, 268, 270, 276, 278, 282, 284, 286, 292, 294, 298, 300, 302, 308, 310, 314, 316, 318, 324, 326, 330, 332, 334, 340, 342, 346, 348, 350, 356, 358, 362, 364, 366, 372, 374, 378, 380, 382, 388, 390, 394, 396, 398]
...

Cas de test vides (aucune sortie, erreur, liste vide, etc. est une sortie acceptable)

1, 2, 3, 4, 5, 6, 7, 9, 10, 14, 15, 20, 25, 27, 30, 35 ... 100 ...

En relation:

Compter les orbites de Fibonacci

Trouver la période Pisano


Sandbox (supprimé).
pizzapants184

Réponses:


6

Gelée , 9 8 octets

²RÆḞ%ḟ@Ḷ

Essayez-le en ligne!

Sur la base de la période de Pisano p(n) <= 6nde A001175 . Aussi p(n) <= 6n <= n^2pour n >= 6et p(n) <= n^2pour n < 6. Enregistré cet octet grâce à Dennis.


²devrait fonctionner au lieu de ×6.
Dennis

6

Haskell , 70 octets

Un certain nombre d'octets économisés grâce à Esolanging Fruit

8 octets économisés grâce à Laikoni

a=1:scanl(+)1a
f x=[u|u<-[2..x-1],and[mod b x/=u|(_,b)<-zip[1..x^2]a]]

Essayez-le en ligne!


@EsolangingFruit Ah merci! J'arrivais moi-même à une conclusion similaire.
Wheat Wizard

read$showfonctionne au lieu de fromIntegerdans ce cas et enregistre deux octets.
Laikoni

L'utilisation zip[1..x^2]de la troncature permet d'économiser encore plus d'octets: essayez-le en ligne!
Laikoni

@Laikoni A pris du temps mais j'ai fait le changement. Merci, c'est une bonne idée.
Wheat Wizard

5

Perl 6 ,  43 42 39  32 octets

{^$_ (-)(1,1,(*+*)%$_...->\a,\b{!a&&b==1})}

Essaye-le

{^$_∖(1,1,(*+*)%$_...->\a,\b{!a&&b==1})}

Essaye-le

{^$_∖(1,1,(*+*)%$_...{!$^a&&$^b==1})}

Essaye-le

{^$_∖(1,1,(*+*)%$_...!*&*==1)}

Essaye-le

Étendu:

{  # bare block lambda with implicit parameter 「$_」

  ^$_               # Range upto and excluding the input

                   # set minus (U+2216)

  (                 # generate the Fibonacci sequence mod k

    1, 1,           # seed the sequece (can't be 0,1)

    ( * + * ) % $_  # add two values and modulus the input (lambda)

    ...             # keep doing that until

                    # it matches 0,1
    !*              #   negate the first param (1 when 0)
    &               #   and Junction
    *               #   second param
    == 1            #   both match 1

  )
}

3

> <> , 48 octets

01\
?!\:&+{:}%:1$0p&$:
v0\~:1=?
>?!;1-::0g?!nao:

Essayez-le en ligne!

Prend l'entrée via le drapeau -v.

Imprime beaucoup de nouvelles lignes en excès, mais fait le travail. Cela utilise essentiellement la première ligne pour stocker l'ensemble des nombres qui sont apparus jusqu'à présent dans la séquence.

Comment ça fonctionne:

01\    Input is already on the stack
...... Initialises the sequence with 1 and 0
...... Goes to the second line
......

......
..\:&+{:}% Gets the next number in the modded Fibonacci sequence while preserving the previous number
......
......

......
..........:1$0p&$: Puts a 1 at that cell number on the first line
.......
.......

......             If the number is a 0 go to the third line
?!\..............: Check if the next number is a 1, meaning we've reached the end of the sequence
v0\~:1=?           Go to the fourth line if so
>.....             Re-add the 0 and go back to the second line if not

......           While input:
......             Get the cell from the first line
......             If not 0: print the number
>?!;1-::0g?!nao:   Finally, print a newline and decrement the input


3

MATL , 19 18 octets

0lbU:"yy+]vG\G:qX~

Essayez-le en ligne!

-1 octet merci à Guiseppe.

  bU:"   ]         % Do K^2 (>6K) times.
0l    yy+          %  Fibbonaci
                X~ % Set exclusive difference between
          vG\      %  the fibonacci numbers mod K
             G:q   %  and 0...K-1

18 octets ; réorganiser récupère votre utilisation de X~!
Giuseppe

@Giuseppe Merci! Toujours très long cependant ...
Sanchises


2

Husk , 13 12 10 octets

Merci @Zgarb pour -2 octets!

-U2m%⁰İfŀ⁰

Imprime une liste vide au cas où tous les entiers apparaissent, essayez-le en ligne!

Explication

-U2m%⁰İfŀ⁰  -- named argument ⁰, example with: 8
-           -- difference of
        ŀ⁰  -- | lowered range: [0,1,2,3,4,5,6,7]
            -- and
      İf    -- | Fibonacci sequence: [1,1,2,3,5,8,13,21,34,55,89,144,233,377…
   m%⁰      -- | map (modulo ⁰): [1,1,2,3,5,0,5,5,2,7,1,0,1,1…
 U2         -- | keep longest prefix until 2 adjacent elements repeats: [1,1,2,3,5,0,5,5,2,7,1,0,1]
            -- : [4,6]

Vous pouvez utiliser U2pour obtenir le préfixe le plus long où aucune paire adjacente ne se répète.
Zgarb


2

R, 92 86 octets

Merci à @Giuseppe d' avoir économisé 6 octets!

function(k,n=!!0:2){while(any((z=tail(n,2))-n[1:2]))n=c(n,sum(z)%%k);setdiff(1:k-1,n)}

Essayez-le en ligne!

Implémentation assez simple ( version précédente , mais même concept):

function(k,
         K=1:k-1,      #Uses default arguments to preset variables for legibility 
         n=c(0,1,1)){  #(wouldn't change byte-count to put them in the body of the function)
    while(any((z=tail(n,2))!=n[1:2])) #Do as long as first 2 elements are not identical to last 2 elements
        n=c(n,sum(z)%%k) #Built the fibonacci mod k sequence
    K[!K%in%n] #Outputs integers < k if not in sequence.
}


@Giuseppe ah setdiff, bonne idée!
plannapus

70 octets traduisant l' 1:k^2approche que tout le monde utilise
Giuseppe

2

Python 3, 173 152 152 143 131 octets

f=lambda n,m,a=0,b=1:a%m if n<=0else f(n-1,m,b,a+b)
p=lambda n,i=2,y={0}:y^{*range(n)}if f(i,n)==1>f(i-1,n)else p(n,i+1,y|{f(i,n)})

Un merci spécial à @ovs.

Essayez-le en ligne

Comment ça marche?

La première fonction prend deux paramètres m et n, et elle retourne le nième nombre de Fibonacci mod m. La deuxième fonction parcourt les nombres de Fibonacci mod k et vérifie si 0 et 1 sont répétés. Il stocke les nombres dans une liste et le compare avec une liste contenant les nombres 1-n. Les numéros en double sont supprimés et les numéros restants sont retournés.


Cela fait partie de l'en-tête et il n'est pas obligatoire de l'inclure dans le code.
Manish Kundu

Entendu, c'est fait. @ovs Merci de l'avoir dit, je ne le savais pas.
Manish Kundu

1
131 octets en créant des ensembles avec des accolades au lieu de set()et des comparaisons chaînées.
ovs


2

Rubis , 47 octets

->n{a=b=1;[*1...n]-(1..n*n).map{a,b=b,a+b;a%n}}

Essayez-le en ligne!

Bien qu'il utilise une partie de la même logique, ce n'est pas basé sur la réponse de GB .

Explication:

->n{
  a=b=1;   # start sequence with 1,1
  [*1...n] # all the numbers from 1 to n-1 as an array
           # 0 is excluded as it should never be in the final answer 
  -  # set operation; get all items in the first set and not in the second
  (1..n*n).map{ # n squared times
    a,b=b,a+b;  # assign next fibonacci numbers 
    a%n         # return a fibonacci number mod n
  }    # Map to an array
}

2

Lisp commun, 106 octets

(lambda(k)(do((a 1 b)c(b 1(mod(+ a b)k)))((=(1- b)0 a)(dotimes(i k)(or(member i c)(print i))))(push a c)))

Essayez-le en ligne!



1

Elixir , 148 144 octets

 fn x->Enum.to_list(1..x-1)--List.flatten Enum.take_while Stream.chunk(Stream.unfold({1,1},fn{p,n}->{rem(p,x),{n,p+n}}end),2),&Enum.sum(&1)!=1end

Essayez-le en ligne!

Pas une réponse particulièrement compétitive, mais c'était vraiment amusant de jouer au golf! Elixir est un langage assez lisible, mais une explication du désordre des personnages au milieu suit.


Cette explication est en deux sections, le mod-fibonacci et son fonctionnement

Mod-fib:

Stream.unfold({1,1},fn{p,n}->{rem(p,x),{n,p+n}}end)

Cela renvoie un flux infini de fibonacci mod x. Il commence par un accumulateur {1,1}et applique l'opération à l'infini: accumulateur donné{p,n} , sortie p mod xvers le flux. Réglez ensuite l'accumulateur sur {n,p+n}.

Le reste:

fn x->                              Define a fxn f(x) that returns
  Enum.to_list(1..x-1)--            The numbers from 1..x-1 that are not in
  List.flatten                      The flattened list constructed by
    Enum.take_while                 Taking from mod-fib until
      Stream.chunk(                 A 2-size chunk
        Stream.unfold({1,1},fn{p,n}->{rem(p,x),{n,p+n}}end) (of mod fib)
        ,2)
      ,&Enum.sum(&1)!=1             sums to 1, representing [0,1] or [1,0]
end



1

JavaScript (ES6), 84 octets

f=(n,a=0,b=1,q=[...Array(n).keys()])=>a*b+a-1?f(n,b,(a+b)%n,q,q[b]=0):q.filter(x=>x)

1

Python 3, 76 octets

def t(n,r=[1]):
 while n*n>len(r):r+=[sum(r[-2:])%n]
 return{*range(n)}-{*r}

Cela regarde simplement le plus long cycle possible de nombres de Fibonnaci (n ^ 2), et crée une liste de tous les nombres qui se produisent pendant cette période. Pour simplifier la logique, les nombres sont stockés modulo n.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.