ค้นหาตัวเลขที่ขาดหายไปใน Fibonacci Sequence Mod K


20

แรงบันดาลใจจากคำถาม Math.SEนี้

พื้นหลัง

ลำดับ Fibonacci (เรียกว่าF) เป็นลำดับที่เริ่มต้น0, 1ดังกล่าวว่าแต่ละหมายเลข ( F(n)) (หลังจากครั้งแรกที่สอง) คือผลรวมของทั้งสองก่อนที่มัน ( F(n) = F(n-1) + F(n-2))

Fibonacci Sequence mod K (เรียกว่าM) เป็นลำดับของหมายเลข Fibonacci mod mod K ( M(n) = F(n) % K)

สามารถแสดงให้เห็นว่า Fibonacci Sequence mod K เป็นวงจรสำหรับ K ทั้งหมดเนื่องจากแต่ละค่าถูกกำหนดโดยคู่ก่อนหน้าและมี K 2คู่ที่เป็นไปได้ของจำนวนเต็มไม่เป็นลบทั้งคู่น้อยกว่า K เนื่องจากลำดับ Fibonacci mod K เป็นวัฏจักรหลังจากคำศัพท์ซ้ำคู่แรกของจำนวนที่ไม่ปรากฏใน Fibonacci Sequence mod K ก่อนที่คำซ้ำคู่แรกจะไม่ปรากฏขึ้น

สำหรับ K = 4

0 1 1 2 3 1 0 1 ...

สำหรับ K = 8

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

โปรดสังเกตว่าสำหรับ K = 8, 4 และ 6 จะไม่ปรากฏก่อนทำซ้ำ0 1ดังนั้น 4 และ 6 จะไม่ปรากฏใน Fibonacci Sequence mod 8

ท้าทาย

รับค่าจำนวนเต็ม K อย่างเคร่งครัดมากกว่า 0 ส่งออกจำนวนเต็มแบบไม่ลบทั้งหมดน้อยกว่า K ที่ไม่ปรากฏใน Fibonacci Sequence mod K

กฎระเบียบ

  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม

  • เริ่มต้น I / O

  • โปรแกรมหรือฟังก์ชั่นที่เป็นที่ยอมรับ

  • คุณสามารถสันนิษฐานได้ว่าKจะพอดีกับชนิดจำนวนเต็มดั้งเดิมของคุณ ( ภายในเหตุผล )

  • หากมีตัวเลขที่ไม่เป็นลบน้อยกว่า K ที่ไม่ปรากฏใน Fibonacci Sequence mod K โปรแกรม / ฟังก์ชั่นของคุณควรแสดงตัวเลขดังกล่าวทั้งหมดในลักษณะที่สมเหตุสมผล

  • หากไม่มีจำนวนเต็มลบที่น้อยกว่า K ที่ไม่ปรากฏใน Fibonacci Sequence mod K โปรแกรม / ฟังก์ชั่นของคุณอาจระบุสิ่งนี้ได้โดยส่งคืนรายการว่างเปล่าไม่พิมพ์อะไรสร้างข้อผิดพลาด ฯลฯ

  • สั่งซื้อไม่เป็นไร

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาจะชนะ

กรณีทดสอบ

สร้างกรณีทดสอบออนไลน์!

กรณีทดสอบที่ไม่ว่างเปล่า

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

กรณีทดสอบเปล่า (ไม่มีเอาต์พุต, ข้อผิดพลาด, รายการว่างเปล่า, ฯลฯ เป็นเอาต์พุตที่ยอมรับได้)

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

ที่เกี่ยวข้อง:

การนับ Fibonacci Orbits

ค้นหายุค Pisano


Sandbox (ถูกลบ)
pizzapants184

คำตอบ:



6

Haskell , 70 ไบต์

จำนวนไบต์ที่บันทึกไว้ต้องขอบคุณ Esolanging Fruit

บันทึก 8 ไบต์ขอบคุณ Laikoni

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

ลองออนไลน์!


@EsolangingFruit อขอบคุณ! ฉันเพิ่งมาถึงข้อสรุปที่คล้ายกันตัวเอง
ข้าวสาลีตัวช่วยสร้าง

read$showทำงานแทนfromIntegerในกรณีนี้และบันทึกสองไบต์
Laikoni

การใช้การzip[1..x^2]ตัดทอนจะช่วยประหยัดไบต์ได้มากขึ้น: ลองออนไลน์!
Laikoni

@Laikoni ใช้เวลาสักครู่ แต่ฉันทำการเปลี่ยนแปลง ขอบคุณนั่นเป็นความคิดที่ดี
ข้าวสาลีตัวช่วยสร้าง

5

Perl 6 ,  43 42 39  32 ไบต์

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

ทดสอบมัน

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

ทดสอบมัน

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

ทดสอบมัน

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

ทดสอบมัน

ขยาย:

