【问题标题】:Factorizing an integer in a list of integers在整数列表中分解整数
【发布时间】:2016-04-19 16:31:17
【问题描述】:

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

【问题讨论】:

  • 在整数列表中分解一个整数是什么意思?通常的解释是整数是列表的一个元素,而您只想分解整数(因此列表甚至无关紧要),但这似乎不是您要说的。是否需要来自列表的因素?如果可以,是否可以重复使用因子?
  • 您无需重新检查n%x is 0。您的 fac_list 已经过滤了这些值。 else: continue 也是不必要的。您可以将其重写为if n/x is 1 or can_factorize_in_list(n/x, fac_list): return True。并且请返回布尔值而不是 0/1,这将使您的代码更清晰,更少hacky
  • 因子必须来自列表,是的。因子也可以多次使用。
  • 不要使用list作为变量名,你会隐藏内置的list
  • 问题出在 NP 中;如果输出为“是”,则有效的分解用作答案为“是”的多项式时间可检查的证书。

标签: python np factorization


【解决方案1】:

不需要深度优先搜索,问题在潜在因素列表的大小上是线性的。这是一个函数,它要么返回目标数的因式分解,要么返回 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,因为这是您要计算的数论中的概念:对给定列表进行因数分解的数字在该因数列表上平滑 .对于大多数应用程序,您可能希望所有潜在因素都是素数。

【讨论】:

  • 这个贪心算法不能解决我要解决的问题。如果列表fs 中的元素都是素数,它会起作用,但情况不一定如此。一个简单的反例:n = 46fs = [2,46]。您描述的算法将首先除以 2,然后在 23xs 中没有因子。
  • 将函数调用为smooth(46, [46,2]) 似乎可行。如果做不到这一点,您可以分解目标和列表的每个成员并比较因素。您要解决的实际问题是什么?
猜你喜欢
  • 2012-03-21
  • 2016-01-08
  • 1970-01-01
  • 2015-03-01
  • 2015-11-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多