소수 인덱스를 가진 소수


13

처음 10000 소수 인덱스 소수를 출력 / 반환하는 프로그램 또는 함수를 작성하십시오.

우리가 n 번째 소수 라고 부르면 p(n)이 목록은

3, 5, 11, 17, 31, 41, 59 ... 1366661

때문에

p(p(1)) = p(2) = 3
p(p(2)) = p(3) = 5
p(p(3)) = p(5) = 11
p(p(4)) = p(7) = 17
...
p(p(10000)) = p(104729) = 1366661

표준 허점은 금지되어 있으며 표준 출력 방법이 허용됩니다. 전체 프로그램, 명명 된 기능 또는 익명의 기능으로 답변 할 수 있습니다.


2
문제를 해결하려면 일반적으로 샌드 박스에 문제를 게시해야합니다 (오른쪽의 링크 참조).
SE가 EVIL이기 때문에 Aditsu 종료

6
런타임에 최적화하는 것은 코드 골프 과제에서하는 것이 아닙니다. 가장 짧은 프로그램이 항상 이깁니다.
lirtosiast

1
소수 첨자가있는 소수 : A006450 .

1
@bilbo 코드 골프에 대한 답변은 일반적으로 일주일 후에 허용되며 가장 짧은 성공적인 코드 로 수락해야합니다 . 코드 속도 를 원한다면 태그가 있습니다. 태그 코드 골프에 대해서는 이 페이지를 참조하십시오 .
Addison Crump

1
모든 콘테스트에는 객관적인 승리 기준이 필요합니다 . 그렇지 않으면 주제에서 벗어납니다. 크기 속도로 답을 판단 하려면 두 가지를 결합하는 방법을 공개해야합니다. 이것은 컨테스트가 게시 될 때 수행되어야하며, 14 시간이 아니라 10 개의 답변이 있습니다. 다른 옵션은 주제를 벗어난 게시물을 닫는 것이므로 속도 관련 수정 사항을 모두 취소했습니다.
Dennis

답변:


15

MATLAB / Octave, 25 바이트

p=primes(2e6)
p(p(1:1e4))

이것보다 훨씬 간단하지 않습니다.


9

파이썬, 72 바이트

P=p=1;l=[]
while p<82e5/6:l+=P%p*[p];P*=p*p;p+=1
for x in l:print l[x-1]

이것은 10000 숫자를 인쇄 한 후 "목록 색인 범위를 벗어남 오류"와 함께 종료 되며 기본적으로 허용됩니다 .

용도 윌슨의 정리 방법을 목록 생성 l1만번째 소수에 소수의를. 그런 다음 10000 번째 소수 프라임 이후에 범위가 다 떨어질 때까지 목록의 위치를 ​​사용하여 소수를 0으로 인덱싱하기 위해 1만큼 이동합니다.

편리하게는,이 위의 결합 1366661으로 추정 할 수 82e5/6있는 1366666.6666666667숯불을 절약.

단일 루프 방법을 사용하여 소수 인덱스 소수를 추가 할 때 인쇄하지만 더 길어 보입니다.

P=p=1;l=[]
while p<104730:
 l+=P%p*[p]
 if len(l)in P%p*l:print p
 P*=p*p;p+=1

이것은 내가 쓰는 쓰레기보다 훨씬 낫습니다. +1
Mego


@aditsu 내 실수를 본 것 같아. 더 큰 범위로이 코드를 실행할 수 있습니까?
xnor

아마 오랜 시간이 걸릴 것입니다 : P는
aditsu 종료 SE 악이기 때문에

나는 그것이 \ (@; ◇; @) /을 끝냈다 고 생각한다
SE가 EVIL이기 때문에

8

J, 11 바이트

p:<:p:i.1e4

형식으로 소수를 출력합니다

3 5 11 17 31 41 59 67 83 109 127 ...

설명

        1e4  Fancy name for 10000
      i.     Integers from 0 to 9999
    p:       Index into primes: this gives 2 3 5 7 11 ...
  <:         Decrement each prime (J arrays are 0-based)
p:           Index into primes again

4

Mathematica, 26 25 23 바이트

Prime@Prime@Range@1*^4&

목록을 반환하는 순수 함수.


1
총리는 Listable간단한이 있도록 Prime@Prime@Range@1*^4&할 것

나는 느낌을 알고 있습니다 ... 어쨌든 이것이 내가 본 것 중 가장 예쁘다고 Mathematica 솔루션이라고 생각합니다!

@연산자를 ^쓸 때보 다 우선 순위가 더 높다고 생각 Range@10^4합니까? 고전적인 Mathematica는 골프 게임을 망치고 있습니다. 좋은 트릭!

4

하스켈, 65 바이트

p=[x|x<-[2..],all((>0).mod x)[2..x-1]]
f=take 10000$map((0:p)!!)p

출력 : [3,5,11,17,31,41,59,67,83,109,127.....<five hours later>...,1366661]

