Liste Sophie Germain Primzahlen

10

Die Frage

Eine Sophie Germain-Primzahl ist eine Primzahl p, so dass 2p + 1 ebenfalls eine Primzahl ist. Zum Beispiel ist 11 eine Sophie Germain-Primzahl, weil 23 auch eine Primzahl ist. Schreiben Sie das kürzeste Programm, um die Primzahlen von Sophie Germain in aufsteigender Reihenfolge zu berechnen

Regeln

  • Die Sophie Germain-Primzahlen müssen von Ihrem Programm generiert werden , nicht von einer externen Quelle.
  • Ihr Programm muss alle Sophie Germain-Primzahlen unter 2³²-1 berechnen
  • Sie müssen jede einzelne Sophie Germain-Primzahl drucken, die Ihr Programm findet.
  • Die Person mit der niedrigsten Punktzahl gewinnt

Wertung

  • 2 Punkte pro Byte Ihres Codes
  • -10, wenn Sie eine von Ihrem Programm erzeugte Primzahl größer als 2³²-1 anzeigen können
Miau Mix
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Dieses Gespräch wurde in den Chat verschoben .
Martin Ender

Antworten:

4

CJam

Für 17 Zeichen erhalten wir eine vollständige Aufzählung bis zu 2 ^ 32:

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

Für 4 Zeichen mehr erhalten wir einen Bereich, der gerade groß genug ist, um eine SG-Primzahl größer als 2 ^ 32 aufzunehmen:

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

seit 4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400.

Natürlich können wir die Reichweite ebenso kostenlos erweitern wie

C9#,{_mp*2*)mp},`
Peter Taylor
quelle
Dies bedeutet, dass Sie es ohne den Bonus für 17 Zeichen oder mit dem Bonus für 21 Zeichen einreichen können
Meow Mix
@ user3502615 oder mit dem Bonus für 17 Zeichen. Obwohl es fraglich ist, ob die SG prime I-Liste tatsächlich "von meinem Programm" generiert wurde, da ich keinen Computer habe, der leistungsfähig genug ist, um sie so weit auszuführen.
Peter Taylor
I,behandelt , Ials 32-Bit - Ganzzahl signiert, so dass der maximale Wert für Iist 2 ** 31 - 1.
Dennis
2
@Dennis, ist das eine dokumentierte Eigenschaft der Sprache oder eine Implementierungs-Eigenart der Java-Implementierung?
Peter Taylor
Es ist nicht dokumentiert, aber das Verhalten ist sowohl für Java als auch für den Online-Interpreter konsistent.
Dennis
3

Pyth, 19 Bytes * 2 - 10 = 28

Beachten Sie, dass der Online-Compiler / Executor keine Ausgabe anzeigt, da es sich um eine Endlosschleife handelt.

K1#~K1I&!tPK!tPhyKK

Erklärt:

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
mbomb007
quelle
PZgibt keinen wahrheitsgemäßen oder falschen Wert zurück. Es gibt die Primfaktorisierung von zurück Z. Beim Testen auf Primzahl wird !tPZgeprüft, ob die Primfaktorisierung nur einen Faktor enthält.
Jakube
Ja. Jetzt gehts. !tPFehler 0und 1Primzahl zu sein, da ihre Primfaktorisierung nur 1 Faktor enthält. Einfache Lösung besteht darin, alle Zdurch zu ersetzen Kund K2zu Beginn zuzuweisen .
Jakube
Einige andere Golfplätze: Weisen Sie K1statt zu K2und tauschen Sie das Wenn und das Inkrement aus. Auf diese Weise können Sie die entfernen ). Und +1*K2ist das gleiche wie hyK.
Jakube
Ah, ich hatte gerade über diese auf der Tutorial-Seite gelesen. Funktioniert es für Sie auf pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0
mbomb007
Der Online-Compiler zeigt kein Ergebnis an, da das Programm in einer Endlosschleife steckt. Und die Website zeigt nur die Ausgabe, nachdem das Programm beendet ist. Ich habe den Code mit dem Offline-Compiler getestet. Es klappt.
Jakube
1

