gpt4 book ai didi

Javascript - 素数函数问题,内存过载

转载 作者:行者123 更新时间:2023-11-28 16:50:37 27 4
gpt4 key购买 nike

我有下一个问题。我试图找到所有素数,直到指定的数字作为输入,但是当我输入例如 13480000 或 643513511 等非常大的数字时,算法会以某种方式停止迭代,并且我的浏览器在处理函数方面变得太慢。这是html代码:

<!DOCTYPE html>
<html lang="es">
<head>
<script src="esPrimo.js">
</script>
</head>
<body>
<h1>Lista de primos</h1>
<form name="formu">
<input id="txtValue" type="text" />
<input type="button" value="Calcular!" onclick="proceso()">
</form>

<p id="res">El resultado se escribe aqui</p>
</body>
</html>

这是我的 esPrimo.js 文件的 javascript 代码

function proceso() {
var value = document.querySelector('#txtValue').value;
var primos = getPrimos(value);
var output = document.querySelector('#res');
output.innerHTML = primos.toString();

}

function getPrimos (value) {
var primos = [];
for (var i = 1; i <= value; i++){
if (esPrimo(i)) primos.push(i);
}
return primos;
}

function esPrimo(n){
if (isNaN(n) || !isFinite(n) || n%1 || n<2) return false;
var m = Math.sqrt(n);
for (var i = 2; i <= m; i++)
if (n % i == 0) return false;
return true;
}

在程序获取参数的最后一个函数上,速度非常慢。它检查 n 是否可以被每个整数 2、3、4、5 ...整除最多 sqrt(n) 但此版本的代码行数最少。此外,我尝试了另一种迭代所有素数的方法,例如:

function esPrimo(n) {
if (isNaN(n) || !isFinite(n) || n%1 || n<2) return false;
if (n%2==0) return (n==2);
var m=Math.sqrt(n);
for (var i=3;i<=m;i+=2) {
if (n%i==0) return false;
}
return true;
}

这里它单独检查除数 2:然后,它仅继续检查从 3 到 sqrt(n) 的奇数除数。最多检查 3 到 sqrt(n) 之间的一半数字。

我怎样才能优化代码,以便我的程序能够更快地计算这种迭代?

任何建议或建议,我都会非常感激和有帮助,因为上周我一直在尝试寻找某种解决方案,但没有用。此外,我还有最后一个感兴趣的环节,我对它进行了深入研究,并在掌握数字的素性测试方面对我有很大帮助。

Javascript Primality Tests

谢谢

最佳答案

根据 Pointy 在评论中所说的内容,下面是您的 JavaScript 重构以使用 Eratosthenes“筛子”算法。在开始编写代码之前,首先快速解释一下埃拉斯托斯特尼 (Erastosthenes)。埃拉斯托斯特尼发现,通过查找 2 和 N 之间每个数字的倍数并将其从列表中删除,您可以更有效地查找 2 和 N 之间的素数(其中 N 是一个很大的数字)。无论你剩下什么,都必须是首要的。

E.G. N = 10

2, 3, 4, 5, 6, 7, 8, 9, 10 --> 2的倍数包括4, 6, 8和10,所以它们不是素数。 3 的倍数包括 6 和 9,因此它们被删除。等等。最终只剩下 2、3、5、7,其中没有一个可以与数字相乘。

现在,下面的代码使用了Erastosthenes算法,但是如果你尝试你的643513511的例子,它仍然会崩溃,我只是认为浏览器所需的处理能力太多了,但我可能是错的。不过,它适用于您的 1300 万示例。

注意:此代码是使用您的代码和取自另一篇 Stackoverflow 帖子 Sieve of Eratosthenes algorithm in JavaScript running endless for large number 的代码进行重构的。 .

var getPrimos = function(n) {
// Eratosthenes algorithm to find all primes under n
var array = [], upperLimit = Math.sqrt(n), output = [];

// Make an array from 2 to (n - 1)
for (var i = 0; i < n; i++) {
array.push(true);
}

// Remove multiples of primes starting from 2, 3, 5,...
for (var i = 2; i <= upperLimit; i++) {
if (array[i]) {
for (var j = i * i; j < n; j += i) {
array[j] = false;
}
}
}

// All array[i] set to true are primes
for (var i = 2; i < n; i++) {
if(array[i]) {
output.push(i);
}
}

return output;
};

关于Javascript - 素数函数问题,内存过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60010960/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com