繁体   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