【问题标题】:Finding largest prime factor of a given number in Python [duplicate]在Python中找到给定数字的最大素数[重复]
【发布时间】:2018-06-24 21:42:35
【问题描述】:

这是一个欧拉计划问题。 数字 600851475143 的最大质因数是多少? 我写了以下代码-:

def prime_factors(x):
    my_list = []
    for no3 in range(2, int(x)):
        i = 0
        if x % no3 == 0:
            for a in range(1, int(no3)):
                if no3 % a == 0:
                    i = i + 1
            if i == 1:
                my_list.append(no3)
    print(max(my_list))

prime_factors(600851475143)

它适用于小数字,但对于像“600851475143”这样的大数字,代码不会给出输出,它只是继续运行。 我想知道这段代码有什么问题,我该如何解决。

【问题讨论】:

  • 这个数字比较大,你的代码必须在第一个循环中循环大量数字(提示:你不需要那么多数字)和第二个循环中的大量数字,所以可能需要很长时间才能完成。
  • 这在 Code Golf 或 Software Engineering StackExchange 网站上可能会更好。
  • 做过研究吗?仅通过搜索您要考虑的数字,stackoverflow 就有超过 300 次点击。
  • 再一次,模组将某些东西标记为重复,即使它不是重复的。这个问题专门询问Python,另一个问题是关于Java。

标签: python primes prime-factoring


【解决方案1】:

您的每个循环都是从 2 到 n,因此对于 2 个循环,您的循环必须运行 square(n) 次,然后才能给您答案

如果你稍微改变你的循环,你可以让它更快。要找到数 n 的因数,您不必检查所有小于 n 的数。如果您检查 int(sqrt(n)) 就足够了。对于 2 和 int(sqrt(n)) 之间的每个因子 x,n/x 也将是一个因子。

因此,通过将循环更改为仅运行 int(sqrt(n)),您的代码将运行得更快

from math import sqrt 

def is_prime(n): 
    for a in range(2, int(sqrt(n))): 
        if n % a == 0: 
            return False 
    return True 

def prime_factors(x): 
    my_list = [] 
    for no3 in range(2, int(sqrt(x))): 
        if x % no3 == 0: 
            # no3 and x/no3 are factors of x 
            if is_prime(no3): 
                my_list.append(no3) 
            if is_prime(x/no3): 
                my_list.append(no3) 
    print(max(my_list)) 

现在尝试这个我们得到

>>> prime_factors(600851475143)
6857
>>> 

【讨论】:

  • 目标数是奇数,所以没有偶数因数。检查可能因素时,从第 3 步和第 2 步开始,因此只检查奇数可能因素。这应该会使搜索时间减半。
  • 是的...还有很多可以做的优化;但想尽可能地维护 OP 的代码我希望 OP 会尝试你的建议并尝试更多
  • 感谢@Sunitha 女士的帮助,但在平方根小于最大因子的情况下,检查直到目标数的平方根将不起作用。例如,在数字 10 的情况下,最大因子是 5,但平方根是 3.16,因此此代码将返回 2 作为输出,而它应该给出 5。
猜你喜欢
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
  • 2015-11-18
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多