รายการโซฟี Germain จำนวนเฉพาะ


10

คำถาม

Sophie Germain นายกเป็นนายกพีดังกล่าวว่า2p + 1เป็นสำคัญเช่นกัน ตัวอย่างเช่น 11 เป็นโซฟี Germain prime เพราะ 23 เป็น Prime เช่นกัน เขียนโปรแกรมที่สั้นที่สุดเพื่อคำนวณจำนวนเฉพาะของ Sophie Germain ตามลำดับจากน้อยไปหามาก

กฎระเบียบ

  • โปรแกรมของคุณต้องสร้างช่วงเวลาของ Sophie Germain ไม่ใช่จากแหล่งภายนอก
  • โปรแกรมของคุณจะต้องคำนวณจำนวนเฉพาะทั้งหมดของ Sophie Germain ภายใต้2³²-1
  • คุณต้องพิมพ์เฉพาะโปรแกรมที่คุณพบ
  • บุคคลที่มีคะแนนต่ำสุดชนะ

เกณฑ์การให้คะแนน

  • 2 คะแนนต่อไบต์ของรหัสของคุณ
  • -10 ถ้าคุณสามารถแสดงนายกที่สร้างโดยโปรแกรมของคุณมากกว่า2³²-1

ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Martin Ender

คำตอบ:


4

CJam

สำหรับ 17 ตัวอักษรเราจะได้รับการแจงนับสูงสุด 2 ^ 32:

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

สำหรับ 4 ตัวอักษรมากกว่านี้เราจะได้รับช่วงที่กว้างพอที่จะรวมนายก SG ที่มากกว่า 2 ^ 32:

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

ตั้งแต่ 4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400

แน่นอนว่าเราสามารถขยายขอบเขตได้ฟรีเท่า ๆ กันเช่น

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

ซึ่งหมายความว่าคุณสามารถส่งได้โดยไม่มีโบนัสสำหรับตัวละคร 17 ตัวหรือด้วยโบนัสสำหรับตัวละคร 21 ตัว
Meow Mix

@ user3502615 หรือด้วยโบนัสจำนวน 17 อักขระ แม้ว่าจะเป็นที่ถกเถียงกันว่ารายการ SG prime I นั้นถูกสร้างขึ้นจริง ๆ "โดยโปรแกรมของฉัน" หรือไม่เพราะฉันไม่มีคอมพิวเตอร์ที่ทรงพลังพอที่จะใช้งานได้
Peter Taylor

I,ถือว่าIเป็นลงนามจำนวนเต็ม 32 บิตดังนั้นค่าสูงสุดสำหรับการมีI 2 ** 31 - 1
เดนนิส

2
@Dennis, นั่นเป็นคุณสมบัติของเอกสารของภาษาหรือการใช้งานที่แปลกประหลาดของการใช้งาน Java หรือไม่?
Peter Taylor

มันไม่ได้ทำเป็นเอกสาร แต่พฤติกรรมนั้นสอดคล้องกันสำหรับทั้ง Java และล่ามออนไลน์
Dennis

3

Pyth, 19 ไบต์ * 2 - 10 = 28

โปรดทราบว่าคอมไพเลอร์ออนไลน์ / ผู้ปฏิบัติการไม่แสดงผลลัพธ์เพราะมันเป็นวงไม่สิ้นสุด

K1#~K1I&!tPK!tPhyKK

อธิบาย:

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

PZไม่คืนค่าความจริงหรือค่าเท็จ Zมันส่งกลับตัวประกอบที่สำคัญของ การทดสอบสำหรับนายกคือ!tPZซึ่งตรวจสอบว่าการแยกตัวประกอบเฉพาะมีเพียงหนึ่งปัจจัย
Jakube

ใช่. ตอนนี้มันใช้งานได้ !tPความผิดพลาด0และ1เป็นเรื่องสำคัญเนื่องจากการแยกตัวประกอบเฉพาะมีเพียง 1 ปัจจัย การแก้ไขอย่างง่ายคือการแทนที่ทั้งหมดZด้วยKและกำหนดK2ที่จุดเริ่มต้น
Jakube

สนามกอล์ฟอื่น: กำหนดK1แทนK2และสลับถ้าและเพิ่ม )วิธีนี้คุณสามารถลบ และเป็นสิ่งเดียวกับ+1*K2 hyK
Jakube

อ่าฉันเพิ่งอ่านเรื่องเกี่ยวกับสิ่งที่อยู่ในหน้าการสอน ใช้งานได้กับคุณในpyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)~K1&debug=0
mbomb007

