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
되어 키로 저장되지만 이 (키, 값) 쌍의 값은 프로그램 흐름과 관련이 없습니다.
키 i
가 P
이미 ( 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에 걸리는 시간이 너무 빠르다고 생각합니다.
테스트 mawk
및 gawk
Debian8 / AMD64에