线性筛选素数--python
来源:互联网 发布:机械师软件 编辑:程序博客网 时间:2024/06/08 15:20
首先知道:合数一定可以分解为几个素数的积,既然是几个素数,就一定有最小的一个。我们将这个最小素数因子叫最小素因子,
那么是我们可以知道任何一个合数都有唯一的一个最小素因子。我们要做的事就是用素因子筛选出其对应的合数,然后标注为合数。
筛选出所有的合数,那么剩下的当然是素数。
代码如下:
# -*-coding:utf-8-*-maxl = 1000000 # 筛选范围count = 0 ss = [] # 素数check = [] # 0代表素数,1代表合数。全部初始化为素数。for x in range(0, maxl+1):check.append(0)# 筛选出 2~10^6 所有素数for i in range(2, maxl):# 如果是素数就存起来if check[i] == 0:ss.append(i)count += 1# 循环存起来的素数for j in range(0, count):# 素数的i倍,肯定是一个合数if ss[j]*i > maxl:break# 将素数的i倍标注为合数,这儿将所有素数视为最小素数,那么最小素数对应的所有合数都会被标注。check[ss[j]*i] = 1# 循环素数列表,如果被筛选的数能被列表中某个数整除,由于列表中的素数是有序的,所以该素数就是被筛选数的最小素因子。# 我们知道上一句代码就是用来筛选出素因子对应合数的,既然合数 i 对应的最小素因子已经在素数列表中了,那么合数 i 肯定# 会被改素数给筛选出,所以结束当前循环,没必要用其他素数去筛选 i if i%ss[j] == 0:breakprint(ss[:100])保证一遍循环,干掉所有合数且每个合数只被干掉一次,便是节省时间的做法。
每个合数只有一个最小素因子,将当前知道的素数分别作为最小素因子找出他所有的倍数,那就是找出了最小素因子对应的
所有合数,这确保了干掉筛选范围内所有的合数。
那么怎么保证合数只被干掉一次呢?
例如:合数24,循环素数列表时,2*12=24 被干掉一次。3*8=24,又被干掉一次。
那么我们怎么确保24只被干掉一次呢,合数24的最小素因子是素数2。既然是因子,自然有:24%2 == 0
就是说当我们循环当前的有序的(从小到大)素数列表,只要有一个素数能整除合数那么这个素数就是该合数的最小素因子,就有:合数%最小素因子 == 0, 当这个条件成立时,说明素数列表中已经有合数的最小素因子,该合数被干掉是迟早的事。
所以这个条件成立时,就应该结束循环素数列表。
阅读全文
0 0
- 线性筛选素数--python
- 线性筛选素数模板
- 素数线性筛选
- 素数的线性筛选
- 线性筛选素数法
- 线性筛选素数
- 素数线性筛选法
- 素数线性筛选
- 线性筛选求素数
- 线性筛选求素数
- 【线筛】线性筛选素数
- 线性筛选素数。。。。线性哦
- 线性筛选素数(欧拉筛选)
- 浅谈—线性筛选素数
- 快速线性素数筛选[模板]
- 线性筛选素数(模板)
- Python素数筛选法
- 素数筛选之“普通筛选”和“线性筛选”
- 关于缓存中Session,Cache,cookie的区别
- Java锁的种类以及辨析(二):自旋锁的其他种类
- 9月28日云栖精选夜读:阿里云MaxCompute澳大利亚开服,“领跑”人工智能市场
- WRF参数化方案
- 684
- 线性筛选素数--python
- 将任意文件转化成16进制byte流,并将流打印到本地txt文档
- [C++]char转换为string ,固定长度的char数组转换为string
- 用户行为日志-js埋点(三)浏览记录和停留时间思路
- python import模块的几种情况 import次级目录模块/同级目录模块/上级目录模块
- 俞敏洪的同济大学演讲
- HDU
- Java类加载机制
- layer.msg弹窗倒计时