สร้างจำนวนแฟร์มาต์


10

กำหนดตัวเลข n ให้พิมพ์หมายเลขเฉพาะแฟร์มาต์หมายเลขที่หมายเลขแฟร์มาต์เป็นรูปแบบ 2 2 k +1 รหัสนี้ควรใช้งานได้จริงในทางทฤษฎีสำหรับ n ใด ๆ (เช่นอย่าฮาร์ดโค้ด) แม้ว่าจะไม่คาดว่าจะยุติการทำงานสำหรับ n> 4 (มันไม่ควรส่งคืน 4294967297 สำหรับ n = 5 เนื่องจาก 4294967297 ไม่ใช่หมายเลขเฉพาะ)

โปรดทราบว่าในขณะที่จำนวนแฟร์มาต์ทั้งหมดอยู่ในรูปแบบ 2 2 n +1 แต่ตัวเลขทั้งหมดของรูปแบบ 2 2 n +1 นั้นเป็นจำนวนเฉพาะ เป้าหมายของความท้าทายนี้คือการคืนค่านายกที่ n

กรณีทดสอบ

0 -> 3
1 -> 5
2 -> 17
3 -> 257
4 -> 65537

กฎระเบียบ

  • ช่องโหว่มาตรฐานไม่ได้รับอนุญาต
  • 0-indexing และ 1-indexing นั้นเป็นที่ยอมรับได้
  • นี่คือชนะน้อยที่สุดนับไบต์

ที่เกี่ยวข้อง: Constructible n-gons


1
ฉันหรือคำตอบบางส่วนตีความผิดการท้าทายหรือไม่ เราไม่ได้เพียงแค่เขียนโปรแกรมที่เอาท์พุท2^(2^n) + 1ที่nป้อนข้อมูลหรือไม่ สิ่งนี้สอดคล้องกับกรณีทดสอบของคุณ (ซึ่งเรารู้ว่าดีที่สุดแล้วดังนั้นไม่จำเป็นต้องตรวจสอบ) และคุณไม่คาดหวังว่าโปรแกรมจะทำงานโดยที่ n> 4 (และ n = 5 เป็น non-prime แรก)
jstnthms

โปรแกรมควรทำงานในทางทฤษฎีสำหรับ n> 4 แม้ว่ามันจะไม่ทำงานในทางปฏิบัติเท่าที่เรารู้เพียง 5 ครั้งแฟร์มาต์
poi830

ฉันไม่เข้าใจจุดประสงค์ของการทำงานตามหลักวิชาในเชิงทฤษฎีสำหรับแฟร์มาต์ทุกคนเนื่องจากมีศัพท์ที่รู้จักกันเพียง 5 ข้อเท่านั้น
Mr. Xcoder

2
@CodyGray testcase กำลังทำให้เข้าใจผิดเพราะใช้งานn=1:4ได้ เฟนต์แฟร์มาทั้งหมดอยู่ในรูปแบบ2^2^n+1แต่นั่นไม่ได้หมายความว่าตัวเลขทั้งหมดของแบบฟอร์ม2^2^n+1นั้นมีความสำคัญมาก นี่เป็นกรณีสำหรับn=1:4แต่ไม่ใช่n=5สำหรับตัวอย่าง
JAD

3
ผมคิดว่าเป็นส่วนหนึ่งของความสับสนบางอย่างที่คุณกำลังจะบอกว่าใส่เป็นและเอาท์พุทจะต้องอยู่ในรูปแบบn 2^(2^n)+1หากคุณใช้ตัวแปรที่แตกต่างกันสำหรับอินพุตและเลขชี้กำลังความสับสนบางอย่างอาจลดลง นอกจากนี้ยังอาจช่วยถ้าคุณระบุอย่างชัดเจนว่า "n = 5 ไม่จำเป็นต้องส่งออกในเวลาที่เหมาะสม แต่จะต้องไม่ส่งออก 4294967297"
Kamil Drakari

คำตอบ:



3

เยลลี่ , 13 11 ไบต์

ÆẸ⁺‘©ÆPµ#ṛ®

ใช้การจัดทำดัชนีแบบอิง 1

ลองออนไลน์!

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

ÆẸ⁺‘©ÆPµ#ṛ®  Main link. No argument.

        #    Read an integer n from STDIN and call the chain to the left with
             arguments k = 0, 1, 2, ... until n matches were found.
ÆẸ           Find the integer with prime exponents [k], i.e., 2**k.
  ⁺          Repeat the previous link, yielding 2**2**k.
   ‘         Increment, yielding 2**2**k+1 and...
    ©        copy the result to the register.
     ÆP      Test the result for primality.
          ®  Yield the value from the register, i.e., the n-th Fermar prime.
         ṛ   Yield the result to the right.

โอ้คนหนึ่งใช้เพื่อล้างผลลัพธ์ ... TIL
Leun Nun

