需要关于如何在JavaScript中考虑非常大的数字的提示/建议吗
我的任务是生成一个数组,其中包含所有素数,最多为12位数字 我试图通过首先生成一个函数需要关于如何在JavaScript中考虑非常大的数字的提示/建议吗,javascript,primes,Javascript,Primes,我的任务是生成一个数组,其中包含所有素数,最多为12位数字 我试图通过首先生成一个函数enumerate来模拟,该函数生成一个数组,其中包含从2到num的每个整数: var enumerate = function(num) { array = []; for (var i = 2; i <= num; i++) { array.push(i); } return array; }; 当数字高达50000左右时,这个功能可以正常工作,但如果
enumerate
来模拟,该函数生成一个数组,其中包含从2到num的每个整数:
var enumerate = function(num) {
array = [];
for (var i = 2; i <= num; i++) {
array.push(i);
}
return array;
};
当数字高达50000左右时,这个功能可以正常工作,但如果超过这个数字,浏览器似乎就会冻结
这种方法是否有一些版本可以容纳更大的数字,或者我选错了树?最多12位数就是10000000000。这是很多素数(~N/logn=3948131653)
因此,制作一个10^6的筛子,将其压缩到约78500个核心素数的数组中,并使用它们逐段筛选,直到达到目标。使用的素数最大为段当前上限的平方根。通常选择段的大小,使其适合系统缓存。在筛选每个片段后,收集其素数
这就是所谓的埃拉托斯坦分段筛。正如@WillNess所建议的,你不应该制作一个这样大小的单片筛。取而代之的是,使用一个分段的埃拉托斯坦筛子,在连续的段中进行筛分。在第一段,计算段内每个筛分素数的最小倍数,然后以正常方式将筛分素数的倍数标记为复合;当使用所有筛选素数时,段中剩余的未标记数为素数。然后,对于下一段,每个筛分素数的最小倍数是前一段中结束筛分的倍数,因此筛分继续进行,直到完成
考虑在20段中从100到200进行筛分的示例;5个筛分素数为3、5、7、11和13。在从100到120的第一段中,位阵列具有10个时隙,其中时隙0对应于101,时隙k对应于100+2*k*+1,时隙9对应于119。段中3的最小倍数为105,对应于槽2;插槽2+3=5和5+3=8也是3的倍数。插槽2处5的最小倍数为105,插槽2+5=7也是5的倍数。插槽2处7的最小倍数为105,插槽2+7=9也是7的倍数。等等
函数素数
采用lo、hi和delta参数;lo和hi必须是偶数,lo
我将把它留给您翻译成JavaScript。您可以在中看到更多涉及素数的算法。您是否看过看起来非常有用的算法。如果我放弃自己去弄清楚这个问题,我肯定会去看看的。@Jeremy,那页太糟糕了。我不是专家,但我猜问题在于从一个大数组中一次删除很多项。您可以测试这个想法——而不是删除非素数,您可以创建第二个数组并将素数推入其中。
var leaveOnlyPrimes = function(max,array) {
for (var i = 0; array[i] <= max/2; i++) {
(function(mult,array) {
for (var i = mult*2; i <= array[array.length-1]; i += mult) {
var index = array.indexOf(i);
if (index !== -1) {
array.splice(index,1);
}
}
})(array[i],array);
}
};
function primes(lo, hi, delta)
sieve := makeArray(0..delta-1)
ps := tail(primes(sqrt(hi)))
m := length(ps)
qs := makeArray(0..m-1)
for i from 0 to m-1
qs[i] := (-1/2 * (lo + ps[i] + 1)) % ps[i]
while lo < hi
for i from 0 to delta-1
sieve[i] := True
for i from 0 to m-1
for j from qs[i] to delta step ps[i]
sieve[j] := False
qs[i] := (qs[i] - delta) % ps[i]
for i from 0 to delta-1
t := lo + 2*i + 1
if sieve[i] and t < hi
output t
lo := lo + 2*delta
function primes(n)
sieve := makeArray(2..n, True)
for p from 2 to n step 1
if sieve(p)
output p
for i from p * p to n step p
sieve[i] := False