package mattrixwv; import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class SieveOfEratosthenesBig implements Iterator{ BigInteger possiblePrime; private Map> dict; public SieveOfEratosthenesBig(){ dict = new HashMap>(); possiblePrime = BigInteger.TWO; } @Override public boolean hasNext(){ return true; } @Override public BigInteger next(){ BigInteger prime; if(possiblePrime.compareTo(BigInteger.TWO) > 0){ //Loop until you find a prime number for(;dict.containsKey(possiblePrime);possiblePrime = possiblePrime.add(BigInteger.TWO)){ //Create the next entry for all entries in the map for(BigInteger num : dict.get(possiblePrime)){ BigInteger loc = possiblePrime.add(num).add(num); if(!dict.containsKey(loc)){ ArrayList tempArray = new ArrayList(Arrays.asList(num)); dict.put(loc, tempArray); } else{ dict.get(loc).add(num); } } //Delete the current entry dict.remove(possiblePrime); } //Save that the number is a prime prime = possiblePrime; BigInteger loc = prime.multiply(BigInteger.valueOf(3)); if(!dict.containsKey(loc)){ ArrayList tempArray = new ArrayList(Arrays.asList(prime)); dict.put(loc, tempArray); } else{ dict.get(loc).add(prime); } //Move on to the next possible prime possiblePrime = possiblePrime.add(BigInteger.TWO); } else{ //Return 2 and move to 3 prime = possiblePrime; possiblePrime = possiblePrime.add(BigInteger.ONE); } return prime; } }