求100000以内的质数
什么是质数
质数就是只能被 1 和 它本身整除的自然数(1 不是)。质数在算法中的有许多独特的作用,比如计算数组的子集,[2, 3, 5] 与 [2, 3, 5, 7], 可以通过元素乘积来判断是否为子集关系。
求解质数的方法(100000以内质数)
暴力求解
利用循环判断是否能被小于本身的自然数整除,实际上只要判断是否能被小于等于自身开根号的自然数整除即可
证明:如果 a * b = c
a > √c
b > √c
, 则 a * b > c
function getPrimeList (ceilNum) {
const primeList = [];
for (let i = 2; i <= ceilNum; i++) {
let isPrime = true;
// 如果是质数,一定能被开平方内的数整除 a*b = c,a,b定有个小于根号c
for (let j = 2, sqrt = Math.sqrt(i, 1 / 2); j <= sqrt; j++) {
if (i % j === 0) {
isPrime = false;
break;
}
}
if (isPrime) primeList.push(i);
}
return primeList;
}
const list = getPrimeList(100000);
筛选法
如果求 100 以为的质数,从素数 2 开始,排除 2 的倍数,接着再取剩下的数中最小的数 3 此时也会质数,排除 3 的倍数,接着再取剩下的最小质数 5,依次循环上面步骤即可过滤出质数集合。
function getPrimeNum (ceilNum) {
let list = [];
const sqrt = Math.sqrt(ceilNum, 1 / 2)
const primeList = [];
for (let i = 2; i <= ceilNum; i++) {
list.push(i);
}
while (list[0] <= sqrt) {
const newList = [];
const num = list[0];
primeList.push(num);
for (let i = 1, len = list.length; i < len; i++) {
if (list[i] % num) newList.push(list[i]);
}
list = newList;
}
return primeList.concat(list);
}
const list = getPrimeNum(100000);
费马小定理+二次探测定理求解
不会,没写出来...
欢迎到前端学习打卡群一起学习~516913974