求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

原文地址:https://www.cnblogs.com/formercoding/p/12882786.html