查找数字优化的所有除数
我编写了以下函数,该函数查找给定自然数的所有除数,并将它们作为列表返回:
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
当检查单个数字时,此方法确实非常有效,但是我不确定是否应该使用它来编译所有素数直至某个边界。
-
通过计算 素数分解, 可以找到一个数字的所有除数。每个除数必须是因式分解中素数的组合。
如果有素数列表,这是获得因式分解的简单方法:
def factorize(n, primes): factors = [] for p in primes: if p*p > n: break i = 0 while n % p == 0: n //= p i+=1 if i > 0: factors.append((p, i)); if n > 1: factors.append((n, 1)) return factors
这称为审判分庭。有很多更有效的方法可以做到这一点。请参阅此处以获取概述。
现在,计算除数非常简单:
def divisors(factors): div = [1] for (p, r) in factors: div = [d * p**e for d in div for e in range(r + 1)] return div
计算所有除数的效率取决于查找素数的算法(此处小概述)以及因式分解算法。对于大量用户,后者总是很慢,对此您无能为力。