Збільшення перегородок Гольдбаха


9

Гіпотеза Гольдбаха говорить, що:

кожне парне число, що перевищує 2, є сумою двох простих чисел.

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

Завдання

Давши парне ціле число n> 2 , визначте, чи n збільшує розділ Goldbach, і виведіть два унікальних значення, одне, якщо воно є, і одне, якщо це не так.

Це є , тому ви повинні прагнути мінімізувати кількість байтів у вихідному коді.

OEIS A025018



Добре питання, що важко зрозуміти. Я відредагував це, щоб спростити формулювання. Перевірте це, і якщо все правильно, застосуйте зміни.
Евгеній Новиков

1
@ ЕвгенийНовиков Я вважав вашу редакцію більш заплутаною, ніж оригінал. Я це відкинув. Можливо, ми можемо обговорити спосіб зробити це зрозумілішим тут .
Ad Hoc Hunter Hunter

Опрацьовані приклади все ще дуже заплутані - вони ніби витягують числа з нізвідки, і кожне зі порівнянь виражається по-різному, не пояснюючи, чому використовуються певні числа. Якщо ви вже знаєте відповідь, ви можете це зрозуміти. . . що я зробив, повернувшись до першого абзацу, ігноруючи приклади, поки не стало зрозумілим, а потім з'ясував, як будуються приклади. Можливо, допоможе якась таблична структура, також 10, мабуть, допоможе
Ніл Слейтер

@NeilSlater Дякую за відгук. Я повністю видалив приклади, тому що думаю, що вони робили більше шкоди, ніж користі. Я думаю, що виклик зрозумілий з пояснення, і приклади лише ускладнюють речі. Якщо пояснення недостатньо, я б з радістю розширив або уточнив це питання, однак я не думаю, що я додаватиму приклади ще раз, оскільки вони здаються найбільшим джерелом плутанини до цих пір.
Ad Hoc Hunter Hunter

Відповіді:


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 .

(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

Демо


2

Пітон 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) (знову) (і знову)


@Olmman вам це подобається?
enedil

@Rod оскільки maxдля клавіші повертає елемент із максимальним значенням після застосування ключа, мені довелося додати функціональну програму, але вона тим не менше.
enedil

@Rod, і я не можу приймати ваші пропозиції, rangeоскільки nобмежений всередині lambda.
enedil

@enedil Дійсно, але для максимуму можна скористатисьmax(map(m,r[::2]))
Rod

1
Вам не потрібно називати імена, fтаким чином ви можете зберегти 2 байти, видаливши f=.
Ad Hoc Hunter Hunter

1

Пітон 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

Спробуйте в Інтернеті!


2
Кілька порад, більшість вбудованих функцій на кшталт minі allможуть сприймати генератори як аргументи, це означає, що min([...])можна скоротити min(...)і однаково з усіма. Ви також можете позбутися деяких просторів, зокрема, простору в import *та будь-якого простору після дужок, я бачу, у вас є один після range(g)і один раніше [i for i in ..., і вони не потрібні.
Ad Hoc Hunter Hunter

^ Це приголомшливо, я цього не знав
bendl

Крім того, ви можете зробити свій прем'єр чек трохи коротше, змінивши його на all(n%i for i in range(2,g)), але ви повинні змінити , range(g)щоб , range(1,g)тому що це дає хибнопозитивний на 1.
Спеціальна Гарф Hunter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.