Dugaan Goldbach


15

Tulis program yang meminta pengguna untuk bilangan bulat lebih besar dari 2.

Dengan dugaan Goldbach bahwa setiap bilangan bulat bahkan lebih besar dari 2 dapat dinyatakan sebagai jumlah dari dua bilangan prima, cetak dua bilangan prima yang, ketika ditambahkan bersama, memberikan bilangan genap yang diminta. Sunting: program hanya perlu mencetak SEPASANG prima, tidak semua. Sebagai contoh:

4: 2 + 2

6: 3 + 3

8: 3 + 5

10: 5 + 5 atau 3 + 7


"hanya perlu mencetak sepasang bilangan prima" Apakah itu berarti kita diizinkan untuk mencetak lebih banyak pasangan?
Ayiko

Saya kira jika itu memperpendek panjang kode Anda, tetapi harus diatur
Rasionalitas

Jawaban:


11

APL, 34 atau 44 byte

Versi pertama panjangnya 34 simbol dan terbatas pada karakter dari rangkaian karakter APL byte tunggal asli, seperti yang masih didukung di Dyalog APL:

↑c/⍨n=+/¨c←,∘.,⍨v/⍨~v∊v∘.×v←1↓⍳n←⎕

Penjelasan:

                               n←⎕   ⍝ ask for a number, store as n
                          v←1↓⍳n     ⍝ generate all integers from 2 to n
                      v∘.×v          ⍝ compute the product table of any two such integers
                v/⍨~v∊               ⍝ select those that don't appear in the product table 
         c←,∘.,⍨                     ⍝ generate all possible pairs of these primes
    n=+/¨c                           ⍝ check which pairs have a sum equal to n
↑c/⍨                                 ⍝ take the first that does

Versi kedua hanya 22 simbol, karena mengeksploitasi πfungsi untuk memeriksa bilangan prima, tetapi itu hanya tersedia di NARS2000 yang menggunakan Unicode, sehingga jumlah byte 44 di UCS-2:

2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1

Penjelasan:

                   ⎕    ⍝ ask for a number N
                  ⍳ -1  ⍝ generate all naturals from 1 to N-1
             (⍪,⌽)      ⍝ arrange it into a table of all pairs of naturals with sum N
     {∧/0π⍵}            ⍝ check which pairs are made of all primes
2⍴(⌿⍨       )           ⍝ return the first pair that does

Contohnya

(⎕: adalah prompt yang meminta nomor)

      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      4
2 2
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      6
3 3
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      8
3 5
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      124
11 113

Apakah akan ¯2π⍳2πnberfungsi sebagai generator utama?
Oberon

@ Oberon, apa πtepatnya yang dilakukan operator?
Primo

Diad πswitch dengan : ¯2πxmenghitung perdana xth, ¯1πxadalah perdana pertama kurang dari x, 0πxtes x untuk primality, 1πxadalah lebih besar perdana pertama dari x, 2πxadalah jumlah bilangan prima kurang dari x, 10πxadalah jumlah pembagi dari x, 11πxadalah jumlah yang dari semua pembagi x, 12πxdan 13πxmasing-masing adalah fungsi Möbius dan totient. Terakhir, monadik πxmengembalikan faktorisasi utama x.
Oberon

@ Oberon yang khusus untuk NARS2000, bukan? Tampaknya menjadi juru bahasa yang menarik. Saya akan mencobanya dan merevisi jawaban saya.
Tobia

@Tobia Itu? Maaf kalau begitu Saya melihatnya direferensikan di suatu tempat, tetapi mereka tidak pernah menyebutkan NARS2000. Senang mendengarnya.
Oberon

6

Python 2, 75 71 byte

n=input();k=m=1;p={0}
while{n-k,k}-p:m*=k*k;k+=1;p|={m%k*k}
print n-k,k

Uji di Ideone .

Bagaimana itu bekerja

Kami menggunakan akibat wajar dari teorema Wilson :

akibat teorema Wilson

