重复模式下的整数分解

3
我正在寻找一个高效的解决方案来解决特定的整数因子分解问题。这里的“高效”是指比当前的 O(2^n) 要快很多(其中n表示我们完成后数组中元素的数量)。
假设我们有以下数组:[4, 5, 11],并且一个“目标”值为84。
我们想要找出是否有可能满足 4*a + 5*b + 11*c = 84
给定以下限制条件:
0 <= a <= 3
0 <= b <= 2
0 <= c <= 1
如果我们没有找到解决方案,则向数组添加一个整数,比如15:[4, 5, 11, 15] 现在我们想知道是否有任何满足 4*a + 5*b + 11*c + 15*d = 84 的东西
给定以下限制条件:
0 <= a <= 4
0 <= b <= 3
0 <= c <= 2
0 <= d <= 1
...然后我们重复这个过程,直到找到一个解决方案,或达到n次。我想知道是否可以利用问题的重复性质来找到一个高效的解决方案:
目标不会改变
整数按升序排列
a、b、c…的最大约束每次增加1个
每重复一次都会向公式添加一些内容,但除了约束条件外什么都没有改变。
有什么想法吗?

1
当你有了第一个公式(包括abc)的解决方案后,你可以将完全相同的解决方案用于所有其他公式,只需将剩余变量(de等)设置为0即可。 - Amit
哦,抱歉如果我用了错误的术语。这个应该叫什么? - Atte Juvonen
@Amit 一旦我们找到了解决方案(在任何步骤),我们就可以停止这个过程。我会将这些信息编辑到问题中。 - Atte Juvonen
1
如果我没错的话,这个问题属于“整数线性规划”类别,已知它是NP难问题。因此,没有希望找到快速(多项式)解决方案。 - user1196549
1个回答

3
首先,术语是错误的。它不是整数分解,而是带有许多变量和一些附加约束条件的线性丢番图方程
如果没有你的限制条件,这将是一个简单的任务。只需找到GCD(系数列表),如果它可以整除自由项,则存在一个解,否则不存在。
对于你的限制条件,这可能是第一步,但是如果你发现有解,它们可能不符合限制条件。
我没有看到一个快速的(多项式解)方法,所以这是我会处理它的方式。你有enter image description here
我会使用meet in the middle approach,并将带约束条件的方程分为两部分: 第一部分enter image description here, 第二部分enter image description here 我会将它们分开,使得两个部分中执行的计算数量大致相同(考虑到约束条件)。
现在你需要迭代第一部分并将所有内容存储在字典中。然后迭代第二部分并检查答案是否存在于字典中。如果是,你就找到了一个解决方案。
这将指数除以2,但需要内存。

这个 数学答案 可能会帮助某人想出比我找到的更好的方法。


1
你提供的数学答案包含了一个非常有用的见解,它允许在某些情况下以 O(1) 的时间确定无解。因为必须满足 GCD(系数列表) 可以整除 k 且项是递增的。这意味着 k 必须小于或等于第一项(即最小值),才能存在解。这意味着对于 OP 的示例 4*a + ... = 84,无论添加多少项都不会有解。在这里,GCD 必须在 1 和 4(包括 1 和 4)之间,但这个值太低了,无法被 84 整除。 - Nuclearman
@Nuclearman,a、b、c...都可以为零,因此额外的项可能会得出一个解。例如,4*0 + 5*0 + ... + 84*1 = 84 - Atte Juvonen
我在理解如何应用GCD方面遇到了困难。例如,如果方程式为“3a + 8b = 10”,则3和8的最大公约数为1,可以整除10,这意味着即使没有解也会有一个解。我做错了什么吗? - Atte Juvonen
@AtteJuvonen:你混淆了“除数”的定义。在你的例子中,GCD(3,8) / 10 = 0.1,0.1不是整数,所以1不能被10整除。不过我承认,如果把0也算上,我的意思只是说你可以快速消除(将系数设为0,并保持不变)低于目标的任何项。因此,在你的例子中,只有在84x = 84时,你才需要开始测试系数。另外,如果你只考虑3 / 10 = 0.3和8/10 = 0.8,两者都不是整数。所以在这种情况下可以忽略它们。 - Nuclearman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接