ゴールドバッハの予想


15

2より大きい偶数の整数をユーザーに求めるプログラムを作成します。

2より大きいすべての整数は2つの素数の合計として表現できるというGoldbachの推測を考えると、2つの素数を出力し、それらを加算すると、要求された偶数を提供します。編集:プログラムは、すべてではなく素数のペアを印刷するだけです。例えば:

4:2 + 2

6:3 + 3

8:3 + 5

10:5 + 5または3 + 7


「素数のペアを印刷するだけでよい」ということは、より多くのペアを印刷できることを意味しますか?
愛子14年

コードの長さを短くする場合は、整理する必要があると思います
合理性14年

回答:


11

APL、34または44バイト

最初のバージョンは34シンボル長で、Dyalog APLでまだサポートされているような、元のシングルバイトAPL文字セットの文字に制限されています。

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

説明:

                               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

2番目のバージョンは22シンボル長です。これはπ、素数をチェックする機能を利用するためですが、Unicodeを使用するNARS2000でのみ利用できるため、UCS-2のバイトカウントは44です。

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

説明:

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

(⎕:数字を尋ねるプロンプトです)

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

¯2π⍳2πnプライム発電機として動作しますか?
オベロン

@Oberon πオペレーターは正確に何をしますか?
primo 14年

ダイアディックπスイッチ¯2πxx番目の素数を計算し、x ¯1πxより小さい最初の素数であり、xの0πx素数性をテストし、x 1πxより大きい最初2πxの素数であり、xより小さい素数10πxの数であり、xの約数の数で11πxあり、合計であるxのすべての約数の、12πxそして13πxそれぞれ、メビウスとトーティエント関数です。最後になりましたが、モナドπxはxの素因数分解を返します。
オベロン14年

NARS2000に固有の@Oberonですね。面白いインタプリタのようです。私はそれを試して、答えを修正します。
トビア14年

@Tobiaそれは?ごめんなさい 私はそれがどこかで言及されているのを見ましたが、彼らはNARS2000について決して言及しませんでした。知っておくといい。
オベロン

6

Python 2、75 71バイト

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でテストします。

使い方

ウィルソンの定理の帰結を使用します。

corollary of Wilson's theorem

常に、変数mk-1の階乗の2乗に等しくなります。kは値1から始まり、mは値0!²= 1から始まります。セットpは、0と、kの現在の値までのすべての素数で構成されます。

各反復で、最初にn-kkの両方がpに属しているかどうかをチェックします。これは、{nk、k}pのセットの差が空の場合にのみtrueです。そうである場合、条件は偽であり、ループが継続します。

k> 0で、{n-k、k}n-kの正の値の条件を満たしていることに注意してください(Goldbachの予想が真であると仮定)。したがって、p0は偽陽性になりません。

ループでは、kmを更新します。mの新しい値はm×k²=(k-1)!²×k²= k!²であり、kの新しい値はk + 1なので、m =(k-1)!²はまだ前後に保持されます更新。

次に、set unionを実行して、m%k×kの値をpに追加します。ウィルソンの定理の帰結により、kが素数であれば1×k = kが加算され、そうでなければ0×k = 0が加算されます。

ループが終了すると、n-kおよびkの最後の値を出力します。これらは合計nの素数になります。


一体どのようにその素数生成アルゴリズムは機能しますか?
リーキー修道女

@LeakyNun説明を追加しました。
デニス

ああ...それは天才です。
リーキー修道女

5

ルビー2.0(65)

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

4

PHP-73バイト

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

入力はコマンドライン引数として取得されます。

サンプル使用法:

$ php goldbach.php 7098
19+7079

4

GolfScript 41 33 32

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

コマンドライン引数を受け入れます

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

入力番号のすべての関連パーティションを検索します:

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

そして、次の値を持つ素数ではない最初のパーティションを見つけます:

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

複合チェックブロックnpは次のとおりです。

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

このブロックは、指定された数値を均等に分割するすべての数値に絞り込みます。そのような数がない場合(したがって、その数は素数です)、結果は[]になり、GolfScriptでは偽になります。


3

perl 6:69

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

3

R、170 112 83文字

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

インデント:

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)

使用法:

> 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 

後世のための112文字の古いソリューション

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

インデント:

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

これはクレイジーでありながらも心温まるものです!!
トマス14

3

パイソン-107

