Sophie Germain 소수 목록


10

질문

소피 저메인 프라임 소수 인 P 되도록 2P + 1 뿐만 아니라 소수. 예를 들어 11은 Sophie Germain 소수이며 23도 소수입니다. Sophie Germain 소수를 오름차순으로 계산하는 가장 짧은 프로그램 작성

규칙

  • 소피 제르맹 소수에 의해 생성되어야 당신 이 아닌 외부에서 프로그램.
  • 프로그램 2³²-1 미만의 모든 Sophie Germain 소수를 계산 해야합니다
  • 프로그램에서 찾은 각기 다른 Sophie Germain 소수를 인쇄해야합니다.
  • 가장 낮은 점수를받은 사람이 승리

채점

  • 코드 바이트 당 2 점
  • 2³²-1보다 큰 프로그램에서 생성 된 소수를 표시 할 수있는 경우 -10

의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Martin Ender

답변:


4

CJam

17 개의 문자에 대해 최대 2 ^ 32까지 전체 열거를 얻습니다.

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

4 자 이상인 경우 2 ^ 32보다 큰 SG 소수를 포함 할 수있을만큼 큰 범위를 얻습니다.

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

4294967681 = 2 ^ 32 + 385 <2 ^ 32 + 400 이후입니다.

물론 범위를 무료로 동일하게 확장 할 수 있습니다.

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

즉, 17 자 보너스 또는 21 자 보너스없이 제출할 수 있습니다.
Meow Mix

@ user3502615 또는 17 자 보너스. SG 프라임 I 목록이 실제로 "내 프로그램에 의해"생성되었는지 여부는 논란의 여지가 있지만 그 정도까지 실행할 수있는 강력한 컴퓨터가 없기 때문입니다.
피터 테일러

I,I부호있는 32 비트 정수로 취급 하므로의 최대 값은 I입니다 2 ** 31 - 1.
Dennis

2
@Dennis, 언어의 문서화 된 속성 또는 Java 구현의 구현 문제입니까?
피터 테일러

문서화되지 않았지만 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

예. 이제 작동합니다. 그들의 소인수 분해는 1 요소만을 포함하기 때문에 !tP실수 01소수입니다. 쉬운 수정을 모두 교체하는 것입니다 Z으로 K하고 할당하는 K2시작 부분에.
Jakube

다른 골프 : K1대신에 할당 K2하고 if와 증가분을 바꾸십시오. 이 방법으로를 제거 할 수 있습니다 ). 와 +1*K2같은 것 hyK입니다.
Jakube

아, 나는 튜토리얼 페이지에서 이것에 대해 읽었습니다. pyth.herokuapp.com/?code=K2%23I%26!tPK!tPhyKK)
K1 & debug

프로그램이 무한 루프에 빠지기 때문에 온라인 컴파일러는 결과를 표시하지 않습니다. 그리고 웹 사이트는 프로그램이 완료된 후에 만 ​​출력을 보여줍니다. 오프라인 컴파일러를 사용하여 코드를 테스트했습니다. 효과가있다.
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

온라인 1000 미만으로 시도하십시오 .


1
약 40GB의 RAM 메모리가있는 시스템이 필요합니다. 상당히 효율적인 ;-)
Jakube

실제로 코드를 성공적으로 실행하지 않으면-10을 청구 할 수 있다고 생각하지 않습니까?
orlp

@orlp 아니오, OP에게 물었고 그는 범위를 작게 만들고 전체 프로그램을 시뮬레이션하는 것으로 충분하다고 말했습니다
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

아래 12 ** 9에 포함 된 모든 Sophie Germain 소수를 인쇄합니다 4294967681 > 2 ** 32.

내 컴퓨터에서 약 8 시간이 소요될 것으로 예상됩니다. 오늘 밤에 실행하겠습니다.


0

하스켈, 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모두 n2*x+1주요됩니다. p무한한 목록입니다.

편집 : 2*n+1소수 인지 확인하는 더 좋은 방법입니다 .


0

줄리아, 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 자입니다. 둘 다 소피 제르맹의 모든 소수를 계산 2^33하므로 10 포인트 할인을 받아야합니다.


0

파이썬 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)

여기에서 온라인으로 사용해보십시오 .


내 컴퓨터에 따르면 2 ^ 32 미만의 모든 Sophie Germain 소수 중 0.023283 %가 생성되었습니다.

완료되면 충분한 줄이 있으면 pastebin에 게시합니다. 당신은 그들 모두를 가지고 있는지 확인하는 데 사용할 수 있습니다.


.5보다 짧은0.5
mbomb007

0

펄, 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까지. 2*$_+1작성된 경우 50 % 더 빠르게 실행 1+$_<<1되지만 1 바이트 더 늘어납니다.

이 모듈은 또한 primes.plSophie-Germain 프라임 용 필터를 포함하여 많은 필터가있는 설치합니다 . 그래서 : primes.pl --so 2**33(20 바이트)


0

루비, 61 * 2-10 = 112

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

최대 2 ** 32까지 모든 값을 인쇄하려면 시간이 오래 걸립니다

편집하다

1.0 / 0 대신 Float :: INFINITY를 대체하여 몇 바이트를 줄였습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.