Atkins si er en algoritme til at finde alle primtal op til et givet heltal N. Algoritmen blev skabt af A. O. L. Atkinog D. Yu. Bernstein[1] [2] . Den asymptotiske hastighed af den algoritme , som forfatterne har erklæret,svarer til hastigheden af de bedst kendte sigtealgoritmer, men i sammenligning med dem kræver Atkin-sien mindre hukommelse.
Hovedideen med algoritmen er at bruge irreducible kvadratiske former (repræsentation af tal som akse 2 + med 2 ). De tidligere algoritmer var dybest set forskellige modifikationer af sigten af Eratosthenes , som brugte repræsentationen af tal i form af reducerede former (normalt i form af et produkt xy ).
I en forenklet form kan algoritmen repræsenteres som følger:
For at reducere hukommelseskravene udføres "sifting" i portioner (segmenter, blokke), hvis størrelse er ca.
For at fremskynde tingene ignorerer algoritmen alle tal, der er multipla af et af de første par primtal (2, 3, 5, 7, ...). Dette gøres ved at bruge standard datastrukturer og databehandlingsalgoritmer foreslået tidligere af Paul Pritchard [3 ] . De er kendt under det engelske navn. hjulsigtning . Antallet af første primtal vælges afhængigt af det givne tal N. Teoretisk foreslås det at tage de første primtal cirka op til . Dette giver os mulighed for at forbedre det asymptotiske estimat af algoritmens hastighed med faktoren . I dette tilfælde kræves der yderligere hukommelse, som, når N vokser, er afgrænset som . Stigningen i hukommelsesbehov anslås til .
Den version, der præsenteres på en af forfatternes websted [4] er optimeret til at søge efter alle primtal op til en milliard ( ), og tal, der er multipla af 2, 3, 5 og 7, er udelukket fra beregninger (2 × 3 × 5 × 7 = 210).
Ifølge forfatterne af [2] har algoritmen asymptotisk kompleksitet og kræver stykker hukommelse. Tidligere kendte man algoritmer, der var lige så asymptotisk hurtige, men som kræver væsentlig mere hukommelse [5] [6] . Teoretisk kombinerer denne algoritme den maksimale hastighed med de laveste hukommelseskrav. Implementeringen af algoritmen, udført af en af forfatterne, viser en ret høj praktisk hastighed [4] .
Algoritmen bruger to typer optimering, som øger effektiviteten markant (sammenlignet med den forenklede version).
Nedenfor er en implementering af en forenklet version i programmeringssproget C , der illustrerer algoritmens hovedidé - brugen af kvadratiske former:
int grænse = 1000 ; int sqr_lim ; bool er_prime [ 1001 ]; int x2 , y2 ; int i , j ; int n ; // Sieve initialisering sqr_lim = ( int ) sqrt (( lang dobbelt ) grænse ); for ( i = 0 ; i <= grænse ; ++ i ) is_prime [ i ] = falsk ; is_prime [ 2 ] = sand ; is_prime [ 3 ] = sand ; // Formodentlig er primtal heltal med et ulige antal // af repræsentationer i de givne kvadratiske former. // x2 og y2 er i og j kvadrater (optimering). 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 ; hvis (( n <= grænse ) && ( n % 12 == 1 || n % 12 == 5 )) is_prime [ n ] = ! er_primtal [ n ]; // n = 3 * x2 + y2; n- = x2 ; // Optimering hvis (( n <= grænse ) && ( n % 12 == 7 )) is_prime [ n ] = ! er_primtal [ n ]; //n = 3 * x2 - y2; n- = 2 * y2 ; // Optimering hvis (( i > j ) && ( n <= grænse ) && ( n % 12 == 11 )) is_prime [ n ] = ! er_primtal [ n ]; } } // Lug multipla af kvadraterne af primtal ud i intervallet [5, sqrt(grænse)]. // (hovedscenen kan ikke luge dem ud) for ( i = 5 ; i <= sqr_lim ; ++ i ) { if ( er_primtal [ i ]) { n = i * i ; for ( j = n ; j <= grænse ; j += n ) is_prime [ j ] = falsk ; } } // Udskriv en liste over primtal til konsollen. printf ( "2, 3, 5" ); for ( i = 6 ; i <= limit ; ++ i ) { // check for delelighed med 3 og 5 er blevet tilføjet. Der er ikke behov for det i den originale version af algoritmen. if (( er_primtal [ i ]) && ( i % 3 != 0 ) && ( i % 5 != 0 )) printf ( ", %d" , i ); }