Fermat 프라임 생성


10

숫자 n이 주어지면, n 번째 소수 Fermat 수를 인쇄하십시오 . 여기서 Fermat 수는 2 2 k +1 형식 입니다. 이> N 4.를 종료 할 것으로 예상되지는 않지만이 코드는 이론적 상관 없음에 대한 작업 (즉, 그것을 하드 코딩하지 않음), (그것은해야한다 하지 4294967297가 소수 아니므로, 대한 4,294,967,297 N = 5를 반환합니다.)

모든 Fermat 프라임은 2 2 n +1 형식 이지만 2 2 n +1 형식의 모든 숫자가 소수는 아닙니다 . 이 과제의 목표는 n 번째 소수 를 반환하는 것 입니다.

테스트 사례

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

규칙

  • 표준 허점은 허용되지 않습니다.
  • 0 인덱싱 및 1 인덱싱이 모두 허용됩니다.
  • 이것은 , 가장 낮은 바이트 수의 승리입니다.

관련 : 구성 가능한 n- 곤


1
나는 도전을 잘못 해석하는 답이 있습니까? 단순히 출력하는 프로그램을 작성하지 않습니까? 입력은 2^(2^n) + 1어디에 n있습니까? 이것은 테스트 사례와 일치합니다 (우리는 이미 주요한 것으로 알고 있으므로 확인할 필요가 없습니다). 그리고 n> 4 (및 n = 5가 첫 번째 비 프라임) 인 경우 프로그램이 작동하지 않을 것으로 예상됩니다.
jstnthms

이 프로그램은 이론적으로 n> 4에서 작동해야하지만 5 개의 Fermat 소수만 알고 있으므로 실제로는 작동하지 않습니다.
poi830

나는 알려진 용어가 5 개뿐이므로 모든 Fermat 프라임에 이론적으로 작동하는 목적을 이해하지 못합니다.
Mr. Xcoder

2
@CodyGray 테스트 케이스가 작동하기 때문에 오해의 소지가 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
Leaky Nun

아, 그래서 하나의 정수 ÆẸ대신에 하나를 사용 합니다 2*... TIL
Erik the Outgolfer

2

펄 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

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

자바 스크립트, 12 46 바이트

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

코드의 대부분은 출신 주요 체크에 의해 흡수되고 여기에 .


n 번째 Fermat 번호뿐만 아니라 n 번째 소수 Fermat 번호를 반환해야합니다 .
poi830

@ poi830 이제 프라임 체크는 대부분의 기능을 수행합니다. (
SuperStormer

나는 당신이 i == 1 대신 i <2라고 말할 수 있다고 생각합니다. 2 바이트를 줄여야합니다
DanielIndie

0

Dyalog APL (29 자)

나는 이것이 향상 될 수 있다고 확신합니다.

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

이것은 1 + 2 ^ 2 ^ ⍵의 제수를 확인하는 재귀 함수입니다. 여기서 where는 함수의 올바른 인수입니다. 제수의 수가 2이면 소수가 소수이고, 그렇지 않으면 ⍵ + 1을 올바른 인수로 사용하여 함수를 다시 호출합니다.

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

여기에서는 각 ⍳4 (숫자 1-4)에서 함수를 호출합니다. 그것은 모든 숫자에 차례로 적용됩니다.


0

하스켈 , 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.