例如,数字为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算法在这种情况下似乎是一个很好的解决方案,但它无法获得所有这些。有没有更快的方法来解决这个问题?
答案 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