Dugaan Goldbach menyatakan bahwa setiap bilangan genap yang lebih besar dari dua dapat dinyatakan sebagai jumlah dari dua bilangan prima. Sebagai contoh,
4 = 2 + 2
6 = 3 + 3
8 = 5 + 3
Namun, begitu kita sampai ke 10 sesuatu yang menarik terjadi. Tidak hanya 10 dapat ditulis sebagai
5 + 5
tetapi juga dapat ditulis sebagai
7 + 3
Karena 10 dapat dinyatakan sebagai jumlah dari dua bilangan prima dua cara , kita mengatakan bahwa "partisi Goldbach" dari 10 adalah 2
. Atau lebih umum,
Partisi Goldbach suatu angka adalah jumlah total cara penulisan yang berbeda di
n = p + q
manap
danq
merupakan bilangan prima danp >= q
Tantangan Anda adalah menulis program atau fungsi yang menemukan partisi Goldbach dari sebuah angka. Sekarang, secara teknis istilah "partisi Goldbach" hanya digunakan untuk merujuk ke angka genap. Namun, karena aneh bilangan bulat p + 2 dapat juga dinyatakan sebagai jumlah dari dua bilangan prima jika p> 2 adalah prima, kami akan memperpanjang ini untuk semua bilangan bulat positif ( A061358 ).
Anda dapat dengan aman berasumsi bahwa input Anda akan selalu menjadi bilangan bulat positif, dan Anda dapat mengambil input dan output dalam salah satu metode standar yang diizinkan , misalnya argumen fungsi dan nilai pengembalian, STDIN dan STDOUT, membaca dan menulis ke file, dll.
Partisi Goldbach dari bilangan bulat positif hingga 100 adalah:
0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 0, 1, 1, 2, 1, 2, 0, 2, 1, 2, 1, 3, 0, 3, 1,
3, 0, 2, 0, 3, 1, 2, 1, 4, 0, 4, 0, 2, 1, 3, 0, 4, 1, 3, 1, 4, 0, 5, 1, 4,
0, 3, 0, 5, 1, 3, 0, 4, 0, 6, 1, 3, 1, 5, 0, 6, 0, 2, 1, 5, 0, 6, 1, 5, 1,
5, 0, 7, 0, 4, 1, 5, 0, 8, 1, 5, 0, 4, 0, 9, 1, 4, 0, 5, 0, 7, 0, 3, 1, 6
Seperti biasa, celah standar berlaku, dan jawaban terpendek dalam byte menang!
Jawaban:
Jelly , 8 byte
Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Python 2, 76 byte
Secara rekursif merangkak naik dari
k=2
ken/2
, menambahkan nilai-nilai di mana keduak
dann-k
yang prima. Akan lebih baik untuk menghitungn
mundur pada saat yang sama, tetapi ini memiliki masalah yangk=0
dank=1
disebut prime:Pemeriksaan primality adalah pembagian-percobaan, disingkat dengan memeriksa keduanya
k
dann-k
bersama - sama. Saya menemukan ini lebih pendek daripada menggunakan generator Teorema Wilson (79 byte):Gagasan untuk yang satu ini adalah untuk menyimpan daftar semua bilangan prima di bagian bawah untuk diperiksa pada saat kita sampai di bagian atas, tetapi untuk titik tengah
k=n/2
, kita belum punya waktu untuk menambahkann-k
ke daftar keluar ketika kita sampai kek
. Versi berulang berkeliling ini, tetapi 82 byte:sumber
MATL , 8 byte
Cobalah online!
Penjelasan
Pertimbangkan input
8
sebagai contohSangat menarik untuk mengamati grafik urutannya , menggunakan versi kode yang sedikit dimodifikasi:
Untuk input
10000
hasilnya adalahAnda dapat mencobanya di MATL Online (Refresh halaman jika tombol "Run" tidak berubah menjadi "Bunuh" ketika ditekan). Butuh beberapa sekitar 25 detik untuk menghasilkan grafik untuk input
3000
; input di atas beberapa ribu akan habis.sumber
Upper triangular part
trik benar-benar keren!JavaScript (ES6),
777370 byteDisimpan 3 byte berkat @Arnauld
f
adalah fungsi tes primality; fungsi yang relevan adalahg
.f
bekerja dengan menghitung mundur dari n-1 secara rekursif ; aliran kontrol pada setiap tahap berjalan seperti ini:x<2||
Jika x <2 , jumlahnya prima; kembali 1 .n%x&&
Kalau tidak, jika n mod x = 0 , angkanya tidak prima; kembalin%x
.f(n,x-1)
Kalau tidak, jumlahnya mungkin prima atau tidak prima; pengurangan x dan coba lagi.g
bekerja dengan cara yang sama, meskipun dengan aliran kontrol yang tidak begitu banyak. Ia bekerja dengan mengalikan f (b) dengan f (ab) untuk setiap bilangan bulat b dalam kisaran [2, lantai (a / 2)] , lalu menjumlahkan hasilnya. Ini memberi kita jumlah pasangan yang menjumlahkan ke tempat di mana kedua angka dalam pasangan adalah prima, yang persis seperti yang kita inginkan.sumber
a
positif,b=a>>1
seharusnya menghemat satu byte.>>
operatornya ...f=(n,x=n)=>--x<2||n%x&&f(n,x)
?05AB1E ,
108 byteSangat tidak efisien.
Cobalah online! atau Coba cara yang kurang efisien untuk menghasilkan bilangan prima
Penjelasan
n = 10
digunakan sebagai contoh.sumber
ü
sebagai gantinya? SukaD!fü+r¢
?n=10
yang dihitung (10, [5,8,12]) yaitu 0 dan bukan 2.ü
diterapkan di antara masing-masing pasangan item saja. Ini memberi saya ide untuk mencobaã
, tetapi sayangnya ternyata 1 byte lebih lama.GAP , 57 byte
Saya tidak berpikir GAP memiliki cara yang lebih pendek daripada yang sudah jelas ini.
Number
menghitung berapa banyak elemen daftar yang memenuhi predikat.Menggunakannya untuk menghitung 100 nilai pertama:
sumber
Brachylog , 22 byte
Cobalah online!
Penjelasan
Transkripsi masalah secara langsung.
sumber
Mathematica, 52 byte
Hasilnya disediakan sebagai fungsi anonim. Coba plot grafik di atasnya:
Omong-omong, kodenya memiliki panjang yang sama dengan versi fungsi dari kode demo pada OEIS.
sumber
PrimeQ[#~IntegerPartitions~{2}]~Count~{a=True,a}&
Jelly , 12 byte
TryItOnline
1-100
Bagaimana?
sumber
Racket 219 byte
Tidak Disatukan:
Pengujian:
Keluaran:
sumber
Sebenarnya , 11 byte
Cobalah online!
Penjelasan:
sumber
05AB1E , 6 byte
Cobalah online!
Penjelasan:
sumber
Haskell, 73 byte
Contoh penggunaan:
map f [1..25]
->[0,0,0,1,1,1,1,1,1,2,0,1,1,2,1,2,0,2,1,2,1,3,0,3,1]
.Implementasi langsung dari definisi: pertama mengikat
r
semua bilangan prima hingga nomor inputn
, kemudian mengambil1
untuk semuap
danq
darir
manaq<=p
danp+q==n
dan jumlah mereka.sumber