这是我的分解代码,用于查找数字的所有因子,但在大约7位数后,程序开始减速。
所以我想知道是否有任何优化此程序的方法可以让它更快地分解数字。
number = int(input("Input the whole number here?\n"))
factors = [1]
def factorization():
global factors
for i in range(1 , number):
factor = (number/i)
try:
factorInt = int(number/i)
if factorInt == factor:
factors.append(factorInt)
except ValueError:
pass
factorization()
print(factors)
答案 0 :(得分:0)
让我提供一个基于NumPy的解决方案。这似乎非常有效:
import numpy as np
def factorize(number):
n = np.arange(2, np.sqrt(number), dtype=int)
n2 = number / n
low = n[n2.astype(int) == n2]
return np.concatenate((low, number // low,))
factorize(34976237696437)
#array([ 71, 155399, 3170053, 492623066147, 225073763, 11033329])])
# 176 msec
答案 1 :(得分:0)
最有效的优化是通过注意当数字具有非平凡因子,并且它们中的最小值小于数字的平方根时,并且不需要继续循环遍历此平方根。
确实,让这个最小因子为m
。我们有n = m.p
,另一个因素是p >= m
。但是如果m > √n
,那么m.p >= n
就是矛盾。
请注意,此优化只会加快素数的处理(对于复合数字,搜索会在√n
之前停止)。但素数的密度和n
比√n
大得多的事实使它绝对值得。
另一个优化是指出最小的除数必须是素数,并且你可以使用存储的素数表。 (低于10亿的素数少于5100万。)加速将不太明显。