Python求解质数因子的方法

什么是质数因子?

质数因子(Prime Factors)是指一个正整数可以分解为一系列质数的乘积。例如:

12的质数因子是2, 2, 3(因为12 = 2 × 2 × 3)

30的质数因子是2, 3, 5(因为30 = 2 × 3 × 5)

每个大于1的整数要么本身是质数,要么可以表示为质数的乘积,这就是算术基本定理。

Python求解质数因子的方法

方法1:基本算法

def prime_factors(n):

   factors = []

   divisor = 2

   while divisor <= n:

    if n % divisor == 0:

      factors.append(divisor)

      n = n // divisor #整数除法(地板除)

    else: divisor += 1

   return factors

# 示例

print(prime_factors(12)) # 输出: [2, 2, 3]

print(prime_factors(30)) # 输出: [2, 3, 5]

print(prime_factors(17)) # 输出: [17]

def primeFactor(a):

   res = []

   while a>1:

    for i in range(2,a+1):

      if a%i == 0:

        res.append(i)

        a = int(a/i)

        break

   return res

print(primeFactor(12)) # 输出: [2, 2, 3]

print(primeFactor(30)) # 输出: [2, 3, 5]

print(primeFactor(17)) # 输出: [17]

print('8/5:',8/5,'5/2:',5/2) # 输出:8/5: 1.6 5/2: 2.5

print('8//5:',8//5,'5//2:',5//2)#输出: 8//5: 1 5//2: 2

 

方法2:优化算法(减少不必要的检查)

def prime_factors(n):

factors = []

# 先处理2的因子

while n % 2 == 0:

factors.append(2)

n = n // 2

 

# 然后检查奇数,从3开始,步长为2

divisor = 3

while divisor * divisor <= n:

while n % divisor == 0:

factors.append(divisor)

n = n // divisor

divisor += 2

 

# 如果剩下的n是大于2的质数

if n > 2:

factors.append(n)

 

return factors

 

# 示例

print(prime_factors(315)) # 输出: [3, 3, 5, 7]

print(prime_factors(100)) # 输出: [2, 2, 5, 5]

方法3:使用字典返回质因数及其指数

def prime_factors(n):

factors = {}

divisor = 2

 

while divisor <= n:

if n % divisor == 0:

factors[divisor] = factors.get(divisor, 0) + 1

n = n // divisor

else:

divisor += 1

return factors

 

# 示例

print(prime_factors(12)) # 输出: {2: 2, 3: 1}

print(prime_factors(100)) # 输出: {2: 2, 5: 2}

方法4:使用sympy库(适合大数分解)

from sympy import factorint

 

# 返回质因数及其指数的字典

print(factorint(12)) # 输出: {2: 2, 3: 1}

print(factorint(1000000000000000000)) # 输出: {2: 18, 5: 18}

选择哪种方法?

  1. 对于小数字或简单应用,方法1或方法2足够
  2. 如果需要知道每个质因数的指数,使用方法3
  3. 对于非常大的数字或需要高性能的场景,使用方法4(sympy库)

所有方法都能正确找出质数因子,只是实现方式和效率有所不同。

 

posted @ 2025-03-26 21:26  sealis  阅读(91)  评论(0)    收藏  举报