Zwiększenie partycji Goldbacha

9

Hipoteza Goldbacha stwierdza, że:

każda liczba parzysta większa niż 2 jest sumą dwóch liczb pierwszych.

Rozważymy partycję Goldbacha liczby n jako parę dwóch liczb pierwszych dodających do n . Mamy do czynienia z liczbami jest zwiększania partycji Goldbach . Mierzymy wielkość partycji Goldbach według rozmiaru najmniejszej liczby pierwszej we wszystkich partycjach tej liczby. Liczba rośnie, jeśli ten rozmiar jest większy niż rozmiar wszystkich mniejszych liczb parzystych.

Zadanie

Biorąc pod uwagę parzystą liczbę całkowitą n> 2 , określ, czy n ma zwiększającą się partycję Goldbacha, i wypisz dwie unikalne wartości, jedną, jeśli jest, a drugą, jeśli nie.

To jest , dlatego należy dążyć do zminimalizowania liczby bajtów w kodzie źródłowym.

OEIS A025018

Ad Hoc Garf Hunter
źródło
Daj nam kontynuować tę dyskusję w czacie .
Ad Hoc Garf Hunter
To dobre pytanie, które jest trudne do zrozumienia. Zredagowałem to, aby uprościć sformułowanie. Sprawdź to, a jeśli wszystko jest w porządku, zastosuj zmiany.
Евгений Новиков
1
@ ЕвгенийНовиков Uważam twoją edycję za bardziej mylącą niż oryginał. Odrzuciłem to. Może omówimy sposób, aby to wyraźniej tutaj .
Ad Hoc Garf Hunter
Przepracowane przykłady są nadal bardzo mylące - wydają się wyciągać liczby znikąd, a każde z porównań jest wyrażane inaczej, bez wyjaśnienia, dlaczego niektóre liczby są używane. Jeśli znasz już odpowiedź, możesz ją zrozumieć. . . co zrobiłem, wracając do pierwszego akapitu, ignorując przykłady, aż stało się jasne, a następnie zastanawiając się, jak je skonstruowano. Być może pomogłaby jakaś struktura tabelaryczna, w tym prawdopodobnie 10
Neil Slater
@NeilSlater Dziękujemy za opinię. Przykłady całkowicie usunąłem, ponieważ uważam, że wyrządzają więcej szkody niż pożytku. Myślę, że wyzwanie wynika z wyjaśnienia, a przykłady tylko komplikują sprawy. Jeśli wyjaśnienie nie jest wystarczające , chętnie go rozwinę lub wyjaśnię, jednak nie sądzę, że dodam ponownie przykłady, ponieważ wydają się one jak dotąd największym źródłem nieporozumień.
Ad Hoc Garf Hunter

Odpowiedzi:

5

Galaretka , 12 bajtów

ÆRðfạṂ
Ç€M⁼W

Wypróbuj online!

Jak to działa

Ç€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
źródło
4

PHP , 154 bajty

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

Wypróbuj online!

Rozszerzony

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

Wypróbuj online! Sprawdź wszystkie liczby do 1000

Jörg Hülsermann
źródło
3

JavaScript (ES6), 135 bajtów

Wykorzystuje podobną logikę jak odpowiedź PHP Jörga .

(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

Próbny

Arnauld
źródło
2

Python 3: 156 151 142 138 136 128 bajtów

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

(dzięki OP)

(dzięki @Rod) (ponownie) (i ponownie)

enedil
źródło
@Olmman lubisz to?
enedil
@Rod, ponieważ maxz kluczem zwraca element o maksymalnej wartości po zastosowaniu klucza, musiałem dodać aplikację funkcji, ale jest ona jednak krótsza.
enedil
@Rod i ja nie możemy przyjąć twoich sugestii, rangeponieważ nsą one ograniczone w środku lambda.
enedil
@enedil Rzeczywiście, ale dla maksimum możesz użyćmax(map(m,r[::2]))
Rod
1
Nie musisz nazywać, fdzięki czemu możesz zaoszczędzić 2 bajty, usuwając f=.
Ad Hoc Garf Hunter
1

Python 3: 204 196 bajtów

Zapisane bajty dzięki: 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

Wypróbuj online!

zginać
źródło
2
Kilka wskazówek, większość wbudowanych funkcji, takich jak mini allmoże przyjmować generatory jako argumenty, oznacza to, że min([...])można je skrócić min(...)i to samo ze wszystkimi. Możesz także pozbyć się niektórych pól, szczególnie przestrzeni wimport * nawiasie klamrowym i dowolnej przestrzeni po nawiasach klamrowych, widzę, że masz jedną po range(g)drugiej i jedną wcześniej [i for i in ..., żadne z nich nie jest konieczne.
Ad Hoc Garf Hunter
^ To niesamowite, nie wiedziałem o tym
zginam
Możesz także nieco skrócić swój test główny, zmieniając go na all(n%i for i in range(2,g)), ale musisz zmienić range(g)na, range(1,g)ponieważ daje to fałszywie dodatni wynik 1.
Ad Hoc Garf Hunter