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编辑  收藏  举报

导航