Goldbach'ın varsayımı


15

Kullanıcıdan 2'den büyük bir tamsayı isteyen bir program yazın.

Goldbach'ın 2'den büyük her tam sayının iki asalın toplamı olarak ifade edilebileceği varsayımı göz önüne alındığında, bir araya getirildiğinde istenen çift sayıyı sağlayan iki asal sayı yazdırın. Düzenleme: Program sadece bir ÇİFT as basmak zorunda, hepsi değil. Örneğin:

4: 2 + 2

6: 3 + 3

8: 3 + 5

10: 5 + 5 veya 3 + 7


"sadece bir çift asa basmak zorunda" Bu , daha fazla çift basabileceğimiz anlamına mı geliyor?
Ayiko

Sanırım kodunuzun uzunluğunu kısaltır, ancak organize edilmelidir
Akılcılık

Yanıtlar:


11

APL, 34 veya 44 bayt

İlk sürüm 34 sembol uzunluğundadır ve orijinal tek bayt APL karakter kümelerindeki karakterlerle sınırlıdır, örneğin Dyalog APL'de hala desteklenmektedir:

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

Açıklama:

                               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

İkinci sürüm sadece 22 sembol uzunluğundadır, çünkü πasal sayıları kontrol etme işlevinden yararlanır, ancak bu yalnızca Unicode kullanan NARS2000'de kullanılabilir , bu nedenle UCS-2'de bayt sayısı 44'tür :

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

Açıklama:

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

Örnekler

(⎕: bir sayı isteminde bulunur)

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

Misiniz ¯2π⍳2πnbirinci sınıf bir jeneratör olarak çalışmaya?
Oberon

@Oberon πOperatör tam olarak ne yapıyor ?
primo

Çiftler πanahtarları ile : ¯2πxX. asal hesaplar ¯1πxbirinci birincil az X, daha 0πxtestleri primality için x 1πx, x daha önce ana büyüktür 2πx, asal sayı x'de daha az olduğu 10πx, x bölenler sayısıdır 11πxtoplamıdır x tüm bölenler ait 12πxve 13πxsırasıyla Möbiüs ve totient fonksiyonudur. Son fakat aynı πxderecede önemli olarak , monadik x'in asal çarpanlarına ayırmasını döndürür.
Oberon

@ NARS2000'e özgü oron, değil mi? İlginç bir tercüman gibi görünüyor. Deneyeceğim ve cevabımı gözden geçireceğim.
Tobia

@ Tobia Öyle mi? Öyleyse özür dilerim. Bir yere atıfta bulunduğunu gördüm, ama NARS2000'den hiç bahsetmediler. Bunu bildiğim iyi oldu.
Oberon

6

Python 2, 75 71 bayt

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

Ideone üzerinde test edin .

Nasıl çalışır

Wilson teoreminin bir sonucunu kullanıyoruz :

corollary of Wilson's theorem

Her zaman, m değişkeni k - 1 faktöriyelinin karesine eşittir ; k değeri 1'de başlar ve m değeri 0! ² = 1'de başlar . Set p , 0'dan ve geçerli k değerine kadar olan tüm asal sayılardan oluşur .

Her bir yinelemede, ilk kontrol durumunda her iki nk ve k aittir p doğrudur, ancak ve ancak bir dizi fark sadece {nk, k} ve p boştur. Eğer öyleyse, durum yanlıştır ve döngü devam eder.

O Not k> 0 ve {- k, k, n} bazı olumlu değeri koşulunu tatmin edecek k - n böylece, (Goldbach varsayım doğru olduğunu varsayarak) 0 içinde p yanlış pozitif yol açmaz.

Döngüde, k ve m'yi güncelleriz . Yeni değeri m olan ² x k² = k! - mx k² = (1 k) ve yeni değeri k olduğu , k + 1 , yani , m = (k 1 -!) ² yine önce ve sonra tutar Güncelleme.

Ardından, m% k × k değerini p'ye eklemek için ayar birliği yaparız . Wilson teoreminin sonucuna göre, k , asalsa 1 × k = k, değilse x × k = 0 ekleyecektir .

Döngü sona erdiğinde, n - k ve k'nin son değerlerini basarız ki bu toplam n ile başlar .


Bu asal üretme algoritması nasıl çalışır?
Sızdıran Rahibe

@LeakyNun Bir açıklama ekledim.
Dennis

Oh ... bu deha.
Leaky Nun

5

Yakut 2,0 (65)

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

4

PHP - 73 bayt

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

Giriş, komut satırı bağımsız değişkeni olarak alınır.

Örnek kullanım:

$ php goldbach.php 7098
19+7079

4

GolfScript 41 33 32

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

Komut satırı bağımsız değişkenini kabul eder örn.

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

Girdi numarasının tüm ilgili bölümlerini şununla bulur:

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

ve sonra hiçbir sayının asal OLMADIĞI ilk bölümü bulur:

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

burada kompozit kontrol bloğu np :

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

bu blok, belirli bir sayıyı eşit olarak bölen tüm sayılara göre filtreler. Böyle bir sayı yoksa (yani sayı asal), sonuç []GolfScript'te falseydir.


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)

Girintili'ye:

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)

Kullanımı:

> 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 

Posterity için 112 karakter eski çözüm

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

Girintili'ye:

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

Bu hem çılgın hem de güler yüzlü !!
Tomas

3

Python - 107

Temel olarak nutria cevabının ikinci kısmında bir gelişme (bunu 2.7'de çalıştırdım ama 3.x için de çalışması gerektiğini düşünüyorum)

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

Yeni satırlar ve boşluklar :zorunlu mu?
mniip

Sekme bir boşluğa indirilebilir ve baskıdan önceki boşluk kaldırılabilir (4 bayt tıraş olur).
clismique

3

JavaScript (ES6) (Normal İfade), 105

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

Şimdi özel özelliklere (temel geri referans desteği, olumlu ve olumsuz ileriye dönük) düşük gereksinimi olan Goldbach varsayımını test eden bir regex var.

Bu String.prototype.repeat(), EcmaScript 6. sürüm teklifinin bir parçası olan kullanır . Şu anda, bu kod yalnızca Firefox'ta çalışır.

Gerçekten regex ile çalışırken terse komutu olan daha iyi bir dile ihtiyacım var ...


2

Scala, 286 192 172 148 karakter

En hızlı değil ama işe yarıyor. 10 için goldbach çifti listesini almak için g (10) 'u arayın.

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

C ++ 'ya dönüşüm kolaydır.


2

C - 139129 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);}

intİşlevinizdeki bildirimleri kaldırarak 8 karakter tıraş edebilirsiniz i. ifKaldırıp başka bir çift ve işareti ekleyerek 2 karakter daha kaydedebilirsiniz :i(b,2)&&i(a-b,2)&&printf(...)
Josh

Teşekkürler! Bunu düşünmedim &&. (Asla susturmayı tartışmaya alışmayacağım ...)
Oberon

Yuvalanmış üçlüyü kullanımınızı seviyorum.
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)))

çalıştırmak için kodu içerir. Sonuçlar aşırı cömert ...

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

Adaçayı, 60

Skoru benzer ve res'in çözümünü hissediyorum , ancak yayınlamak için yeterli olduğunu düşünüyorum.

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

2

Adaçayı , 65 62

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

Yukarıdakiler goldbach.sagedosyadayken, bir terminalde Sage ile çalıştırın:

sage: %runfile goldbach.sage 

Fikir için @ boothby'a teşekkürler p=is_prime.


Bunu ayarlayarak 62'ye düşürebilirsiniz p=is_prime.
boothby

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]

Açıklama:

  • g"goldbach" fonksiyonudur. Çağırmak g nsize toplanan asal çiftini verir n.
  • p, daha küçük bir primer listesi oluşturan bir fonksiyondur n.
  • ctanımlamak için kullanılan ana denetleyici işlevidir p.

Örnek çalıştırmalar:

*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

Bu, giriş tamsayısı için tüm çözümleri döndürür.

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

Örneğin, 1298 girildiğinde…

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

