Aumentando partições Goldbach

9

A conjectura de Goldbach afirma que:

todo número par maior que 2 é a soma de dois números primos.

Consideraremos uma partição Goldbach de um número n como um par de dois números primos acrescentando a n . Estamos preocupados com os números é o aumento da partição Goldbach . Medimos o tamanho das partições Goldbach de um número pelo tamanho do menor primo em todas as partições desse número. Um número é de partição crescente se esse tamanho for maior que o tamanho de todos os números pares menores.

Tarefa

Dado um número inteiro par n> 2 , determine se n está aumentando a partição Goldbach e produza dois valores únicos, um se for e outro se não for.

Isso é , então você deve tentar minimizar o número de bytes no seu código-fonte.

OEIS A025018

Caçador Ad Hoc Garf
fonte
Vamos continuar esta discussão no chat .
Ad Hoc Garf Hunter
É uma boa pergunta, difícil de entender. Eu editei para simplificar a redação. Por favor, verifique e, se tudo estiver correto, aplique as alterações.
214176 #
11
@ ЕвгенийНовиков Achei sua edição mais confusa que a original. Eu rejeitei isso. Talvez possamos discutir uma maneira de tornar isso mais claro aqui .
Ad Hoc Garf Hunter
Os exemplos trabalhados ainda são muito confusos - eles parecem extrair números do nada, e cada uma das comparações é expressa de maneira diferente, sem explicar por que certos números são usados. Se você já sabe a resposta, pode descobrir. . . o que fiz voltando ao primeiro parágrafo, ignorando os exemplos até que ficasse claro, e depois descobrindo como os exemplos foram construídos. Talvez alguma estrutura tabular ajudaria, também incluindo 10 provavelmente ajuda
Neil Slater
@ NeilSlater Obrigado pelo feedback. Eu removi os exemplos inteiramente porque acho que eles estavam fazendo mais mal do que bem. Acho que o desafio está claro na explicação, e os exemplos apenas complicam as coisas. Se a explicação não for suficiente, eu ficaria mais do que feliz em expandir ou esclarecer isso, no entanto, acho que não voltarei a adicionar os exemplos porque eles parecem ser a maior fonte de confusão até agora.
Ad Hoc Garf Hunter

Respostas:

5

Gelatina , 12 bytes

ÆRðfạṂ
Ç€M⁼W

Experimente online!

Como funciona

Ç€M⁼W   Main link. Argument: n

Ç€      Map the helper link over [1, ..., n].
  M     Get all indices of the maximum.
    W   Wrap; yield [n].
   ⁼    Test the results to both sides for equality.


ÆRðfạṂ  Helper link. Argument: k

ÆR      Prime range; get all primes in R := [1, ..., k].
  ð     Begin a dyadic chain with arguments R and k.
    ạ   Absolute difference; yield k-p for each p in R.
   f    Filter; keep the q in R such that q = k-p for some p in R.
     Ṃ  Take the minimum.
        This yields 0 if the array is empty.
Dennis
fonte
4

PHP , 154 bytes

for(;$n++<$a=$argn;$i-1?:$p[]=$n)for($i=$n;--$i&&$n%$i;);foreach($p as$x)foreach($p as$y)if(!$r[$z=$x+$y]){$r[$z]=$x;$l[]=$z<$a?$x:0;};echo$r[$a]>max($l);

Experimente online!

Expandido

for(;$n++<$a=$argn;$i-1?:$p[]=$n) # loop through all integers till input if is prime add to array 
  for($i=$n;--$i&&$n%$i;);
foreach($p as$x) #loop through prime array
  foreach($p as$y) #loop through prime array 
    if(!$r[$z=$x+$y]){
      $r[$z]=$x; # add only one time lower value for a sum of $x+$y 
      $l[]=$z<$a?$x:0;}; # add lower value if sum is lower then input
echo$r[$a]>max($l); # Output 1 if lower value for sum of input is greater then all lower values of all numbers under input

Experimente online! Verifique todos os números até 1000

Jörg Hülsermann
fonte
3

JavaScript (ES6), 135 bytes

Usa uma lógica semelhante à resposta PHP de Jörg .

(n,P=[...Array(n).keys()].filter(n=>(p=n=>n%--x?p(n):x==1)(x=n)))=>P.map(p=>P.map(q=>a[q+=p]=a[q]||(m=q<n&&p>m?p:m,p)),a=[m=0])&&a[n]>m

Demo

Arnauld
fonte
2

Python 3: 156 151 142 138 136 128 bytes

r=range
m=lambda n:min(x for x in r(2,n+1)if all(o%i for o in[x,n-x]for i in r(2,o)))
f=lambda n:m(n)>max(map(m,r(2,n,2)))or n<5

(graças ao OP)

(graças a @Rod) (novamente) (e novamente)

enedil
fonte
@Olmman você gosta?
18717 enedil
@ Rod, já que maxcom key retorna o elemento com valor máximo após a aplicação da tecla, tive que adicionar um aplicativo de função, mas ainda assim é mais curto.
28517 enedil
@ Rod e eu não posso aceitar as suas sugestões, pois rangedesde que né limitado por dentro lambda.
enedil 3/07
@enedil fato, mas para o max, você pode usarmax(map(m,r[::2]))
Rod
11
Você não precisa nomear fe, portanto, pode salvar 2 bytes removendo o f=.
Ad Hoc Garf Hunter
1

Python 3: 204 196 bytes

Bytes salvos graças a: Olm Man

from itertools import*
m=lambda g:min([x for x in product([n for n in range(2,g)if all(n%i for i in range(2,n))],repeat=2)if sum(x)==g][0])
i=lambda g:1if all(m(g)>m(x)for x in range(4,g,2))else 0

Experimente online!

Bendl
fonte
2
Algumas dicas, a maioria das funções internas, como mine allpodem considerar os geradores como argumentos, min([...])podem ser reduzidos para min(...)o mesmo com todos. Você também pode se livrar de alguns espaços, particularmente o espaço dentro import *e qualquer espaço depois do aparelho, vejo que você tem um depois range(g)e um antes [i for i in ..., nem são necessários.
Ad Hoc Garf Hunter
^ Isso é incrível, eu não sabia que
BENDL
Além disso, você pode fazer o seu check primo um pouco mais curto, alterando-a all(n%i for i in range(2,g)), mas você tem que mudar range(g)para range(1,g)porque isso dá um falso positivo no 1.
Ad Hoc Garf Hunter