对整数列表中的整数进行分解

时间:2016-04-19 16:31:18

标签: python np factorization

我正在尝试编写一个脚本,用于确定是否可以对整数列表中的整数值进行分解。我这样做的方法是搜索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。不需要使用列表中的所有元素作为因子,因子可以多次使用。

1 个答案:

答案 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 超过该列表因素。对于大多数应用程序,您可能希望所有潜在因素都是主要因素。