【问题标题】:Optimising Factoring Program优化保理程序
【发布时间】:2017-09-11 16:16:08
【问题描述】:

这是我的因式分解代码,用于查找一个数字的所有因数,但在大约 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)

【问题讨论】:

  • 可能不是很大的改进,但是为什么你在try语句中使用number/i两次而不是使用factor
  • 你研究过这个吗?你应该先试试。两个微不足道的优化 - 您不需要检查 sqrt(number) 上面的内容,也不需要检查 2 之后的偶数。

标签: python optimization factors


【解决方案1】:

最有效的优化是注意当数有非平凡因数,且其中最小的小于数的平方根时,不需要继续循环越过这个平方根。

确实,让这个最小的因子为m。我们有n = m.p,另一个因素是p >= m。但是如果m > √n,那么m.p >= n,就矛盾了。


请注意,这种优化只会加快素数的处理速度(对于复合数,搜索会在√n 之前停止)。但是素数的密度和n√n 大得多的事实使它绝对值得。


另一个优化是注意最小除数必须是素数,您可以使用存储的素数表。 (10 亿以下的质数少于 5100 万个。)加速将不太明显。

【讨论】:

    【解决方案2】:

    让我提供一个基于 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多