我正在尝试编写一个脚本,用于确定是否可以对整数列表中的整数值进行分解。我这样做的方法是搜索recursivley以获得有效的因式分解,有效地在可能因素的树中执行DFS(在下面的代码中)。有可能制作一个贪婪的算法,发现这么快吗?我的想法是继续在列表中搜索剩余部分中的最大因子,直到找到有效的因式分解。在这种情况下,这是一个正确的算法吗?如果没有,这是NP的问题吗?
解决用Python编写的问题的代码:
def can_factorize_in_list(n, list):
# Determines whether it is possible to factorize 'n' in 'list'
# Filter the list to only include the values which are factors
fac_list = [p for p in list if (n % p is 0)]
for x in fac_list:
if n % x is 0:
if n/x is 1:
# If we end up at 1, we have a valid factorization
return 1 # End state
else:
# If we do not end at 1, keep trying
if can_factorize_in_list(n/x, fac_list):
return 1
else:
continue
return 0
编辑:例如,给定整数30和列表[2,3,5,8],算法应返回True,因为30 = 2 * 3 * 5。不需要使用列表中的所有元素作为因子,因子可以多次使用。
答案 0 :(得分:0)
不需要深度优先搜索,并且问题在潜在因素列表的大小上是线性的。这是一个函数,它返回目标数的分解,如果不能在因子列表中计算,则返回False:
def smooth(n, fs):
xs = []
for f in fs:
if n == 1: return xs
while n % f == 0:
n = n / f
xs.append(f)
if n == 1: return xs
return False
我调用了函数smooth
,因为这是您尝试计算的数论中的概念:对于给定列表的因子被称为 smooth 超过该列表因素。对于大多数应用程序,您可能希望所有潜在因素都是主要因素。