质数的定义:指在大于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