Augmentation des partitions Goldbach

9

La conjecture de Goldbach déclare que:

chaque nombre pair supérieur à 2 est la somme de deux nombres premiers.

Nous considérerons une partition de Goldbach d'un nombre n comme une paire de deux nombres premiers additionnant n . Nous sommes préoccupés par le nombre est d'augmenter la partition Goldbach . Nous mesurons la taille des partitions Goldbach d'un nombre par la taille du plus petit nombre premier dans toutes les partitions de ce nombre. Un nombre augmente de partition si cette taille est supérieure à la taille de tous les petits nombres pairs.

Tâche

Etant donné un entier pair n> 2 , déterminez si n a une partition Goldbach croissante et affichez deux valeurs uniques, une si elle l'est et une si elle ne l'est pas.

Il s'agit de , vous devez donc viser à réduire le nombre d'octets dans votre code source.

OEIS A025018

Ad Hoc Garf Hunter
la source
Continuons cette discussion dans le chat .
Ad Hoc Garf Hunter
C'est une bonne question, difficile à comprendre. Je l'ai édité pour simplifier la formulation. Veuillez le vérifier, et si tout est correct, appliquez les modifications.
Евгений Новиков
1
@ ЕвгенийНовиков J'ai trouvé votre montage plus déroutant que l'original. Je l'ai rejeté. Peut-être pouvons-nous discuter d'un moyen de rendre cela plus clair ici .
Ad Hoc Garf Hunter
Les exemples travaillés sont encore très confus - ils semblent tirer des chiffres de nulle part, et chacune des comparaisons est exprimée différemment sans expliquer pourquoi certains nombres sont utilisés. Si vous connaissez déjà la réponse, vous pouvez la découvrir. . . ce que j'ai fait en revenant au premier paragraphe, en ignorant les exemples jusqu'à ce que ce soit clair, puis en déterminant comment les exemples ont été construits. Peut-être qu'une certaine structure tabulaire aiderait, y compris également 10 aiderait probablement
Neil Slater
@NeilSlater Merci pour la rétroaction. J'ai supprimé les exemples entièrement parce que je pense qu'ils faisaient plus de mal que de bien. Je pense que le défi ressort clairement de l'explication, et les exemples ne font que compliquer les choses. Si l'explication n'est pas suffisante, je serais plus qu'heureux de développer ou de clarifier cela, mais je ne pense pas que j'ajouterai les exemples car ils semblent être la plus grande source de confusion jusqu'à présent.
Ad Hoc Garf Hunter

Réponses:

5

Gelée , 12 octets

ÆRðfạṂ
Ç€M⁼W

Essayez-le en ligne!

Comment ça fonctionne

Ç€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
la source
4

PHP , 154 octets

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);

Essayez-le en ligne!

Étendu

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

Essayez-le en ligne! Vérifiez tous les numéros jusqu'à 1000

Jörg Hülsermann
la source
3

JavaScript (ES6), 135 octets

Utilise une logique similaire à la réponse 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

Démo

Arnauld
la source
2

Python 3: 156 151 142 142 138 136 128 octets

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

(merci à OP)

(merci à @Rod) (encore) (et encore)

enedil
la source
@Olmman vous a plu?
enedil
@Rod puisque maxavec la clé renvoie l'élément avec une valeur maximale après avoir appliqué la clé, j'ai dû ajouter une application de fonction mais elle est néanmoins plus courte.
enedil
@Rod et moi ne pouvons pas accepter vos suggestions rangecar nétant délimité à l'intérieur lambda.
enedil
@enedil En effet, mais pour le max, vous pouvez utilisermax(map(m,r[::2]))
Rod
1
Vous n'avez pas besoin de nommer fet pouvez ainsi économiser 2 octets en supprimant le f=.
Ad Hoc Garf Hunter
1

Python 3: 204 196 octets

Octets économisés grâce à: 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

Essayez-le en ligne!

bendl
la source
2
Quelques conseils, la plupart des fonctions intégrées aiment minet allpeuvent prendre des générateurs comme arguments, cela signifie que cela min([...])peut être raccourci min(...)et le même avec tous. Vous pouvez également vous débarrasser de certains espaces, en particulier de l'espace à l'intérieur import *et de tout espace après les accolades, je vois que vous en avez un après range(g)et un avant [i for i in ..., aucun n'est nécessaire.
Ad Hoc Garf Hunter
^ C'est génial, je ne le savais pas
bendl
Aussi , vous pouvez faire votre chèque prime un peu plus court en changeant à all(n%i for i in range(2,g)), mais vous devez changer range(g)à range(1,g)parce que cela donne un faux positif sur 1.
Ad Hoc Garf Hunter