重复模式中的整数分解

时间:2016-01-07 23:33:48

标签: algorithm math integer diophantine

我正在寻找一种特定整数因子分解的有效解决方案。有效率我的意思比O(2^n)快得多,我目前拥有它(n表示完成后数组中元素的数量)。

假设我们有以下数组:[4, 5, 11]和“目标”84。

我们想知道是否可以满足4*a + 5*b + 11*c = 84

给出以下约束:

  • 0 <= a <= 3
  • 0 <= b <= 2
  • 0&lt; = c&lt; = 1

如果我们找不到解决方案,我们会在数组中添加一个整数,比方说15:[4, 5, 11, 15]

现在我们想知道是否满足4*a + 5*b + 11*c + 15*d = 84

鉴于

  • 0 <= a <= 4
  • 0 <= b <= 3
  • 0&lt; = c&lt; = 2
  • 0 <= d <= 1

...我们重复这个过程,直到找到解决方案,或者最多n次。我想知道我们是否可以利用问题的重复属性来找到有效的解决方案:

  • “目标”不会改变
  • 整数按升序排列
  • 每次添加新元素时,a,b,c ...的最大约束都会增加1
  • 每次重复都会添加到公式中,但不会更改任何内容(约束除外)

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

首先,这个词是错误的。它不是integer factorization,而是一个线性diophantine equation,其中包含许多带有一些额外约束的变量。

没有你的约束,这将是一件容易的事。只需找到GCD(list of coefficients),如果它除了免费术语 - 你有一个解决方案,否则它没有。

使用你的约束它可能是第一步,但是如果你看到有解决方案,它们可能不满足约束。

我没有看到快速(多项式解决方案)所以这就是我将如何解决它。你有enter image description here

我会在middle approach中使用meet,并将约束分为两部分:

第1部分enter image description here

第2部分enter image description here

我会将它们分开,以便在两个部分中执行的计算次数大致相同(考虑到约束条件)。

现在,您遍历第一部分并将所有内容存储在字典中。然后迭代第二个并检查字典中是否存在答案。如果是,您找到了解决方案。

这将指数除以2,但需要记忆。

math answer可能有助于某人找到一种我无法找到的更好的方法。