素数的判断与筛选

1.素数的判断

素数的定义:素数即在正整数范围内,大于1并且只有1和自身两个约数的数

i根据该定义,很容易得出最简单的判断数n是否为质数的方法:从2-n枚举一个数i,判断该数能否被n整除。

再进一步思考,n如果是众数,能够被分解,则它的其中一个质因子必定小于等于\sqrt{n} ,所以我们只需从2-\sqrt{n}枚举。(思考一下n=2和n=3是什么情况)(n=2和n=3是根本没进入循环哦)

 

如果我们需要求1-n之间的所有质数,则需要在上面的基础存放每一个质数。

到此判断和筛选质数最的基本的方法就完成了。 

END

你以为真的就到此结束了?其实这才是开始

2.素数筛选的进一步优化

基本的素数判断和筛选在n比较小的时候管用(大概是n在10^{5}以内吧),但如果当n大一点难免会遇到TLE(时间超限)的情况,这时候我们就需要重新考虑一下怎么更快捷的筛选素数。

这时还是得回归定义:

如果一个数n是众数,则它一定是2-n中的某个素数的倍数,反过来想想,我们可以用2-n中的素数把他们的倍数(n以内)全部筛除,则剩下的就都是素数。(这种方法被称作埃氏筛法)

 

 这种方法极大的提高了筛选素数的速度,但是仍然不是最优的方法

通过观察可以发现,对于同一个数,埃氏筛法可能会重复将其筛去。比如说 6=2*3,在2的时候被2筛除一遍,在3的时候又被筛除了一遍。

那我们想要更加优化此算法,则需要的就是保证每个众数只被筛除一遍(那我们可以用它的最小的质因子将之筛除就行了)说的简单,但是怎么实现是个问题

还是熟悉的从2-n枚举i,如果i是素数,则将其记录下来,并用它将它的倍数筛掉(此时我们只需枚举i及之前的质数);如果i是众数,也将其倍数筛除(此时我们只需要枚举i的最小质因子及其之前的质数)(这种方法被称为欧拉筛法也叫线性筛法)

合理性的证明:(a[j]即是当前枚举到的质数)

1)第一次枚举到 i % a[ j ] == 0 ,则说明 a[ j ] 是 i 的最小质因子,那么a[ j ] 也一定是a [ j ] * i 的最小质因子。例如:4 % 2 == 0 ,2 是 4的最小质因子,且 2 也是2 * 4 的最小质因子。

(2)若i % a[ j ] != 0 ,由于我们是从小到大枚举的所有的质数,并且我们没有枚举到 i 的任何一个质因子,则此时a[ j ] 一定小于 i 的所有质因子,但是a[ j ] 也一定是a[ j ] * i 的最小质因子。

到此判断质数的方法就完成了

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值