这是在 JavaScript 中根据先前的素数计算素数的最快方法。
function nextPrime(value) {
if (value > 2) {
var i, q;
do {
i = 3;
value += 2;
q = Math.floor(Math.sqrt(value));
while (i <= q && value % i) {
i += 2;
}
} while (i <= q);
return value;
}
return value === 2 ? 3 : 2;
}
测试
var value, result = [];
for (var i = 0; i < 10; i++) {
value = nextPrime(value);
result.push(value);
}
console.log("Primes:", result);
输出
Primes: [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ]
它非常快,因为:
- 它将循环限制对齐为整数;
- 它使用较短的迭代循环,跳过偶数。
它可以在大约 130 毫秒内为您提供前 100,000 个素数,或在大约 4 秒内为您提供前 1m 个素数。
2021 更新
在这个时代,我们应该为此使用ES6 生成器:
// generates "n" primes that follow "startPrime";
function* nextPrimes(startPrime, n) {
let value = startPrime, i = 0;
while (i++ < n) {
if (value > 2) {
let k, q;
do {
k = 3;
value += 2;
q = Math.floor(Math.sqrt(value));
while (k <= q && value % k) {
k += 2;
}
} while (k <= q);
} else {
value = value === 2 ? 3 : 2;
}
yield value;
}
}
测试:
const result = [...nextPrimes(1, 10)];
//=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
function* nextPrimes(startPrime, n) {
let value = startPrime, i = 0;
while (i++ < n) {
if (value > 2) {
let k, q;
do {
k = 3;
value += 2;
q = Math.floor(Math.sqrt(value));
while (k <= q && value % k) {
k += 2;
}
} while (k <= q);
} else {
value = value === 2 ? 3 : 2;
}
yield value;
}
}
const result = [...nextPrimes(1, 10)];
display('Primes: ' + result.join(', '));
function display(msg) {
document.body.insertAdjacentHTML(
'beforeend',
'<p>' + msg + '</p>'
);
}