如果2个数都是质数,而且它们相差为2,那么就可以说是一对“孪生质数”。
如何判断指定范围内的孪生质数?
一种高效的做法是结合筛法与缓存判断,可以很接近线性的效率。
用常规的判定质数方法,再使用缓存,也可以达到目的。
效率是O(N*sqrt(N))的,而且因为缓存的缘故,多次调用的情况下,性能也是很可观的。
下面,我提供了常规实现,具体上还可以优化,比如使用二分查找。
//缓存孪生质数
var cache = [[3,5],[5,7]];
//是否是质数
function isPrime(n){
var factor = Math.sqrt(n);
//最小的质数是2
if(n < 2){
return false;
}
//质数只有1和它本身,2个因子
//否则是合数
for(var i=2;i<=factor;i++){
if(n % i == 0){
return false;
}
}
return true;
}
function twinPrime(n) {
//缓存的最后一对孪生质数
var last = cache[cache.length - 1];
//如果n在已缓存范围内
if(n < last[0] + 1){
//直接返回数目
for(var i=0;cache[i][0] < n;i++);
return i;
}
else{
//否则,查找并且缓存
var start = last[0] + 1;
for(var i=start;i<n;i++){
if(isPrime(i) && isPrime(i+2)){
cache.push([i, i+2]);
}
}
return cache.length;
}
}