Setiap saat, variabel m sama dengan kuadrat faktorial dari k - 1 ; k dimulai pada nilai 1 dan m pada nilai 0! ² = 1 . Set p akan terdiri dari 0 dan semua bilangan prima hingga nilai saat ini k .

Dalam setiap iterasi, pertama kita periksa apakah n - k dan k milik p , yang benar jika dan hanya jika perbedaan set {nk, k} dan p kosong. Jika ya, kondisinya salah dan loop berlanjut.

Perhatikan bahwa k> 0 , dan {n - k, k} akan memenuhi kondisi untuk beberapa nilai positif n - k (dengan asumsi dugaan Goldbach benar), sehingga 0 dalam p tidak akan mengarah ke positif palsu.

Dalam loop, kami memperbarui k dan m . Nilai baru m adalah m × k² = (k - 1)! ² × k² = k! ² , dan nilai baru k adalah k + 1 , jadi m = (k - 1)! ² masih berlaku sebelum dan sesudah pembaruan.

Kemudian, kami melakukan set union untuk menambahkan nilai m% k × k ke p . Dengan akibat teorema Wilson, ini akan menambah 1 × k = k jika k adalah prima dan 0 × k = 0 jika tidak.

Ketika loop berakhir, kita mencetak nilai terakhir dari n - k dan k , yang akan menjadi bilangan prima dengan jumlah n .


Bagaimana cara kerja algoritma penghasil utama itu bekerja?
Leaky Nun

@ LeakyNun Saya telah menambahkan penjelasan.
Dennis

Oh ... itu jenius.
Leaky Nun

5

Ruby 2.0 (65)

require'prime'
n=gets.to_i
Prime.find{|i|p [i,n-i]if(n-i).prime?}

4

PHP - 73 byte

<?for(;@($n%--$$n?:$o=&$argv[1]>$$n=++$n)||${++$b}^${--$o};);echo"$b+$o";

Input diambil sebagai argumen baris perintah.

Penggunaan sampel:

$ php goldbach.php 7098
19+7079

4

GolfScript 41 33 32

~(,2>.-1%]zip{{.,2>\{\%!}+,},!}?

Menerima argumen baris perintah misalnya

echo "14" | ruby golfscript.rb goldbach.gs
-> [2 12]

Temukan semua partisi nomor input yang relevan dengan:

(,2>.-1%]zip  #If only zip were a one-character command!  It is so often useful.

dan kemudian menemukan partisi pertama di mana tidak ada angka yang TIDAK prima dengan:

{np,!}? #For each partition, filter down to elements that are not prime, and only accept if there are no such results (since [] is falsey).

di mana blok pemeriksaan komposit npadalah:

{.,2>\{\%!}+,}

blok ini memfilter ke semua angka yang membagi angka secara merata. Jika tidak ada angka seperti itu (jadi nomornya adalah prima), hasilnya adalah [], yang merupakan falsey di GolfScript.


3

perl 6: 69

$/=get;for grep &is-prime,^$/ {exit say $_,$_-$/ if ($/-$_).is-prime}

3

R, 170 112 83 karakter

a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];q=p[(a-p)%in%p][1];cat(a,":",q,a-q)

Bertakuk:

a=scan() #Take user input as a numeric
b=2:a
p=b[rowSums(!outer(b,b,`%%`))<2] #Find all primes from 2 to user input
q=p[(a-p)%in%p][1] #Check which a-p also belong to p and takes the first one
cat(a,":",q,a-q)

Pemakaian:

> a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];q=p[(a-p)%in%p][1];cat(a,":",q,a-q)
1: 72
2: 
Read 1 item
72 : 5 67 

Solusi lama pada 112 karakter, untuk anak cucu

a=scan();b=2:a;p=b[rowSums(!outer(b,b,`%%`))<2];w=which(outer(p,p,`+`)==a,T);cat(a,":",p[w[1,1]],p[w[1,2]])

Bertakuk:

a=scan()
b=2:a
p=b[rowSums(!outer(b,b,`%%`))<2]
w=which(outer(p,p,`+`)==a,T) #Find the index of valid combinations
cat(a,":",p[w[1,1]],p[w[1,2]]) #Prints the first valid combination

