Wymień liczby pierwsze Sophie Germain

10

Pytanie

Zofia Germain Prime jest podstawowym P w taki sposób, 2p + 1 jest liczbą pierwszą, jak również. Na przykład 11 jest liczbą pierwszą Sophie Germain, ponieważ 23 jest również liczbą pierwszą. Napisz najkrótszy program do obliczania liczb pierwszych Sophie Germain w porządku rosnącym

Zasady

  • Liczby główne Sophie Germain muszą być generowane przez twój program, a nie z zewnętrznego źródła.
  • Twój program musi obliczyć wszystkie liczby pierwsze Sophie Germain poniżej 2³²-1
  • Musisz wydrukować każdą odrębną liczbę pierwszą Sophie Germain, którą znajdzie Twój program.
  • Osoba z najniższym wynikiem wygrywa

Punktacja

  • 2 punkty za bajt twojego kodu
  • -10, jeśli możesz pokazać liczbę pierwszą wygenerowaną przez twój program większą niż 2³²-1
Meow Mix
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Martin Ender

Odpowiedzi:

4

CJam

Dla 17 znaków otrzymujemy pełne wyliczenie do 2 ^ 32:

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

Dla 4 znaków więcej otrzymujemy zasięg wystarczająco duży, aby uwzględnić liczbę pierwszą SG większą niż 2 ^ 32:

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

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

Oczywiście możemy równie dobrze rozszerzyć zakres za darmo, jak

C9#,{_mp*2*)mp},`
Peter Taylor
źródło
Oznacza to, że możesz przesłać go bez premii za 17 znaków lub z premią za 21 znaków
Meow Mix
@ user3502615 lub z premią za 17 znaków. Chociaż dyskusyjne jest to, czy lista pierwsza liczba SG została faktycznie wygenerowana „przez mój program”, ponieważ nie mam wystarczająco mocnego komputera, aby uruchomić ją tak daleko.
Peter Taylor
I,traktuje Ijako 32-bitową liczbę całkowitą ze znakiem, więc maksymalna wartość Ito 2 ** 31 - 1.
Dennis
2
@Dennis, czy jest to udokumentowana właściwość języka lub dziwactwo implementacji Java?
Peter Taylor
Nie jest to udokumentowane, ale zachowanie jest spójne zarówno dla Java, jak i interpretera online.
Dennis
3

Pyth, 19 bajtów * 2 - 10 = 28

Zauważ, że kompilator / executor online nie wyświetla danych wyjściowych, ponieważ jest to nieskończona pętla.

K1#~K1I&!tPK!tPhyKK

Wyjaśnione:

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
źródło
PZnie zwraca wartości prawda lub fałsz. Zwraca pierwszą faktoryzację Z. Testowanie liczby pierwszej polega na !tPZsprawdzeniu, czy faktoryzacja liczby pierwszej zawiera tylko jeden czynnik.
Jakube,
Tak. Teraz działa. !tPbłędów 0i 1być głównym, ponieważ ich pierwsza faktoryzacja zawiera tylko 1 czynnik. Easy Fix jest zastąpienie wszystkich Zprzez Ki przypisać K2na początku.
Jakube,
Niektóre inne K1pola golfowe: przypisz zamiast K2i zamień if oraz przyrost. W ten sposób możesz usunąć ). I +1*K2to to samo, co hyK.
Jakube,
Ach, właśnie przeczytałem o tych na stronie samouczka. Czy to działa dla ciebie na pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0
mbomb007
Kompilator online nie pokazuje wyniku, ponieważ program utknął w nieskończonej pętli. Witryna wyświetla tylko dane wyjściowe po zakończeniu programu. Przetestowałem kod przy użyciu kompilatora offline. To działa.
Jakube,
1

Pyth - 2 * 16 bajtów - 10 = 22

Używa zwyczajowej metody sprawdzania liczby pierwszych w Pythu za pomocą !tPi stosuje ją zarówno do liczby, jak i jej liczby bezpiecznej, z małą sztuczką, aby sprawdzić oba jednocześnie. Idzie do 10^10, więc idę po bonus.

f!+tPTtPhyTr2^TT

Wyjaśnienie już wkrótce.

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

Wypróbuj poniżej 1000 online .

Maltysen
źródło
1
To zajmuje maszynę z około 40 GB pamięci RAM. Dość wydajny ;-)
Jakube
Nie sądzę, żebyś mógł ubiegać się o - 10, chyba że faktycznie udało ci się uruchomić kod?
lub
@orlp nie, zapytałem OP, a on powiedział, że zmniejszenie zasięgu i symulacja całego programu będzie wystarczająca: 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;
    }
}
użytkownik45221
źródło
3
Rozważ grę w golfa (usuwając spację ... itd.) I sprawdź, jak daleko możesz się dostać.
Mhmd
0

CJam, 34 (2 * 22-10)

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

Drukuje wszystkie liczby pierwsze Sophie Germain poniżej 12 ** 9, w tym 4294967681 > 2 ** 32.

Szacuję, że na moim komputerze zajmie to około 8 godzin. Uruchomię to dziś wieczorem.

Dennis
źródło
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]

ito pierwsza kontrola. pbierze wszystkie liczby ntam, gdzie jedno ni drugie 2*x+1jest liczbą pierwszą. pjest nieskończoną listą.

Edycja: lepszy sposób sprawdzania, czy 2*n+1jest liczbą pierwszą.

nimi
źródło
0

Julia, 2 * 49–10 = 88

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

Drukuje je w formacie listy, [2,3,5,11,...]. Jeśli ten format, użycie primesfunkcji lub oczekiwanie na wykonanie wszystkich obliczeń w celu wydrukowania jest niedopuszczalne, spowoduje to wydrukowanie jednego z nich w wierszu podczas działania.

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

To trochę dłużej, 52 znaki. Obaj obliczają wszystkie liczby pierwsze Sophie Germain do 2^33, więc powinni otrzymać 10 punktów zniżki.

Andrzej
źródło
0

Python 3, 124 123 bajty

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

Jak to działa?

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)

Wypróbuj online tutaj .


Mój komputer twierdzi, że wygenerował 0,023283% wszystkich liczb pierwszych Sophie Germain poniżej 2 ^ 32.

Po zakończeniu opublikuję go na pastebin, jeśli jest wystarczająca liczba wierszy. Możesz go użyć, aby sprawdzić, czy masz je wszystkie.

Tim
źródło
.5jest krótszy niż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 sekundy do 2 ^ 32, 1m26s do 2 ^ 33. Działa o 50% szybciej, jeśli 2*$_+1jest napisane jako, 1+$_<<1ale to jeszcze jeden bajt.

Moduł instaluje również, primes.plktóry ma wiele filtrów, w tym jeden dla liczb pierwszych Sophie-Germain. Więc: primes.pl --so 2**33(20 bajtów)

DanaJ
źródło
0

Ruby, 61 * 2 - 10 = 112

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

Wydrukowanie wszystkich wartości do 2 ** 32 zajęłoby wieczność

Edytować

Ogolono kilka bajtów podstawiając Float :: INFINITY na 1.0 / 0

Sheerforce
źródło
0

PARI / GP, 46 * 2–10 = 82

forprime(p=2,2^33,if(isprime(2*p+1),print(p)))
alephalpha
źródło