Tapis Atkin
Dalam matematika, tapis Atkin adalah algoritme modern untuk menemukan semua bilangan prima sampai dengan bilangan bulat yang ditentukan. Dibandingkan dengan tapis Eratosthenes yang kuno, yang menandai kelipatan dari bilangan prima, Tapis Atkin melakukan beberapa pekerjaan awal dan kemudian menandai kelipatan kuadrat dari bilangan prima, sehingga mencapai teori kompleksitas asimtotik yang lebih baik. Tapis Atkin dibuat pada tahun 2003 oleh A. O. L. Atkin dan Daniel J. Bernstein.[1]
Algoritma
suntingDalam algoritma:
- Semua sisanya adalah modulo, enam puluh sisa (bagi nomor dengan 60 dan kembalikan sisanya).
- Semua angka, termasuk x dan y, adalah bilangan bulat positif.
- Membalik entri dalam daftar tapis berarti mengubah tanda (prima atau nonprima) ke tanda yang berlawanan.
- Ini menghasilkan bilangan dengan bilangan ganjil solusi ke persamaan yang sesuai berpotensi menjadi bilangan prima (bilangan prima jika juga bebas kuadrat), dan bilangan dengan bilangan genap solusi yang digabungkan.
Algoritme:
- Buat daftar hasil, diisi dengan 2, 3, dan 5.
- Buat daftar saringan dengan entri untuk setiap bilangan bulat positif; semua entri dari daftar ini pada awalnya harus ditandai non prime (komposit).
- Untuk setiap nomor entri n dalam daftar saringan, dengan sisa modulo-enam puluh r:
- Jika r adalah 1, 13, 17, 29, 37, 41, 49, atau 53, balikkan entri untuk setiap kemungkinan solusi ke 4x2 + y2 = n. Jumlah operasi pembalikan sebagai rasio terhadap kisaran penyaringan untuk pendekatan langkah ini 4√π15[1] × 860 (angka "8" dalam pecahan berasal dari delapan modulos yang ditangani oleh kuadrat ini dan 60 karena Atkin menghitungnya berdasarkan jumlah genap modulo 60 roda), yang menghasilkan pecahan sekitar 0.1117010721276....
- Jika r adalah 7, 19, 31, atau 43, balikkan entri untuk setiap solusi yang mungkin ke 3x2 + y2 = n. Jumlah operasi pembalikan sebagai rasio terhadap kisaran penyaringan untuk pendekatan langkah ini π√0.12[1] × 460 (angka "4" dalam pecahan berasal dari empat modulos yang ditangani oleh kuadrat ini dan 60 karena Atkin menghitungnya berdasarkan jumlah genap modulo 60 roda), yang menghasilkan pecahan sekitar 0,072551974569....
- Jika r adalah 11, 23, 47, atau 59, balikkan entri untuk setiap kemungkinan solusi ke 3x2 − y2 = n jika x > y. Jumlah operasi pembalikan sebagai rasio terhadap kisaran penyaringan untuk pendekatan langkah ini √1.92ln(√0.5+√1.5)[1] × 460 (angka "4" dalam pecahan berasal dari empat modulos yang ditangani oleh kuadrat ini dan 60 karena Atkin menghitungnya berdasarkan jumlah genap modulo 60 roda), yang menghasilkan sebagian kecil sekitar 0,060827679704....
- Jika r adalah sesuatu yang lain, abaikan sepenuhnya.
- Mulailah dengan angka terendah dalam daftar tapis.
- Ambil bilangan berikutnya dalam daftar tapis yang masih bertanda prima.
- Sertakan nomor dalam daftar hasil.
- Kuadratkan angka tersebut dan tandai semua kelipatan persegi tersebut sebagai bukan prima. Perhatikan bahwa kelipatan yang dapat difaktorkan dengan 2, 3, atau 5 tidak perlu diberi tanda, karena ini akan diabaikan pada pencacahan akhir prima.
- Ulangi langkah empat sampai tujuh. Jumlah total operasi untuk pengulangan penandaan bilangan prima ini sebagai rasio rentang penyaringan adalah jumlah dari balikan bilangan prima yang dikuadratkan, yang mendekati fungsi zeta prima (2) dari 0,45224752004... minus 122, 132, dan 152 untuk bilangan prima yang telah dieliminasi oleh roda, dengan hasil dikalikan dengan 1660 untuk rasio pukulan roda per rentang; ini menghasilkan rasio sekitar 0,01363637571....
Menambahkan rasio operasi di atas bersama-sama, algoritma di atas mengambil rasio konstan dari operasi pembalikan / penandaan ke kisaran penyaringan sekitar 0.2587171021...; Dari implementasi aktual algoritma, rasionya sekitar 0,25 untuk rentang penyaringan serendah 67.
Kode semu
suntingBerikut ini adalah kode semu yang menggabungkan algoritme Atkin 3.1, 3.2, dan 3.3[1] dengan menggunakan gabungan set "s" dari semua bilangan modulo 60 tidak termasuk yang merupakan kelipatan dari bilangan prima 2, 3, dan 5, sesuai dengan algoritme, untuk versi langsung dari algoritme yang mendukung pengemasan bit opsional pada roda; meskipun tidak disebutkan secara khusus dalam makalah referensi, kode semu ini menghilangkan beberapa kombinasi yang jelas dari ganjil /genap x / y untuk mengurangi komputasi di mana komputasi tersebut tidak akan pernah lulus tes modulo (yaitu akan menghasilkan angka genap
limit ← 1000000000 // batas pencarian sembarang
// set posisi "hit" roda untuk roda 2/3/5 yang diputar dua kali sesuai algoritma Atkin ← {1,7,11,13,17,19,23,29,31,37,41,43,47,49,53,59}
// Inisialisasi saringan dengan roda yang cukup untuk memasukkan batas:
untuk n ← 60 × w + x dimana w ∈ {0,1,...,limit ÷ 60}, x ∈ s:
is_prime(n) ← false
// Masukkan bilangan prima kandidat:
// bilangan bulat yang memiliki jumlah ganjil
// representasi dengan bentuk kuadrat tertentu.
// Algoritme langkah 3.1:
for n ≤ limit, n ← 4x²+y² where x ∈ {1,2,...} and y ∈ {1,3,...} // all x's odd y's
if n mod 60 ∈ {1,13,17,29,37,41,49,53}:
is_prime(n) ← ¬is_prime(n) // toggle state
// Algoritme langkah 3.2:
for n ≤ limit, n ← 3x²+y² where x ∈ {1,3,...} and y ∈ {2,4,...} // only odd x's
if n mod 60 ∈ {7,19,31,43}: // and even y's
is_prime(n) ← ¬is_prime(n) // toggle state
// Algoritme langkah 3.3:
for n ≤ limit, n ← 3x²-y² where x ∈ {2,3,...} and y ∈ {x-1,x-3,...,1} //all even/odd
if n mod 60 ∈ {11,23,47,59}: // odd/even combos
is_prime(n) ← ¬is_prime(n) // toggle state
// Hilangkan komposit dengan pengayakan, hanya untuk kejadian di roda:
untuk n² ≤ limit, n ← 60 × w + x dimana w ∈ {0,1,...}, x ∈ s, n ≥ 7:
if is_prime(n):
// n adalah bilangan prima, hilangkan kelipatan kuadratnya; ini sudah cukup
// karena komposit bebas persegi tidak bisa masuk dalam daftar ini
for c ≤ limit, c ← n² × (60 × w + x) where w ∈ {0,1,...}, x ∈ s:
is_prime(c) ← false
// satu sapuan untuk menghasilkan daftar bilangan prima berurutan hingga batas:
output 2, 3, 5
for 7 ≤ n ≤ limit, n ← 60 × w + x where w ∈ {0,1,...}, x ∈ s:
if is_prime(n): output n
Kode semu ini ditulis untuk kejelasan; meskipun beberapa perhitungan yang berlebihan telah dihilangkan dengan mengontrol kombinasi ganjil / genap x / y, itu masih menyia-nyiakan hampir setengah dari komputasi kuadratnya pada gelung takproduktif yang tidak lulus uji modulo sedemikian rupa sehingga tidak akan lebih cepat dari yang setara faktor roda (2/3/5) tapis Eratosthenes. Untuk meningkatkan efisiensinya, suatu metode harus dirancang untuk meminimalkan atau menghilangkan perhitungan takproduktif ini.