Sophie Germain asallarını listele


10

Soru

Bir Sophie Germain, asal bir asal s şekilde 2p + 1 de asal. Örneğin 11, Sophie Germain'in bir başbakanı çünkü 23 de başbakan. Sophie Germain asallarını artan sırada hesaplamak için en kısa programı yazın

kurallar

  • Sophie Germain asal tarafından oluşturulan edilmelidir senin değil harici bir kaynaktan, programa.
  • Programınız gerekir 2³²-1 altındaki tüm Sophie Germain asal hesaplamak
  • Programınızın bulduğu her bir Sophie Germain prime'ı yazdırmalısınız.
  • En düşük puanı alan kişi kazanır

puanlama

  • Kodunuzun bayt başına 2 puanı
  • Programınız tarafından oluşturulan bir asal değeri 2³²-1'den fazla gösterebiliyorsanız -10

Yorumlar uzun tartışmalar için değildir; bu sohbet sohbete taşındı .
— Martin Ender

Yanıtlar:


4

CJam

17 karakter için 2 ^ 32'ye kadar tam sayım elde ederiz:

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

4 karakter daha fazla, 2 ^ 32'den daha büyük bir SG prime'ı içerecek kadar büyük bir aralık elde ederiz:

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

4294967681'den beri = 2 ^ 32 + 385 <2 ^ 32 + 400.

Tabii ki, aralığı eşit olarak genişletebiliriz

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

Bu, 17 karakter için bonus olmadan veya 21 karakter için bonus olmadan gönderebileceğiniz anlamına gelir
— Meow Mix

@ user3502615 veya 17 karakter bonusu ile. Ben listeye SG başbakan aslında "benim program" tarafından oluşturulan olup olmadığını tartışmalı olsa da, o kadar çalıştırmak için yeterince güçlü bir bilgisayar yok çünkü.
— Peter Taylor

I,davranır Iimzalanmış 32 bit tamsayı olarak, bu kadar yüksek bir değer Iolan 2 ** 31 - 1.
— Dennis

2
@Dennis, dilin belgelenmiş bir özelliği mi yoksa Java uygulamasının bir uygulama sorunu mu?
— Peter Taylor

Belgelenmemiştir, ancak davranış hem Java hem de çevrimiçi yorumlayıcı için tutarlıdır.
— Dennis

3

Pyth, 19 bayt * 2-10 = 28

Çevrimiçi derleyici / yürütücünün sonsuz bir döngü olduğu için çıktı göstermediğini unutmayın.

K1#~K1I&!tPK!tPhyKK

Açıklaması:

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

PZdoğru ya da yanlış bir değer döndürmez. 'İn asal çarpanlarına ayırması Z. Asal için test !tPZ, asal çarpanlaştırmanın yalnızca bir faktör içerip içermediğini kontrol eder.
— Jakube

Evet. Şimdi çalışıyor. !tPhataları 0ve 1asal olmak, çünkü asal çarpanlarına ayırma sadece 1 faktör içerir. Kolay düzeltme tüm değiştirmektir Ztarafından Kve atamak K2başında.
— Jakube

Diğer bazı golfler: if ve artımı K1yerine atayın K2ve değiştirin. Bu şekilde ). Ve +1*K2aynı şey hyK.
— Jakube

Ah, öğretici sayfadakileri yeni okumuştum. O sizi çalışır mı pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0
— mbomb007

Çevrimiçi derleyici bir sonuç göstermez, çünkü program sonsuz bir döngüye sıkışmış. Ve web sitesi program bittikten sonra yalnızca çıktı gösterir. Kodu çevrimdışı derleyici kullanarak test ettim. İşe yarıyor.
— Jakube

1

Pyth - 2 * 16 bayt - 10 = 22

Pyth'de geleneksel ön kontrol yöntemini kullanır ve !tPher ikisini de aynı anda kontrol etmek için küçük bir hile ile hem sayıya hem de güvenli asalına uygular. Artar 10^10, bu yüzden bonusa gidiyorum.

f!+tPTtPhyTr2^TT

Açıklama çok yakında.

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'den az çevrimiçi deneyin .


1
Bu, yaklaşık 40 GB RAM belleğe sahip bir makineyi alır. Oldukça verimli ;-)
— Jakube

Aslında kodu başarıyla çalıştırmadıysanız - 10 iddia edebilirsiniz sanmıyorum?
— orlp

@orlp no, OP'ye sordum ve menzili daha küçük yapmanın ve tüm programı simüle etmenin yeterli olacağını söyledi: 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
Lütfen programınızı golf oynamayı düşünün (alanı kaldırarak ..etc) ve ne kadar uzağa gidebileceğinizi görün.
— Mhmd

0

CJam, 34 (2 * 22-10)

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

Aşağıdakileri 12 ** 9içeren tüm Sophie Germain astarlarını yazdırır 4294967681 > 2 ** 32.

Bunun makinemde yaklaşık 8 saat alacağını tahmin ediyorum. Bu gece çalışacağım.


0

Haskell, 2x 54-10 = 98 132

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

ibir birincil kontroldür. pTüm numaraları alır nhem nve 2*x+1asal vardır. psonsuz bir listedir.

Düzenleme: 2*n+1Başbakan olup olmadığını kontrol etmenin daha iyi bir yolu .


0

Julia, 2 * 49-10 = 88

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

Bunları liste biçiminde yazdırır [2,3,5,11,...],. Bu biçim, primesişlevi kullanarak veya yazdırmak için tüm hesaplama yapılıncaya kadar beklemek kabul edilemezse, bu, çalıştıkça her satıra bir tane yazdırır.

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

Biraz daha uzun, 52 karakter. Her ikisi de Sophie Germain ilkelerini hesaplar 2^33, bu yüzden 10 puanlık indirim almalıdırlar.


0

Python 3, 124 123 bayt

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

O nasıl çalışır?

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)

Burada çevrimiçi deneyin .


Bilgisayarım, 2 ^ 32'nin altındaki tüm Sophie Germain primlerinin% 0.023283'ünü oluşturduğunu söylüyor.

İşiniz bittiğinde, yeterli satır varsa onu macun üzerine gönderirim. Hepsini aldığınızdan emin olmak için kullanabilirsiniz.


.5daha kısadır0.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 saniye ila 2 ^ 32, 1m26s ila 2 ^ 33. % 50 daha hızlı çalışır2*$_+1 , 1+$_<<1ancak bu bir bayt daha.

Modül ayrıca primes.plSophie-Germain primleri için bir tane de dahil olmak üzere birçok filtreye sahip kurulumlar yapıyor. Yani: primes.pl --so 2**33(20 bayt)


0

Yakut, 61 * 2-10 = 112

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

2 ** 32'ye kadar olan tüm değerleri yazdırmak sonsuza kadar sürer

Düzenle

1.0 / 0 Float :: INFINITY yerine birkaç bayt çıkarıldı


0

PARI / GP, 46 * 2-10 = 82

forprime(p=2,2^33,if(isprime(2*p+1),print(p)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.