zoukankan      html  css  js  c++  java
  • 求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

  • 相关阅读:
    创建user keywords
    robotframework中list和dict variables
    安装sshlibrary库报错:Could not find a version that satisfies the requirement
    【转】用U盘制作启动盘后空间变小的恢复方法
    docker "exec format error"
    window cmd 设置IP,关闭防火墙,开启远程桌面
    Linux iptables
    python logging 模块
    docker 命令
    python xmlrpc入门
  • 原文地址:https://www.cnblogs.com/formercoding/p/12882786.html
Copyright © 2011-2022 走看看