Hipoteza Goldbacha

15

Napisz program, który monituje użytkownika o parzystą liczbę całkowitą większą niż 2.

Biorąc pod uwagę hipotezę Goldbacha, że ​​każdą parzystą liczbę całkowitą większą niż 2 można wyrazić jako sumę dwóch liczb pierwszych, wydrukuj dwie liczby pierwsze, które po zsumowaniu dają żądaną liczbę parzystą. Edycja: program musi tylko wydrukować PARĘ liczb pierwszych, nie wszystkie. Na przykład:

4: 2 + 2

6: 3 + 3

8: 3 + 5

10: 5 + 5 lub 3 + 7

Racjonalność
źródło
„musi tylko wydrukować parę liczb pierwszych” Czy to oznacza, że ​​możemy wydrukować więcej par?
Ayiko
Podejrzewam, że jeśli skróci to długość twojego kodu, ale powinien być zorganizowany
Racjonalność

Odpowiedzi:

11

APL, 34 lub 44 bajty

Pierwsza wersja ma 34 znaki i jest ograniczona do znaków z oryginalnych jednobajtowych zestawów znaków APL, takich jak ten nadal obsługiwany w Dyalog APL:

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

Wyjaśnienie:

                               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

Druga wersja ma tylko 22 symbole, ponieważ wykorzystuje πfunkcję do sprawdzania liczb pierwszych, ale jest dostępna tylko w NARS2000, który używa Unicode, więc liczba bajtów wynosi 44 w UCS-2:

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

Wyjaśnienie:

                   ⎕    ⍝ 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

Przykłady

(⎕: jest pytaniem o numer)

      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      4
2 2
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      6
3 3
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      8
3 5
      2⍴(⌿⍨{∧/0π⍵})(⍪,⌽)⍳⎕-1
⎕:
      124
11 113
Tobia
źródło
Czy ¯2π⍳2πndziałałby jako główny generator?
Oberon
@Oberon, co πdokładnie robi operator?
primo
Dwójkowym πprzełączniki : ¯2πxoblicza Prime XTH, ¯1πxto pierwsze zasadnicze mniejsza niż X, 0πxX Próby na pierwszości, 1πxjest najpierw pierwsza większa niż x, 2πxto liczba bodźców poniżej X 10πxoznacza liczbę dzielników X 11πxjest sumą wszystkich dzielników x, 12πxi 13πxsą odpowiednio funkcją Möbius i totient. Wreszcie monadyczny πxzwraca pierwszą faktoryzację x.
Oberon
@Oberon, który jest specyficzny dla NARS2000, prawda? Wydaje się być interesującym tłumaczem. Wypróbuję to i poprawię moją odpowiedź.
Tobia
@Tobia To jest? Przepraszam więc Widziałem gdzieś to odniesienie, ale nigdy nie wspominali o NARS2000. Dobrze wiedzieć.
Oberon
6

Python 2, 75 71 bajtów

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

Przetestuj na Ideone .

Jak to działa

Używamy następstwa twierdzenia Wilsona :

corollary of Wilson's theorem

Przez cały czas zmienna m jest równa kwadratowi silni k - 1 ; k zaczyna się od wartości 1, a m od wartości 0! ² = 1 . Zbiór p będzie się składał z 0 i wszystkich liczb pierwszych aż do bieżącej wartości k .

W każdej iteracji, musimy najpierw sprawdzić, czy zarówno NK i K należą do p , co jest prawdziwe wtedy i tylko wtedy, gdy zbiór różnica {nk, k} i p jest pusty. Jeśli tak, warunek jest fałszywy, a pętla trwa.

Zauważ, że k> 0 i {n - k, k} spełnią warunek pewnej dodatniej wartości n - k (zakładając, że hipoteza Goldbacha jest prawdziwa), więc 0 w p nie będzie prowadzić do fałszywie dodatnich.

W pętli aktualizujemy k i m . Nowa wartość m to m × k² = (k - 1)! ² × k² = k! ² , a nowa wartość k to k + 1 , więc m = (k - 1)! ² nadal obowiązuje przed i po aktualizacja.

Następnie wykonujemy set union, aby dodać wartość m% k × k do p . Zgodnie z twierdzeniem Wilsona doda to 1 × k = k, jeśli k jest liczbą pierwszą, i 0 × k = 0, jeśli nie.

Po zakończeniu pętli wypisujemy ostatnie wartości n - k i k , które będą liczbami pierwszymi o sumie n .

Dennis
źródło
Jak, u licha, działa ten algorytm generowania liczb pierwszych?
Leaky Nun
@LeakyNun Dodałem wyjaśnienie.
Dennis
Och ... to jest genialne.
Leaky Nun
5

Ruby 2.0 (65)

require'prime'
n=gets.to_i
Prime.find{|i|p [i,n-i]if(n-i).prime?}
daniero
źródło
4

