Daftar bilangan prima Sophie Germain


10

Pertanyaan

Sebuah Sophie Germain utama adalah prima p sehingga 2p + 1 adalah prima juga. Misalnya, 11 adalah prime Sophie Germain karena 23 juga prima. Tulis program terpendek untuk menghitung bilangan prima Sophie Germain dalam urutan menaik

Aturan

  • Bilangan prima Sophie Germain harus dihasilkan oleh program Anda , bukan dari sumber eksternal.
  • Program Anda harus menghitung semua bilangan prima Sophie Germain di bawah 2³²-1
  • Anda harus mencetak setiap Sophie Germain utama yang ditemukan program Anda.
  • Orang dengan skor terendah menang

Mencetak gol

  • 2 poin per byte kode Anda
  • -10 jika Anda dapat menampilkan prime yang dihasilkan oleh program Anda lebih besar dari 2³²-1

Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Martin Ender

Jawaban:


4

CJam

Untuk 17 karakter, kami mendapatkan penghitungan penuh hingga 2 ^ 32:

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

Untuk 4 karakter lebih, kami mendapatkan rentang yang cukup besar untuk menyertakan perdana SG yang lebih besar dari 2 ^ 32:

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

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

Tentu saja, kami dapat memperluas rentang sama dengan gratis seperti

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

Ini berarti Anda dapat mengirimkannya tanpa bonus untuk 17 karakter atau dengan bonus untuk 21 karakter
Meow Mix

@ user3502615, atau dengan bonus untuk 17 karakter. Meskipun masih bisa diperdebatkan apakah daftar SG prime I benar-benar dihasilkan "oleh program saya", karena saya tidak memiliki komputer yang cukup kuat untuk menjalankannya sejauh itu.
Peter Taylor

I,memperlakukan Isebagai integer 32-bit yang ditandatangani, sehingga nilai maksimumnya Iadalah 2 ** 31 - 1.
Dennis

2
@ Dennis, apakah itu properti yang didokumentasikan dari bahasa tersebut atau kekhasan implementasi dari implementasi Java?
Peter Taylor

Ini tidak didokumentasikan, tetapi perilaku ini konsisten untuk Java dan penerjemah online.
Dennis

3

Pyth, 19 byte * 2 - 10 = 28

Perhatikan bahwa kompiler / pelaksana online tidak menampilkan keluaran karena ini merupakan loop tak terbatas.

K1#~K1I&!tPK!tPhyKK

Dijelaskan:

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

PZtidak mengembalikan nilai yang benar atau salah. Ini mengembalikan faktorisasi utama Z. Pengujian untuk prima adalah !tPZ, yang memeriksa apakah faktorisasi prima hanya berisi satu faktor.
Jakube

Iya. Sekarang berhasil. !tPkesalahan 0dan 1menjadi prima, karena faktorisasi prima mereka hanya berisi 1 faktor. Perbaikan mudah adalah dengan mengganti semua Zdengan Kdan menetapkan K2di awal.
Jakube

Beberapa golf lain: tetapkan K1alih-alih K2, dan tukarkan jika dan kenaikannya. Dengan cara ini Anda dapat menghapus ). Dan +1*K2sama halnya dengan hyK.
Jakube

Ah, saya baru saja membaca tentang itu di halaman tutorial. Apakah itu berfungsi untuk Anda di pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0
mbomb007

Kompilator online tidak menunjukkan hasil, karena program macet dalam loop tak terbatas. Dan situs web hanya menampilkan output, setelah program selesai. Saya telah menguji kode menggunakan kompiler offline. Berhasil.
Jakube

1

Pyth - 2 * 16 byte - 10 = 22

Menggunakan metode pemeriksaan perdana prima di Pyth dengan !tPdan menerapkannya baik untuk nomor dan safe-prime, dengan sedikit trik untuk memeriksa keduanya sekaligus. Naik 10^10, jadi saya akan mendapatkan bonus.

f!+tPTtPhyTr2^TT

Penjelasan segera hadir.

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

Coba di bawah 1000 online .


1
Ini membutuhkan mesin dengan sekitar 40 GB memori RAM. ; Cukup efisien ;-)
Jakube

Saya tidak berpikir Anda dapat mengklaim - 10 kecuali Anda benar-benar berhasil menjalankan kode?
orlp

@ orlp tidak, saya bertanya OP dan dia berkata membuat rentang lebih kecil dan mensimulasikan seluruh program akan cukup: 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
Silakan pertimbangkan bermain golf program Anda (dengan menghapus ruang ..etc) dan lihat seberapa jauh Anda bisa mendapatkan.
Mhmd

0

CJam, 34 (2 * 22 - 10)

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

Mencetak semua bilangan prima Sophie Germain di bawah 12 ** 9, yang mencakup 4294967681 > 2 ** 32.

Saya memperkirakan bahwa ini akan memakan waktu sekitar 8 jam pada mesin saya. Saya akan menjalankannya malam ini.


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]

iadalah cek utama. pmengambil semua angka di nmana keduanya ndan 2*x+1prima. padalah daftar tanpa batas.

Sunting: cara yang lebih baik untuk memeriksa apakah 2*n+1prime.


0

Julia, 2 * 49 - 10 = 88

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

Mencetaknya dalam format daftar [2,3,5,11,...],. Jika format itu, menggunakan primesfungsi, atau menunggu sampai semua perhitungan dilakukan untuk mencetak tidak dapat diterima, ini mencetak satu per baris saat dijalankan.

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

Ini sedikit lebih lama, 52 karakter. Keduanya menghitung semua bilangan prima Sophie Germain hingga 2^33, sehingga mereka harus mendapatkan diskon 10 poin.


0

Python 3, 124 123 byte

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

Bagaimana cara kerjanya?

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)

Cobalah online di sini .


Komputer saya mengatakan ini telah menghasilkan 0,023283% dari semua bilangan prima Sophie Germain di bawah 2 ^ 32.

Setelah selesai, saya akan mempostingnya di pastebin jika ada cukup baris. Anda dapat menggunakannya untuk memeriksa apakah Anda memiliki semuanya.


.5lebih pendek dari0.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 detik hingga 2 ^ 32, 1m26s hingga 2 ^ 33. Akan berjalan 50% lebih cepat jika 2*$_+1ditulis sebagai 1+$_<<1tetapi itu satu byte lagi.

Modul ini juga menginstal primes.plyang memiliki banyak filter termasuk satu untuk bilangan prima Sophie-Germain. Jadi: primes.pl --so 2**33(20 byte)


0

Ruby, 61 * 2 - 10 = 112

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

Butuh selamanya untuk mencetak semua nilai hingga 2 ** 32

Edit

Dicukur beberapa byte menggantikan Float :: INFINITY untuk 1.0 / 0


0

PARI / GP, 46 * 2 - 10 = 82

forprime(p=2,2^33,if(isprime(2*p+1),print(p)))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.