Ini gila dan ramah !!
Tomas

3

Python - 107

Pada dasarnya perbaikan pada bagian kedua dari jawaban nutria (saya menjalankan ini pada 2,7 tapi saya pikir itu juga harus bekerja untuk 3.x)

p=lambda x:all(x%i!=0 for i in range(2,x))
n=input()
for i in range(2,n-1):
    if p(i)&p(n-i): print i,n-i

Apakah baris baru, dan spasi setelah :wajib?
mniip

Tab dapat direduksi menjadi spasi, dan ruang sebelum cetakan dapat dihapus (berkurang 4 byte).
clismique

3

JavaScript (ES6) (Regex), 105

a=/^(xx+?)(?!(xx+)\2+$)x*(?=\1$)(?!(xx+)\3+$)/.exec("x".repeat(prompt()));alert(a[1].length+"+"+a[0].length)

Sekarang Anda memiliki regex yang menguji dugaan Goldbach, yang memiliki persyaratan rendah pada fitur-fitur khusus (dukungan referensi-belakang dasar, pandangan ke depan yang positif dan negatif).

Ini menggunakan String.prototype.repeat() , yang merupakan bagian dari proposal edisi 6 EcmaScript. Saat ini, kode ini hanya berfungsi di Firefox.

Saya benar-benar membutuhkan bahasa yang lebih baik yang memiliki perintah singkat ketika bekerja dengan regex ...


2

Scala, 286 192 172 148 karakter

Bukan yang tercepat tetapi berhasil. Panggil g (10) untuk mendapatkan daftar pasangan goldbach untuk 10.

def g(n:Int)={def p(n:Int,f:Int=2):Boolean=f>n/2||n%f!=0&&p(n,f+1)
s"$n : "+(for(i<-2 to n/2;j=n-i if p(i)&&p(j))yield s"$i + $j").mkString(" or ")}

Konversi ke C ++ mudah.


2

C - 139 129 karakter

a,b;i(x,y){return x>y?x%y?i(x,y+1):0:x>1;}main(){scanf("%i",&a);for(b=a/2;b-->1;)i(b,2)&&i(a-
b,2)&&printf("%i:%i+%i\n",a,b,a-b);}

Anda dapat mencukur 8 karakter dengan menghapus intdeklarasi di fungsi Anda i. Anda dapat menyimpan 2 karakter lainnya dengan menghapus ifdan menambahkan double ampersand lainnya:i(b,2)&&i(a-b,2)&&printf(...)
Josh

Terima kasih! Tidak memikirkan itu &&. (Saya tidak akan terbiasa dengan tipe argumen pembungkaman ...)
Oberon

Saya suka Anda menggunakan terner bersarang.
Josh

2

newLISP - 169 148 karakter

(define(p n)(=(length(factor n))1))
(define(g n)(when(even? n)(for(i 3 n 2)
(and(p i)(p(- n i))(println n {: } i { }(- n i))))))
(g(int(read-line)))

termasuk kode untuk menjalankannya. Hasilnya terlalu murah hati ...

72: 5 67
72: 11 61
72: 13 59
72: 19 53
72: 29 43
72: 31 41
72: 41 31
72: 43 29
72: 53 19
72: 59 13
72: 61 11
72: 67 5

2

Sage, 60

Serupa dalam skor dan merasa untuk solusi res , tapi saya pikir itu cukup berbeda untuk dikirim.

i=n=input()
while not{i,n-i}<set(primes(n)):i-=1
print i,n-i

2

Sage , 65 62

n=input()
i=0
p=is_prime
while p(i)*p(n-i)==0:i+=1
print i,n-i

Dengan file di atas goldbach.sage, jalankan dengan Sage berjalan di terminal:

sage: %runfile goldbach.sage 

Terima kasih kepada @boothby untuk p=is_primeidenya.


Anda dapat menurunkannya hingga 62 dengan mengatur p=is_prime.
stan

