ソフィージェルマンの素数を一覧表示する


10

質問

A ソフィージェルマン素数が素数であるPよう2P + 1も素数です。たとえば、23も素数であるため、11はソフィージャーマン素数です。ソフィージェルマンの素数を昇順で計算する最短のプログラムを書く

ルール

  • Sophie Germain素数は、外部ソースからではなくプログラムによって生成される必要があります。
  • プログラム、2³²-1未満のすべてのソフィージェルマン素数を計算する必要があります
  • プログラムが見つけたソフィージャーメインプライムをそれぞれ印刷する必要があります。
  • 最もスコアの低い人が勝つ

得点

  • コードのバイトあたり2ポイント
  • -10(プログラムによって生成された素数が2³²-1より大きい場合)

コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
マーティンエンダー2015年

回答:


4

CJam

17文字の場合、最大2 ^ 32の列挙が得られます。

G8#,{_mp*2*)mp},`

4文字以上の場合、範囲は2 ^ 32より大きいSG素数を含めるのに十分な大きさになります。

G8#K_*+,{_mp*2*)mp},`

4294967681以降= 2 ^ 32 + 385 <2 ^ 32 + 400。

もちろん、無料で範囲を等しく拡張することもできます。

C9#,{_mp*2*)mp},`

これは、17キャラクターのボーナスなし、または21キャラクターのボーナス付きで送信できることを意味します
Meow Mix

@ user3502615、または17文字のボーナス付き。私がSGプライムリストを実際に「自分のプログラムによって」生成したのかどうかは議論の余地がありますが、それを実行するのに十分な強力なコンピューターがないので。
Peter Taylor

I,I符号付き32ビット整数として扱われるため、の最大値はIです2 ** 31 - 1
デニス

2
@Dennis、それは言語の文書化されたプロパティですか、それともJava実装の実装の癖ですか?
Peter Taylor

文書化されていませんが、動作はJavaとオンラインインタープリターの両方で一貫しています。
デニス

3

Pyth、19バイト* 2-10 = 28

オンラインコンパイラ/エグゼキュータは無限ループであるため、出力を表示しないことに注意してください。

K1#~K1I&!tPK!tPhyKK

説明:

K1                      K=1
  #                     While true:
   ~K1                  K+=1
      I                 If
       &                logical AND
        !tPK            K is prime
            !tPhyK      2*K+1 is prime (y is double, h is +1)
                  K     Print K

PZ真実または偽の値を返しません。の素因数分解を返しますZ。素数のテストは!tPZであり、素因数分解に1つの因子のみが含まれているかどうかをチェックします。
ジャクベ

はい。今では動作します。しかし、それらの素因数分解には1つの因子しか含まれていないため、!tP間違い01素数になることになります。簡単な修正は、すべてZを最初に置き換えてK割り当てることK2です。
ジャクベ2015年

他のいくつかのゴルフ:のK1代わりに割り当てK2、ifと増分を入れ替えます。このようにして、を削除できます)。そして+1*K2と同じですhyK
ジャクベ2015年

ああ、チュートリアルページで読んだところです。pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0で
mbomb007

プログラムが無限ループに陥っているので、オンラインコンパイラは結果を表示しません。また、プログラムの終了後、Webサイトには出力のみが表示されます。オフラインコンパイラを使用してコードをテストしました。できます。
ジャクベ2015年

1

Pyth-2 * 16バイト-10 = 22

Pythでの通常の素数チェックの方法を使用し!tPて、数値とその安全素に両方を適用します。両方を一度にチェックするためのちょっとしたトリックがあります。まで上がる10^10ので、ボーナスを獲得します。

f!+tPTtPhyTr2^TT

説明はすぐに来ます。

f          r2^TT     Filter from 2 till 10^10
 !                   Logical not to detect empty lists
  +                  List concatenation
   tP                All but the firs element of the prime factorization
    T                The filter element
   tP                All but the firs element of the prime factorization
    hyT              2n+1

オンラインで1000未満で試してください


1
これには、約40 GBのRAMメモリを搭載したマシンが必要です。かなり効率的です;-)
ジャクベ2015年

実際にコードを正常に実行しない限り、-10を要求できるとは思いませんか?
orlp 2015年

ノー@orlp、私はOPを尋ね、彼は範囲を小さくすると十分であるプログラム全体をシミュレートし、言った:chat.stackexchange.com/transcript/message/21585393#21585393
Maltysen

