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.

## Algoritma
Dalam algoritma:
* Semua sisanya adalah modulo, enam puluh sisa (bagi nomor dengan 60 dan kembalikan sisanya).
* Semua angka, termasuk  dan , 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.

Algoritma:
# 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  dalam daftar saringan, dengan sisa modulo-enam puluh :
## Jika adalah 1, 13, 17, 29, 37, 41, 49, atau 53, balikkan entri untuk setiap kemungkinan solusi ke .  Jumlah operasi pembalikan sebagai rasio terhadap kisaran penyaringan untuk pendekatan langkah ini  ×  (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 adalah 7, 19, 31, atau 43, balikkan entri untuk setiap solusi yang mungkin ke .  Jumlah operasi pembalikan sebagai rasio terhadap kisaran penyaringan untuk pendekatan langkah ini  ×  (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 adalah 11, 23, 47, atau 59, balikkan entri untuk setiap kemungkinan solusi ke  jika .  Jumlah operasi pembalikan sebagai rasio terhadap kisaran penyaringan untuk pendekatan langkah ini  ×  (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 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 , , dan  untuk bilangan prima yang telah dieliminasi oleh roda, dengan hasil dikalikan dengan  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

Berikut ini adalah kode semu yang **menggabungkan** algoritma Atkin 3.1, 3.2, dan 3.3 dengan menggunakan **gabungan** set "s" dari semua bilangan modulo 60 tidak termasuk yang merupakan kelipatan dari bilangan prima 2, 3, dan 5, sesuai dengan algoritma, 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


```c
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 di mana 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.
// Algoritma 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
// Algoritma 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
// Algoritma 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 di mana 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.

## Lihat pula
* Tapis Eratosthenes
* Tapis Legendre
* Tapis Sundaram
* Teori tapis

## Referensi