Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成前n个素数数组的时间复杂度?_Javascript_Math_Time Complexity_Big O_Primes - Fatal编程技术网

Javascript 生成前n个素数数组的时间复杂度?

Javascript 生成前n个素数数组的时间复杂度?,javascript,math,time-complexity,big-o,primes,Javascript,Math,Time Complexity,Big O,Primes,对于接受整数n并返回第一个n素数数组的函数,我们有: function nPrimes(n) { let primes = []; for(let i = 3; primes.length < n - 1; i += 2) { if (primes.every(prime => i % prime !== 0)) { primes.push(i); } } primes.unshift(2);

对于接受整数
n
并返回第一个
n
素数数组的函数,我们有:

function nPrimes(n) {
    let primes = [];
    for(let i = 3; primes.length < n - 1; i += 2) {
        if (primes.every(prime => i % prime !== 0)) {
            primes.push(i);
        }
    }
    primes.unshift(2);
    return primes;
}
函数n时间(n){
设素数=[];
对于(设i=3;素数长度i%prime!==0)){
素数推(i);
}
}
素数。反移位(2);
返回素数;
}
我不确定这个算法的复杂度。它看起来至少是二次的,因为
每次
调用都会给运行时复杂性增加一个
n
,其中n是给定迭代中素数数组的大小。末尾的
unshift
添加了一个
n
,但与此无关,因为它将与前导系数相形见绌


接下来是,有没有更有效的方法生成这样的数组

这个计算相当困难

外部循环执行
n
次,并为从
3
n
th素数的所有奇数调用
every
构造

如果
every
构造确实测试到目前为止列表中的所有素数,那么总工作量将与
k.(p[k+1]-p[k])=k.G[k]
之和成比例,其中
p[k]
k
第个素数和
G[k]
到下一个素数的间隔(当找到
k
-th素数时,列表中有
k
元素,并在下一个素数之前进行测试)

根据素数定理,我们知道“平均”间隔长度的顺序是
logp[k]
,其本身的顺序是
log(klogk)=logk+logk
。然后求和得到
O(n.logn)

现在,如果
每一个
构造在满足错误条件时停止,其成本就会降低。事实上,搜索将在测试数的第一个素数因子处停止,总工作量将与所有奇数的第一个素数因子的索引之和成比例,直到
p[n]~n log n


通过网络搜索,似乎整数的第一个素数因子的分布遵循
1/p[k]log p[k]
中的规律,即
k
-th素数,即
1/k.log k.log(k.log k)
,我们需要使用
k~m/log m
对所有整数进行求和
m
。这既不严格,也不容易。

对于更快的解决方案,我建议阅读。请注意,您的解决方案目前效率低下,因为它足以尝试高达
的除数√仅限i
,这大大减少了尝试次数。