我正在我发现的网站(项目Euler)上解决此问题,并且有一个问题涉及找到数字中最大的素数。我的解决方案大量失败,所以我想知道如何简化此代码?
""" Find the largest prime of a number """
def get_factors(number):
factors = []
for integer in range(1, number + 1):
if number%integer == 0:
factors.append(integer)
return factors
def test_prime(number):
prime = True
for i in range(1, number + 1):
if i!=1 and i!=2 and i!=number:
if number%i == 0:
prime = False
return prime
def test_for_primes(lst):
primes = []
for i in lst:
if test_prime(i):
primes.append(i)
return primes
################################################### program starts here
def find_largest_prime_factor(i):
factors = get_factors(i)
prime_factors = test_for_primes(factors)
print prime_factors
print find_largest_prime_factor(22)
#this jams my computer
print find_largest_prime_factor(600851475143)
使用大量数字时,它会失败,这是我猜到的问题的重点。 (计算机出现故障,告诉我我的内存不足,并询问我要停止哪些程序)。
************************************** 谢谢您的回答。在任何情况下,代码中实际上都有几个错误。因此,此(无效代码)的固定版本如下。
""" Find the largest prime of a number """
def get_factors(number):
factors = []
for integer in xrange(1, number + 1):
if number%integer == 0:
factors.append(integer)
return factors
def test_prime(number):
prime = True
if number == 1 or number == 2:
return prime
else:
for i in xrange(2, number):
if number%i == 0:
prime = False
return prime
def test_for_primes(lst):
primes = []
for i in lst:
if test_prime(i):
primes.append(i)
return primes
################################################### program starts here
def find_largest_prime_factor(i):
factors = get_factors(i)
print factors
prime_factors = test_for_primes(factors)
return prime_factors
print find_largest_prime_factor(x)
最佳答案
通过您的方法,您首先要在n
中生成数字O(n)
的所有除数,然后在另一个O(n)
调用的test_prime
数目(无论如何都是指数)中测试这些除数中的哪一个是质数。
更好的方法是观察到,一旦找到一个数的除数,就可以反复除以该数,以消除所有因素。因此,要获得odt_code的素数,请测试所有小的素数(缓存的),对于除以数字的每个素数,请保持除法:
830297
可被830297
整除,因此现在您将使用13
进行测试830297 / 13 = 63869
仍可被63869
整除,您在13
上4913
不除以13,下一个素数是4913
,它将17
除以得到4913
289
仍然是289
的倍数,您拥有17
这是除数和终止点。 为了进一步提高速度,在测试了下面表示为
17
的缓存素数之后,您必须使用100
函数(根据@Ben的答案进行更新)测试素数除数,但从test_prime
开始进行相反的操作。您的数字可被sqrt
整除,下一个数字将给出71
的sqrt
,它与最大素数91992
有点相似。关于python - 找到大量最大素数的有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24166478/