Pyth - 2 * 16 Bytes - 10 = 22

Verwendet die übliche Methode der Primprüfung in Pyth mit !tPund wendet sie sowohl auf die Zahl als auch auf die sichere Primzahl an, mit einem kleinen Trick, um beide gleichzeitig zu prüfen. Geht auf 10^10, also gehe ich für den Bonus.

f!+tPTtPhyTr2^TT

Erklärung in Kürze.

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

Versuchen Sie es unter 1000 online .

Maltysen
quelle
1
Dies erfordert eine Maschine mit ca. 40 GB RAM-Speicher. Ziemlich effizient ;-)
Jakube
Ich glaube nicht, dass Sie die - 10 beanspruchen können, es sei denn, Sie haben den Code tatsächlich erfolgreich ausgeführt?
Orlp
@orlp nein, ich fragte OP und er sagte, die Reichweite zu verkleinern und das gesamte Programm zu simulieren würde ausreichen: 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;
    }
}
user45221
quelle
3
Bitte denken Sie daran, Ihr Programm zu spielen (indem Sie Platz usw. entfernen) und sehen Sie, wie weit Sie kommen können.
Mhmd
0

CJam, 34 (2 * 22-10)

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

Druckt alle Primzahlen von Sophie Germain unter 12 ** 9, einschließlich 4294967681 > 2 ** 32.

Ich schätze, dass dies auf meiner Maschine ungefähr 8 Stunden dauern wird. Ich werde es heute Abend laufen lassen.

Dennis
quelle
0

Haskell, 2 * 54-10 = 98 132

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

iist ein Prime Check. pnimmt alle Zahlen, bei ndenen beide nund 2*x+1Primzahlen sind. pist eine unendliche Liste.

Bearbeiten: Besserer Weg, um zu überprüfen, ob 2*n+1Prime ist.

Nimi
quelle
0

Julia, 2 * 49 - 10 = 88

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

Druckt sie im Listenformat [2,3,5,11,...]. Wenn dieses Format, die Verwendung der primesFunktion oder das Warten, bis die gesamte Berechnung zum Drucken abgeschlossen ist, nicht akzeptabel ist, werden sie während der Ausführung einmal pro Zeile gedruckt.

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

Es ist etwas länger, 52 Zeichen. Beide berechnen alle Primzahlen von Sophie Germain bis zu 2^33, daher sollten sie den 10-Punkte-Rabatt erhalten.

Andrew
quelle
0

Python 3, 124 123 Bytes

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

Wie funktioniert es?

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)

Probieren Sie es hier online aus .


Mein Computer sagt, dass er 0,023283% aller Sophie Germain-Primzahlen unter 2 ^ 32 erzeugt hat.

Wenn es fertig ist, werde ich es auf Pastebin posten, wenn es genügend Zeilen gibt. Sie können damit überprüfen, ob Sie alle haben.

Tim
quelle
.5ist kürzer als0.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 Sekunden bis 2 ^ 32, 1m26s bis 2 ^ 33. Läuft 50% schneller, wenn 2*$_+1geschrieben als, 1+$_<<1aber das ist ein weiteres Byte.

Das Modul wird auch installiert primes.plund verfügt über viele Filter, darunter einen für Sophie-Germain-Primzahlen. Also: primes.pl --so 2**33(20 Bytes)

DanaJ
quelle
0

Ruby, 61 * 2 - 10 = 112

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

Es würde ewig dauern, alle Werte bis zu 2 ** 32 auszudrucken

Bearbeiten

Einige Bytes wurden entfernt, wobei 1.0 / 0 durch Float :: INFINITY ersetzt wurde

Bloße Kraft
quelle
0

PARI / GP, 46 * 2 - 10 = 82

forprime(p=2,2^33,if(isprime(2*p+1),print(p)))
Alephalpha
quelle