PHP - 73 bajty

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

Dane wejściowe są traktowane jako argument wiersza poleceń.

Przykładowe użycie:

$ php goldbach.php 7098
19+7079
primo
źródło
4

GolfScript 41 33 32

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

Akceptuje argument wiersza poleceń, np

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

Znajduje wszystkie odpowiednie partycje numeru wejściowego za pomocą:

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

a następnie znajduje pierwszą partycję, na której NIE ma liczb pierwszych:

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

gdzie blok sprawdzający kompozyt npjest:

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

blok ten filtruje do wszystkich liczb, które dzielą równomiernie daną liczbę. Jeśli nie ma takich liczb (więc liczba jest liczbą pierwszą), wynikiem jest [], co jest falsey w GolfScript.

Ben Reich
źródło
3

perl 6: 69

$/=get;for grep &is-prime,^$/ {exit say $_,$_-$/ if ($/-$_).is-prime}
Ayiko
źródło
3

R, 170 112 83 znaków

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

Zębaty:

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)

Stosowanie:

> 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 

Stare rozwiązanie zawierające 112 znaków dla potomności

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

Zębaty:

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
plannapus
źródło
To jest zarówno szalone, jak i genialne !!
Tomas
3

Python - 107

Zasadniczo poprawa w drugiej części odpowiedzi nutrii (uruchomiłem to w wersji 2.7, ale myślę, że powinno to również działać w wersji 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
KSab
źródło
Czy znaki nowej linii i spacje są :obowiązkowe?
mniip
Zakładkę można zmniejszyć do spacji, a spację przed wydrukiem można usunąć (goli 4 bajty).
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)

Teraz masz regex, który testuje hipotezę Goldbacha, która ma niskie wymagania dotyczące specjalnych funkcji (podstawowe wsparcie referencyjne, pozytywne i negatywne spojrzenie w przyszłość).

To wykorzystuje String.prototype.repeat(), który jest częścią propozycji EcmaScript 6. edycji. Obecnie ten kod działa tylko w przeglądarce Firefox.

Naprawdę potrzebuję lepszego języka, który ma krótkie polecenia podczas pracy z regex ...

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
źródło
2

Scala, 286 192 172 148 znaków

Nie najszybszy, ale działa. Zadzwoń do g (10), aby uzyskać listę par Goldbacha za 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 ")}

Konwersja do C ++ jest prosta.

Mikaël Mayer
źródło
2

C - 139 129 znaków

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);}
Oberon
źródło
Możesz ogolić 8 znaków, usuwając intdeklaracje w swojej funkcji i. Możesz zapisać kolejne 2 znaki, usuwając ifi dodając kolejne podwójne znaki handlowe:i(b,2)&&i(a-b,2)&&printf(...)
Josh
Dzięki! Nie myślałem o tym &&. (Nigdy nie przyzwyczaję się do wyciszania argumentów ...)
Oberon
Uwielbiam twoje użycie zagnieżdżonego trójskładnika.
Josh
2

nowośćLISP - 169 148 znaków

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

zawiera kod do uruchomienia. Rezultaty są zbyt hojne ...

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
kormullion
źródło
2

Szałwia, 60 lat

Podobny wynik i rozwiązanie res , ale myślę, że jest wystarczająco inny do opublikowania.

i=n=input()
while not{i,n-i}<set(primes(n)):i-=1
print i,n-i
boothby
źródło
2

Sage , 65 62

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

Z powyższym plikiem goldbach.sage, uruchom go z Sage uruchomionym w terminalu:

sage: %runfile goldbach.sage 

Dzięki @boothby za p=is_primepomysł.

res
źródło
Możesz zmniejszyć to do 62, ustawiając p=is_prime.
stoisko
2

Haskell, 97 ° C

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]

Wyjaśnienie:

  • gjest funkcją „goldbach”. Wywołanie g ndaje parę liczb pierwszych, które się sumują n.
  • pto funkcja generująca listę liczb pierwszych mniejszych niż n.
  • c to funkcja sprawdzania liczby głównej używana do definiowania p .

Przykładowe przebiegi:

*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)]
Danmcardle
źródło
2

Mathematica 56

Zwraca wszystkie rozwiązania dla wejściowej liczby całkowitej.

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

Na przykład, gdy wprowadzono 1298…

{{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}}

Jak napisano, każde rozwiązanie zwraca dwa razy.

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}}

DavidC
źródło
Wejdź 2, zapytaj wyrocznię, czy się zatrzyma, udowodnij /
obal hipotezę o dwóch liczbach
1

Julia, 62 znaki (85 z pytaniem)

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]
gggg
źródło
To nie monituje użytkownika (zgodnie z wymaganiami), prawda?
res
Nie, nie zauważyłem tego. Dodałoby teraz wiele postaci Julia. g(int(readline(STDIN)))
gggg
1

GTB , 31

Do kalkulatora TI-84

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

