Я пытаюсь написать алгоритм Sieve of Eratosthenes в JavaScript. В основном я просто буквально выполнил следующие шаги:
- Создайте список последовательных целых чисел от 2 до (n-1)
- Пусть первое простое число p равно 2
- Начиная с p, подсчитывайте с шагом p и удаляйте каждое из этих чисел (p и кратность p)
- Перейдите к следующему номеру в списке и повторите 2,3,4
- Добавить непреднамеренно удаленные простые числа обратно в список
и это то, что я придумал:
function eratosthenes(n){
var array = [];
var tmpArray = []; // for containing unintentionally deleted elements like 2,3,5,7,...
var maxPrimeFactor = 0;
var upperLimit = Math.sqrt(n);
var output = [];
// Eratosthenes algorithm to find all primes under n
// Make an array from 2 to (n - 1)
//used as a base array to delete composite number from
for(var i = 2; i < n; i++){
array.push(i);
}
// Remove multiples of primes starting from 2, 3, 5,...
for(var i = array[0]; i < upperLimit; i = array[0]){
removeMultiples:
for(var j = i, k = i; j < n; j += i){
var index = array.indexOf(j);
if(index === -1)
continue removeMultiples;
else
array.splice(index,1);
}
tmpArray.push(k);
}
array.unshift(tmpArray);
return array;
}
Он работает для небольших чисел, но не для чисел более одного миллиона. Я использовал Node.js для тестирования, и процесс просто кажется бесконечным и ошибки памяти не было. Я прочитал решение здесь (также в javascript), но до сих пор не могу его полностью понять.
Вопрос: Как сделать эту работу для достаточно больших чисел, таких как миллион и выше?