<p>关于你的问题1:<a href="http://en.wikipedia.org/wiki/Integer_factorization" rel="nofollow noreferrer">factoring is hard</a>。这就是为什么它是许多密码算法的核心——我们目前还不知道一种快速将一个非常大的数字因子化的方法。在</p>
<p>对于小数字,你的算法就可以了。对于稍微大一点的数字,我已经得到了<a href="https://math.stackexchange.com/questions/631559/algorithms-for-finding-the-prime-factorization-of-an-integer/631591#631591">same question</a>-显然<em>Pollard的Rho</em>是一个很好的算法。对于大量的人,我们不知道。在</p>
<p>现在回答你的问题2:</p>
<p>首先,在您的<code>prime(n)</code>函数中,您不需要一直检查<code>if n%i==0</code>,直到<code>n</code>。您只需要检查到<code>sqrt(n)</code>,因为如果有任何一对整数<code>(a,b)</code>,这样<code>a * b = n</code>,那么这些整数中的一个必然小于或等于<code>sqrt(n)</code>。所以你只需要检查<code>sqrt(n)</code>。这样可以节省大量计算。在</p>
<p>这是您的<code>factors</code>函数:</p>
<pre><code>from math import ceil
def factors(n):
factors = []
while n > 1:
for i in range(2,int((ceil(n/2.0))+1)):
if n%i==0:
factors.append(i)
n = n/i
continue
factors.append(n)
break
return factors
</code></pre>