判断质数和合数python代码_质数,非质数之Python

质数的定义:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数(百度百科)

自然数的定义:指用以计量事物的件数或表示事物次序的数。即用数码0,1,2,3,4……所表示的数。自然数由0开始,一个接一个,组成一个无穷的集体。自然数有有序性,无限性。分为偶数和奇数,合数和质数等(百度百科)

问题:怎么找出n(n为大于2的自然数)内的全部质数?

我们已知大于2的偶数自然数均为合数,大于2的奇数自然数却由质数和合数组成。那么,如果我们把奇数中的合数全部去掉(合数有质数相乘得到的,如:10=2*5),奇数中的剩余部分便全是质数了,最后添加一个2便是最终结果。举例说明:

现求100以内的全部质数,将[3,100]区间的数据分为奇数和偶数,偶数部分全为合数,奇数部分有3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99。(以下的数字都是此数据中的数)

第一个数字是3(质数),我们先除去range(3*2,101,2*3)的合数(因为奇数*偶数=偶数,奇数+偶数=奇数,偶数已被我们剔除,所以乘奇数倍),得到的结果有3,5,7,11,13,17,19,23,25,29,31,35,37,41,43,47,49,53,55,59,61,65,67,71,73,77,79,83,85,89,91,95,97

第二个数字是5(质数),再除去range(5**2,101,2*5)。得到的结果有3,5,7,11,13,17,19,23,29,31,37,41,43,47,49,53,59,61,67,71,73,77,79,83,89,91,97

第三个数字是7(质数),再出去range(7**2,101,2*7),得到的结果有3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97

第四个数字是9(合数),过

第五个数字是11(质数),但是11**2>100,则第五个数字后都不用管,再第三步的结果中添加2变为100内的全部质数。

而大于2的全部合数是:range(4,101,2),range(9,101,6),range(25,101,10),range(49,101,14)

以下是python提取质数的代码过程(返回的集合,i5处理器,10000000内的全部质数耗时约2.3s):

from itertools import chain

def prime_set3(a):

b=[] # 存放合数

for i in range(3, int(a**0.5)+1, 2):

number = 0

for n in range(3, i, 2):

if i % n == 0 and i > n:

number = 1

break

if number == 1:

continue

b.append(range(i**2, a+1, 2*i))

aa = set(chain([2],range(3, a+1, 2)))

bb = set(chain(*b))

prime = aa - bb

return prime

以下是上述代码的雏形:

from itertools import chain

def prime_set(a):

b=[]

for i in range(2,int(a**0.5)+1):

b.append((range(i**2,a+1,i)))

sa=set(range(2,a+1))

sb=set(chain(*b))

prime=sa-sb

return prime

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值