โอ้คนหนึ่งใช้ÆẸแทน2*เลขจำนวนเต็มเดียว ... TIL
Erik the Outgolfer

2

Perl 6 ,  45  42 ไบต์

{({1+[**] 2,2,$++}...*).grep(*.is-prime)[$_]}

ลองมัน

{({1+2**2**$++}...*).grep(*.is-prime)[$_]}

ลองมัน

ขยาย:

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

  (  # generate a sequence of the Fermat numbers

    {
      1 +
      2 ** 2 **
        $++            # value which increments each time this block is called
    }
    ...                # keep generating until:
    *                  # never stop

  ).grep(*.is-prime)\  # reject all of the non-primes
  [$_]                 # index into that sequence
}



0

Pyth , 14 ไบต์

Lh^2^2byfP_yTQ

ลองออนไลน์

แนวคิดหลัก "ยืม" จากคำตอบของ xnor ในคำถามอื่น

Lh^2^2byfP_yTQ

L                    define a function with name y and variable b, which:
 h^2^2b                returns 1+2^2^b
       y             call the recently defined function with argument:
        f    Q         the first number T >= Q (the input) for which:
         P_yT            the same function with argument T returns a prime
                     and implicitly print

0

05AB1E , 8 ไบต์

รหัส:

ผลลัพธ์ถูกจัดทำดัชนี 1 รายการ

µN<oo>Dp

ใช้การเข้ารหัส05AB1E ลองออนไลน์!

คำอธิบาย:

µ              # Run the following n succesful times..
 N             #   Push Nn
  oo           #   Compute 2 ** (2 ** n)
    >          #   Increment by one
     D         #   Duplicate
      p        #   Check if the number is prime
               # Implicit, output the duplicated number which is on the top of the stack

0

Javascript, 12 46 ไบต์

k=>eval('for(i=n=2**2**k+1;n%--i;);1==i&&n')

ส่วนใหญ่ของรหัสที่ถูกนำขึ้นมาจากการตรวจสอบที่สำคัญซึ่งอยู่ห่างจากที่นี่


หมายเหตุว่ามันจะต้องกลับมาที่ n นายกจำนวนแฟร์มาต์ไม่เพียง แต่จำนวนแฟร์มาต์ที่ n
poi830

@ poi830 ตอนนี้การตรวจสอบหลักใช้เวลาส่วนใหญ่ของฟังก์ชั่น :(
SuperStormer

ฉันคิดว่าคุณสามารถพูดว่า i <2 แทนที่จะเป็น i == 1 เพราะศูนย์ก็ดีที่นี่เช่นกัน? ที่ควรลดลงเป็น 2 ไบต์
DanielIndie

0

Dyalog APL (29 ตัวอักษร)

ฉันเกือบจะแน่ใจว่าสิ่งนี้สามารถปรับปรุงได้

{2=+/0=(⍳|⊢)a←1+2*2*⍵:a⋄∇⍵+1}

นี่คือฟังก์ชันเรียกซ้ำซึ่งตรวจสอบจำนวนตัวหารของ 1 + 2 ^ 2 ^ ⍵โดยที่⍵เป็นอาร์กิวเมนต์ที่ถูกต้องของฟังก์ชัน หากจำนวนตัวหารคือ 2 จำนวนนั้นจะเป็นจำนวนเฉพาะและจะส่งคืนมิฉะนั้นจะเรียกใช้ฟังก์ชันอีกครั้งโดยใช้⍵ + 1 เป็นอาร์กิวเมนต์ที่ถูกต้อง

ตัวอย่าง

{2=+/0=(⍳|⊢)a←1+2*2*⍵:a ⋄ ∇ ⍵+1}¨⍳4
      5 17 257 65537

ที่นี่ฉันเรียกฟังก์ชั่นในแต่ละ⍳4 (หมายเลข 1-4) มันใช้กับทุกหมายเลขในทางกลับกัน


0

Haskell , 61 ไบต์

p n=2^2^n;f=(!!)[p x+1|x<-[0..],all((>)2.gcd(p x+1))[2..p x]]

ลองออนไลน์!

ดัชนีที่ใช้ 0

คำอธิบาย

p n=2^2^n;                                          -- helper function 
                                                    -- that computes what it says
f=                                                  -- main function
  (!!)                                              -- partially evaluate 
                                                    -- index access operator
      [p x+1|                                       -- output x-th fermat number
             x<-[0..],                              -- try all fermat number indices
                      all                 [2..p x]  -- consider all numbers smaller F_x
                                                    -- if for all of them...
                         ((>)2                      -- 2 is larger than...
                              .gcd(p x+1))          -- the gcd of F_x 
                                                    -- and the lambda input 
                                                    -- then it is a Fermat prime!   
                                                  ]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.