【问题标题】:How to optimize factorization code in Python?如何在 Python 中优化因式分解代码?
【发布时间】:2014-12-06 20:40:28
【问题描述】:

我最近用 Python 编写了一段代码,它接受用户输入的数字“n”并打印出该数字的质因数,包括重复质数。我非常兴奋,因为我已经为此工作了一段时间,但实际上它并没有那么好。任何大于 500,000 的 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()

【问题讨论】:

标签: python optimization factorization


【解决方案1】:

以下是使用一些 Python 风格的习语(例如列表理解)进行的一些改进:

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 是素数则最慢,如果它有很多小的素因子则最快)。

【讨论】:

    【解决方案2】:

    你的算法很慢,因为它做了太多的工作。无需像 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 被确定为素数。还要注意,大数的因子是立即计算的,但不要指望它;试除法的时间复杂度为O(sqrt(n)),当n的因素很大时,速度较慢。

    有更好的方法来分解整数。通过试除法还有更好的方法来分解整数。但这应该足以让您入门。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 2017-03-13
      • 2017-09-03
      相关资源
      最近更新 更多