AWK - 129 byte
... oookay ... quá lâu để giành điểm vì sự gọn nhẹ ... nhưng có lẽ nó có thể đạt được một số danh dự cho tốc độ?
Các x
tập tin:
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++}}
Đang chạy:
$ 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
Có thể đọc được
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++
}
}
Chương trình tính toán một dòng các số nguyên tố sử dụng L
như "băng số" giữ các số nguyên tố tìm thấy nhảy xung quanh L
để gắn cờ các số gần đó đã biết có một ước số. Các số nguyên tố nhảy này sẽ tiến lên trong khi "băng số" L
bị cắt nhỏ theo số từ đầu.
Trong khi cắt đầu băng L[n]
trống rỗng có nghĩa là không có ước số (số nguyên tố) đã biết.
L[n]
giữ một giá trị có nghĩa là, giá trị này là một số nguyên tố và được biết để chia n
.
Vì vậy, hoặc chúng tôi đã tìm thấy một ước số nguyên tố hoặc một số nguyên tố mới. Sau đó, số nguyên tố sẽ được chuyển sang phần tiếp theo L[n+m*p]
trên băng được tìm thấy trống.
Điều này giống như Sàng của Eratosthenes "kéo qua một chai Klein". Bạn luôn luôn hành động trên băng bắt đầu. Thay vì bắn nhiều số nguyên tố qua băng, bạn sử dụng các số nguyên tố đã được tìm thấy khi các con trỏ nhảy ra khỏi băng bắt đầu bằng nhiều khoảng cách giá trị của chúng cho đến khi tìm thấy vị trí tự do.
Mặc dù vòng lặp bên ngoài tạo ra một số nguyên tố hoặc không phải là số nguyên tố trên mỗi vòng lặp, các số nguyên tố được tìm thấy được tính và được lưu trữ P
dưới dạng khóa, giá trị của cặp (khóa, giá trị) này không phù hợp với luồng chương trình.
Nếu khóa của chúng i
xảy ra trong P
( i in P
), chúng ta có một nguyên tố của giống p (p (i)).
Đang chạy:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
Hãy xem xét rằng mã này không sử dụng các bảng nguyên tố tiền định sẵn bên ngoài.
Thời gian dành cho Thinkpad T60 cũ tốt của tôi, vì vậy tôi nghĩ rằng nó xứng đáng được gọi là nhanh.
Đã thử nghiệm với mawk
và gawk
trên Debian8 / AMD64