Fibonacci Dizisi Mod K'da Eksik Sayıları Bulun


20

Esinlenen bu Math.SE soruya .

Arka fon

Fibonacci Dizisi (denilen F) başlayarak dizisidir 0, 1her sayı (öyle ki F(n)(ilk iki sonra)) daha önce ikisinin toplamı (olduğunu F(n) = F(n-1) + F(n-2)).

Bir Fibonacci Dizisi mod K (denir M), Fibonacci dizisi mod K ( ) dizisidir M(n) = F(n) % K.

Her bir değer, önceki çifti tarafından belirlenir olarak Fibonacci Dizisi mod K, bütün K siklik olduğu gösterilebilir ve yalnızca K bulunmaktadır 2 negatif olmayan tam olası çiftleri K. daha kısa bir sürede Fibonacci dizisi mod K için ilk tekrarlanan terimler çiftinden sonra döngüseldir, ilk tekrarlanan terimler çiftinden önce Fibonacci Sekansı mod K'da görünmeyen bir sayı asla görünmez.

K = 4 için

0 1 1 2 3 1 0 1 ...

K = 8 için

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

K = 8, 4 ve 6 için tekrarlanandan önce görünmediğine dikkat edin 0 1, bu nedenle 4 ve 6 asla Fibonacci Sekansı mod 8'de görünmeyecektir.

Meydan okuma

Bir tamsayı K 0'dan kesinlikle büyük göz önüne alındığında, tüm az K daha negatif olmayan tamsayılar çıkış yok Fibonacci Dizisi mod K. görünür

kurallar

  • Varsayılan boşluklar yasaktır .

  • Varsayılan G / Ç .

  • Programlar veya işlevler kabul edilebilir .

  • K'nin yerel tamsayı türünüze ( akıl dahilinde ) uyacağını varsayabilirsiniz .

  • Fibonacci Sekansı mod K'de görünmeyen K'den küçük negatif olmayan sayılar varsa, programınız / fonksiyonunuz tüm bu sayıları makul bir şekilde vermelidir.

  • Fibonacci Sekansı mod K'de görünmeyen K'den küçük negatif olmayan tamsayılar yoksa, programınız / fonksiyonunuz boş bir liste döndürerek, hiçbir şey basmadan, hata üreterek vb.

  • Düzen önemli değil.

  • Bu , her dilde en kısa cevap kazanır.

Test Durumları

Çevrimiçi test senaryoları oluşturun!

Boş Olmayan Test Kutuları

  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]
...

Boş Test Durumları (çıktı, hata, boş liste vb. Kabul edilebilir çıktı yok)

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

İlgili:

Fibonacci Yörüngeleri Sayma

Pisano Dönemini Bulun


Yanıtlar:


6

Jöle , 9 8 bayt

²RÆḞ%ḟ@Ḷ

Çevrimiçi deneyin!

Pisano süre dayanan p(n) <= 6ngelen A001175 . Ayrıca, p(n) <= 6n <= n^2için n >= 6ve p(n) <= n^2için n < 6. Dennis sayesinde bu baytı kurtardı.


²yerine çalışmalı ×6.
Dennis

6

Haskell , 70 bayt

Esolanging Fruit sayesinde bir miktar bayt tasarrufu

Laikoni sayesinde 8 bayt kurtardı

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

Çevrimiçi deneyin!


@EsolangingFruit Ah teşekkürler! Ben de kendime benzer bir sonuca varıyordum.
Buğday Sihirbazı

read$showfromIntegerbu durumda yerine çalışır ve iki bayt kaydeder.
Laikoni

Kesmek zip[1..x^2]için kullanmak daha fazla bayt tasarrufu sağlar: Çevrimiçi deneyin!
Laikoni

@Laikoni Bir süre aldı ama değişikliği yaptım. Teşekkürler, bu iyi bir fikir.
Buğday Büyücüsü

5

Perl 6 ,  43 42 39  32 bayt

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

Dene

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

Dene

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

Dene

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

Dene

Expanded:

{  # 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 bayt

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

Çevrimiçi deneyin!

-V bayrağı üzerinden girdi alır.

Çok fazla yeni satır yazdırır, ancak işi halleder. Bu, temelde, dizide şimdiye kadar ortaya çıkan sayı kümesini saklamak için ilk satırı kullanır.

Nasıl çalışır:

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 bayt

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

Çevrimiçi deneyin!

Guiseppe sayesinde -1 bayt.

  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 bayt ; yeniden düzenleme kullanımınızı kurtarır X~!
Giuseppe

@Giuseppe Teşekkürler! Yine de çok uzun ...
Sanchises


2

Kabuk , 13 12 10 bayt

-2 bayt için @Zgarb teşekkürler!

-U2m%⁰İfŀ⁰

Tüm tamsayıların görünmesi durumunda boş bir liste yazdırır, çevrimiçi deneyin!

açıklama

-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]

U2Bitişik bir çiftin tekrar etmediği en uzun öneki almak için kullanabilirsiniz .
Zgarb


2

R ', 92 86 bayt

@Giuseppe'ye 6 bayt kaydettiği için teşekkürler !

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)}

Çevrimiçi deneyin!

Oldukça basit bir uygulama ( önceki sürüm , ancak aynı konsept):

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, iyi fikir!
plannapus

70 bayt taşıma 1:k^2olduğunu herkes kullandığı yaklaşımı
Giuseppe

2

Piton 3, 173 152 143 131 bayt

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)})

@Ovs'a Özel Teşekkürler.

Çevrimiçi Deneyin

O nasıl çalışır?

İlk fonksiyon iki parametre m ve n alır ve n numaralı Fibonacci sayı mod m'yi döndürür. İkinci fonksiyon Fibonacci mod k modundan geçer ve 0 ve 1'in tekrarlanıp tekrarlanmadığını kontrol eder. Sayıları bir listede saklar ve 1-n sayılarını içeren bir listeyle karşılaştırır. Yinelenen sayılar kaldırılır ve kalan sayılar döndürülür.


Bu, başlığın bir parçasıdır ve koda dahil edilmesi zorunlu değildir.
Manish Kundu

Tamam oldu. @ovs Söylediğin için teşekkürler, farkında değildim.
Manish Kundu

1
131 bayt yerine set()zincirli karşılaştırmalar yerine küme parantez kümeleri oluşturarak .
ovs


2

Ruby , 47 bayt

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

Çevrimiçi deneyin!

Aynı mantığın bazılarını kullansa da, bu GB'nin Yanıtını temel almaz .

Açıklama:

->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

Ortak Lisp, 106 bayt

(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)))

Çevrimiçi deneyin!



1

İksir , 148144 bayt

 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

Çevrimiçi deneyin!

Özellikle rekabetçi bir cevap değil, ama golf gerçekten eğlenceliydi! İksir oldukça okunabilir bir dildir, ancak ortadaki karakterlerin karışıklığı için bir açıklama gelir.


Bu açıklama iki bölümdedir, mod-fibonacci ve üzerindeki çalışma

Mod-fib:

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

Bu sonsuz bir fibonacci mod akışı döndürür x. Bir akümülatör ile başlar {1,1}ve şu işlem reklamını uygular: verilen akümülatör {p,n}, çıktıp mod x akışına. Ardından, akümülatörü olarak ayarlayın {n,p+n}.

Geri kalan:

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 bayt

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 bayt

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

Bu sadece Fibonnaci sayılarının (n ^ 2) mümkün olan en uzun döngüsünü inceler ve o sırada meydana gelen tüm sayıların bir listesini oluşturur. Mantık basitleştirmek için sayılar n modulo saklanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.