如何在Python中优化因子分解代码?

如何在Python中优化因子分解代码?,python,optimization,factorization,Python,Optimization,Factorization,我最近用Python编写了一段代码,它接受用户输入的数字n并打印该数字的素数因子,包括重复素数。我非常兴奋,因为我已经为此工作了一段时间,但实际上效果并不好。任何大于500000的n都需要很长时间才能计算,我想知道是否有任何方法可以优化它 import sys def is_prime(n): if n < 2: return False if n == 2: return True if not n & 1:

我最近用Python编写了一段代码,它接受用户输入的数字n并打印该数字的素数因子,包括重复素数。我非常兴奋,因为我已经为此工作了一段时间,但实际上效果并不好。任何大于500000的n都需要很长时间才能计算,我想知道是否有任何方法可以优化它

import sys

def is_prime(n):
    if n < 2:
        return False
    if n == 2:
        return True
    if not n & 1:
        return False
    for x in range(3,int(n**0.5)+1,2):
        if n % x == 0:
            return False
    return True

def factors(n):
    n = int(n)
    factors = []
    test_numbers = []
    if is_prime(n) == True:
        print "%s is prime!" % n
    else:   
        for a in range(1,n+1):
            if is_prime(a) == True:
                test_numbers.append(a)
        while int(len(test_numbers)) > 0:
            mx = int(max(test_numbers))
            while n % mx == 0:
                n = n/mx
                factors.append(mx)
            else:
                test_numbers.remove(mx)
        print factors


n = raw_input("What number would you like to factorize?  ")
factors(n)
print

thing = raw_input("Press ENTER to continue.")
sys.exit()

下面是使用一些Pythonic习惯用法(如列表理解)的一些改进:

import math
def factors(n):
    def is_prime(n):
        return not [m for m in xrange(2,int(math.sqrt(n))) if not n % m]

    primes = []
    test_numbers = xrange(2,n+1)
    test_number = 2
    while not primes and test_number in test_numbers:
        if not n % test_number and is_prime(test_number):
            primes = primes + [test_number] + factors(n/test_number)
        test_number += 1            
    return primes

n = raw_input("What number would you like to factorize? ")
n = int(n)
prime_factors = factors(n)
print prime_factors

它是快还是慢取决于n中有多少因子,如果n是素数,则速度最慢;如果n中有很多小素数,则速度最快。

您的算法速度慢,因为它做了太多的工作。不需要像for循环那样计算小于n的素数。而且不需要单独测试n的素性,因为算法将自行确定。下面是一个简单的程序,通过尝试除法计算整数:

>>> def factors(n):
...     f, fs = 2, []
...     while f * f <= n:
...        while n % f == 0:
...            fs.append(f)
...            n /= f
...        f += 1
...     if n > 1: fs.append(n)
...     return fs
... 
>>> factors(997)
[997]
>>> factors(13290059)
[3119, 4261]
>>> factors(1234098760912343)
[67, 103, 184117, 971279]
请注意,997被确定为素数。还要注意的是,一个大数字的系数是立即计算出来的,但不要指望这一点;试验划分的时间复杂度为Osqrtn,当n因子较大时,试验划分的速度较慢


有更好的方法来计算整数的因子。还有更好的方法通过试除法计算整数。但这应该足以让您开始。

因子分解是现代密码安全所依赖的最难的问题。查看此项了解更多详细信息answer@SainathMotlakunta:我以为那是解离散对数。这更适合于看这里: