项目Euler Q3 Python非常慢

时间:2017-05-09 15:07:54

标签: python performance

我是一个完整的编码初学者,所以我认为通过解决项目欧拉问题我可以变得更好,我被困在问题3上。

" 13195的主要因素是5,7,13和29。 数字600851475143的最大主要因素是什么?"

我的代码适用于较小的数字示例,但是当我尝试较大的代码时,它需要永远运行,如何才能使代码更高效?

n=3 #factors
l=[]
flag = True
while(n<600851475143):
  a=3
  if (600851475143%n==0):
    while(a<n):
      if n%a!=0:
        a+=2
      else:
        flag = False
        break
    if(flag):
      l.append(n)  

  n+=2 
print(l[len(l)-1])

2 个答案:

答案 0 :(得分:2)

您可以采取一些措施来加快此代码的速度。 首先是更多地了解数学和素数的一些属性。

Prime numbers

Integer factorization

Why do we check up to the square root of a prime number to determine if it is prime or not

另一件事是(至少对我而言),你的代码真的难以阅读......试着让你的意图更清晰。

我尝试在python中提出一个解决方案,并在我的计算机上运行0.15s

#!/usr/bin/env python
import math

def square_root_as_int(x):
  return int(math.sqrt(x))

def is_prime(number):
  if number == 1:
    return False
  for x in range(2, square_root_as_int(number) + 1):
    if x == number:
      next
    if number % x == 0:
      return False
  return True

def factors_of_(number):
  factors = []
  for x in range(2, square_root_as_int(number) + 1):
    if number % x == 0:
      factors.append(x)
      factors.append(number/x)
  return factors

factors = factors_of_(600851475143)
primes = []
for factor in factors:
  if is_prime(factor):
    primes.append(factor)
print max(primes)

# Bonus: "functional way"
print max(filter(lambda x: is_prime(x), factors_of_(600851475143)))

答案 1 :(得分:0)

你也可以使用generators,这对我有用。

以下是一个例子:

# Set variables
number = 600851475143
primeFactorList = []

def primeList(number):
    # Make list of prime numbers < 'number'
    for x in range(2, number+1):
        isPrime = True
        # Don't calculate for more than the sqrt of number for efficiency
        for y in range(2, int(x**0.5)+1):
            if x % y == 0:
                isPrime = False
                break
        if isPrime:
            yield x

# Calculate  primes using primeList and check for prime factors of 'number'
for i in primeList(number):
    if i > number**0.5:
        break
    if number % i == 0:
        primeFactorList.append(i)

# Print largest prime factor of 'number'
print(max(primeFactorList))