再次迭代,素数循环,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]
我最近在 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]