Tạo số nguyên tố Fermat


10

Cho một số n, in số Fermat nguyên tố thứ n , trong đó các số Fermat có dạng 2 2 k +1. Mã này nên về mặt lý thuyết làm việc cho bất kỳ n (tức là không hardcode nó), mặc dù nó không được kỳ vọng sẽ chấm dứt đối với n> 4. (Nó nên không trở 4294967297 cho n = 5, như 4294967297 không phải là một số nguyên tố.)

Xin lưu ý rằng mặc dù tất cả các số nguyên tố Fermat đều có dạng 2 2 n +1, nhưng không phải tất cả các số có dạng 2 2 n +1 đều là số nguyên tố. Mục tiêu của thử thách này là trả lại số nguyên tố thứ n .

Các trường hợp thử nghiệm

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

Quy tắc

  • Sơ hở tiêu chuẩn là không được phép.
  • Cả hai chỉ mục và 1 chỉ mục đều được chấp nhận.
  • Đây là , byte thấp nhất.

Liên quan: n-gons xây dựng


1
Tôi hoặc một số câu trả lời giải thích sai về thách thức? Không phải chúng ta chỉ đơn giản là viết một chương trình đầu ra 2^(2^n) + 1, nđầu vào ở đâu? Điều này phù hợp với các trường hợp thử nghiệm của bạn (mà chúng tôi biết là đã là số nguyên tố, vì vậy không cần phải kiểm tra). Và bạn không mong đợi chương trình hoạt động trong đó n> 4 (và n = 5 là số nguyên tố đầu tiên).
jstnthms

Chương trình về mặt lý thuyết nên hoạt động cho n> 4, mặc dù điều đó sẽ không bao giờ hoạt động trong thực tế, vì chúng ta chỉ biết đến 5 số nguyên tố Fermat.
poi830

Tôi không thực sự hiểu mục đích làm việc trên lý thuyết cho tất cả các số nguyên tố Fermat, vì chỉ có 5 thuật ngữ được biết đến.
Ông Xcoder

2
@CodyGray Các testcase là sai lệch, bởi vì điều này làm việc cho n=1:4. Tất cả các số nguyên tố fermat đều có dạng 2^2^n+1, nhưng điều đó không có nghĩa là tất cả các số của mẫu 2^2^n+1đều thực sự là số nguyên tố. Đây trường hợp cho n=1:4, nhưng không phải là n=5ví dụ.
JAD

3
Tôi nghĩ rằng một phần của sự nhầm lẫn là bạn đang nói đầu vào là nvà đầu ra phải có dạng 2^(2^n)+1. Nếu bạn sử dụng các biến khác nhau cho đầu vào và số mũ thì một số nhầm lẫn có thể được giảm bớt. Nó cũng có thể hữu ích nếu bạn tuyên bố rõ ràng rằng "n = 5 không cần xuất trong thời gian hợp lý, nhưng không được xuất 4294967297"
Kamil Drakari

Câu trả lời:



3

Thạch , 13 11 byte

ÆẸ⁺‘©ÆPµ#ṛ®

Sử dụng lập chỉ mục dựa trên 1.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ÆẸ⁺‘©Æ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.

Ồ, vậy là người ta dùng để xóa kết quả ... TIL
Leaky Nun

Ồ, vậy là người ta sử dụng ÆẸthay vì 2*cho một số nguyên duy nhất ... TIL
Erik the Outgolfer 28/07/17

2

Perl 6 ,  45  42 byte

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

Thử nó

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

Thử nó

Mở rộng:

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

05AB1E , 8 byte

Mã số:

Kết quả là 1 chỉ số.

µN<oo>Dp

Sử dụng mã hóa 05AB1E . Hãy thử trực tuyến!

Giải trình:

µ              # 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 byte

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

Hầu hết các mã được đưa lên bởi kiểm tra chính, đó là từ đây .


Lưu ý rằng nó phải trả về số Fermat thứ n , không chỉ số Fermat thứ n.
poi830

@ poi830 bây giờ, kiểm tra chính chiếm phần lớn chức năng :(
SuperStormer

Tôi nghĩ bạn có thể nói i <2 thay vì i == 1 becuase zero cũng tốt ở đây? nên giảm xuống 2 byte
DanielIndie

0

APL Dyalog (29 ký tự)

Tôi gần như chắc chắn điều này có thể được cải thiện.

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

Đây là hàm đệ quy kiểm tra số lượng ước của 1 + 2 ^ 2 ^, trong đó là đối số đúng của hàm. Nếu số lượng ước là 2, số đó là số nguyên tố và nó trả về nó, nếu không, nó gọi lại hàm với ⍵ + 1 là một đối số đúng.

Thí dụ

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

Ở đây tôi gọi hàm trên mỗi ⍳4 (các số 1-4). Nó áp dụng nó cho mỗi số lần lượt.


0

Haskell , 61 byte

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

Hãy thử trực tuyến!

Chỉ số dựa trên 0

Giải trình

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!   
                                                  ]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.