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.