private static void initialize(int size) {
        greatestFactor = new int[size];

        // wheel factorization (sort of...)
        greatestFactor[1] = 1;

        for (Integer seed : seeds) {
            for (int i = seed; i < size; i += seed) {
                greatestFactor[i] = seed;
            }
        }

        // now do modified Sieve of Er...
        int sqrt = (int) Math.floor(Math.sqrt(size) + 1);

        for (int prime = 2; prime < sqrt; prime++) {
            if (0 == greatestFactor[prime]) {
                for (int i = prime; i < size; i += prime) {
                    greatestFactor[i] = prime;
                }
            }
        }

        // now flesh out the rest of the sieve.
        for (int i = sqrt; i < size; i++) {
            if (0 == greatestFactor[i]) {
                greatestFactor[i] = i;
            }
        }
    }