คอมไพเลอร์ออนไลน์ไม่แสดงผลลัพธ์เนื่องจากโปรแกรมติดอยู่ในการวนซ้ำไม่สิ้นสุด และเว็บไซต์จะแสดงเฉพาะผลลัพธ์หลังจากโปรแกรมเสร็จสิ้น ฉันทดสอบโค้ดโดยใช้คอมไพเลอร์ออฟไลน์ มันได้ผล.
Jakube

1

Pyth - 2 * 16 ไบต์ - 10 = 22

ใช้วิธีการตรวจสอบแบบไพรม์ใน Pyth !tPและใช้กับทั้งจำนวนและความปลอดภัยแบบไพรม์พร้อมด้วยเคล็ดลับเล็กน้อยในการตรวจสอบทั้งสองในครั้งเดียว ขึ้นไป10^10ดังนั้นฉันจะได้รับโบนัส

f!+tPTtPhyTr2^TT

คำอธิบายจะมาเร็ว ๆ นี้

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

ลองภายใต้ 1,000 ออนไลน์


1
ใช้เครื่องที่มีหน่วยความจำ RAM ประมาณ 40 GB ค่อนข้างมีประสิทธิภาพ ;-)
Jakube

ฉันไม่คิดว่าคุณจะสามารถรับสิทธิ์ --10 ยกเว้นว่าคุณได้เรียกใช้รหัสสำเร็จหรือไม่
orlp

@ หรือไม่มีฉันถาม OP และเขากล่าวว่าการทำให้ช่วงมีขนาดเล็กลงและการจำลองโปรแกรมทั้งหมดจะเพียงพอ: 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
โปรดพิจารณาตีกอล์ฟโปรแกรมของคุณ (โดยลบพื้นที่ .. ฯลฯ ) และดูว่าคุณจะไปได้ไกลแค่ไหน
Mhmd

0

CJam, 34 (2 * 22 - 10)

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

พิมพ์เฉพาะ Sophie Germain ทั้งหมดภายใต้ซึ่งรวมถึง12 ** 94294967681 > 2 ** 32

ฉันคาดว่าจะใช้เวลาประมาณ 8 ชั่วโมงในเครื่องของฉัน คืนนี้ฉันจะวิ่ง


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]

iเป็นการตรวจสอบที่สำคัญ pใช้ตัวเลขทั้งหมดnที่ทั้งสองnและ2*x+1มีความสำคัญ pเป็นรายการที่ไม่มีที่สิ้นสุด

แก้ไข: วิธีที่ดีกว่าสำหรับการตรวจสอบว่า2*n+1ดีหรือไม่


0

Julia, 2 * 49 - 10 = 88

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

[2,3,5,11,...]พิมพ์ไว้ในรูปแบบรายการ หากรูปแบบนั้นใช้primesฟังก์ชั่นหรือรอจนกว่าการคำนวณทั้งหมดจะเสร็จสิ้นเพื่อพิมพ์ไม่เป็นที่ยอมรับนี่จะพิมพ์หนึ่งรายการต่อบรรทัดในขณะที่ทำงาน

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

มันยาวไปหน่อย 52 ตัวอักษร ทั้งสองคำนวณยอดเงินทั้งหมดของ Sophie Germain จนถึง2^33ดังนั้นพวกเขาควรได้รับส่วนลด 10 แต้ม


0

Python 3, 124 123 ไบต์

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

มันทำงานยังไง?

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)

ลองออนไลน์ได้ที่นี่


คอมพิวเตอร์ของฉันบอกว่ามันสร้างขึ้น 0.023283% ของจำนวนทั้งหมดของ Sophie Germain ที่ต่ำกว่า 2 ^ 32

เมื่อเสร็จแล้วฉันจะโพสต์ไว้บน pastebin หากมีบรรทัดเพียงพอ คุณสามารถใช้มันเพื่อตรวจสอบว่าคุณได้รับมาทั้งหมด


.5สั้นกว่า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 วินาทีถึง 2 ^ 32, 1m26s ถึง 2 ^ 33 จะทำงานเร็วขึ้น 50% หาก2*$_+1เขียนเป็น1+$_<<1แต่นั่นคืออีกหนึ่งไบต์

โมดูลนี้ยังติดตั้งprimes.plซึ่งมีตัวกรองจำนวนมากซึ่งรวมถึงตัวกรองสำหรับช่วงเวลาของ Sophie-Germain ดังนั้น: primes.pl --so 2**33(20 ไบต์)


0

Ruby, 61 * 2 - 10 = 112

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

มันจะใช้เวลาตลอดไปในการพิมพ์ค่าทั้งหมดสูงสุด 2 ** 32

แก้ไข

ปิดการใช้งานการแทนที่สักสองสามไบต์ Float :: INFINITY สำหรับ 1.0 / 0


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.