Gerando primos Fermat

10

Dado um número n, imprimir o enésimo privilegiada número Fermat, onde os números de Fermat são da forma 2 2 k +1. Este código deve teoricamente obra para qualquer n (ou seja, não codificá-lo), embora não se espera para terminar para n> 4. (Deve não voltar 4294967297 para n = 5, como 4294967297 não é um número primo.)

Observe que, embora todos os números primos Fermat tenham a forma 2 2 n +1, nem todos os números da forma 2 2 n +1 são primos. O objetivo deste desafio é retornar o n-ésimo primo.

Casos de teste

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

Regras

  • As brechas padrão não são permitidas.
  • A indexação 0 e a indexação 1 são aceitáveis.
  • Isso é , vitórias mais baixas na contagem de bytes.

Related: n-gons construtíveis

poi830
fonte
11
Eu sou ou algumas das respostas estão interpretando mal o desafio? Não estamos simplesmente escrevendo um programa que produz 2^(2^n) + 1, onde nestá a entrada? Isso está alinhado com seus casos de teste (que sabemos que já são excelentes, portanto não há necessidade de verificar). E você não espera que o programa funcione onde n> 4 (en = 5 é o primeiro não primo).
Jstnthms 28/07
Teoricamente, o programa deve funcionar para n> 4, embora isso nunca funcione na prática, pois sabemos apenas 5 primos de Fermat.
poi830
Eu realmente não entendo o propósito de trabalhar teoricamente para todos os primos Fermat, já que existem apenas 5 termos conhecidos.
Mr. Xcoder
2
@CodyGray Os casos de teste são enganosos, porque isso funciona para n=1:4. Todos os números primos fermat são da forma 2^2^n+1, mas isso não significa que todos os números da forma 2^2^n+1sejam realmente primos. Este é o caso n=1:4, mas não n=5por exemplo.
JAD
3
Eu acho que uma parte da confusão é que você está dizendo que a entrada é ne a saída deve estar no formato 2^(2^n)+1. Se você usar variáveis ​​diferentes para a entrada e o expoente, alguma confusão poderá ser reduzida. Também pode ajudar se você declarar explicitamente que "n = 5 não precisa ser produzido em tempo razoável, mas não deve ser produzido 4294967297" #
311 Kamil Drakari

Respostas:

3

Geléia , 13 11 bytes

ÆẸ⁺‘©ÆPµ#ṛ®

Usa indexação baseada em 1.

Experimente online!

Como 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
fonte
Ah, então se usa para limpar o resultado ... TIL
Freira gotejante
Ah, então usa-se em ÆẸvez de 2*para um único inteiro ... TIL
Erik, o Outgolfer
2

Perl 6 ,  45  42 bytes

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

Tente

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

Tente

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
fonte
1

Mathematica, 56 bytes

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

Experimente online!

J42161217
fonte
0

Pitão , 14 bytes

Lh^2^2byfP_yTQ

Experimente online.

Idéia principal "emprestada" da resposta do xnor em outra pergunta

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
becos
fonte
0

05AB1E , 8 bytes

Código:

Os resultados são indexados em 1.

µN<oo>Dp

Usa a codificação 05AB1E . Experimente online!

Explicação:

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

Javascript, 12 46 bytes

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

A maior parte do código é utilizada pela verificação básica, que é daqui .

SuperStormer
fonte
Note-se que ele deve retornar a enésima privilegiada número Fermat, não apenas o número de Fermat enésimo.
poi830
@ poi830 agora o cheque principal ocupa a maior parte das funções :(
SuperStormer
Eu acho que você pode dizer i <2 em vez de i == 1 porque zero também é bom aqui? isso deve reduzir 2 bytes
DanielIndie 8/17/17
0

Dyalog APL (29 caracteres)

Estou quase certo de que isso pode ser melhorado.

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

Esta é uma função recursiva que verifica o número de divisores de 1 + 2 ^ 2 ^ ⍵, onde ⍵ é o argumento correto da função. Se o número de divisores for 2, o número será primo e o retornará; caso contrário, ele chamará a função novamente com ⍵ + 1 como argumento correto.

Exemplo

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

Aqui eu chamo a função em cada um dos ⍳4 (os números 1-4). Aplica-o a todos os números por sua vez.

James Heslip
fonte
0

Haskell , 61 bytes

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

Experimente online!

Índice baseado em 0

Explicação

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
fonte