{  # 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 ไบต์

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

ลองออนไลน์!

รับอินพุตผ่านแฟล็ก -v

พิมพ์บรรทัดใหม่ที่มากเกินไป แต่ทำงานให้เสร็จลุล่วง โดยทั่วไปจะใช้บรรทัดแรกเพื่อเก็บชุดของตัวเลขที่ปรากฏในลำดับ

มันทำงานอย่างไร:

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 ไบต์

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

ลองออนไลน์!

-1 ไบต์ขอบคุณ 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 ไบต์ ; การจัดเรียงกู้คืนการใช้งานของX~คุณ!
Giuseppe

@iuseppe ขอบคุณ! ยังคงนานมาก ....
Sanchises


2

Husk , 13 12 10 ไบต์

ขอบคุณ @Zgarb สำหรับ -2 ไบต์!

-U2m%⁰İfŀ⁰

พิมพ์รายการที่ว่างเปล่าในกรณีที่จำนวนเต็มทั้งหมดปรากฏลองออนไลน์!

คำอธิบาย

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

คุณสามารถใช้U2เพื่อรับส่วนนำหน้าที่ยาวที่สุดที่ไม่มีคู่ซ้ำติดกัน
Zgarb

2

Python 3 , 78 ไบต์

def m(K):M=0,1;exec(K*6*'M+=sum(M[-2:])%max(K,2),;'+'print({*range(K)}-{*M})')

ลองออนไลน์!

พิมพ์ชุดดังนั้นเอาต์พุตสำหรับกรณีทดสอบว่างคือset()ซึ่งเป็นชุดว่าง



@ovs คุณหมายถึงใน Python 2 ใช่ไหม แน่นอน
Erik the Outgolfer

2

R, 92 86 ไบต์

ขอบคุณ@Giuseppeสำหรับการบันทึก 6 ไบต์!

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

ลองออนไลน์!

การใช้งานที่ไม่ซับซ้อน ( เวอร์ชั่นก่อนหน้านี้แต่มีแนวคิดเดียวกัน):

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


@iuseppe อ่าsetdiffความคิดที่ดี!
plannapus

70 ไบต์ย้ายระบบ1:k^2วิธีการที่คนอื่นใช้
จูเซปเป้

2

Python 3, 173 152 143 131 ไบต์

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

ลองใช้ออนไลน์

มันทำงานยังไง?

ฟังก์ชั่นแรกใช้สองพารามิเตอร์ m และ n และมันคืนค่า n หมายเลขฟีโบนักชีหมายเลข mod m ฟังก์ชั่นที่สองวนซ้ำไปตามหมายเลข Fibonacci mod k และตรวจสอบว่ามีการทำซ้ำ 0 และ 1 หรือไม่ มันเก็บตัวเลขในรายการและเปรียบเทียบกับรายการที่มีตัวเลข 1-n ตัวเลขที่ซ้ำกันจะถูกลบออกและจำนวนที่เหลือจะถูกส่งกลับ


มันเป็นส่วนหนึ่งของส่วนหัวและที่ไม่ได้บังคับให้รวมไว้ในรหัส
Manish Kundu

เสร็จแล้ว @ovs ขอบคุณที่บอกมาฉันไม่รู้ตัว
Manish Kundu

1
131 ไบต์โดยการสร้างชุดที่มีวงเล็บปีกกาแทนset()และเปรียบเทียบการโยงโซ่
ovs


2

Ruby , 47 ไบต์

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

ลองออนไลน์!

ในขณะที่มันใช้บางส่วนของตรรกะเดียวกันนี้ไม่ได้ตามออก คำตอบของ GB

คำอธิบาย:

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



1

Elixir , 148 144 bytes

 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

ลองออนไลน์!

ไม่ใช่คำตอบที่แข่งขันโดยเฉพาะอย่างยิ่ง แต่ก็สนุกกับกอล์ฟ! Elixir เป็นภาษาที่อ่านง่าย แต่คำอธิบายสำหรับความยุ่งเหยิงของตัวละครอยู่ตรงกลางดังต่อไปนี้


คำอธิบายนี้มีสองส่วนคือ mod-fibonacci และการดำเนินการกับมัน

Mod-โกหก:

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

สิ่งนี้จะส่งคืนกระแส fibonacci mod ที่xไม่สิ้นสุด มันเริ่มต้นด้วยแอคคูมูเล{1,1}เตอร์และใช้งานอินฟินิตี้โฆษณาต่อไปนี้: แอคคูเลเตอร์ที่กำหนด{p,n}, ส่งออกp mod xไปยังสตรีม จากนั้นตั้งค่าตัวสะสมเป็น{n,p+n}จากนั้นตั้งค่าสะสมเพื่อ

ส่วนที่เหลือ:

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

Python 3, 76 ไบต์

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

นี่เป็นเพียงวงจรที่ยาวที่สุดที่เป็นไปได้ของหมายเลข Fibonnaci (n ^ 2) และสร้างรายการหมายเลขทั้งหมดที่เกิดขึ้นในเวลานั้น เพื่อลดความซับซ้อนของตรรกะตัวเลขจะถูกเก็บไว้แบบโมดูโล n

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.