如何在Python中优化因子分解代码?
我最近用Python编写了一段代码,它接受用户输入的数字n并打印该数字的素数因子,包括重复素数。我非常兴奋,因为我已经为此工作了一段时间,但实际上效果并不好。任何大于500000的n都需要很长时间才能计算,我想知道是否有任何方法可以优化它如何在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:
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:我以为那是解离散对数。这更适合于看这里: