Generowanie liczb pierwszych Fermata

10

Biorąc pod uwagę liczbę n, wydrukuj n-tą pierwszą liczbę Fermata, gdzie liczby Fermata mają postać 2 2 k +1. Kod ten powinien teoretycznie praca dla każdego n (czyli nie hardcode go), choć nie należy się spodziewać, aby zakończyć dla n> 4. (Należy nie powrócić 4294967297 dla n = 5, jak 4294967297 nie jest liczbą pierwszą).

Zauważ, że chociaż wszystkie liczby pierwsze Fermata mają postać 2 2 n +1, nie wszystkie liczby w postaci 2 2 n +1 są pierwsze. Celem tego wyzwania jest zwrócenie n-tej liczby pierwszej.

Przypadki testowe

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

Zasady

  • Standardowe luki są niedozwolone.
  • Zarówno indeksowanie 0, jak i indeksowanie 1 są dopuszczalne.
  • To jest , wygrana o najniższej liczbie bajtów.

Powiązane: Konstruowalne n-gony

poi830
źródło
1
Czy ja lub niektóre z odpowiedzi źle interpretują wyzwanie? Czy nie piszemy po prostu programu, który wypisuje 2^(2^n) + 1, gdzie njest wejście? Jest to zgodne z twoimi przypadkami testowymi (które, jak wiemy, są już pierwsze, więc nie musisz tego sprawdzać). I nie spodziewasz się, że program będzie działał tam, gdzie n> 4 (a n = 5 jest pierwszą nie-pierwszą).
jstnthms
Program powinien teoretycznie funkcjonować dla n> 4, chociaż to nigdy nie zadziała w praktyce, ponieważ wiemy tylko o 5 liczbach pierwszych Fermata.
poi830
Nie do końca rozumiem cel teoretycznej pracy dla wszystkich liczb pierwszych Fermata, ponieważ istnieje tylko 5 znanych terminów.
Pan Xcoder,
2
@CodyGray Przypadki testowe wprowadzają w błąd, ponieważ działa to na n=1:4. Wszystkie liczby pierwsze Fermata mają postać 2^2^n+1, ale to nie znaczy, że wszystkie liczby postaci 2^2^n+1są rzeczywiście pierwsze. Tak jest na przykład n=1:4, ale nie n=5na przykład.
JAD
3
Myślę, że pewną częścią zamieszania jest to, że mówisz, że dane wejściowe są, na dane wyjściowe muszą mieć formę 2^(2^n)+1. Jeśli użyjesz różnych zmiennych dla danych wejściowych i wykładnika, pewne zamieszanie może zostać zmniejszone. Może to również pomóc, jeśli wyraźnie oświadczysz, że „n = 5 nie musi generować danych w rozsądnym czasie, ale nie może generować 4294967297”
Kamil Drakari

Odpowiedzi:

3

Galaretka , 13 11 bajtów

ÆẸ⁺‘©ÆPµ#ṛ®

Wykorzystuje indeksowanie 1.

Wypróbuj online!

Jak to działa

ÆẸ⁺‘©Æ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.
Dennis
źródło
Och, więc używa się do wyczyszczenia wyniku ... TIL
Leaky Nun
Och, więc używa się ÆẸzamiast 2*jednej liczby całkowitej ... TIL
Erik the Outgolfer
2

Perl 6 ,  45  42 bajtów

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

Spróbuj

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

Spróbuj

Rozszerzony:

{  # 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
}
Brad Gilbert b2gills
źródło
1

Mathematica, 56 bajtów

(t=n=0;While[t<=#,If[(PrimeQ[s=2^(2^n)+1]),t++];n++];s)&

Wypróbuj online!

J42161217
źródło
0

Pyth , 14 bajtów

Lh^2^2byfP_yTQ

Wypróbuj online.

Główna idea „zapożyczona” z odpowiedzi xnor w innym pytaniu

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
alleks
źródło
0

05AB1E , 8 bajtów

Kod:

Wyniki są indeksowane 1.

µN<oo>Dp

Wykorzystuje kodowanie 05AB1E . Wypróbuj online!

Wyjaśnienie:

µ              # 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
Adnan
źródło
0

JavaScript, 12 46 bajtów

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

Większość kodu jest pobierana przez kontrolę wstępną, która jest stąd .

SuperStormer
źródło
Pamiętaj, że musi zwracać n-tą pierwszą liczbę Fermata, a nie tylko n-tą liczbę Fermata.
poi830,
@ poi830 teraz pierwsza kontrola zajmuje większość funkcji :(
SuperStormer
myślę, że możesz powiedzieć, że <2 zamiast i == 1, ponieważ zero też tu jest dobre? powinno to być 2 bajty
DanielIndie
0

Dyalog APL (29 znaków)

Jestem prawie pewien, że można to poprawić.

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

Jest to funkcja rekurencyjna, która sprawdza liczbę dzielników 1 + 2 ^ 2 ^ ⍵, gdzie ⍵ jest właściwym argumentem funkcji. Jeśli liczba dzielników wynosi 2, liczba jest liczbą pierwszą i zwraca ją, w przeciwnym razie wywołuje funkcję ponownie, używając ⍵ + 1 jako poprawnego argumentu.

Przykład

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

Tutaj wywołuję funkcję na każdym z ⍳4 (liczby 1-4). Dotyczy to każdej liczby z kolei.

James Heslip
źródło
0

Haskell , 61 bajtów

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

Wypróbuj online!

Indeks oparty na 0

Wyjaśnienie

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!   
                                                  ]
SEJPM
źródło