Danh sách các số nguyên tố Sophie Germain


10

Câu hỏi

Một Sophie Germain thủ là số nguyên tố p2p + 1 là số nguyên tố là tốt. Ví dụ, 11 là số nguyên tố của Sophie Germain vì 23 cũng là số nguyên tố. Viết chương trình ngắn nhất để tính các số nguyên tố của Sophie Germain theo thứ tự tăng dần

Quy tắc

  • Các số nguyên tố Sophie Germain phải được tạo bởi chương trình của bạn , không phải từ nguồn bên ngoài.
  • Chương trình của bạn phải tính toán tất cả các số nguyên tố của Sophie Germain dưới 2³²-1
  • Bạn phải in từng nguyên tố riêng biệt của Sophie Germain mà chương trình của bạn tìm thấy.
  • Người có điểm thấp nhất sẽ thắng

Chấm điểm

  • 2 điểm cho mỗi byte mã của bạn
  • -10 nếu bạn có thể hiển thị số nguyên tố được tạo bởi chương trình của bạn lớn hơn 2³²-1

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Martin Ender

Câu trả lời:


4

Camam

Trong 17 ký tự, chúng tôi nhận được liệt kê đầy đủ lên đến 2 ^ 32:

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

Để có thêm 4 ký tự, chúng ta có một phạm vi chỉ đủ lớn để bao gồm một số nguyên tố SG lớn hơn 2 ^ 32:

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

kể từ 4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400.

Tất nhiên, chúng tôi có thể mở rộng phạm vi miễn phí như

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

Điều này có nghĩa là bạn có thể gửi nó mà không cần phần thưởng cho 17 ký tự hoặc với phần thưởng cho 21 ký tự
Meow Mix

@ user3502615 hoặc có thưởng cho 17 ký tự. Mặc dù vẫn còn tranh cãi liệu danh sách SG Prime mà tôi thực sự được tạo ra bởi "chương trình của tôi" hay không, vì tôi không có một máy tính đủ mạnh để chạy nó đến mức đó.
Peter Taylor

I,coi Inhư một số nguyên 32 bit đã ký, vì vậy giá trị tối đa I2 ** 31 - 1.
Dennis

2
@Dennis, đó là một thuộc tính được ghi lại bằng ngôn ngữ hay là một sự giải quyết thực thi của việc triển khai Java?
Peter Taylor

Nó không được ghi lại, nhưng hành vi phù hợp với cả Java và trình thông dịch trực tuyến.
Dennis

3

Bình thường, 19 byte * 2 - 10 = 28

Lưu ý rằng trình biên dịch / thực thi trực tuyến không hiển thị đầu ra vì đó là một vòng lặp vô hạn.

K1#~K1I&!tPK!tPhyKK

Giải thích:

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

PZkhông trả về giá trị trung thực hoặc giả. Nó trả về hệ số nguyên tố của Z. Kiểm tra nguyên tố là !tPZ, kiểm tra xem hệ số nguyên tố chỉ chứa một yếu tố.
Jakube

Đúng. Bây giờ nó hoạt động. !tPsai lầm 01mặc dù là số nguyên tố, vì hệ số nguyên tố của chúng chỉ chứa 1 yếu tố. Dễ dàng sửa chữa là thay thế tất cả Zbằng Kvà chỉ định K2lúc đầu.
Jakube 11/05/2015

Một số golf khác: chỉ định K1thay vì K2và trao đổi nếu và tăng. Bằng cách này bạn có thể loại bỏ ). Và +1*K2cũng giống như vậy hyK.
Jakube

Ah, tôi vừa đọc về những người trên trang hướng dẫn. Nó có hoạt động với bạn trên pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0
mbomb007 11/05/2015

Trình biên dịch trực tuyến không hiển thị kết quả, vì chương trình bị kẹt trong một vòng lặp vô hạn. Và trang web chỉ hiển thị đầu ra, sau khi chương trình kết thúc. Tôi đã kiểm tra mã bằng trình biên dịch ngoại tuyến. Nó hoạt động.
Jakube

1

Pyth - 2 * 16 byte - 10 = 22

Sử dụng phương pháp kiểm tra số nguyên tố thông thường trong Pyth với !tPvà áp dụng cả hai cho số và số nguyên tố an toàn của nó, với một mẹo nhỏ để kiểm tra cả hai cùng một lúc. Đi lên 10^10, vì vậy tôi sẽ nhận tiền thưởng.

f!+tPTtPhyTr2^TT

Giải thích đến sớm.

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

Hãy thử dưới 1000 trực tuyến .


1
Điều này cần một máy có bộ nhớ RAM khoảng 40 GB. Khá hiệu quả ;-)
Jakube 11/05/2015

Tôi không nghĩ bạn có thể yêu cầu - 10 trừ khi bạn thực sự chạy mã thành công?
orlp

@orlp không, tôi đã hỏi OP và anh ấy nói làm cho phạm vi nhỏ hơn và mô phỏng toàn bộ chương trình là đủ: 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
Vui lòng xem xét việc chơi golf chương trình của bạn (bằng cách loại bỏ không gian ..vv) và xem bạn có thể đi được bao xa.
Mhmd

0

CJam, 34 (2 * 22 - 10)

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

In tất cả các số nguyên tố của Sophie Germain 12 ** 9, bao gồm 4294967681 > 2 ** 32.

Tôi ước tính rằng điều này sẽ mất khoảng 8 giờ trên máy của tôi. Tôi sẽ chạy nó tối nay.


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]

ilà một kiểm tra chính. plấy tất cả các số ntrong đó cả hai n2*x+1là số nguyên tố. plà một danh sách vô hạn.

Chỉnh sửa: cách tốt hơn để kiểm tra nếu 2*n+1là số nguyên tố.


0

Julia, 2 * 49 - 10 = 88

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

In chúng ở định dạng danh sách , [2,3,5,11,...]. Nếu định dạng đó, sử dụng primeshàm hoặc đợi cho đến khi tất cả các tính toán được thực hiện để in không được chấp nhận, thì điều này sẽ in chúng trên mỗi dòng khi nó chạy.

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

Nó dài hơn một chút, 52 ký tự. Cả hai đều tính toán tất cả các số nguyên tố của Sophie Germain 2^33, vì vậy họ sẽ được giảm giá 10 điểm.


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

Làm thế nào nó hoạt động?

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)

Hãy thử trực tuyến tại đây .


Máy tính của tôi nói rằng nó đã tạo ra 0,023283% của tất cả các số nguyên tố Sophie Germain dưới 2 ^ 32.

Khi nó kết thúc, tôi sẽ đăng nó lên pastebin nếu có đủ dòng. Bạn có thể sử dụng nó để kiểm tra xem bạn đã có tất cả chưa.


.5ngắn hơn0.5
mbomb007 11/05/2015

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 giây đến 2 ^ 32, 1m26 đến 2 ^ 33. Sẽ chạy nhanh hơn 50% nếu 2*$_+1được viết dưới dạng 1+$_<<1nhưng đó là thêm một byte.

Mô-đun này cũng cài đặt primes.plcó rất nhiều bộ lọc, bao gồm một bộ lọc cho các số nguyên tố của Sophie-Germain. Vậy: 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

Sẽ mất mãi mãi để in ra tất cả các giá trị lên tới 2 ** 32

Biên tập

Đã tắt một vài byte thay thế Float :: INFINITY cho 1.0 / 0


0

PARI / GP, 46 * 2 - 10 = 82

forprime(p=2,2^33,if(isprime(2*p+1),print(p)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.