📜  给定数 N 的不同素因数(1)

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

给定数 N 的不同素因数

在数学中,一个数可以被分解为不同素因数的乘积。素因数是指不能再分解为其他因数的质数。给定一个数N,如何找到它的不同素因数呢?

方法一:暴力分解

我们可以从小到大枚举每个质数,尝试将N分解为这些质数的乘积。如果可以分解,则加入结果数组中,同时将N除以这个质数继续分解。如果无法分解,则继续枚举下一个质数。

def get_prime_factors(N):
    factors = []
    i = 2
    while i * i <= N:
        while N % i == 0:
            factors.append(i)
            N /= i
        i += 1
    if N > 1:
        factors.append(N)
    return factors

代码解释:

  1. 初始化一个空数组factors用于存储不同素因数。
  2. 从2开始枚举每个质数。
  3. 当N可以被当前质数整除时,说明当前质数是N的一个因数。将这个质数加入到结果数组factors中,同时将N除以这个质数继续分解。
  4. 如果当前质数不是N的因数,则继续枚举下一个质数。
  5. 如果N最终无法被分解为小于等于$\sqrt{N}$之内的质数的乘积,说明N本身就是一个质数。将N加入结果数组中。

该算法的时间复杂度为$O(\sqrt{N})$,空间复杂度为$O(\sqrt{N})$。

方法二:试除法

我们可以用更简单的方法来分解N的不同素因数,即试除法。我们从2开始尝试将N分解成2的倍数,如果不行,就尝试3的倍数、5的倍数、7的倍数,以此类推。注意,当我们试到$N/\sqrt{N}$时,如果依然没有找到素因子,那么我们就可以确定N本身就是一个质数。

def get_prime_factors(N):
    factors = []
    i = 2
    while i * i <= N:
        if N % i == 0:
            factors.append(i)
            N /= i
        else:
            i += 1
    if N > 1:
        factors.append(N)
    return factors

代码解释:

  1. 初始化一个空数组factors用于存储不同素因数。
  2. 从2开始枚举每个数。
  3. 如果N可以被当前数整除时,说明当前数是N的一个因数。将这个数加入到结果数组factors中,同时将N除以这个数继续分解。
  4. 如果当前数不是N的因数,则继续枚举下一个数。
  5. 如果N最终无法被分解为小于等于$\sqrt{N}$之内的数的乘积,说明N本身就是一个质数。将N加入结果数组中。

该算法的时间复杂度平均为$O(\sqrt{N}/\ln N)$,最坏情况下为$O(N)$,但实际运行速度比暴力分解快多了。空间复杂度为$O(1)$。

总结

以上两种算法都能够找到一个数的不同素因数,试除法更加简单,但其时间复杂度可能最坏情况下很高。实际应用中,要根据具体情况选择不同的算法。