需要关于如何在JavaScript中考虑非常大的数字的提示/建议吗

需要关于如何在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左右时,这个功能可以正常工作,但如果

我的任务是生成一个数组,其中包含所有素数,最多为12位数字

我试图通过首先生成一个函数
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