그리 빠르지 않습니다. 작동 방식 : p소수의 무한 소수 목록입니다 (순진하게 모든 mod x ys에서 y를 검사 함 [2..x-1]). (get nth element of )가 매핑 10000될 때 얻는 목록 의 첫 번째 요소를 가져옵니다 . 색인 함수 ( )가 0을 기반으로 하기 때문에 하나의 숫자 (-> ) 를 앞에 추가하여 요소를 가져 오는 소수 목록을 조정해야합니다 .0:p!!pp0:!!



3

AWK-129 바이트

... oookay ... 너무 길어서 압축 점수를 얻지 못했습니다 ...하지만 속도에 대한 명예를 얻을 수 있습니까?

x파일 :

BEGIN{n=2;i=0;while(n<1366662){if(n in L){p=L[n];del L[n]}else{P[p=n]=++i;if(i in P)print n}j=n+p;while(j in L)j=j+p;L[j]=p;n++}}

달리는:

$ awk -f x | nl | tail
  9991  1365913
  9992  1365983
  9993  1366019
  9994  1366187
  9995  1366327
  9996  1366433
  9997  1366483
  9998  1366531
  9999  1366609
 10000  1366661

읽을 수있는 :

BEGIN {
        n=2
        i=0
        while( n<1366662 ) {
                if( n in L ) {
                        p=L[n]
                        del L[n]
                } else {
                        P[p=n]=++i
                        if( i in P ) print n
                }
                j=n+p
                while( j in L ) j=j+p
                L[j]=p
                n++
        }
}

이 프로그램은 L발견 된 소수가 L이미 제수를 가지고있는 것으로 알려진 근처의 숫자를 표시하기 위해 점프하는 "숫자 테이프"로 사용하여 소수 스트림을 계산합니다 . 이 숫자는 "숫자 테이프" L가 처음부터 숫자 단위로 잘리는 동안 진행됩니다 .

테이프 헤드 L[n]가 비어있는 상태에서 잘리는 것은 알려진 (프라임) 제수가 없음을 의미합니다.

L[n]값을 보유한다는 것은이 값이 소수이며 나누는 것으로 알려져 n있습니다.

그래서 우리는 소수 또는 제수를 찾았습니다. 그런 다음 빈이 L[n+m*p]발견 된 테이프에서 다음 프라임이 다음으로 올라갑니다 .

이것은 에라토스테네스의 체가 "클라인 병을 통해 끌어 당겨지는"것과 같습니다. 항상 테이프 시작에 따라 행동하십시오. 테이프를 통해 여러 개의 소수를 발사하는 대신, 커서가 자유 위치를 찾을 때까지 자체 값의 여러 거리만큼 테이프에서 시작하는 커서로 이미 발견 된 소수를 사용합니다.

외부 루프는 루프 당 하나의 소수 또는 소수가 아닌 데미지를 생성하지만, 발견 된 소수는 계산 P되어 키로 저장되지만 이 (키, 값) 쌍의 값은 프로그램 흐름과 관련이 없습니다.

iP이미 ( i in P) 인 경우 p (p (i)) 유형의 소수입니다.

달리는:

$ time awk -f x.awk | wc -l
10000

real    0m3.675s
user    0m3.612s
sys     0m0.052s

이 코드는 미리 계산 된 외부 프라임 테이블을 사용하지 않습니다.

내 오래된 오래된 Thinkpad T60에 걸리는 시간이 너무 빠르다고 생각합니다.

테스트 mawkgawkDebian8 / AMD64에


둔한 좋은 129 바이트 : 지금 내 corei7-i870@3.6Ghz에 Debian10 / AMD64와 : 실제 0m2,417s 사용자 0m2,205s SYS 0m0,042s
JeanClaudeDaudin

BEGIN {n = 2; i = 0; while (n <1366662) {if (n in L) {p = L [n]; del L [n]} else {P [p = n] = ++ i; if (i에서 P) 인쇄 n} j = n + p; (j에서 L) j + = p; L [j] = p; n ++}}
JeanClaudeDaudin


1

펄, 55 바이트

use ntheory':all';forprimes{print nth_prime$_,$/}104729

용도 @DanaJMath::Prime::Util(프라 그마로드 펄에 대한 모듈 ntheory). 다음과 같이 사용하십시오.

cpan install Math::Prime::Util
cpan install Math::Prime::Util::GMP

0

05AB1E, 7 바이트 (비경쟁)

암호:

4°L<Ø<Ø

온라인으로 사용해보십시오! , 난을 변경 한 것을 42. 당신은 많은 시간이있는 경우, 변경할 수 있습니다 2에 다시 4, 그러나 이것은 걸릴 많은 시간을. 이를 위해 알고리즘을 고정해야합니다.

설명:

4°       # Push 10000 (10 ^ 4)
  L      # Create the list [1 ... 10000]
   <     # Decrement on every element, [0 ... 9999]
    Ø    # Compute the nth prime
     <   # Decrement on every element
      Ø  # Compute the nth prime
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.