编写一个程序来检查线性方程是否具有正整数解

时间:2014-12-13 11:13:20

标签: algorithm math equation linear diophantine

我正在尝试编写一种算法,以确定线性方程,特别是ax + by = c的形式,对于给定的a,b,c是否具有正整数解。它需要是有效的,因为数字a,b和c可以在0 <= a,b,c <= 10 ^ 16的范围内。我该如何处理这个问题?

由于这是一个丢番图方程,我试图检查a和b的GCD是否除以c,但这样我无法区分正,负或零解。

Algorithm to determine non-negative-values solution existance for linear diophantine equation

我在这里找到了一个解决方案,但我并不太明白。也许有人可以为我简化它?由于这个很通用,我只对2个变量的方程感兴趣。

1 个答案:

答案 0 :(得分:6)

存在

Bezout's identity确实告诉你,使用a和b的最大公约数(gcd)d,我们有:

  

i)d是可以写成ax + by的最小正整数,以及ii)ax + by形式的每个整数都是d的倍数。

所以你去吧。如果c可以被d分割,你就有了解决方案。

符号

从任何一对解决方案中,我们都可以获得所有其他解决方案。因此,我们可以看出它们是否可以是积极的。仍然来自同一身份,我们得到:

  

当计算了一对Bézout系数(x0,y0)时(例如,使用扩展欧几里得算法),所有对都可以表示形式   all solutions

现在我们已经完成了。您所要做的就是:

  1. 使用扩展的欧几里德算法,它将为你提供d和一对(x0,y0)的ax + by = d
  2. 检查d是否除c。如果不是,则不存在解决方案。如果是这样,将x0和y0乘以(c / d)得到等式的解。
  3. 如果x0和y0现在都有相同的符号,那么你就完成了。如果它是积极的,你有积极的解决方案,如果它是负面的,你没有。
  4. 如果x0和y0具有不同的符号,请选择最小(绝对值)k来更改负整数的符号。
    • 也就是说,如果x0为负数,则取k = d x0 / b,如果是y0,则取k = -d y0 / a。适当地舍入k以得到与x0(resp.y0)具有不同符号的整数x1(相应的y1)。我认为你应该将它向下舍入(至-infinity),因此要注意负数上的整数除法,它们会向0舍入。
    • 计算(x1,y1) = (x0 - k b/d , y0 + k a/d)
    • 如果它们都是正数,那么您只需找到两个正整数解。如果轻拍一个数字的符号翻转另一个数字,则无法找到正解。
  5. 请注意,它与您链接的问题有关,但变量的数量不同。这是因为你只有两个变量。