Я просматривал Интернет, но я не могу найти, как выполнить алгоритм для поиска простых чисел.
var cantidad = 100,j=2;
for(var i=2;i<cantidad;i++) {
for(;j<cantidad;j++) {
if(j%i==0 && (i==j || i==1)) {
console.log(j);
}
}
}
Я попробовал следующее: Пробовал с 2, так как простые числа начинаются оттуда, и в условном я практически основываюсь на том факте, что если остаток равен 0 , а делитель равен тому же числу или 1, он покажет это на консоль, но не работает.
Так в чем моя ошибка и как быть?
Код
Объяснение
Поэтому мы создали функцию:
Что на более естественном языке делает следующее:
Поэтому в этом цикле:
Мы начинаем перебирать каждый из номеров итераций, проверяя функцию
primo()
, является ли число простым, и добавляем его в массив.Обновлять
Из-за комментариев, которые я видел, кажется, что вам не было ясно, как работает этот алгоритм, я продолжаю объяснять его вам шаг за шагом.
Имея следующую функцию:
Запустите сниппет, чтобы посмотреть, как он работает шаг за шагом.
Вычисление простых чисел всегда было очень интересной темой с точки зрения эффективности, поскольку среди практических приложений, требующих очень больших простых чисел, есть криптография. Одним из наиболее часто используемых алгоритмов в этой области является алгоритм RSA .
ПРОБЛЕМА
Требуется вычислить количество простых чисел, которые существуют в диапазоне N положительных целых чисел.
РЕШЕНИЕ
В приближении вашего решения у нас есть классическое условное определение, является ли число простым или нет:
Этот алгоритм может быть более эффективным. Если мы анализируем часть, где мы делим кандидата на делитель, мы делаем ряд ненужных дополнительных делений. Для этого случая при значении N=100 у нас всего 1133 итерации!!!
Объяснение
Составное число n — это любое не простое натуральное число , которое можно записать в виде:
Это означает, что и a, и b (делители n ) имеют максимальное значение, которое зависит друг от друга.
Тогда нет необходимости перебирать все значения от 2 до n в поисках возможных делителей n , достаточно перебирать до квадратного корня из n . И поскольку в большинстве случаев это не будет точным, мы можем пропустить десятичную часть и по умолчанию выполнять итерацию только до ближайшего целого числа.
Улучшение предыдущего алгоритма будет заключаться в следующем:
Мы сократили количество итераций до 236 итераций!!! чтобы получить тот же результат. Можно ли сделать его еще более эффективным?
загадка Эратосфена
В решете Эратосфена вас просят записать все натуральные числа от 2 до N , затем, начиная с 2, вы проходите по всему списку, отмечая (вычеркивая) все числа, кратные 2. Затем вы делаете то же самое с следующее значение списка, которое не было зачеркнуто (например, 3), и так далее, пока мы не вычеркнем все составные числа от 2 до N. В конце концов, числа, которые не были зачеркнуты на нашем экране, будут именно теми простыми числами, которые мы ищем.
Алгоритм будет примерно таким:
Пример (взято из Википедии):
Чтобы реализовать этот алгоритм в Javascript, мы можем сделать следующее:
В приведенном выше коде мы создали Массив из 99 элементов (от 2 до N есть N - 1 элементов), и мы заполнили этот Массив единицами.
Приведенный выше код вычисляет квадратный корень из N и создает цикл for , который переходит от 2 к этому значению.
В приведенном выше коде каждое кратное итерируемому значению вычеркивается путем установки его значения в списке равным нулю.
В приведенном выше коде создается массив , называемый простыми числами , и выполняется обход сита. Для каждого не зачеркнутого элемента (значение которого равно 1) его позиция, прибавленная к 2 ( индекс + 2 ) , сохраняется в Массиве простых чисел , что и будет значением простого числа.
Реализация этого алгоритма может быть:
Обратите внимание, что этот алгоритм даже более эффективен, чем два предыдущих, так как, если исключить тот факт, что мы должны создать список чисел, а затем пройти его, чтобы получить простые числа, результат достигается всего за 113 итераций!!! .
Я надеюсь, что это проясняет различные способы достижения цели, причем Решето Эратосфена является одним из самых эффективных.
Использование генератора (ES6)
Одна из возможностей состоит в том, чтобы использовать генератор, чтобы просто перебирать его и возвращать следующее простое число в последовательности на каждой итерации.
Идея проста, и нет необходимости хранить простые значения, что делается, чтобы взять идею, поднятую в сите Эратосфена, и создать итерируемую структуру, которая реализует метод
next()
, таким образом, что каждый вызов указанного метода возвращает простое значение, и поэтому мы можем отобразить первыеn
простые целые числа.Во-первых, нужно иметь способ перебора натуральных чисел с заданным начальным значением. Мы можем написать функцию-генератор, которая возвращает последовательность натуральных чисел (из значения n) каждый раз, когда
next()
вызывается функция в последовательности.Например:
Ahora necesitamos crear una función generadora que tome cada valor de la secuencia de números naturales y dado un primo, me devuelva todos los valores que no sean múltiplos de dicho primo. Esto es una criba sobre una secuencia de valores.
Por ejemplo:
Esta función recorre una secuencia de números y devuelve aquellos que no sean múltiplos de
primo
.Ahora que tenemos estas 2 funciones que devuelven una secuencia, podemos escribir otra función generadora que a partir de un valor inicial devuelva el siguiente valor primo. Esto lo logramos reescribiendo la secuencia de valores naturales por aquella que tenga los valores no múltiplos del primo anterior.
Por ejemplo:
En esta función se recibe una secuencia que (idealmente) inicia en un valor primo (supongamos el 2). Luego, por cada valor de la misma, crea una nueva secuencia que contiene sólo los números que no son múltiplos del primo generado, y devuelve dicho valor en cada llamado a
next()
.Un ejemplo del código anterior funcionando para mostrar los primeros 10 primos sería:
Si bien este algoritmo tal vez no sea tan eficiente como los presentados con anterioridad, es otra forma de obtener valores primos usando generadores de Javascript para obtener una secuencia que siempre devolverá un valor primo cada vez que se llame al método
next()
.Tambien existe este algoritmo https://en.wikipedia.org/wiki/Sieve_of_Atkin es moderno para hallar los numeros primos
Вам лучше знать, что числа в парах кроме 2 не простые, выносим их из формулы; Нам нужно было бы получить нечетные числа, которые могут быть 3, 5, 7, 9, но мы знаем, что 9 кратно 3, и мы его испускаем, у нас остались бы только 3, 5 и 7, так как мы уже знаем числа. от 1 до 10, которые являются простыми числами, мы можем их опустить и начать с 11, добавляя два к двум, и поэтому нам не нужно проверять, является ли оно четным
Bueno yo me base en esta formula, Lo saque de la pagina: http://www.ceiploreto.es/sugerencias/ceibal/Primo_o_compuesto/cmo_saber_si_un_nmero_es_primo.html!
Use la consola para apreciar el resultado. Lo que hice fue crear dos funciones: La primera se encarga de evaluar si es o no es un numero primo. Y la segunda se encarga de que numero a que numero deseas saber los números primos.
Aquí la misma respuesta pero sin comentarios
Y si en caso quisieras imprimir en la consola todos los números de inicio a fin y aparezca si es o no es un numero primo entonces:
Я только добавляю к пустым возвратам console.log со строкой Templai, чтобы добавить значения, и я также добавляю два if в начале. Я надеюсь, что это было полезно для вас. Ваше здоровье !!!
Para calcular los semiprimos de un numero a, a un numero b