Generando primos de Fermat

10

Dado un número n, imprima el enésimo primer número de Fermat, donde los números de Fermat tienen la forma 2 2 k +1. Este código debe teóricamente trabajo para cualquier n (es decir, no se hardcode), aunque no se espera que interrumpir para n> 4. (Debe no volver 4294967297 para n = 5, como 4294967297 no es un número primo.)

Tenga en cuenta que si bien todos los números primos de Fermat son de la forma 2 2 n +1, no todos los números de la forma 2 2 n +1 son primos. El objetivo de este desafío es devolver el enésimo primer.

Casos de prueba

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

Reglas

  • Las lagunas estándar no están permitidas.
  • La indexación 0 y la indexación 1 son aceptables.
  • Este es el , el menor recuento de bytes gana.

Relacionado: n-gons construibles

poi830
fuente
1
¿Estoy o algunas de las respuestas malinterpretan el desafío? ¿No estamos simplemente escribiendo un programa que genera 2^(2^n) + 1, dónde nestá la entrada? Esto se alinea con sus casos de prueba (que sabemos que ya son primos, por lo que no hay necesidad de verificar). Y no espera que el programa funcione donde n> 4 (yn = 5 es el primer no primo).
jstnthms
El programa debería funcionar teóricamente para n> 4, aunque eso nunca funcionará en la práctica, ya que solo conocemos 5 primos de Fermat.
poi830
Realmente no entiendo el propósito de trabajar teóricamente para todos los primos de Fermat, ya que solo hay 5 términos conocidos.
Sr. Xcoder
2
@CodyGray Los casos de prueba son engañosos, porque esto funciona para n=1:4. Todos los primos de fermat son de la forma 2^2^n+1, pero eso no significa que todos los números de la forma 2^2^n+1sean realmente primos. Este es el caso n=1:4, pero no n=5por ejemplo.
JAD
3
Creo que parte de la confusión es que estás diciendo que la entrada es ny la salida debe ser de la forma 2^(2^n)+1. Si usa diferentes variables para la entrada y el exponente, entonces podría reducirse cierta confusión. También podría ayudar si declara explícitamente que "n = 5 no necesita salir en un tiempo razonable, pero no debe salir 4294967297"
Kamil Drakari

Respuestas:

3

Jalea , 13 11 bytes

ÆẸ⁺‘©ÆPµ#ṛ®

Utiliza indexación basada en 1.

Pruébalo en línea!

Cómo funciona

ÆẸ⁺‘©Æ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
fuente
Oh, entonces uno usa para borrar el resultado ... TIL
Leaky Nun
Ah, entonces uno usa en ÆẸlugar de 2*un solo entero ... TIL
Erik the Outgolfer
2

Perl 6 ,  45  42 bytes

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

Intentalo

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

Intentalo

Expandido:

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

Pyth , 14 bytes

Lh^2^2byfP_yTQ

Probar en línea

Idea principal "prestada" de la respuesta de xnor en otra pregunta

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
callejones
fuente
0

05AB1E , 8 bytes

Código:

Los resultados están indexados en 1.

µN<oo>Dp

Utiliza la codificación 05AB1E . Pruébalo en línea!

Explicación:

µ              # 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
fuente
0

Javascript, 12 46 bytes

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

La mayor parte del código está ocupado por la verificación principal, que es desde aquí .

SuperStormer
fuente
Tenga en cuenta que se debe devolver el enésimo primer número de Fermat, no sólo el número de Fermat enésimo.
poi830
@ poi830 ahora la verificación principal ocupa la mayor parte de la función :(
SuperStormer
creo que puedes decir que i <2 en lugar de i == 1 porque cero también es bueno aquí? eso debería reducirse en 2 bytes
DanielIndie
0

Dyalog APL (29 caracteres)

Estoy casi seguro de que esto se puede mejorar.

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

Esta es una función recursiva que verifica el número de divisores de 1 + 2 ^ 2 ^ ⍵, donde ⍵ es el argumento correcto de la función. Si el número de divisores es 2, el número es primo y lo devuelve; de ​​lo contrario, vuelve a llamar a la función con ⍵ + 1 como argumento correcto.

Ejemplo

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

Aquí llamo a la función en cada uno de ⍳4 (los números 1-4). Se aplica a cada número por turno.

James Heslip
fuente
0

Haskell , 61 bytes

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

Pruébalo en línea!

Índice basado en 0

Explicación

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
fuente