我一直在浏览互联网,但我找不到如何执行算法来查找素数。
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 次迭代!!!得到相同的结果。它可以变得更高效吗?
埃拉托色尼之谜
在Eratosthenes 的筛子中,你被要求写出从 2 到N的所有自然数,然后,从 2 开始,你遍历整个列表,标记(划掉)所有 2 的倍数。然后你对列表中没有被划掉的下一个值(例如 3),依此类推,直到我们划掉 2和N之间的所有合数。最后,我们屏幕上没有被划掉的数字将正是我们正在寻找的素数。
该算法将是这样的:
一个例子(取自维基百科):
要在 Javascript 中实现此算法,我们可以执行以下操作:
在上面的代码中,我们创建了一个包含 99 个元素的数组(从 2 到N有N - 1 个元素),并且 我们用 1 填充了这个数组。
上面的代码计算N的平方根并创建一个从 2 到该值的for循环。
在上面的代码中,通过将列表中的值设置为零来删除每个被迭代的值的倍数。
在上面的代码中,创建了一个名为primes的数组并遍历了筛子。对于每个未被划掉的元素(其值为 1),其加到 2 的位置(索引 + 2 )保存在素数数组中,这将是素数的值。
该算法的实现可能是:
请注意,这个算法比前两个算法更有效,因为,去掉我们必须创建数字列表然后通过它来获得素数的事实,结果只需要113 次迭代!.
我希望这能阐明实现目标的不同方法,埃拉托色尼筛是最有效的方法之一。
使用生成器 (ES6)
一种可能性是使用生成器简单地对其进行迭代,并在每次迭代时返回序列中的下一个素数。
这个想法很简单,没有必要存储质数,所做的是采用 Eratosthenes 筛子中提出的想法并创建一个实现该方法的可迭代结构,
next()
这样每次调用该方法都返回一个素值,所以我们可以显示第一个n
素数。第一件事是有一种方法来迭代自然数,给定一个初始值。我们可以编写一个生成器函数,每次
next()
调用序列中的函数时返回自然数序列(从值 n)。例如:
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 开始,将 2 加 2,因此我们不必验证它是否是偶数
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:
我只添加到空返回一个带有Templai String的console.log来添加值,并且我还在开头添加了两个if。我希望它对你有用。干杯!!!
Para calcular los semiprimos de un numero a, a un numero b