簡體   English   中英

優化素數分解算法

[英]Optimizing a Prime Number Factorization algorithm

下面的算法是找到給定數N的素數分解的算法。我想知道是否有任何方法可以使用HUGE數來使其更快。 我說的是20-35位數字。 我想嘗試讓這些盡快完成。 有任何想法嗎?

import time

def prime_factors(n):
    """Returns all the prime factors of a positive integer"""
    factors = []
    divisor = 2        
    while n > 1:        
        while n % divisor == 0:
            factors.append(divisor)
            n /= divisor          
        divisor = divisor + 1
        if divisor*divisor > n:
            if n > 1: 
                factors.append(n)
            break
    return factors

#HUGE NUMBERS GO IN HERE!
start_time = time.time()
my_factors = prime_factors(15227063669158801)
end_time = time.time()
print my_factors
print "It took ", end_time-start_time, " seconds."

您的算法是試驗划分,其時間復雜度為O(sqrt(n))。 您可以通過僅使用2和奇數作為試驗除數來改進算法,或者通過僅使用質數作為試驗除數甚至更好,但是時間復雜度將保持O(sqrt(n))。

為了更快,您需要一個更好的算法。 嘗試這個:

def factor(n, c):
    f = lambda(x): (x*x+c) % n
    t, h, d = 2, 2, 1
    while d == 1:
        t = f(t); h = f(f(h)); d = gcd(t-h, n)
    if d == n:
        return factor(n, c+1)
    return d

要說出您的電話號碼,說

print factor(15227063669158801, 1)

這幾乎立即返回了(可能是復合的)因子2090327。 它使用了約翰·波拉德(John Pollard)於1975年發明的稱為rho算法的算法。rho算法的時間復雜度為O(sqrt(sqrt(n))),因此它比試驗划分要快得多。

還有許多其他用於分解整數的算法。 對於您感興趣的20到35位數字范圍的數字,橢圓曲線算法非常適合。 它應該在不超過幾秒鍾的時間內分解該大小的數字。 SQUFOF是另一個非常適合此類數字(尤其是半質數(具有兩個質數因子)的算法)的算法。

如果您對使用質數編程感興趣,我會在我的博客上適度推薦這篇文章 完成后,我博客上的其他條目將討論橢圓曲線分解和SQUFOF,以及各種其他甚至更強大的分解更大整數的方法。

例如,列出數字100的所有素數分解。

  • Check 2是否為因式分解之一。 然后,可以刪除2 <2 * c <= 100。 例如4、6、8,... 98
  • Check 3是否為因式分解之一。 然后,可以刪除3 <2 * d <= 100。 例如9、12,... 99
  • 從可能的設置中刪除了4
  • 檢查5 ,然后刪除10、15、20,...,100。
  • 6被刪除。
  • 檢查7 ,.. ....

似乎沒有除數檢查。 抱歉,如果我錯了,但如何知道除數是否為質數? 您的除數變量在每個循環后都會增加1,因此我認為它將生成大量的復合數。

沒有對該算法的優化,至少在通常情況下,您不能將35位數字分解為因子。 原因是最多35個數字的質數太高而無法在合理的時間內列出,更不用說嘗試除以每個數了。 即使有人願意嘗試,存儲它們所需的位數也會太多。 在這種情況下,您需要從通用分解算法列表中選擇其他算法

但是,如果所有素數因子都足夠小(比如說低於10 ^ 12左右),那么您可以使用分段的Eratosthenes篩子 ,或者簡單地找到一個達到某個實際數字的素數列表(比如說10 ^ 12左右)。在線使用它,而不是嘗試計算素數,並希望列表足夠大。

暫無
暫無

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

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