基本的にヌートリアの答えの第2部の改善(これを2.7で実行しましたが、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

改行とスペースは:必須ですか?
mniip 14

タブをスペースに縮小し、印刷前のスペースを削除することができました(4バイト削ります)。
clismique

3

JavaScript(ES6)(正規表現)、105

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

これで、特別な機能(基本的な後方参照サポート、肯定的および否定的な先読み)の要件が低いGoldbach推測をテストする正規表現ができました。

これはString.prototype.repeat()、EcmaScript第6版の提案の一部であるを使用しています。現在、このコードはFirefoxでのみ機能します。

正規表現で作業するときは、簡潔なコマンドを備えたより良い言語が本当に必要です...


2

スカラ、286の 192 172 148文字

最速ではありませんが、動作します。g(10)を呼び出して、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 ")}

C ++への変換は簡単です。


2

C- 139 129文字

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関数の宣言を削除すると、8文字を削ることができますi。あなたは削除することで、別の2つの文字を保存することができますifし、別の二重のアンパサンドに追加することを:i(b,2)&&i(a-b,2)&&printf(...)
ジョシュ

ありがとう!それを考えなかった&&。(引数の型のサイレンシングに慣れることは決してありません...)
Oberon 14年

ネストされた3項の使用が大好きです。
ジョシュ14年

2

newLISP- 169 148文字

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

実行するコードが含まれています。結果は過度に寛大です...

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

セージ65 62

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

上記のfile goldbach.sageを使用して、ターミナルでSageを実行して実行します。

sage: %runfile goldbach.sage 

@boothbyのp=is_primeアイデアに感謝します。


を設定することで、これを62まで下げることができますp=is_prime
ブースビー14

2

ハスケル、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]

説明:

  • g「ゴールドバッハ」関数です。を呼び出すg nと、合計する素数のペアが得られますn
  • pは未満の素数のリストを生成する関数ですn
  • cを定義するために使用されるプライムチェッカー関数pです。

実行例:

*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

これは、入力整数のすべての解を返します。

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

たとえば、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}}

書かれているように、各ソリューションを2回返します。

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


それが停止した場合は、インプット2は、勝つ、双子素数予想を反証/証明、神託を尋ねる
Filipq

1

ジュリア、62文字(プロンプト付き85文字)

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]

これは(必要に応じて)ユーザーにプロンプ​​トを表示しませんか?
解像度14年

いいえ、気付きませんでした。今すぐジュリアに多くのキャラクターを追加します。 g(int(readline(STDIN)))
gggg 14年

1

GTB、31

TI-84計算機用

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

主なビルトインはありません。

実行例

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

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

私はあなたでさらに2つの文字をオフに剃ることができると思うreturn;の代わりにreturn 0;
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

1

Python 3- 150 143文字

古いバージョン(150文字):

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

新しいバージョン(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))]


4 2 + 2
10 7 + 3 5 + 5 3 + 7 など、すべての組み合わせを印刷します


|そう、boolean型で安全に使用することができます(a+b!=n)|p(a)|p(b)
n̴̖̋h̷͉a̷̭̿h̸̡̅ẗ̵̨d̷̰ĥ̷̳

以下を使用するとさらに短くなりますprint([(a,b)for b in range(2,n)for a in range(2,n)if not((a+b!=n)|p(a)|p(b))])(合計がnであるタプルのリストを出力します)。8バイト節約します。
agtoever

また、使用r=range(2,n)して参照するとr、さらにいくつか節約できます。
-agtoever

1

q [116文字]

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

素数を見つけるための組み込み関数はありません。

入力

72

出力

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

パーティーに少し遅れましたが、私はゴルフのスキルを練習しています。

この質問を見つける前に、実際にこれをコーディングしました!そのため、他の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

1

J- 35 32文字

「ユーザーにプロンプ​​トを表示」は、すべてのJゴルファーの悩みの種です。私の苦労して稼いだすべてのキャラクターがあります!

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

説明:

  • ".1!:1]1- 1!:1入力(ファイルハンドル1)から文字列()を読み取り、それを数値(".)に変換します。
  • p:i.n=:-この番号を変数に割り当てn、最初のn素数を取ります。
  • +/~- n幅とn高さのある追加テーブルを作成します。
  • i.&n,-テーブルを1つのリストに変換し、nGoldbachの推測が真である場合に存在するの最初の出現のインデックスを見つけます。
  • p:(n,n)#: -インデックスから行と列を取得し、対応する素数を取得します。

使用法:

   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

プロンプトが要件ではなかった場合、25文字の動詞を次に示します。

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


1

ジュリア、50 49バイト

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

オンラインでお試しください!

関数が受け入れられる場合、コードは32バイトに短縮できます

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

使い方

~=primes引数までのすべての素数のリストを返す組み込み素数関数のエイリアスを作成します。n=ARGS[]|>int最初のコマンドライン引数を解析してnに保存します。

適切な素数のペアを見つけるために、まず、前述の素数範囲をで計算し~nます。次に、n-~nこれらの素数とnのすべての差を求めます。

結果を素数範囲自体と交差()することにより、残りの素数pn-pも素数になるようにします。

最後extremaに、交差点で最低と最高の素数を取るため、それらの合計はnでなければなりません。


0

SQL、 295 284

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;

ただし、「再帰に左外部結合がない」、「再帰にサブクエリがない」などの目的がなければ、半分のスペースでそれを行うことができるはずです...

出力は次のとおりです。

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

バッチ-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!

きちんと設定-

@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バイト

57、プラス1 -nE

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

入力と出力は単項です。例:

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

ハットチップ。


0

Oracle SQL 11.2、202バイト

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;   

ゴルフをしていない

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バイト

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の素数テストであり、g(x)は数値を再帰的に繰り返し、適合する2つの素数を見つけます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.