Python数十亿次迭代循环

时间:2014-09-06 02:15:36

标签: python loops iteration

我是编程新手,所以请耐心等待。

我写了这段代码来找到一个数字的最大素数因子,但是当我输入十亿或更多的数字时,它并没有解决。我尝试过xrange,但我使用的是Python 3.4。有人能指出我正确的方向吗?

done = False

num = int(input("Enter a number: "))

for j in range(num,2,-1):

        if (num % j) != 0:
            continue
        for i in range(2,j):     
            if (j % i) != 0:
                continue
            break


        else: break

print(j)

2 个答案:

答案 0 :(得分:2)

它是一种O(n ^ 2)算法。它没有似乎解决,因为它只需要很长时间。解?使用numpy。或者找一个非天真的算法,或者自己写一个。 Eratosthenes的筛子是一个很好的起点。

答案 1 :(得分:1)

由于您不熟悉编程,这是一个简单的解决方案(但要知道有更复杂的解决方案更有效)。首先请注意,您只需要检查除数的平方根之前的除数,因为如果num = a * b,则一个小于平方根,一个大于。其次,你只需要检查素数除数。

您可以按如下方式生成素数列表:

import math
import itertools

def primes_generator():
    """Generator for the infinite list of primes."""
    primes = [2, 3]
    for prime in primes:
        yield prime
    for c in itertools.count(5, 2):
        bound = math.sqrt(c)
        for p in primes:
            if not (c % p):
                break
            if p > bound:
                primes.append(c)
                yield c
                break

现在找到所有的主要除数:

def prime_factorization(number, primes=None):
    if not primes:
        primes = primes_generator()
    factorization = dict()
    for p in primes:
        count = 0
        while not (number % p):
            number = number / p
            count = count + 1
        if count:
            factorization[p] = count
        if number == 1:
            return factorization

最大的除数是字典中最大的关键。这些函数应该适用于相当大的输入。在我的机器上,以下需要0.06秒。

 print(max(prime_factorization(1000000001).keys()))