线性筛生成质数的超详细理解

本文介绍了一种高效的线性筛法生成小于或等于n的所有质数的方法。通过优化传统筛法,避免了重复计算,提高了求质数的速度。

一,前言

目前求质数的方法多种多样,下面就介绍两种方法求质数。

二,线性筛法生成质数

筛法生成小于或等于n的质数的原理就是,将0到n的所有自然数都存放进一个数组里面。然后从2开始循环直到n,循环到i时,就把i的所有倍数(小于或等于n)都从这个数组里面移除,最后剩下的就是小于或者等于n的质数。

但是这种方法有一定的缺陷,就是假设 i 和 j 都是max的因数,那么无论是循环到i还是j,程序都会将max从数组中抹去,这样就重复计算了。为了消除这种不必要的计算,我们可以选用线性筛法来提高速度。

线性筛法生成质数的原理如下(结合下面的代码来理解可以更顺畅):

整个事件简单来说就是,从2到n按顺序依次抽出一个数(设为i),然后找出所有的i*m,把i*m从数组里面筛掉(因为它是合数),其中,m的取值是不小于2且不大于“i的最小质因数”的全体质数。那么数组中剩下的就全是质数了。这就是实现每个合数都只被划去一次(被它们的最小质因数筛掉)的过程。详细代码解说如下:

若要生成小于或者等于n的所有质数,则设置两个数组is_prime和prime,它们的大小均为n+1。将数组is_prime中的所有元素均初始化为0。is_prime[i]等于0时,代表i是质数;当is_prime[i]等于1时,代表i是合数。prime[i]从2到n的第i+1个质数。再设置一个下标now,它代表当程序运行到当前状态时,prime[now-1]是prime数组中的最后一个质数。

然后循环变量i,从2到n。当循环到h时,如果h是质数,那么就将h加入prime数组中,并将下标now的值加一,然后向下继续执行。如果h是合数,那就直接向下执行。

这时候,循环j,从0到now-1,而prime[now-1]*h必定是一个合数,仅当它小于或等于n时,循环j继续。如果说,prime[j]是h的因数,那么将prime[j]*h从数组里面删掉,然后退出循环。这是因为如果prime[j]是h的因数的话,那么prime[j]*h的最小

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值