Az Atkin-szita egy algoritmus az összes prímszám megtalálására egy adott N egész számig. Az algoritmust A. O. L. Atkin készítetteés D. Yu. Bernstein[1] [2] . A szerzők által deklarált algoritmus aszimptotikus sebessége megfelel a korábban ismert legjobb szitáló algoritmusok sebességének, de azokhoz képest az Atkin-szita kevesebb memóriát igényel.
Az algoritmus fő ötlete az irreducibilis másodfokú formák használata (a számok ax 2 + 2 -vel való ábrázolása ). A korábbi algoritmusok alapvetően az Eratoszthenész szitájának különféle módosításai voltak, amelyek a számok redukált alakok (általában xy szorzat formájában ) történő ábrázolását alkalmazták.
Egyszerűsített formában az algoritmus a következőképpen ábrázolható:
A memóriaigény csökkentése érdekében a "szitálás" részenként (szegmensek, blokkok) történik, amelyek mérete kb .
A dolgok felgyorsítása érdekében az algoritmus figyelmen kívül hagy minden olyan számot, amely az első néhány prímszám (2, 3, 5, 7, ...) valamelyikének többszöröse. Ez a Paul Pritchard által korábban javasolt szabványos adatstruktúrák és adatfeldolgozó algoritmusok használatával történik [3 ] . Angol néven ismertek . kerekes szitálás . Az első prímek számát az adott N számtól függően választjuk ki . Elméletileg azt javasolják, hogy az első prímszámokat körülbelül -ig vegyük . Ez lehetővé teszi számunkra, hogy egy tényezővel javítsuk az algoritmus sebességének aszimptotikus becslését . Ebben az esetben további memória szükséges, amely az N növekedésével korlátos . A memóriaigény növekedését a becslések szerint .
Az egyik szerző honlapján [4] bemutatott verzió egymilliárdig ( ) minden prímszám keresésére van optimalizálva , és a 2, 3, 5 és 7 többszörösei ki vannak zárva a számításokból (2 × 3 × 5 × 7 = 210).
A [2] szerzői szerint az algoritmus aszimptotikus bonyolultságú , és memóriabiteket igényel . Korábban ismertek olyan algoritmusokat, amelyek ugyanolyan aszimptotikusan gyorsak voltak, de lényegesen több memóriát igényelnek [5] [6] . Elméletileg ez az algoritmus a maximális sebességet a legalacsonyabb memóriaigénnyel kombinálja. Az algoritmus megvalósítása, amelyet az egyik szerző végez, meglehetősen nagy gyakorlati sebességet mutat [4] .
Az algoritmus kétféle optimalizálást alkalmaz, ami jelentősen növeli a hatékonyságát (az egyszerűsített változathoz képest).
Az alábbiakban bemutatjuk a C programozási nyelv egyszerűsített verziójának megvalósítását, amely bemutatja az algoritmus fő gondolatát - a másodfokú formák használatát:
int limit = 1000 ; int sqr_lim ; bool is_prím [ 1001 ]; int x2 , y2 ; int i , j ; int n ; // Szita inicializálása sqr_lim = ( int ) sqrt (( long double ) limit ); for ( i = 0 ; i <= határ ; ++ i ) is_prím [ i ] = hamis ; is_prím [ 2 ] = igaz ; is_prím [ 3 ] = igaz ; // Feltehetően prímek olyan egész számok, amelyek páratlan // reprezentációi vannak az adott négyzet alakzatokban. // x2 és y2 i és j négyzetek (optimalizálás). x2 = 0 ; for ( i = 1 ; i <= sqr_lim ; ++ i ) { x2 += 2 * i - 1 ; y2 = 0 ; for ( j = 1 ; j <= sqr_lim ; ++ j ) { y2 += 2 * j - 1 ; n = 4 * x2 + y2 ; if (( n <= határérték ) && ( n % 12 == 1 || n % 12 == 5 )) is_prím [ n ] = ! is_prím [ n ]; // n = 3 * x2 + y2; n = x2 ; // Optimalizálás if (( n <= limit ) && ( n % 12 == 7 )) is_prím [ n ] = ! is_prím [ n ]; // n = 3 * x2 - y2; n = 2 * y2 ; // Optimalizálás if (( i > j ) && ( n <= limit ) && ( n % 12 == 11 )) is_prím [ n ] = ! is_prím [ n ]; } } // A prímszámok négyzeteinek többszöröseinek kiszűrése az [5, sqrt(limit)] intervallumban. // (a főszínpad nem tudja kiszűrni őket) for ( i = 5 ; i <= sqr_lim ; ++ i ) { if ( is_prím [ i ]) { n = i * i ; for ( j = n ; j < = határ ; j + = n ) is_prím [ j ] = hamis ; } } // Prímszámok listájának nyomtatása a konzolra. printf ( "2, 3, 5" ); for ( i = 6 ; i <= limit ; ++ i ) { // a 3-mal és 5-tel való oszthatóság ellenőrzése hozzáadásra került. Az algoritmus eredeti verziójában nincs rá szükség. if (( is_prím [ i ]) && ( i % 3 != 0 ) && ( i % 5 != 0 )) printf ( ", %d" , i ); }