Brak najlepszych wbudowanych.

Przykład działa

?4
               2
               2
?6
               3
               3
?8
               3
               5
?10
               5
               5
Timtech
źródło
1

JavaScript, 139 137 136

a=prompt();function b(n){for(i=2;i<n;i++)if(n%i<1)return;return 1}for(c=2,r=1;c<a&&r;c++)if(b(c)&&b(a-c))alert(a+": "+c+" + "+(a-c)),r=0
Niebieskie owce
źródło
Myślę, że możesz ogolić jeszcze 2 znaki, return;zamiastreturn 0;
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
1

Python 3 - 150 143 znaki

Stara wersja (150 znaków):

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

Nowa wersja (dzięki 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))]

Drukuje każdą kombinację, na przykład:
4 2 + 2
10 7 + 3 5 + 5 3 + 7

Andrea Ciceri
źródło
|można bezpiecznie używać z typem logicznym, więc(a+b!=n)|p(a)|p(b)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̸̡̅ẗ̵̨
Jeszcze krótszy przy użyciu: print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])(drukuje listę krotek, których suma wynosi n). Oszczędza 8 bajtów.
przed
Również użycie r=range(2,n)i odniesienie roszczędza kilka innych.
agtoever
1

q [116 znaków]

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

Brak wbudowanej funkcji znajdowania liczby pierwszej.

Wejście

72

Wynik

5  67
11 61
13 59
19 53
29 43
31 41
41 31
43 29
53 19
59 13
61 11
67 5
nyi
źródło
1

Python - 206

Trochę późno na imprezę, ale ćwiczę swoje umiejętności gry w golfa.

Właściwie to zakodowałem, zanim znalazłem to pytanie! Więc mój nie zawiera pięknej lambda, której używają inne rozwiązania Python.

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
Austin Henley
źródło
1

J - 35 32 znaków

„Monituj użytkownika” to zmora każdego golfisty J. Oto wszystkie moje ciężko zarobione postacie!

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

Wyjaśniono:

  • ".1!:1]1- Przeczytaj ciąg znaków ( 1!:1) z wejścia (uchwyt pliku 1) i przekonwertuj go na liczbę ( ".).
  • p:i.n=:- Przypisz tę liczbę do zmiennej n, a następnie weź pierwsze nliczby pierwsze.
  • +/~- Zrób stół dodatkowy, nszeroki i nwysoki.
  • i.&n, - Zamień tabelę w pojedynczą listę, a następnie znajdź indeks pierwszego wystąpienia n , który istnieje, jeśli hipoteza Goldbacha jest prawdziwa.
  • p:(n,n)#: - Pobierz wiersz i kolumnę z indeksu i pobierz odpowiednie liczby pierwsze.

Stosowanie:

   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

Gdyby monit nie był wymagany, oto czasownik składający się z 25 znaków:

(,~p:@#:]i.~&,+/~@:p:@i.)
algorytmshark
źródło
1

Julia, 50 49 bajtów

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

Wypróbuj online!

Jeśli funkcja jest akceptowalna, kod można skrócić do 32 bajtów :

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

Jak to działa

~=primestworzy alias dla wbudowanej funkcji liczb pierwszych, która zwraca listę wszystkich liczb pierwszych aż do argumentu. n=ARGS[]|>intanalizuje pierwszy argument wiersza polecenia, ponieważ zapisuje go w n .

Aby znaleźć odpowiednią parę liczb pierwszych, najpierw obliczamy wyżej wspomniany zakres liczb pierwszych ~n. Następnie n-~notrzymuje się wszelkie różnice te bodźce i n .

Przecinając ( ) wynik z samym zakresem liczby pierwszej, upewniamy się, że pozostałe liczby pierwsze p są takie, że n - p jest również liczbą pierwszą.

W końcu extremaprzyjmuje najniższą i najwyższą liczbę pierwszą na skrzyżowaniu, więc ich suma musi wynosić n .

Dennis
źródło
0

SQL, 295 284

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

Powinien być w stanie to zrobić w połowie przestrzeni, gdyby nie takie rzeczy jak: „brak lewych połączeń zewnętrznych w rekurencji”, „brak podkwerend w rekurencji” ...

Oto wynik:

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)
fryzjer męski
źródło
0

Partia - 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!

Starannie przedstawione -

@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!
nieszczęście
źródło
0

Perl 5, 58 bajtów

57, plus 1 dla -nE

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

Wejścia i wyjścia są jednostkowe. Przykład:

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

Czapka z daszkiem.

msh210
źródło
0

Oracle SQL 11.2, 202 bajty

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;   

Nie grał w golfa

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;   
Jeto
źródło
0

Python 3, 107 bajtów

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) jest testem pierwszeństwa dla x, a g (x) przechodzi przez liczby w celu znalezienia dwóch liczb pierwszych, które pasują.

Magenta
źródło