如何在不到1秒的时间内找到只有少数几个因子的所有因子?

时间:2017-05-13 13:00:21

标签: python performance numbers

例如,数字为3000000021,其素因子为3和1000000007。

以传统方式,例如

n=int(raw_input())
d=2
factors=[]
while n!=1:
    if n%d==0:
        factors.append(d)
        n/=d
    else:
        d+=1
print factors

分析这样的数字需要永远。

Pollard的Rho算法在这种情况下似乎是一个很好的解决方案,但它无法获得所有这些。有没有更快的方法来解决这个问题?

1 个答案:

答案 0 :(得分:0)

即使是一个非常简单的factors()函数,只有sqrt(n)+1限制的简单优化,在子1s中完成

In [1]:
def factors(n):
    for a in range(2, int(n**0.5)+1):
        if n % a:
            continue
        yield from {a, n//a}

In [2]:
list(factors(3000000021))

Out[2]:
[3, 1000000007]

In [3]:
%timeit list(factors(3000000021))

Out[3]:
100 loops, best of 3: 6.69 ms per loop

如果你只需要素因子,那么你需要一个有效的素数生成器(可以在SO上找到很多例子),然后:

In [4]:
def pfactors(n):
    for p in primes():
        while n % p == 0:
            yield p
            n //= p
        if p*p > n:
            if n > 1:
                yield n
            break

list(pfactors(3000000021))

Out[4]:
[3, 1000000007]

速度取决于您的素数发生器。对于我的python素数生成器:

In [5]:
%timeit list(pfactors(3000000021))

Out[5]:
100 loops, best of 3: 6.13 ms per loop