Yazıldığı gibi, her çözeltiyi iki kez döndürür.

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


Giriş 2, durup
durmadığını

1

Julia, 62 Karakter (85 istemiyle)

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]

Bu kullanıcıyı istemez (gerektiği gibi), değil mi?
res

Hayır, bunu fark etmedim. Şu anda birçok karakter ekleyecek Julia. g(int(readline(STDIN)))
gggg

1

GTB , 31

TI-84 Hesap Makineniz için

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

Asal yerleşik değildir.

Örnek çalıştırmalar

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


1

Python 3 - 150 143 karakter

Eski sürüm (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))]

Yeni sürüm (ProgramFOX sayesinde):

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

Her kombinasyonu yazdırır, örneğin:
4 2 + 2
10 7 + 3 5 + 5 3 + 7


|boolean tipi ile güvenle kullanılabilir, bu yüzden(a+b!=n)|p(a)|p(b)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Kullanarak daha da kısa: print([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])(toplamı n olan tuples listesini yazdırır). 8 bayt tasarruf eder.
agtoever

Ayrıca kullanmak r=range(2,n)ve referans vermek rbirkaç tane daha tasarruf sağlar.
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

Asal sayı bulmak için dahili işlev yok.

Giriş

72

Çıktı

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

Partiye biraz geç kaldım ama golf becerilerimi uyguluyorum.

Aslında bu soruyu bulamadan kodladım! Bu yüzden benimki diğer Python çözümlerinin kullandığı güzel lambda'yı içermiyor.

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 karakter

"Kullanıcı istemi" her J golfçünün bane olduğunu. İşte zor kazanılan tüm karakterlerim!

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

Açıklaması:

  • ".1!:1]1- Girişten bir dize ( 1!:1) okuma (dosya tanıtıcısı)1 ) ve bir sayıya ( ".) dönüştürün .
  • p:i.n=: - Bu sayıyı değişkene atayın n ve ardından ilk nasal sayıları alın.
  • +/~ - Bir ilave tablo yapın, n Geniş ve nyüksek .
  • i.&n, - Tabloyu tek bir listeye dönüştürün ve ardından ilk oluşumun dizinini bulun. n Goldbach'ın varsayımı doğruysa var olan .
  • p:(n,n)#: - Satır ve sütunu dizinden alın ve karşılık gelen primerleri alın.

Kullanımı:

   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

Bilgi istemi bir gereklilik olmasaydı, işte 25 karakterlik bir fiil:

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


1

Julia, 50 49 bayt

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

Çevrimiçi deneyin!

Bir işlev kabul edilebilir olsaydı, kod 32 bayta kısaltılabilir :

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

Nasıl çalışır

~=primesyerleşik asal işlevler için bağımsız değişkenine kadar tüm asal sayıların listesini döndüren bir diğer ad oluşturur . n=ARGS[]|>intilk komut satırı bağımsız değişkenini n olarak kaydeder. .

Uygun bir çift astar bulmak için, önce yukarıda belirtilen ana aralığı hesaplıyoruz ~n. Daha sonra, n-~nbu primerlerin ve n .

(Kesişen By asal aralık kendisi ile birlikte) sonucu, biz kalan asal olduğundan emin olun p öyle ki p - n da bir asal olduğunu.

Son olarak, extremakavĢaktaki en düşük ve en yüksek üssü alır, bu yüzden toplamları n olmalıdır .


0

SQL, 295 284

Postgresql'de:

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;

Yine de, "özyinelemede sol dış birleşim yok", "özyinelemede alt sorgu yok" gibi şeyler olmasaydı, alanın yarısında yapabilmelidir ...

İşte çıktı:

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

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

Düzgünce yola koyulun -

@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 bayt

57, artı 1 -nE

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

Giriş ve çıkış tekli. Misal:

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

Şapka ucu.


0

Oracle SQL 11.2, 202 bayt

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;   

Un-golfed

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 bayt

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), x için bir öncelik testidir ve g (x), birbirine uyan iki primeri bulmak için sayılarla tekrarlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.