O Postulado de Bertrand afirma que, para todo número inteiro n ≥ 1, há pelo menos um primo p tal que n <p ≤ 2n . Para verificar esse teorema para n <4000 , não precisamos verificar 4000 casos: O truque Landau diz que é suficiente verificar se
2, 3, 5, 7, 13, 23, 43, 83, 163, 317, 631, 1259, 2503, 5003
são todos primos. Como cada um desses números é menor que o dobro do predecessor, cada intervalo {y: n <y ≤ 2n} contém pelo menos um desses números primos.
Essa sequência de números é o Bertrand Primes (OEIS A006992) e eles são definidos da seguinte maneira:
a(1) = 2
a(n) = largest prime below 2a(n-1)
Desafio
Implemente essa sequência. Você pode escrever
- uma função ou programa que deu alguns retornos n a (n) (0 ou 1 indexado),
- uma função ou programa que fornece n retorna as primeiras entradas n (ou n-1 ou n + 1 ) dessa sequência,
- uma lista infinita ou fluxo ou gerador ou equivalente semelhante no seu idioma.
Fx.ØØ
está tão perto ... Funciona para qualquer coisa aciman > 2
.$F·ÅPθ
pela mesma contagem de bytes.Haskell , 50 bytes
Experimente online!
Produz uma lista infinita.
Haskell , 40 bytes?
Experimente online!
Isso funciona se os números primos de Bertrand não contiverem pseudo-tempos de Fermat para 2 .
fonte
Gelatina , 6 bytes
Experimente online!
Indexado a 0.
Explicação
fonte
MATL , 9 bytes
Entradas n , saídas a ( n ), indexadas em 1.
Experimente online!
Explicação
fonte
Stax , 10 bytes
Executar casos de teste
Esse problema expôs um bug na implementação de stax
:p
, que é uma instrução que obtém o maior número primo menor que sua entrada. Se funcionasse corretamente, haveria uma solução de56 bytes.Mas, infelizmente, não, e não há.Como criador do idioma, eu o corrigirei, mas parece meio barato corrigi-lo e usá-lo depois que o problema foi postado.De qualquer forma, aqui está a representação ascii correspondente do programa acima.
É uma implementação relativamente direta da declaração do problema. A única coisa possivelmente interessante sobre isso é o uso da
gs
forma geradora. Geradores são uma família de construções que combinam uma condição inicial, uma transformação e um filtro, para produzir um ou mais valores satisfatórios. Nesse caso, é usado no lugar da:p
instrução quebrada .Edit: aqui está a solução de 6 bytes, mas requer uma correção de bug que só foi aplicada após o lançamento deste desafio.
fonte
Python 2 , 63 bytes
Experimente online!
Imprime para sempre.
Usa o gerador principal de Theorem de Wilson, mesmo que a geração de primos adiante seja desajeitada para esse problema. Rastreia o maior primo atual visto
r
e o limite de duplicaçãom
.Dois bytes são salvos,
P*=k
mais doP*=k*k
que o habitual, pois o único efeito é afirmar que 4 é primo e a sequência de duplicação erra.fonte
CJam (15 bytes)
Demonstração online . Observe que esse índice é 0.
Uma abordagem mais eficiente seria pesquisar para trás, mas isso exige um caractere a mais porque não pode usar implícito
,
(intervalo):fonte
Japt ,
16141312 bytesDuas soluções pelo preço de uma, ambas indexadas em 1.
Enésimo termo
Finalmente, um desafio que posso escrever uma solução funcional para usar
F.g()
.Tente
Primeiros Termos N
Tente
fonte
Pari / GP , 34 bytes
Experimente online!
fonte
Python 2 , 64 bytes
Experimente online! Imprime a sequência indefinidamente
fonte
Haskell , 58 bytes
Experimente online!
fonte
Python 2 , 68 bytes
Imprime a sequência indefinidamente (você precisa clicar em "Executar" na segunda vez para interromper a execução).
Experimente online!
Python 3 , 90 bytes
Retorna o enésimo termo.
Experimente online!
fonte
C (gcc) ,
9787868079 bytesP
no loop principal.printf
chamada.i
-ésima entrada de sequência (indexada 0) em vez de gerar um fluxo interminável.Experimente online!
fonte
Anexo , 38 bytes
Experimente online!
Baseado em 0; retorna o
n
th Bertrand prime.No momento, não há um builtin para encontrar os números primos anteriores / próximos, então eu uso o
Series
builtin para calcular todos os números primos até2*$[_-1]
. Essa última expressão usa recursão implícita (vinculada a$
) para definir facilmente a relação de recorrência. A condição if é usada para determinar uma condição base.fonte
Perl 6 , 35 bytes
Experimente online!
Essa expressão é uma lista infinita de números primos de Bertrand.
fonte
Retina , 39 bytes
Experimente online! Explicação:
Comece com 1.
Repita o loop usando a entrada como a contagem do loop.
Dobrar o valor.
Encontre o primo mais alto menor que o valor.
Imprima isso.
fonte
Ruby , 51 + 7 (-rprime) = 58 bytes
Experimente online!
Um lamba aceitando
n
e retornando onth
Bertrand prime, 0-indexado. Não há muito aqui, mas deixe-me desenterrar assim mesmo:Ruby , 48 + 7 = 55 bytes
Experimente online!
Por diversão, aqui está uma solução de loop infinito. Imprime conforme necessário e requer uma interrupção. Dependendo exatamente de quando você interrompe, você pode ou não ver a saída. Ungolfed:
fonte
APL (Dyalog Extended) , 12 bytes
Recebe a entrada do usuário como N, retorna o enésimo elemento da sequência (indexado 0).
Experimente online!
Explicação:
fonte
R , 87 bytes
Dadas
n
saídasa(n)
Experimente online!
Ainda estou trabalhando em "Dada a saída n a (1), a (2) ... a (n)". Eu pensei que poderia apenas modificar esse código um pouco, mas parece mais difícil do que isso.
fonte