1
#include<stdio.h>
#include<math.h>

int isprime(int);
int main(){
    int check,n,secondcheck;
    printf("enter how long you want to print\n");
    scanf("%d",&n);
    for(int i=2;i<n;i++){
        check = isprime(i);
        if(check==0){
        secondcheck = isprime(2*i+1);
        if(secondcheck==0){
        printf("%d\t",i);
        }
        else
        continue;
        }
    }
}
int isprime(int num){   
    int check = num,flag=0;
     num = sqrt(num);
    for(int i=2;i<=num;i++){
        if(check%i==0){
            flag=1;
            return 1;
        }
    }
    if(flag==0){
        return 0;
    }
}

3
(スペースを削除するなどして)プログラムをゴルフすることを検討し、どこまで到達できるか見てください。
Mhmd 2015

0

CJam、34(2 * 22-10)

C9#{ImpI2*)mp&{Ip}&}fI

12 ** 9を含む、すべてのソフィージャーメインプライムを印刷します4294967681 > 2 ** 32

私のマシンでは、これには約8時間かかると思います。今夜走ります。


0

ハスケル、2 * 54から10 = 98 132

i a=all((>0).rem a)[2..a-1]
p=[n|n<-[2..],i n,i$2*n+1]

iプライムチェックです。pすべての数字取りnの両方をnして2*x+1プライムあります。pは無限リストです。

編集:2*n+1素数かどうかをチェックするためのより良い方法。


0

ジュリア、2 * 49-10 = 88

p=primes(2^33)
print(p[map(n->isprime(2n+1),p)])

リスト形式で印刷します[2,3,5,11,...]。その形式、primes関数の使用、またはすべての計算が完了するまで待機して印刷できない場合は、実行時に1行に1つずつ印刷されます。

isprime=f
for i=1:2^33;f(i)&&f(2i+1)&&println(i)end

52文字です。どちらもソフィージャーメインの素数をまで計算する2^33ため、10ポイントの割引が適用されます。


0

Python 3、124 123バイト

i=3
q=[2]
while 1:
 p=1
 for x in range(2,round(i**.5)+1):p=min(p,i%x)
 if p:
  q+=[i];s=(i-1)/2
  if s in q:print(s)
 i+=2

それはどのように機能しますか?

i=3                                 # Start at 3
q=[2]                               # Create list with first prime (2), to be list of primes.
while 1:                            # Loop forever
 p=1                                # Set p to 1 (true)
 for x in range(2,round(i**0.5)+1): # Loop from 2 to the number's square root. x is the loop value
     p=min(p,i%x)                   # Set p to the min of itself and the modulo of
                                    # the number being tested and loop value (x).
                                    # If p is 0 at the end, a modulo was 0, so it isn't prime.
 if p:                              # Check if p is 0
  q+=[i]                            # Add the current number (we know is prime) to list of primes (q)
  s=(i-1)/2                         # Generate s, the number that you would double and add 1 to make a prime.

  if s in q:print(s)                # If (i-1)/2 is a prime (in the list), then that prime satifies
                                    # the condition 2p+1 is prime because i is 2p+1, and i is prime
 i+=2                               # Increment by 2 (no even numbers are prime, except 2)

こちらからオンラインでお試しください。


私のコンピューターによると、ソフィジェルマンの素数が2 ^ 32未満の0.023283%が生成されています。

それが終わったら、十分な行があればペーストビンに投稿します。あなたはそれらをすべて持っていることを確認するためにそれを使用できます。


.5より短い0.5
mbomb007

0

Perl、2 * 57-10 = 104

use ntheory":all";forprimes{say if is_prime(2*$_+1)}2**33

2
3
5
11
...
8589934091
8589934271

42秒から2 ^ 32、1分26秒から2 ^ 33。2*$_+1と書いた場合、50%速く実行されます1+$_<<1が、それはもう1バイトです。

このモジュールはprimes.pl、ソフィージェルマンプライム用のフィルターを含む多くのフィルターをインストールします。つまり:primes.pl --so 2**33(20バイト)


0

Ruby、61 * 2-10 = 112

require'prime';Prime.each(1.0/0)do|n|p Prime.prime?(n*2+1)end

2 ** 32までのすべての値を出力するには、永久に時間がかかります

編集する

1.0 / 0をFloat :: INFINITYに置き換えて数バイトを削り取った


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