我写了下面的功能,找到一个给定的自然数的所有约数,并返回它们作为一个列表进行了一些优化的所有除数:寻找
def FindAllDivisors(x):
divList = []
y = 1
while y <= math.sqrt(x):
if x % y == 0:
divList.append(y)
divList.append(int(x/y))
y += 1
return divList
它的作品真的很好,不同的是它真的很慢当输入是一个18位数字时。你对我如何加快速度有什么建议吗?
更新:
我有以下方法基于费马小定理来检查素性:
def CheckIfProbablyPrime(x):
return (2 << x - 2) % x == 1
检查单号时,此方法是非常有效的,但是我不确定我是否应该用它来编译所有素数达到某个边界。
您是否使用'CheckIfPrime'来查看是否可以跳过某个x的分区?你应该小心这一点,因为你可以得到误报:'CheckIfPrime'过滤大部分数字,但一些复合仍然会产生'真'! –
@BenRuijl请给我一个例子,非常感谢! –
由于[Fermat pseudoprimes](http://en.wikipedia.org/wiki/Fermat_pseudoprime),您的'CheckIfPrime'函数不起作用。例如,'CheckIfPrime(341)'为True,但是341 = 11 * 31。如果'CheckIfPrime'为False,那么这个数字肯定是复合的,但是反过来并不成立。 [对不起,我错过了BenRuijl先前的评论。不过,如果仅将它用作“CheckIfProbablyPrime”,它仍可能有用。 – DSM