import java.util.ArrayList; import java.util.Collections; import java.util.PriorityQueue; import java.util.Comparator; public class Main { Sieve sieve = new Sieve(); ArrayList<Integer> primes = new ArrayList<Integer>(); while (primes.size() < 31) { primes.add(sieve.nextPrime()); } ArrayList<Sieve.PrimeCounter> sieveState = new ArrayList<Sieve.PrimeCounter>(sieve.queue); while (primes.size() < 35) { primes.add(sieve.nextPrime()); } } public static class Sieve { public PriorityQueue<PrimeCounter> queue; Sieve() { Comparator<PrimeCounter> c = new Comparator<PrimeCounter>() { public int compare(PrimeCounter a, PrimeCounter b) { return a.multiple.compareTo(b.multiple); } }; queue = new PriorityQueue<PrimeCounter>(1000, c); } // Determine the prime // If we're not at the first prime. if (!queue.isEmpty()) { PrimeCounter top; // Infinite loop with break. while (true) { top = queue.peek(); // The top primecounter needs to be updated. if (top.multiple < current) { top = queue.poll(); top.nextMultiple(); queue.add(top); } // The current number isn't a prime; go on to the next one. else if (top.multiple == current) { current++; } // We've found a prime. else { break; } } } // Handle bookkeeping. current++; queue.add(new PrimeCounter(prime)); // Return the prime. return prime; } public static class PrimeCounter { this.prime = prime; this.multiple = prime; } public void nextMultiple() { multiple += prime; } return "[" + prime + ":" + multiple + "]"; } } } }
Standard input is empty
Primes after 31: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127] Sieve heap after 31: [[127:127], [11:132], [2:128], [17:136], [67:134], [7:133], [43:129], [29:145], [47:141], [73:146], [23:138], [79:158], [53:159], [19:133], [3:129], [61:183], [37:148], [89:178], [71:142], [41:164], [59:177], [83:166], [31:155], [97:194], [101:202], [103:206], [107:214], [109:218], [113:226], [5:130], [13:130]] Ordered sieve state after 31: [[127:127], [2:128], [43:129], [3:129], [5:130], [13:130], [11:132], [7:133], [19:133], [67:134], [17:136], [23:138], [47:141], [71:142], [29:145], [73:146], [37:148], [31:155], [79:158], [53:159], [41:164], [83:166], [59:177], [89:178], [61:183], [97:194], [101:202], [103:206], [107:214], [109:218], [113:226]] Primes: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 128, 129, 130, 131]