筛选质数

作者: 江洋林澜 | 来源:发表于2018-04-07 19:02 被阅读0次

关于怎么判断一个数 n 是否是质数,最简单的方法是枚举 2 到 n−1,判断是否是 n 的约数。如果是, n 肯定不是一个质数。再仔细想想,如果 a 是 n 的一个约数,那么必然有一个b 满足 ab = n,a≤√​n​​​ 和 b≤√​n​​​ 中必然有一个成立,因为如果a>√​n​​​ 并且 b>√​n​​​,那么 ab>n,和 ab = n 矛盾。因此如果 n 是一个合数,那么我们只需要枚举到 √​n​​​ 就一定能找到 n的一个约数。否则,n 肯定是一个质数。下面是代码:

int is_prime(int n)  
{  
   for(int i = 2; i * i <= m; i++)  
      if(n % i == 0)  
         return 0;//不是质数   
   return 1;//是质数         
}  

更多的时候,需要预处理出一段区间上的质数,如果按照之前的方法一个一个判断,时间上肯定会承受不了。于是提出了一种预处理 1 到 N 上质数的算法,称为 Eratosthenes 筛选。

素数筛选算法的基本思想是我们先假设 2 到 N 所有数都是素数。我们从 2 开始扫描,对于一个数 i,可以得到 2i, 3i ……ki 都不是素数,因为这些数都有 i 这个因子,表示这些数不是素数,一直枚举到 N。对于每一个合数,它至少会被它的一个因子枚举到,所以可能证明这个算法的正确性。接下来分析时间复杂度,对于每个 i,枚举的次数为 n / i​​,所以总时间复杂度为 N/2 + N/3 + … + N/N = O(NlgN) 。

下面是代码:

for(int i = 2; i <= n; i++)  
{  
   is_prime[i] = 1;   
}  
for(int i = 2; i <= n; i++)  
{  
   for(int j = i * 2; j <= n; j += i)  
      {  
         is_prime[j] = 0;  
      }  
}  

上面的代码便筛选出来了 n 以内的素数,如果 is_prime[i] = 1,i 是素数,否则 i 是合数。上面的代码还可以优化。第一是基于每个合数必然有一个质因子,所以我们可以只用质数来筛选,第二是 j 的初始条件可以写成 j = i * i,因为比如 j = i * k( k < i), 那么 j 肯定被k 筛选掉了。第三是可以只用√​n​​​ 之前的质数去筛选。优化之后的时间复杂度比O(NlgN)还要低得多。优化以后的代码如下:

for(int i = 2; i <= n; i++)  
{  
   is_prime[i] = 1;  
}  
for(int i = 2; i * i <= n; i++)  
{  
   if(is_prime[i])  
   {  
         for(int j = i * i; j <= n; j += i)  
      {  
         is_prime[j] = 0;  
      }  
   }  
}  

相关文章

  • 筛选质数

    关于怎么判断一个数 n 是否是质数,最简单的方法是枚举 2 到 n−1,判断是否是 n 的约数。如果是, n 肯定...

  • 质数筛选

    题目:实现一个存储正整数的类,此类中的数据用随机数的方式进行填充。提供的方法包括:打印所有的整数、打印数据中所有的...

  • 筛选素数/筛选质数

  • 质数筛选优化

    直接方案:从1-10000筛选质数时候,正常是遍历所有数字,然后遍历所有比自身小的数,如果除以一个比自身小又不是1...

  • 筛选质数 JavaScript

    好久没写博客了。这是一个关于寻找质数的故事。 完全借鉴于 sieve-of-eratosthenes-algori...

  • 极少数人用过的另类素数求解法,C语言经典算法之筛选法求质数

    筛选求质数 明除了自身之外,无法被其它整数整除的数称之为质数,要求质数很简单,但如何快速的求出质数则一直是程式设计...

  • 筛选法求质数

    前情提要 求质数最简单的方法是暴力破解: 但这样做的效率会很低。有没有办法提高效率呢? 筛选法的核心就一句话:质数...

  • 素数(质数)筛选法模板

    判断一个数是否为质数 素数筛选法(时间复杂度O(nlogn))

  • 埃筛

    埃筛 给定一个整数N,求出1~N之间的所有质数,称为质数的筛选问题。埃筛线筛都是用于解决这个问题的算法。埃筛的思想...

  • Swift 计数质数 - LeetCode

    题目:计数质数 描述:统计所有小于非负整数 n 的质数的数量。 案例1: 质数的定义:质数 方案一:判断质数 代码...

网友评论

    本文标题:筛选质数

    本文链接:https://www.haomeiwen.com/subject/swoyhftx.html