Meningkatkan partisi Goldbach

9

Dugaan Goldbach menyatakan bahwa:

setiap bilangan genap yang lebih besar dari 2 adalah jumlah dari dua bilangan prima.

Kami akan menganggap partisi Goldbach dari angka n sebagai sepasang dua bilangan prima yang ditambahkan ke n . Kami prihatin dengan angka peningkatan partisi Goldbach . Kami mengukur ukuran partisi Goldbach suatu bilangan dengan ukuran bilangan prima terkecil di semua partisi bilangan itu. Sejumlah partisi meningkat jika ukuran ini lebih besar dari ukuran semua angka genap yang lebih kecil.

Tugas

Diberi bilangan bulat genap n> 2 , tentukan apakah n adalah peningkatan partisi Goldbach, dan hasilkan dua nilai unik, satu jika itu dan satu jika tidak.

Ini adalah , jadi Anda harus berusaha meminimalkan jumlah byte dalam kode sumber Anda.

OEIS A025018

Ad Hoc Garf Hunter
sumber
Mari kita lanjutkan diskusi ini dalam obrolan .
Ad Hoc Garf Hunter
Ini pertanyaan yang bagus, sulit dimengerti. Saya mengeditnya untuk menyederhanakan kata-katanya. Silakan periksa, dan jika semuanya benar, lakukan perubahan.
Евгений Новиков
1
@ ЕвгенийНовиков Saya menemukan hasil edit Anda lebih membingungkan daripada aslinya. Saya telah menolaknya. Mungkin kita bisa membahas cara untuk memperjelas ini di sini .
Ad Hoc Garf Hunter
Contoh-contoh yang dikerjakan masih sangat membingungkan - mereka sepertinya menarik angka entah dari mana, dan masing-masing perbandingan dinyatakan secara berbeda tanpa menjelaskan mengapa angka-angka tertentu digunakan. Jika Anda sudah tahu jawabannya, Anda bisa mengetahuinya. . . yang saya lakukan dengan kembali ke paragraf pertama, mengabaikan contoh sampai jelas, lalu mencari tahu bagaimana contoh itu dibangun. Mungkin beberapa struktur tabel akan membantu, juga termasuk 10 mungkin akan membantu
Neil Slater
@NeilSlater Terima kasih atas umpan baliknya. Saya telah menghapus contoh seluruhnya karena saya pikir mereka melakukan lebih banyak kerusakan daripada kebaikan. Saya pikir tantangannya jelas dari penjelasannya, dan contoh-contohnya hanya memperumit masalah. Jika penjelasannya tidak mencukupi saya akan sangat senang untuk memperluas atau mengklarifikasi itu, namun saya tidak berpikir saya akan menambahkan contoh kembali karena mereka tampaknya menjadi sumber kebingungan terbesar sejauh ini.
Ad Hoc Garf Hunter

Jawaban:

5

Jelly , 12 byte

ÆRðfạṂ
Ç€M⁼W

Cobalah online!

Bagaimana itu bekerja

Ç€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
sumber
4

PHP , 154 byte

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

Cobalah online!

Diperluas

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

Cobalah online! Periksa semua angka hingga 1000

Jörg Hülsermann
sumber
3

JavaScript (ES6), 135 byte

Menggunakan logika yang mirip dengan jawaban 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

Demo

Arnauld
sumber
2

Python 3: 156 151 142 138 136 128 byte

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

(terima kasih kepada OP)

(terima kasih kepada @Rod) (lagi) (dan lagi)

enedil
sumber
@ Omman apakah Anda suka?
enedil
@Rod karena maxdengan elemen pengembalian kunci dengan nilai maksimal setelah menerapkan kunci, saya harus menambahkan aplikasi fungsi tetapi tetap lebih pendek.
enedil
@Rod dan saya tidak bisa menerima saran Anda rangekarena nsudah dibatasi di dalam lambda.
enedil
@enedil Memang, tetapi untuk maks, Anda dapat menggunakanmax(map(m,r[::2]))
Rod
1
Anda tidak perlu memberi nama fdan karenanya dapat menyimpan 2 byte dengan menghapus f=.
Ad Hoc Garf Hunter
1

Python 3: 204 196 byte

Bytes disimpan berkat: 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

Cobalah online!

bendl
sumber
2
Beberapa tips, sebagian besar fungsi builtin seperti mindan alldapat mengambil generator sebagai argumen, ini berarti min([...])dapat dipersingkat min(...)dan sama dengan semua. Anda juga dapat menghilangkan beberapa ruang, terutama ruang dalam import *dan ruang apa pun setelah kawat gigi, saya melihat Anda memiliki satu setelah range(g)dan satu sebelumnya [i for i in ..., tidak diperlukan.
Ad Hoc Garf Hunter
^ Itu luar biasa, saya tidak tahu itu
bendl
Anda juga dapat membuat cek utama Anda sedikit lebih pendek dengan mengubah ke all(n%i for i in range(2,g)), tapi Anda harus perubahan range(g)untuk range(1,g)karena ini memberikan positif palsu pada 1
Ad Hoc Garf Hunter