再次迭代,素数循环,python

Iterating again, prime factors loop, python

我最近在 python 中创建了一个函数,它将为我提供您在 python 中选择的任何数字的所有因子。我现在想修改它以仅显示主要因素。我目前拥有的功能是:

def prime_factors(n):
L = []
i = range(1, n+1)
for x in i:
    if n % x == 0:
        L.append(x)
return L

现在,为了找到质因数,我想通过 L 重新迭代,并从 L 中删除任何数字,当除以任何数字直至其自身时,余数将为 0。

所以,基本上,我只想获取我现在拥有的列表,在我附加它之后,然后将列表中的每个值除以每个数字直到那个数字,以确保它不能被整除任何余数为 0 的东西。

我试过:

def prime_factors(n):
    L = []
    i = range(1, n+1)
    for x in i:
        if n % x == 0:
            L.append(x)
    for y in L:
        for x in i:
            if y % x == 0:
                L.remove(y)
    return L

此外,我尝试将其拆分为 2 个不同的函数...

def prime_factors(n):
    L = []
    i = range(2, n)
        for x in i:
            if n % x == 0:
                L.append(x)
    return L

def prime(n):
     L = prime_factors(n)
     i = range(2, n)
         for y in L:
            for x in i:
                if x % y == 0:
                    L.remove(x)
     return L

我试过把 returns 放在不同的地方,我试过翻转循环的顺序,无论如何,我不知道如何 运行 列表 L通过另一个检查,看看其中的值是否可以被 0 整除...

您可以简单地使用一个函数 return True/False 求素数

import math
def is_prime(n):
    if n % 2 == 0 and n > 2: 
        return False
    return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))

def prime_factors(n):
    L = []
    i = range(1, n+1)
    for x in i:
        if n % x == 0:
            if is_prime(x):
                L.append(x)
    return L

按如下方式修改您的 prime_factors 函数:

def prime_factors(n):
    L = []
    i = range(2, n+1)  # start from 2 as it is the first prime
    for x in i:
        if n % x == 0:
            L.append(x)
            # loop added
            while n%x == 0:
                n = n/x
        # break as no further factors are possible
        if n == 1:
            break
    return L

现在,while n%x == 0 所做的是,它从原始数字中删除了某些因子的幂。

例如,
n = 24 = 2*2*2*3 n%2 == 0,所以 L = [2] 并且 n 变为 3 [这确保 4 或 8,它们是非素数,不会附加到 L]