AWK - 129 byte
... oookay ... terlalu lama untuk memenangkan poin untuk kekompakan ... tapi mungkin itu bisa mendapatkan kehormatan untuk kecepatannya?
The x
File:
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++}}
Berlari:
$ 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
Dapat dibaca:
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++
}
}
Program ini menghitung aliran bilangan prima menggunakan L
sebagai "pita angka" memegang bilangan prima ditemukan melompat L
untuk menandai nomor-nomor terdekat yang sudah diketahui memiliki pembagi. Primer melompat ini akan maju sementara "pita angka" L
dipotong nomor dengan angka dari awal.
Sementara memotong kepala kaset L[n]
menjadi kosong berarti tidak ada pembagi (prime) yang diketahui.
L[n]
memegang nilai berarti, nilai ini prima dan dikenal untuk membagi n
.
Jadi, kami telah menemukan pembagi utama atau perdana baru. Kemudian perdana akan maju ke berikutnya L[n+m*p]
pada rekaman ditemukan kosong.
Ini seperti Saringan Eratosthenes "ditarik melalui botol Klein". Anda selalu bertindak atas rekaman itu. Alih-alih menembakkan beberapa bilangan prima melalui pita, Anda menggunakan bilangan prima yang sudah ditemukan sebagai kursor yang melompat menjauh dari pita mulai dari berbagai jarak nilainya sendiri sampai posisi bebas ditemukan.
Sementara loop luar menghasilkan satu prime atau tidak prime decission per loop, bilangan prima yang ditemukan dihitung dan disimpan P
sebagai kunci, nilai pasangan (kunci, nilai) ini tidak relevan untuk aliran program.
Jika kunci mereka i
kebetulan P
sudah di ( i in P
), kami memiliki prima dari jenis p (p (i)).
Berlari:
$ time awk -f x.awk | wc -l
10000
real 0m3.675s
user 0m3.612s
sys 0m0.052s
Memperhatikan bahwa kode ini tidak menggunakan tabel prime prakalkulasi eksternal.
Waktu yang dihabiskan untuk Thinkpad T60 lama saya yang baik, jadi saya pikir pantas untuk dipanggil cepat.
Diuji dengan mawk
dan gawk
pada Debian8 / AMD64