Мы знаем, что все простые числа выше 3 могут быть сгенерированы с использованием:
6 * k + 1
6 * k - 1
Однако все числа, порожденные из приведенных выше формул, не являются простыми.
For Example:
6 * 6 - 1 = 35 which is clearly divisible by 5.
Чтобы устранить такие условия, я использовал Ситовый метод и удалил числа, которые являются факторами чисел, генерируемых из приведенной выше формулы.
Используя факты:
Число называется простым, если оно не имеет простых факторов.
- Так как мы можем сгенерировать все простые числа, используя приведенные выше формулы.
- Если мы удалим все кратные вышеприведенных чисел, мы оставим только простые числа.
Для генерации простых чисел ниже 1000.
ArrayList<Integer> primes = new ArrayList<>();
primes.add(2);//explicitly add
primes.add(3);//2 and 3
int n = 1000;
for (int i = 1; i <= (n / 6) ; i++) {
//get all the numbers which can be generated by the formula
int prod6k = 6 * i;
primes.add(prod6k - 1);
primes.add(prod6k + 1);
}
for (int i = 0; i < primes.size(); i++) {
int k = primes.get(i);
//remove all the factors of the numbers generated by the formula
for(int j = k * k; j <= n; j += k)//changed to k * k from 2 * k, Thanks to DTing
{
int index = primes.indexOf(j);
if(index != -1)
primes.remove(index);
}
}
System.out.println(primes);
Однако этот метод правильно генерирует простые числа. Это выполняется намного быстрее, так как нам не нужно проверять все числа, которые мы проверяем в сите.
Мой вопрос в том, что я пропустил какой-либо крайный кейс? Это было бы намного лучше, но я никогда не видел, чтобы кто-то использовал это. Я что-то делаю неправильно?
Можно ли оптимизировать этот подход?
Взятие a boolean[]
вместо ArrayList
выполняется намного быстрее.
int n = 100000000;
boolean[] primes = new boolean[n + 1];
for (int i = 0; i <= n; i++)
primes[i] = false;
primes[2] = primes[3] = true;
for (int i = 1; i <= n / 6; i++) {
int prod6k = 6 * i;
primes[prod6k + 1] = true;
primes[prod6k - 1] = true;
}
for (int i = 0; i <= n; i++) {
if (primes[i]) {
int k = i;
for (int j = k * k; j <= n && j > 0; j += k) {
primes[j] = false;
}
}
}
for (int i = 0; i <= n; i++)
if (primes[i])
System.out.print(i + " ");