在ACM会经常遇到使用大量素数的情景,谷歌了一下,当不是特别多时,可以使用筛选法搞定. 这个wiki上扒来的原理图:
pic
埃拉托斯特尼筛法,简称埃氏筛,是一种公元前250年由古希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。
下面是伪代码:

// arbitrary search limit
limit  1.000.000             
 
// assume all numbers are prime at first                                   
 
is_prime(i)  true, i  [2, limit]
 
for n in [2, limit]:
    if is_prime(n):
        // eliminate multiples of each prime,
        // starting with its square
        is_prime(i)  false, i  {n², n²+n, n²+2n, ..., limit}
 
for n in [2, limit]:
    if is_prime(n): print n

针对上面的思路,Python代码如下

prime_dic = {}
prime_list = []
n = 1000
for i in range(2, n + 1):
	prime_dic[i] = 1
for i in range(2, int(n ** .5) + 1):
	for j in range(i ** 2, n + 1, i):
		if prime_dic[i] == 1:
			prime_dic[j] = 0
for k, v in prime_dic.items():
	if v == 1:
		prime_list.append(k)
print prime_list


blog comments powered by Disqus

Published

07 February 2014

Tags