在Python中优化素数生成器

时间:2014-08-18 00:56:59

标签: python primes

我正在寻找有关优化素数生成器的任何建议。您能不能请说明更正和一些评论,说明为什么答案会更快。

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

4 个答案:

答案 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*kk < 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