2

Haskell, 97C

g n=head[(a,b)|let q=p n,a<-q,b<-q,a+b==n]
p n=filter c[2..n]
c p=null[x|x<-[2..p-1],p`mod`x==0]

Penjelasan:

  • gadalah fungsi "goldbach". Memanggil g nmemberi Anda sepasang bilangan prima yang menambahkan hingga n.
  • padalah fungsi yang menghasilkan daftar bilangan prima kurang dari n.
  • cadalah fungsi pemeriksa utama yang digunakan untuk mendefinisikan p.

Contoh berjalan:

*Main> g 4
(2,2)
*Main> g 6
(3,3)
*Main> g 8
(3,5)
*Main> g 10
(3,7)
*Main> g 12
(5,7)
*Main> map g [4,6..100]
[(2,2),(3,3),(3,5),(3,7),(5,7),(3,11),(3,13),(5,13),(3,17),(3,19),(5,19),(3,23),(5,23),(7,23),(3,29),(3,31),(5,31),(7,31),(3,37),(5,37),(3,41),(3,43),(5,43),(3,47),(5,47),(7,47),(3,53),(5,53),(7,53),(3,59),(3,61),(5,61),(7,61),(3,67),(5,67),(3,71),(3,73),(5,73),(7,73),(3,79),(5,79),(3,83),(5,83),(7,83),(3,89),(5,89),(7,89),(19,79),(3,97)]

2

Mathematica 56

Ini mengembalikan semua solusi untuk integer input.

