簡體   English   中英

在Python中優化素數生成器

[英]Optimizing a prime number generator in Python

我正在尋找有關優化素數生成器的任何建議。 您能否附上更正內容,並附上一些簡短評論,說明其回復速度更快的原因。

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

此處已經有很多關於質數發生器的討論: 列出N以下所有質數的最快方法

在該鏈接處是一個Python腳本,您可以將其與其他幾種算法進行比較。

您可以從“數字”列表中刪除大於2的偶數,因為這些偶數肯定不是質數,因此您不必檢查它們。 您可以通過設置范圍功能的step參數來實現。

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列表中標記了。

計算素數的最簡單方法是使用篩子。 它是由希臘數學家Eratosthenes於2000年前發明的:

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篩網的更多信息,請在我的博客中謙虛地推薦“ 用質數編程 ”一文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM