Problem
Example
For example, if n is 10, the output should be “2, 3, 5, 7″. If n is 20, the output should be “2, 3, 5, 7, 11, 13, 17, 19″.
Algorithm
We have discussed sieve of Eratosthenes here, but lets move to the Sieve of Atkins algorithm today which is a modified version of sieve of Eratosthenes.
Sieve of Atkins is something I wouldn’t suggest for a programming contest for it is difficult to understand and remember. To be frank, there are parts to it that I don’t understand why they are right but it it works pretty fast when coupled with a good implementation. Note that if implemented badly, this could perform worse! The purpose behind putting this article on the blog is to spread the word about the existence of such an algorithm and that the code can be used when needed
Basic algorithm
Also, to read more details on stackoverflow. Thanks.
Given a number n, print all primes smaller than or equal to n.
Example
For example, if n is 10, the output should be “2, 3, 5, 7″. If n is 20, the output should be “2, 3, 5, 7, 11, 13, 17, 19″.
Algorithm
We have discussed sieve of Eratosthenes here, but lets move to the Sieve of Atkins algorithm today which is a modified version of sieve of Eratosthenes.
Sieve of Atkins is something I wouldn’t suggest for a programming contest for it is difficult to understand and remember. To be frank, there are parts to it that I don’t understand why they are right but it it works pretty fast when coupled with a good implementation. Note that if implemented badly, this could perform worse! The purpose behind putting this article on the blog is to spread the word about the existence of such an algorithm and that the code can be used when needed
Basic algorithm
- The algorithm treats 2, 3 and 5 as special cases and just adds them to the set of primes to start with.
- Like Sieve of Eratosthenes, we start with a list of numbers we want to investigate. Suppose we want to find primes <=100, then we make a list for [5,1000] . As explained in (1), 2,3 and 5 are special cases and 4 is not a prime.
- The algorithm talks in terms of modulo-sixty remainders.
- All numbers with modulo-sixty remainder 1, 13, 17, 29, 37, 41, 49, or 53 have a modulo-four remainder of 1. These numbers are prime if and only if the number of solutions to 4x2 + y2 = n is odd and the number is square free. A square free integer is one which is not divisible by any perfect square other than 1.
- All numbers with modulo-sixty remainder 7, 19, 31, or 43 have a modulo-six remainder of 1. These numbers are prime if and only if the number of solutions to 3x2 + y2 = n is odd and the number is squarefree.
- All numbers with modulo-sixty remainder 11, 23, 47, or 59 have a modulo-twelve remainder of 11. These numbers are prime if and only if the number of solutions to 3x2 − y2 = n is odd and the number is squarefree.
// SieveOfAtkin.java import java.util.Arrays; public class SieveOfAtkin { private static int limit = 1000; private static boolean[] sieve = new boolean[limit + 1]; private static int limitSqrt = (int)Math.sqrt((double)limit); public static void main(String[] args) { // there may be more efficient data structure // arrangements than this (there are!) but // this is the algorithm in Wikipedia // initialize results array Arrays.fill(sieve, false); // the sieve works only for integers > 3, so // set these trivially to their proper values sieve[0] = false; sieve[1] = false; sieve[2] = true; sieve[3] = true; // loop through all possible integer values for x and y // up to the square root of the max prime for the sieve // we don't need any larger values for x or y since the // max value for x or y will be the square root of n // in the quadratics // the theorem showed that the quadratics will produce all // primes that also satisfy their wheel factorizations, so // we can produce the value of n from the quadratic first // and then filter n through the wheel quadratic // there may be more efficient ways to do this, but this // is the design in the Wikipedia article // loop through all integers for x and y for calculating // the quadratics for (int x = 1; x <= limitSqrt; x++) { for (int y = 1; y <= limitSqrt; y++) { // first quadratic using m = 12 and r in R1 = {r : 1, 5} int n = (4 * x * x) + (y * y); if (n <= limit && (n % 12 == 1 || n % 12 == 5)) { sieve[n] = !sieve[n]; } // second quadratic using m = 12 and r in R2 = {r : 7} n = (3 * x * x) + (y * y); if (n <= limit && (n % 12 == 7)) { sieve[n] = !sieve[n]; } // third quadratic using m = 12 and r in R3 = {r : 11} n = (3 * x * x) - (y * y); if (x > y && n <= limit && (n % 12 == 11)) { sieve[n] = !sieve[n]; } // end if // note that R1 union R2 union R3 is the set R // R = {r : 1, 5, 7, 11} // which is all values 0 < r < 12 where r is // a relative prime of 12 // Thus all primes become candidates } // end for } // end for // remove all perfect squares since the quadratic // wheel factorization filter removes only some of them for (int n = 5; n <= limitSqrt; n++) { if (sieve[n]) { int x = n * n; for (int i = x; i <= limit; i += x) { sieve[i] = false; } // end for } // end if } // end for // put the results to the System.out device // in 10x10 blocks for (int i = 0, j = 0; i <= limit; i++) { if (sieve[i]) { System.out.printf("%,8d", i); if (++j % 10 == 0) { System.out.println(); } // end if if (j % 100 == 0) { System.out.println(); } // end if } // end if } // end for } // end main } // end class SieveOfAtkin
Also, to read more details on stackoverflow. Thanks.
0 comments:
Post a Comment