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

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

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

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 .


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

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.


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ą.


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.


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.


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


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


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.