A conjectura de Goldbach afirma que todo número par maior que dois pode ser expresso como a soma de dois números primos. Por exemplo,
4 = 2 + 2
6 = 3 + 3
8 = 5 + 3
No entanto, quando chegamos a 10, algo interessante acontece. Não apenas 10 podem ser escritos como
5 + 5
mas também pode ser escrito como
7 + 3
Como 10 pode ser expresso como a soma de dois números primos de duas maneiras , dizemos que a "partição Goldbach" de 10 é 2
. Ou de maneira mais geral,
A partição Goldbach de um número é o número total de maneiras distintas de escrever
n = p + q
ondep
eq
são primos ep >= q
Seu desafio é escrever um programa ou função que encontre a partição Goldbach de um número. Agora, tecnicamente, o termo "partição Goldbach" é usado apenas para se referir a números pares. No entanto, como o número inteiro ímpar p + 2 também pode ser expresso como a soma de dois números primos se p> 2 for primo, estenderemos isso a todos os números inteiros positivos ( A061358 ).
Você pode assumir com segurança que sua entrada sempre será um número inteiro positivo e poderá receber entrada e saída em qualquer um dos nossos métodos padrão permitidos , por exemplo, argumentos de função e valor de retorno, STDIN e STDOUT, leitura e gravação em um arquivo etc.
As partições Goldbach dos números inteiros positivos até 100 são:
0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 2, 1, 2, 0, 2, 1, 2, 1, 3, 0, 3, 1,
3, 0, 2, 0, 3, 1, 2, 1, 4, 0, 4, 0, 2, 1, 3, 0, 4, 1, 3, 1, 4, 0, 5, 1, 4,
0, 3, 0, 5, 1, 3, 0, 4, 0, 6, 1, 3, 1, 5, 0, 6, 0, 2, 1, 5, 0, 6, 1, 5, 1,
5, 0, 7, 0, 4, 1, 5, 0, 8, 1, 5, 0, 4, 0, 9, 1, 4, 0, 5, 0, 7, 0, 3, 1, 6
Como sempre, as brechas padrão se aplicam e a resposta mais curta em bytes vence!
Respostas:
Gelatina , 8 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Python 2, 76 bytes
Recursivamente rastreia de
k=2
atén/2
, adicionando valores onde ambosk
en-k
são primos. Seria bom fazer uma contagemn
regressiva ao mesmo tempo, mas isso tem um problema quek=0
ek=1
são falsamente chamado nobre:A verificação de primalidade é a divisão de teste, abreviada pela verificação de ambos
k
en-k
juntos. Eu achei que isso era mais curto do que usar um gerador de teorema de Wilson (79 bytes):A idéia para este é manter uma lista de todos os números primos na metade inferior a ser verificada quando chegarmos à metade superior, mas, para o ponto médio
k=n/2
, não tivemos tempo de adicionarn-k
uma lista quando chegarmos àk
. Uma versão iterativa contorna isso, mas tem 82 bytes:fonte
MATL , 8 bytes
Experimente online!
Explicação
Considere a entrada
8
como um exemploÉ interessante observar o gráfico da sequência , usando uma versão ligeiramente modificada do código:
Para entrada,
10000
o resultado éVocê pode experimentá-lo no MATL Online ( atualize a página se o botão "Executar" não mudar para "Matar" quando pressionado). Demora vários 25 segundos para produzir o gráfico para entrada
3000
; entradas acima de alguns milhares expirarão.fonte
Upper triangular part
truque é muito legal!JavaScript (ES6),
777370 bytesGuardado 3 bytes graças a @Arnauld
f
é uma função de teste de primalidade; a função relevante ég
.f
funciona contando recursivamente a partir de n-1 ; o fluxo de controle em cada estágio é assim:x<2||
Se x <2 , o número é primo; retorno 1 .n%x&&
Caso contrário, se n mod x = 0 , o número não é primo; retornon%x
.f(n,x-1)
Caso contrário, o número pode ou não ser primo; diminua xe tente novamente.g
funciona de maneira semelhante, embora com pouco controle de fluxo. Ele funciona multiplicando f (b) por f (ab) para cada número inteiro b no intervalo [2, piso (a / 2)] e , em seguida, somando os resultados. Isso nos dá o número de pares que somam uma em que ambos os números do par são primos, que é exatamente o que queremos.fonte
a
é positivo,b=a>>1
você deve economizar um byte.>>
operador ...f=(n,x=n)=>--x<2||n%x&&f(n,x)
?05AB1E ,
108 bytesExtremamente ineficiente.
Experimente online! ou Tente uma maneira menos eficiente de gerar números primos
Explicação
n = 10
usado como exemplo.fonte
ü
? GostaD!fü+r¢
?n=10
que seria count (10, [5,8,12]), que é 0 em vez de 2.,ü
é aplicado apenas entre cada par de itens. Deu-me a ideia de tentarã
, mas infelizmente isso acabou por 1 byte a mais.GAP , 57 bytes
Não acho que o GAP tenha um caminho mais curto que esse óbvio.
Number
conta quantos elementos de uma lista atendem a um predicado.Utilizando-o para calcular os 100 primeiros valores:
fonte
Braquilog , 22 bytes
Experimente online!
Explicação
Uma transcrição direta do problema.
fonte
Mathematica, 52 bytes
O resultado é fornecido como uma função anônima. Tente plotar um gráfico sobre ele:
A propósito, o código tem o mesmo comprimento da versão funcional do código de demonstração no OEIS.
fonte
PrimeQ[#~IntegerPartitions~{2}]~Count~{a=True,a}&
Gelatina , 12 bytes
TryItOnline
1-100
Quão?
fonte
Raquete 219 bytes
Ungolfed:
Teste:
Resultado:
fonte
Na verdade , 11 bytes
Experimente online!
Explicação:
fonte
05AB1E , 6 bytes
Experimente online!
Explicação:
fonte
Haskell, 73 bytes
Exemplo de uso:
map f [1..25]
->[0,0,0,1,1,1,1,1,1,2,0,1,1,2,1,2,0,2,1,2,1,3,0,3,1]
.Implementação direta da definição: primeiro vincule
r
a todos os números primos até o número de entradan
, depois pegue um1
para todosp
eq
der
ondeq<=p
ep+q==n
e os some.fonte