private int nthPrime(int n) {
        while (primes.size() <= n) {
            int candidate;

            if (primes.size() == 0) {
                candidate = 1;
            } else {
                candidate = primes.get(primes.size() - 1);
            }

            boolean isPrime;

            do {
                candidate = candidate + 1;
                isPrime = true;

                int i = 0;

                while (isPrime && i < primes.size()) {
                    int prime = primes.get(i);

                    if (prime > (int)Math.sqrt(candidate)) {
                        break;
                    }

                    if (candidate % prime == 0) {
                        isPrime = false;
                    }

                    ++i;
                }
            } while (!isPrime);

            primes.add(candidate);
        }

        return primes.get(n);
    }