python 求素数
方法一
试除法
求小于x的所有素数
只要尝试小于√x 的质数即可,质数集合一边算一边增大
方法二
筛法
首先,2是公认最小的质数,所以,先把所有2的倍数去掉;然后剩下的那些大于2的数里面,最小的是3,所以3也是质数;然后把所有3的倍数都去掉,剩下的那些大于3的数里面,最小的是5,所以5也是质数......
上述过程不断重复,就可以把某个范围内的合数全都除去(就像被筛子筛掉一样),剩下的就是质数了。
维基百科上的这张图可以说明问题
代码都很简单,还是贴一下
试除法
import math
from Timer import *
num = 600851475143
upper = int(math.sqrt(num))
#print num
print upper
prime = [2,3,5,7,11,13]
print prime
with Timer() as t:
for i in xrange(15,upper,2):
flag = True
for j in prime:
if i%j==0:
flag=False
break
if flag:
prime.append(i)
# print i
print t.interval
print prime
其中Timer是自己写的一个类,用来计时的,大概是求770000内的素数,后台跑的很慢,用了200多秒
方法二
筛法
import math
from Timer import *
num = 600851475143
upper = int(math.sqrt(num))
print upper
prime = []
l = []
for i in xrange(upper+1):
l.append(1)
length = len(l)
with Timer() as t:
for i in xrange(2,upper):
if l[i]:
k=2
prime.append(i)
while k*i<=upper:
l[k*i]=0
k+=1
print t.interval
print prime
一样的数据大概跑了1秒不到,其实就是用空间换时间,本来想用bitset但是没发现python standard library提供这个特性,所以。。。不然可以节省不少内存
posted on 2013-05-07 21:18 luckistmaomao 阅读(1150) 评论(0) 编辑 收藏 举报