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


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.

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
}



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

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

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 .


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.


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!   
                                                  ]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.