【问题标题】:What's algorithm used to solve Linear Diophantine equation: ax + by = c求解线性丢番图方程的算法是什么:ax + by = c
【发布时间】:2011-02-06 23:43:02
【问题描述】:

我在这里寻找整数解决方案。我知道它有无数个从第一对解和 gcd(a,b)|c 派生的解。但是,我们怎样才能找到第一对解决方案呢?有没有什么算法可以解决这个问题?

谢谢,

【问题讨论】:

  • 您的网络搜索结果如何?
  • @David Heffernan:扩展欧几里得算法是我得到的,但我无法理解他们用非常奇怪的语言编写的伪代码。

标签: algorithm numbers


【解决方案1】:

请注意,并不总是有解决方案。事实上,只有cgcd(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) 的解决方案,然后将 xy 乘以 k

【讨论】:

  • @IVIAd:谢谢,你能简单解释一下它是如何工作的吗?我尝试使用 C++ 来实现它,但我无法得到预期的结果。
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多