素数筛选算法
有什么不明白的地方,扫描右方二维码加我微信交流。
筛选从0-1亿的素数,使用JavaScript实现。
运行环境:macOS High Sierra,10.13.6,2.3 GHz Intel Core i5,8 GB 2133 MHz LPDDR3,sublimeText控制台。
低效法:
let loopCount = 0; let count = 100000000; let checkNumCount = 0; console.time("sort1"); let arr = []; for (let i = 0; i < count; i ++) { if (i >= 2) { if (i === 2 || i === 3) { arr.push(i); } else { checkNumCount ++; let isPrime = true; for (let j = 2; j <= Math.sqrt(i); j ++) { loopCount ++; if (i % j === 0) { isPrime = false; break; } } if (isPrime) { arr.push(i); } } } } console.log(arr.length, loopCount, checkNumCount); console.timeEnd("sort1");
高效方法:
console.time("sort2"); arr = []; loopCount = 0; checkNumCount = 0; for (let i = 0; i < count; i ++) { if (i >= 2) { if (i === 2 || i === 3 || i === 5 || i === 7 || i === 11 || i === 13) { arr.push(i); } else { if (i % 2 !== 0 && i % 3 !== 0 && i % 4 !== 0 && i % 5 !== 0 && i % 6 !== 0 && i % 7 !== 0 && i % 8 !== 0 && i % 9 !== 0 && i % 10 !== 0 && i % 11 !== 0 && i % 12 !== 0 && i % 13 !== 0 && i % 14 !== 0 && i % 15 !== 0) { checkNumCount ++; let isPrime = true; for (let j = 2; j <= Math.sqrt(i); j ++) { loopCount ++; if (i % j === 0) { isPrime = false; break; } } if (isPrime) { arr.push(i); } } } } } console.log(arr.length, loopCount, checkNumCount); console.timeEnd("sort2");
运行结果:
//参数依次为获取到的素数个数,进行的循环总次数,进入循环的整数个数,运行时间 5761455 46524124248 99999996 sort1: 162929.460ms 5761455 46351307110 19180819 sort2: 161345.078ms [Finished in 324.4s]
从运行结果来看,高效法的循环次数比低效法少了1.7亿,check的整数个数差不多为原来的1/5,时间减少了1584.392ms,将近总时间的10%,效率还是有提升的,但不是很大。
在高效法中,我们把所有的2-15的倍数的数过滤,此处用的是if方法,而不是for方法,如果用for,则会增加循环次数,增加消耗,为什么是到15,亲测在我的机器上,到15是比较快的,少一个多一个都会增加时间,在不同的环境中可能会有不同。
有什么问题可以在下方留言。