素数インデックス付きの素数


13

最初の10000個の素数付き素数を出力/返すプログラムまたは関数を作成します。

n 番目の素数を呼び出すとp(n)、このリストは

3, 5, 11, 17, 31, 41, 59 ... 1366661

なぜなら

p(p(1)) = p(2) = 3
p(p(2)) = p(3) = 5
p(p(3)) = p(5) = 11
p(p(4)) = p(7) = 17
...
p(p(10000)) = p(104729) = 1366661

標準的な抜け穴は禁止されており、標準的な出力方法が許可されています。完全なプログラム、名前付き関数、または匿名関数で答えることができます。


2
通常、問題を解決するために、最初にチャレンジをサンドボックスに投稿することを試みる必要があります(右側のリンクを参照)。
SEがEVILであるため、Aditsuは終了します

6
実行時の最適化は、私たちがコードゴルフの課題で行うことではありません。最短のプログラムが常に勝ちます。
リスト管理者

1
プライム添え字を持つ素数:A006450

1
@bilboコードゴルフの回答は通常1週間後に受け入れられ、最短の成功コードとして受け入れられる必要があります。コードの速度が必要な場合は、そのためのタグがあります。タグcode-golfについては、このページを参照してください
アディソンクランプ

1
すべてのコンテストには客観的な勝利基準が必要です。それ以外の場合は、トピックから外れています。サイズ速度で回答を判断する場合は、両方を組み合わせる方法を開示する必要があります。これは、コンテストが投稿されたときに行う必要があります。14時間後に10回回答する必要はありません。他の唯一のオプションは、トピックから外れているためにこの投稿を閉じることなので、速度関連の編集はすべて元に戻しました。
デニス

回答:


15

MATLAB / Octave、25バイト

p=primes(2e6)
p(p(1:1e4))

これほど簡単ではありません。


9

Python、72バイト

P=p=1;l=[]
while p<82e5/6:l+=P%p*[p];P*=p*p;p+=1
for x in l:print l[x-1]

これは、10000個の数字を印刷した後に「範囲外のリストインデックスエラー」で終了します。 、デフォルト許可されてします

ウィルソンの定理法を使用lして、10000番目の素数までの素数のリストを生成します。次に、リスト内の位置を使用して素数を印刷し、10000番目の素数の後の範囲を使い果たすまで、ゼロインデックス付けのために1シフトします。

便利なことに、の上限1366661は次のように推定できます。82e5/6である1366666.6666666667炭を節約します。

プライムインデックス付きの素数を追加するときに印刷するシングルループメソッドが欲しいのですが、もっと長いようです。

P=p=1;l=[]
while p<104730:
 l+=P%p*[p]
 if len(l)in P%p*l:print p
 P*=p*p;p+=1

これは、私が書いていたゴミよりもずっといいです。+1
Mego

これは1229年の数字を出力します
SEは悪であるため、aditsuはやめ

@aditsu私は間違いを見たと思う。このコードをより大きな範囲で実行できますか?
xnor

おそらく長い時間がかかるでしょう:p
SEはEVILであるため、aditsuは終了します

私はそれが\終えたと思います(@;◇; @)/、それが正しいようだ
SEは悪であるため、aditsuは終了

8

J、11バイト

p:<:p:i.1e4

形式で素数を出力します

3 5 11 17 31 41 59 67 83 109 127 ...

説明

        1e4  Fancy name for 10000
      i.     Integers from 0 to 9999
    p:       Index into primes: this gives 2 3 5 7 11 ...
  <:         Decrement each prime (J arrays are 0-based)
p:           Index into primes again

4

Mathematica、26 25 23バイト

Prime@Prime@Range@1*^4&

リストを返す純粋な関数。


1
プライムはListableとても簡単Prime@Prime@Range@1*^4&です

私は気持ちを知っています...いずれにせよ、これは私がここで見た最も美しいMathematicaソリューションだと思います!

私が推測すると、@演算子は^書くときよりも高い優先順位を持っていRange@10^4ますか?それはゴルフのゲームを台無しにする古典的なMathematicaです。いいトリックだ!

4

Haskell、65バイト

p=[x|x<-[2..],all((>0).mod x)[2..x-1]]
f=take 10000$map((0:p)!!)p

出力: [3,5,11,17,31,41,59,67,83,109,127.....<five hours later>...,1366661]

