查找数字优化的所有除数

发布于 2021-01-29 17:17:47

我编写了以下函数,该函数查找给定自然数的所有除数,并将它们作为列表返回:

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

当检查单个数字时,此方法确实非常有效,但是我不确定是否应该使用它来编译所有素数直至某个边界。

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    通过计算 素数分解, 可以找到一个数字的所有除数。每个除数必须是因式分解中素数的组合。

    如果有素数列表,这是获得因式分解的简单方法:

    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
    

    计算所有除数的效率取决于查找素数的算法(此处小概述)以及因式分解算法。对于大量用户,后者总是很慢,对此您无能为力。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看