我正在寻找有关优化素数生成器的任何建议。您能不能请说明更正和一些评论,说明为什么答案会更快。
def primeList ( highestNumber ):
""" This function takes a integer and returns a list of all primes less than or equal to that integer"""
numbers = range( 2, highestNumber + 1 ) # creates an inclusive list of all numbers between 2 and highestNumber
isPrime = [ True ] * len( numbers ) # each element corresponds to an element in numbers and keeps track of whether or not it is prime
primes = [] # Where I'll build a list of prime numbers
for i in range( len( numbers ) ):
if ( isPrime[i] == True ):
increment = numbers[i]
position = i + increment
primes.append( numbers[ i ] )
while ( position < len( numbers )): # will only execute if the above if statement is true because position will still be greater than len( number )
isPrime[position] = False # Sets an element of isPrime to False if it is a multiple of a lower number
position += increment
return primes
答案 0 :(得分:2)
这里已经讨论了各种素数生成器:Fastest way to list all primes below N
该链接是一个Python脚本,可用于将您的算法与其他几个算法进行比较。
答案 1 :(得分:1)
您可以从&#34;数字&#34;中删除大于2的偶数。列表,因为肯定那些偶数不是素数,所以你不必检查它们。您可以通过设置范围功能的步骤参数来完成此操作。
答案 2 :(得分:0)
def primeList ( highestNumber ):
""" This function takes a integer and returns a list of """
""" all primes less than or equal to that integer"""
numbers = range( 3, highestNumber + 1, 2 )
isPrime = [ True ] * len( numbers )
primes = [2] if highestNumber >= 2 else []
for number in numbers:
if ( isPrime[(number-3)/2] ):
increment = number
position = (number * number - 3) / 2
if ( position >= len( numbers )):
primes += (x for x in numbers[(number-3)/2:]
if isPrime[(x-3)/2])
# primes += (2*i+3 for i in xrange((number-3)/2,
# len(numbers)) if isPrime[i])
break
else:
primes.append( number )
while ( position < len( numbers )):
isPrime[position] = False
position += increment
return primes
仅在赔率上工作更快,占用的空间更少。
我们可以从n
开始消除n*n
的倍数,因为对于任何n*k
,k < n
,我们都有n*k = k*n
,即它将作为k
的倍数。
我们可以在广场高于顶部时立即停止 - 此时所有倍数都已标记在isPrime
列表中。
答案 3 :(得分:0)
最简单的计算质数的方法是使用筛子;它是由希腊数学家Eratosthenes在两千多年前发明的:
def primes(n):
sieve = [True] * (n+1)
ps = []
for p in range(2,n):
if sieve[p]:
for i in range(p*p, n, p):
sieve[i] = False
ps.append(p)
return ps
有更快的方法来计算质数,但除非你通过测量知道你的应用程序需要比上面给出的函数更快的速度,或者你没有足够的内存来存储筛子,你应该使用这种方法,这很简单,很难出错。如果您想了解更多关于Eratosthenes筛选的信息,我谦虚地在我的博客上推荐文章Programming with Prime Numbers。