【发布时间】:2011-02-06 23:43:02
【问题描述】:
我在这里寻找整数解决方案。我知道它有无数个从第一对解和 gcd(a,b)|c 派生的解。但是,我们怎样才能找到第一对解决方案呢?有没有什么算法可以解决这个问题?
谢谢,
陈
【问题讨论】:
-
您的网络搜索结果如何?
-
@David Heffernan:扩展欧几里得算法是我得到的,但我无法理解他们用非常奇怪的语言编写的伪代码。
我在这里寻找整数解决方案。我知道它有无数个从第一对解和 gcd(a,b)|c 派生的解。但是,我们怎样才能找到第一对解决方案呢?有没有什么算法可以解决这个问题?
谢谢,
陈
【问题讨论】:
请注意,并不总是有解决方案。事实上,只有c 是gcd(a, b) 的倍数才有解决方案。
也就是说,您可以为此使用extended euclidean algorithm。
这是一个实现它的 C++ 函数,假设为 c = gcd(a, b)。我更喜欢使用递归算法:
function extended_gcd(a, b)
if a mod b = 0
return {0, 1}
else
{x, y} := extended_gcd(b, a mod b)
return {y, x-(y*(a div b))}
int ExtendedGcd(int a, int b, int &x, int &y)
{
if (a % b == 0)
{
x = 0;
y = 1;
return b;
}
int newx, newy;
int ret = ExtendedGcd(b, a % b, newx, newy);
x = newy;
y = newx - newy * (a / b);
return ret;
}
现在,如果您有 c = k*gcd(a, b) 和 k > 0,则等式变为:
ax + by = k*gcd(a, b) (1)
(a / k)x + (b / k)y = gcd(a, b) (2)
因此,只需找到 (2) 的解决方案,或者找到 (1) 的解决方案,然后将 x 和 y 乘以 k。
【讨论】: