Ваше решение - , а не Сито Эратосфена. Это очевидно, потому что вы используете оператор modulo
в своем коде; Правильное сито Эратосфена использует только сложение во внутренней петле, а не деление или по модулю. Вот простая версия Сита Эратосфена, которая импортирует BitSet
и LinkedList
из java.util
и возвращает LinkedList простых чисел, меньших n :
public static LinkedList sieve(int n)
{
BitSet b = new BitSet(n);
LinkedList ps = new LinkedList();
b.set(0,n);
for (int p=2; p<n; p++)
{
if (b.get(p))
{
ps.add(p);
for (int i=p+p; i<n; i+=p)
{
b.clear(i);
}
}
}
return ps;
}
Основная идея заключается в создании сита (BitSet
b ) с каждым элементом, изначально установленным в Prime
(представлен в виде установленного бита), итерацией по сито ищет и сообщает о каждом последующем простом числе, и, когда обнаруживается, что оно удаляет все его кратные числа из сита, помечая его Composite
(обозначается как очищенный бит). Множители находятся путем сложения, а не деления, и внутренний цикл состоит только из сложения, операции очистки битов, сравнения для поиска конца сита и перехода назад к началу цикла, поэтому очень быстро.
Доступны оптимизации, которые заставляют Сито Эратосфена работать еще быстрее, но этого должно быть достаточно, чтобы начать работу. Когда вы готовы к большему, я скромно рекомендую это эссе в моем блоге.
Если вы хотите, чтобы простые числа в диапазоне, который не начинался с нуля, вам нужно сегментированное Сито Эратосфена. Я обсуждал сегментированное сито эратосфена ранее на переполнении стека, а также обсуждаю это в моем блоге.