それほど速くありません。仕組み:pは素数の無限リストです(すべてmod x yのsでyをチェックします[2..x-1])。(のn番目の要素を取得)がマップされている10000ときに取得するリストの最初の要素を取得します。インデックス関数()はゼロベースであるため、1つの数字(-> )を前に付けて要素を取得する素数のリストを調整する必要があります。0:p!!pp0:!!



3

AWK-129バイト

...大丈夫...コンパクトさのためにポイントを獲得するには長すぎます...しかし、多分それはスピードのためにいくらかの名誉を得ることができますか?

xファイル:

BEGIN{n=2;i=0;while(n<1366662){if(n in L){p=L[n];del L[n]}else{P[p=n]=++i;if(i in P)print n}j=n+p;while(j in L)j=j+p;L[j]=p;n++}}

ランニング:

$ awk -f x | nl | tail
  9991  1365913
  9992  1365983
  9993  1366019
  9994  1366187
  9995  1366327
  9996  1366433
  9997  1366483
  9998  1366531
  9999  1366609
 10000  1366661

読みやすい:

BEGIN {
        n=2
        i=0
        while( n<1366662 ) {
                if( n in L ) {
                        p=L[n]
                        del L[n]
                } else {
                        P[p=n]=++i
                        if( i in P ) print n
                }
                j=n+p
                while( j in L ) j=j+p
                L[j]=p
                n++
        }
}

このプログラムはL、「数値のテープ」として使用して素数のストリームを計算し、見つかった素数が飛び跳ねLて、除数を持つことが既に知られている近くの数にフラグを立てます。これらのジャンププライムは、「数字のテープ」Lが最初からます。

L[n]空のテープヘッドを切り落とすことは、既知の(プライム)除数がないことを意味します。

L[n]値を保持すると、この値は素数であり、除算することが知られていますn

したがって、素数の除数または新しい素数を見つけました。その後、このプライムはL[n+m*p]、テープが空であることがわかった次のプライムに進みます。

これは、エラトステネスのふるいが「クラインのボトルを通して引っ張られた」ようなものです。あなたは常にテープの開始時に行動します。テープから複数の素数を発射する代わりに、自由な位置が見つかるまでテープから離れるカーソルが独自の値の複数の距離だけ開始するので、すでに見つかっている素数を使用します。

外側のループはループごとに1つの素数決定または素数決定を生成しますが、見つかった素数はカウントされPてキーとして保存されますが、この(key、value)ペアの値はプログラムフローには関係ありません。

それらのキーiP既に(i in P)にある場合、p(p(i))品種の素数があります。

ランニング:

$ time awk -f x.awk | wc -l
10000

real    0m3.675s
user    0m3.612s
sys     0m0.052s

このコードは、事前に計算された外部のプライムテーブルを使用しないことを考慮してください。

私の古き良きThinkpad T60にかかった時間ですので、すぐに呼ばれるに値すると思います。

Debian8 / AMD64 mawkを使用gawkしてテスト済み


良い129バイトのgawk:corei7-i870@3.6GhzでDebian10 / AMD64を使用:実際の0m2,417sユーザー0m2,205s sys 0m0,042s
JeanClaudeDaudin

BEGIN {n = 2; i = 0; while(n <1366662){if(n in L){p = L [n]; del L [n]} else {P [p = n] = ++ i; if(i in P)print n} j = n + p; while(j in L)j + = p; L [j] = p; n ++}}
JeanClaudeDaudin


1

Perl、55バイト

use ntheory':all';forprimes{print nth_prime$_,$/}104729

perlに@DanaJMath::Prime::Utilモジュールを使用します(プラグマとともにロードされますntheory)。以下で入手:

cpan install Math::Prime::Util
cpan install Math::Prime::Util::GMP

0

05AB1E、7バイト(非競合)

コード:

4°L<Ø<Ø

オンラインでお試しください!ノート私が変更されたこと42。あなたは多くの時間を持っている場合は、変更することができます2へ戻る4が、これはかかる多くの時間を。このためにアルゴリズムを固定する必要があります。

説明:

4°       # Push 10000 (10 ^ 4)
  L      # Create the list [1 ... 10000]
   <     # Decrement on every element, [0 ... 9999]
    Ø    # Compute the nth prime
     <   # Decrement on every element
      Ø  # Compute the nth prime
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.