我正在尝试编写一种算法,以确定线性方程,特别是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个变量的方程感兴趣。
答案 0 :(得分:6)
Bezout's identity确实告诉你,使用a和b的最大公约数(gcd)d,我们有:
i)d是可以写成ax + by的最小正整数,以及ii)ax + by形式的每个整数都是d的倍数。
所以你去吧。如果c可以被d分割,你就有了解决方案。
从任何一对解决方案中,我们都可以获得所有其他解决方案。因此,我们可以看出它们是否可以是积极的。仍然来自同一身份,我们得到:
当计算了一对Bézout系数(x0,y0)时(例如,使用扩展欧几里得算法),所有对都可以表示形式
现在我们已经完成了。您所要做的就是:
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)
请注意,它与您链接的问题有关,但变量的数量不同。这是因为你只有两个变量。