【发布时间】:2012-09-14 09:43:17
【问题描述】:
我编写了以下函数,它找到给定自然数的所有除数并将它们作为列表返回:
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过滤了大多数数字,但一些复合仍然会产生True! -
@BenRuijl 你能举个例子吗,非常感谢!
-
由于Fermat pseudoprimes,您的
CheckIfPrime功能无法正常工作。例如,CheckIfPrime(341)为 True,但 341 = 11*31。如果CheckIfPrime为 False,那么这个数肯定是合数,但反之则不成立。 [啊,对不起,错过了@BenRuijl 早先的相同效果的评论。不过,我会留下这个例子。] 但是,如果你只将它用作“CheckIfProbablyPrime”,它仍然很有用。 -
@DSM 非常感谢,我没有考虑到它不是双向的(费马定理)。我将其更改为 CheckIfProbablyPrime。我会采用你的方法。因此,为了使其具有确定性,我还应该检查所有先前产生的素数。
-
继续我的最后一句话:如果你使用这个“CheckIfProbablyPrime”函数来列出候选除数,那么其中有几个伪素数可能不是问题。如果您以递增顺序测试可除性并删除您找到的所有因数,则通过构造任何除以原始数字的伪素数都将已删除其因数,因此不会除以余数。
标签: python math mathematical-optimization