Select[Tuples[Prime@Range@PrimePi[n = Input[]], 2], Tr@# == n &]

Misalnya, ketika 1298 dimasukkan ...

{{7, 1291}, {19, 1279}, {61, 1237}, {67, 1231}, {97, 1201}, {127, 1171}, {181, 1117}, {211, 1087}, { 229, 1069}, {277, 1021}, {307, 991}, {331, 967}, {379, 919}, {421, 877}, {439, 859}, {487, 811}, {541, 757}, {547, 751}, {571, 727}, {607, 691}, {691, 607}, {727, 571}, {751, 547}, {757, 541}, {811, 487} , {859, 439}, {877, 421}, {919, 379}, {967, 331}, {991, 307}, {1021, 277}, {1069, 229}, {1087, 211}, { 1117, 181}, {1171, 127}, {1201, 97}, {1231, 67}, {1237, 61}, {1279, 19}, {1291, 7}}

Seperti yang tertulis, ini mengembalikan setiap solusi dua kali.

Union[Sort/@ %]

{{7, 1291}, {19, 1279}, {61, 1237}, {67, 1231}, {97, 1201}, {127, 1171}, {181, 1117}, {211, 1087}, { 229, 1069}, {277, 1021}, {307, 991}, {331, 967}, {379, 919}, {421, 877}, {439, 859}, {487, 811}, {541, 757}, {547, 751}, {571, 727}, {607, 691}}


Input 2, tanyakan oracle apakah itu berhenti, buktikan /
bantah

1

Julia, 62 Chars (85 dengan cepat)

julia> g(n)=collect(filter((x)->sum(x)==n,combinations(primes(n),2)))
g (generic function with 1 method)

julia> g(88)
4-element Array{Array{Int64,1},1}:
 [5,83] 
 [17,71]
 [29,59]
 [41,47]

Ini tidak meminta pengguna (sesuai kebutuhan), bukan?
res

Tidak, tidak memperhatikan itu. Itu akan menambahkan banyak karakter julia sekarang. g(int(readline(STDIN)))
gggg

1

GTB , 31

Untuk Kalkulator TI-84 Anda

`A:.5A→B@%;A,4)4$~B+1,B-1#~B,B&

Tidak ada bawaan bawaan.

Contoh berjalan

?4
               2
               2
?6
               3
               3
?8
               3
               5
?10
               5
               5


1

Python 3 - 150 143 karakter

Versi lama (150 karakter):

p=lambda n:0 in[n % i for i in range(2,n)]
n=int(input())
[print('%d+%d'%(a, b))for b in range(2,n)for a in range(2,n)if not(a+b!=n or p(a) or p(b))]

Versi baru (terima kasih kepada ProgramFOX):

p=lambda n:0 in[n%i for i in range(2,n)]
n=int(input())
[print('%d+%d'%(a,b))for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))]

Mencetak setiap kombinasi, misalnya:
4 2 + 2
10 7 + 3 5 + 5 3 + 7


|dapat dengan aman digunakan dengan tipe boolean, jadi(a+b!=n)|p(a)|p(b)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Bahkan lebih pendek dengan menggunakan: print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])(mencetak daftar tupel, yang jumlahnya adalah n). Menghemat 8 byte.
agtoever

Juga menggunakan r=range(2,n)dan referensi rmenyimpan beberapa lagi.
agtoever

1

q [116 karakter]

y where all each{{2=count where 0=(x mod)each til x+1}each x}each y:{a where x=sum each a:a cross a:til x}"I"$read0 0

Tidak ada fungsi bawaan untuk menemukan bilangan prima.

Memasukkan

72

Keluaran

5  67
11 61
13 59
19 53
29 43
31 41
41 31
43 29
53 19
59 13
61 11
67 5

1

Python - 206

Sedikit terlambat ke pesta tetapi saya melatih keterampilan bermain golf saya.

Saya sebenarnya mengkodekan ini sebelum saya menemukan pertanyaan ini! Jadi milikku tidak termasuk lambda indah yang digunakan solusi Python lainnya.

import math
def p(n):
    if n%2==0&n>2:return False
    for i in range(3,n):
        if n%i==0:return False
    return True 
X=int(input())
for i in range(2,X):
    if p(i)&p(X-i):print i,X-i;break

1

J - 35 32 char

"Prompt the user" adalah kutukan bagi setiap pegolf J. Ada semua karakter saya yang didapat dengan susah payah!

p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1

Dijelaskan:

  • ".1!:1]1- Baca dalam string ( 1!:1) dari input (menangani file 1) dan mengubahnya menjadi angka ( ".).
  • p:i.n=:- Tetapkan nomor ini ke variabel n, dan kemudian ambil nbilangan prima pertama .
  • +/~- Buat tabel tambahan, nlebar dan ntinggi.
  • i.&n, - Ubah tabel menjadi satu daftar, dan kemudian temukan indeks kemunculan pertama n , yang ada jika dugaan Goldbach benar.
  • p:(n,n)#: - Ambil baris dan kolom dari indeks, dan ambil bilangan prima yang sesuai.

Pemakaian:

   p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
666
5 661
   p:(n,n)#:i.&n,+/~p:i.n=:".1!:1]1
1024
3 1021

Seandainya prompt tidak menjadi persyaratan, inilah kata kerja 25 karakter:

(,~p:@#:]i.~&,+/~@:p:@i.)

1

Jelly , 8 byte (tidak bersaing)

_ÆRfÆR.ị

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

_ÆRfÆR.ị  Main link. Argument: n (integer)

 ÆR       Prime range; yield all primes in [1, ..., n].
_         Subtract all primes from n.
   fÆR    Filter; intersect the list of differences with the prime range.
      .ị  At-index 0.5; yield the last and first element.

1

Julia, 50 49 byte

~=primes;n=ARGS[]|>int
(n-~n)∩~n|>extrema|>show

Cobalah online!

Jika suatu fungsi dapat diterima, kode tersebut dapat disingkat menjadi 32 byte :

~=primes
!n=(n-~n)∩~n|>extrema

Bagaimana itu bekerja

~=primesmembuat alias untuk fungsi bilangan prima bawaan yang mengembalikan daftar semua bilangan prima hingga argumennya. n=ARGS[]|>intmem-parsing argumen baris perintah pertama saat menyimpannya dalam n .

Untuk menemukan pasangan bilangan prima yang sesuai, pertama-tama kita menghitung kisaran prime yang disebutkan sebelumnya ~n. Kemudian, n-~nhasilkan semua perbedaan bilangan prima dan n ini .

Dengan memotong ( ) hasil dengan rentang prima itu sendiri, kami memastikan bahwa bilangan prima p tersisa sedemikian rupa n - p juga bilangan prima.

Akhirnya, extremaambil prime terendah dan tertinggi di persimpangan, sehingga jumlah mereka harus n .


0

SQL, 295 284

Dalam postgresql:

create function c(c int) returns table (n int, m int) as $$ 
with recursive i(n) as
(select 2 union all select n+1 from i where n<c), 
p as (select * from i a where not exists 
(select * from i b where a.n!=b.n and mod(a.n,b.n)=0))
select * from p a, p b where a.n+b.n=c 
$$ language sql;

Seharusnya bisa melakukannya di setengah ruang, jika itu bukan untuk hal-hal seperti "tidak ada bagian luar yang bergabung dalam rekursi", "tidak ada subquery dalam rekursi" ...

Inilah hasilnya:

postgres=# select c(10);
   c   
-------
 (3,7)
 (5,5)
 (7,3)
(3 rows)

postgres=# select c(88);
   c    
---------
 (5,83)
 (17,71)
 (29,59)
 (41,47)
 (47,41)
 (59,29)
 (71,17)
 (83,5)
(8 rows)

0

Gelombang - 266

@echo off&setLocal enableDelayedExpansion&for /L %%a in (2,1,%1)do (set/aa=%%a-1&set c=&for /L %%b in (2,1,!a!)do set/ab=%%a%%%%b&if !b!==0 set c=1
if !c! NEQ 1 set l=!l!%%a,)&for %%c in (!l!)do for %%d in (!l!)do set/ad=%%c+%%d&if !d!==%1 set o=%%c + %%d
echo !o!

Ditata dengan rapi -

@echo off
setLocal enableDelayedExpansion
for /L %%a in (2,1,%1) do (
    set /a a=%%a-1
    set c=
    for /L %%b in (2,1,!a!) do (
        set /a b=%%a%%%%b
        if !b!==0 set c=1
    )
    if !c! NEQ 1 set l=!l!%%a,
)
for %%c in (!l!) do for %%d in (!l!) do (
    set /a d=%%c+%%d
    if !d!==%1 set o=%%c + %%d
)
echo !o!

0

Perl 5, 58 byte

57, ditambah 1 untuk -nE

/^(11+?)(?!(11+)\2+$)1*(?=\1$)(?!(11+)\3+$)/;say for$1,$&

Input dan output berada di unary. Contoh:

$ perl -nE'/^(11+?)(?!(11+)\2+$)1*(?=\1$)(?!(11+)\3+$)/;say for$1,$&'
1111111111
111
1111111

Topi-tip


0

Oracle SQL 11.2, 202 byte

WITH v(x,y,s)AS(SELECT LEVEL,LEVEL,0 FROM DUAL CONNECT BY LEVEL<=:1 UNION ALL SELECT x,y-1,s+SIGN(MOD(x,y))FROM v WHERE y>1),p AS(SELECT x FROM v WHERE x-s=2)SELECT a.x,b.x FROM p a,p b WHERE:1=a.x+b.x;   

Tidak bermain golf

WITH v(x,y,s) AS
(
  SELECT LEVEL,LEVEL,0 FROM DUAL CONNECT BY LEVEL<=:1 
  UNION ALL 
  SELECT x,y-1,s+SIGN(MOD(x,y))FROM v WHERE y>1
)
,p AS (SELECT x FROM v WHERE x-s=2)
SELECT a.x,b.x 
FROM p a,p b 
WHERE :1=a.x+b.x;   

0

Python 3, 107 byte

b=lambda x:all(x%y for y in range(2,x))
g=lambda x,i=2:((i,x-i)if b(i)&b(x-i)else g(x,i+1))if(i<x)else 0

b (x) adalah tes primality untuk x, dan g (x) berulang melalui angka untuk menemukan dua bilangan prima yang cocok.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.