📌  相关文章
📜  一个数的质因数 (1)

📅  最后修改于: 2023-12-03 15:21:26.176000             🧑  作者: Mango

一个数的质因数

在数学中,质因数是一个能够整除给定正整数的质数(素数)。例如,6的质因数为2和3,8的质因数为2,3的质因数为3。质因数分解是将一个正整数表示为一些质数(或幂的积)的乘积的过程。

实现过程

我们可以通过进行质因数分解来找到一个数的所有质因数。具体实现过程如下:

  1. 首先,我们找到该数的最小质因数 $p$。
  2. 如果该数可以整除 $p$,则记录下 $p$。
  3. 如果该数不能整除 $p$,则找到下一个质因数 $p_1$,重复步骤2。
  4. 重复步骤2和3,直到该数等于1。

下面是一个简单的 Python 实现:

def prime_factors(n):
    factors = []
    i = 2
    
    while n > 1:
        if n % i == 0:
            factors.append(i)
            n /= i
        else:
            i += 1
        
    return factors

该实现使用了一个 while 循环,不断地找到能够整除原数的最小质因数,并将其加入到结果列表中。最终,函数返回结果列表。

示例

下面是一个使用该函数的示例:

>>> prime_factors(12)
[2, 2, 3]
>>> prime_factors(35)
[5, 7]
>>> prime_factors(123)
[3, 41]
性能分析

该函数的时间复杂度为 $O(\sqrt{n})$,其中 $n$ 是待分解的数。这是因为,最小质因数 $p$ 不可能大于 $\sqrt{n}$。每次找到一个质因数都会将 $n$ 除以该质因数,因此最多只需要执行 $\sqrt{n}$ 次循环。

剪枝优化

当 $n$ 很大时,这个实现的速度会明显变慢。我们可以通过一些剪枝优化来加快速度,例如:

  • 只需在 $[2, \sqrt{n}]$ 范围内查找质因数。
  • 可以将找到的质因数存储在一个集合中,遇到已知质因数时直接除掉即可。

下面是使用以上优化后的代码实现:

def prime_factors(n):
    factors = []
    primes = set()
    
    for i in range(2, int(n ** 0.5) + 1):
        while n % i == 0:
            if i not in primes:
                primes.add(i)
            factors.append(i)
            n /= i
    
    if n > 1:
        factors.append(n)
    
    return factors

该优化实现的时间复杂度仍为 $O(\sqrt{n})$,但是在 $n$ 很大时的速度会有明显提升。