Увеличение разделов Гольдбаха

9

Гипотеза Гольдбаха утверждает, что:

каждое четное число больше 2 является суммой двух простых чисел.

Мы будем рассматривать разбиение Голдбаха числа n как пару двух простых чисел, добавляющих к n . Нас интересуют цифры увеличивающегося раздела Гольдбаха . Мы измеряем размер разделов Голдбаха числа по величине наименьшего простого числа во всех разделах этого числа. Число увеличивается с разделением, если этот размер больше, чем размер всех меньших четных чисел.

задача

Учитывая четное целое число n> 2 , определите, является ли n увеличивающимся разделом Голдбаха, и выведите два уникальных значения, одно, если оно есть, и одно, если это не так.

Это , поэтому вы должны стремиться минимизировать количество байтов в вашем исходном коде.

OEIS A025018

Специальный охотник за гарфами
источник
Давайте продолжим эту дискуссию в чате .
Специальный охотник за
Это хороший вопрос, который трудно понять. Я отредактировал это, чтобы упростить формулировку. Пожалуйста, проверьте это, и если все правильно, внесите изменения.
Евгений Новиков
1
@ ЕвгенийНовиков Мне показалось, что твоя редакция более запутанная, чем оригинал. Я отверг это. Возможно, мы можем обсудить способ прояснить это здесь .
Специальный охотник за
Проработанные примеры по-прежнему очень запутанные - они, кажется, вытягивают цифры из ниоткуда, и каждое из сравнений выражается по-разному, не объясняя, почему используются определенные числа. Если вы уже знаете ответ, вы можете понять его. , , что я и сделал, вернувшись к первому абзацу, игнорируя примеры до тех пор, пока они не станут понятными, а затем выяснив, как были построены примеры. Возможно, поможет некоторая табличная структура, в том числе 10
Нил Слейтер,
@NeilSlater Спасибо за отзыв. Я полностью удалил примеры, потому что думаю, что они приносили больше вреда, чем пользы. Я думаю, что проблема ясна из объяснения, и примеры только усложняют вещи. Если объяснения недостаточно, я был бы более чем рад расширить или прояснить это, однако я не думаю, что буду добавлять примеры обратно, потому что они, похоже, пока что являются самым большим источником путаницы.
Специальный охотник за

Ответы:

5

Желе , 12 байт

ÆRðfạṂ
Ç€M⁼W

Попробуйте онлайн!

Как это работает

Ç€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.
Деннис
источник
4

PHP , 154 байта

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

Попробуйте онлайн!

расширенный

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

Попробуйте онлайн! Проверить на все номера до 1000

Йорг Хюльсерманн
источник
3

JavaScript (ES6), 135 байт

Использует логику, аналогичную ответу PHP от 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

демонстрация

Arnauld
источник
2

Python 3: 156 151 142 138 136 128 байт

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

(спасибо ОП)

(спасибо @Rod) (снова) (и снова)

enedil
источник
@Olmman тебе нравится?
enedil
@Rod, поскольку maxс ключом возвращает элемент с максимальным значением после применения ключа, мне пришлось добавить функцию application, но тем не менее она короче.
enedil
@Rod и я не могу принять ваши предложения, так rangeкак nограничен внутри lambda.
enedil
@enedil Действительно, но для максимума можно использоватьmax(map(m,r[::2]))
Rod
1
Вам не нужно указывать имя fи, следовательно, вы можете сохранить 2 байта, удалив f=.
Ad Hoc
1

Python 3: 204 196 байт

Байты сохранены благодаря: 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

Попробуйте онлайн!

Bendl
источник
2
Несколько советов, большинство встроенных функций, таких как minи allмогут принимать генераторы в качестве аргументов, это означает, что min([...])можно сократить min(...)и то же самое для всех. Вы также можете избавиться от некоторых пробелов, в частности пробелов в import *и любых пробелов после фигурных скобок, я вижу, что у вас есть один после range(g)и один до [i for i in ..., ни то, ни другое не нужно.
Ad Hoc
^ Это потрясающе, я этого не знал
бендл
Кроме того, вы можете сделать свой основной чек немного короче, изменив его на all(n%i for i in range(2,g)), но вы должны изменить его range(g)на, range(1,g)потому что это дает ложный положительный результат на 1.
Ad Hoc