Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 求解线性丢番图方程的算法是什么:ax+by=c_Algorithm_Numbers - Fatal编程技术网

Algorithm 求解线性丢番图方程的算法是什么:ax+by=c

Algorithm 求解线性丢番图方程的算法是什么:ax+by=c,algorithm,numbers,Algorithm,Numbers,我在这里寻找整数解。我知道它有无穷多个解,由第一对解和gcda,b | c导出。然而,我们如何才能找到第一对解决方案?有解决这个问题的算法吗 谢谢, Chan请注意,并非总是有解决方案。事实上,只有当c是gcda,b的倍数时才有解 也就是说,您可以使用 这里是一个C++函数,它实现了C=GCDA,B。我更喜欢使用递归算法: function extended_gcd(a, b) if a mod b = 0 return {0, 1} else {

我在这里寻找整数解。我知道它有无穷多个解,由第一对解和gcda,b | c导出。然而,我们如何才能找到第一对解决方案?有解决这个问题的算法吗

谢谢,
Chan

请注意,并非总是有解决方案。事实上,只有当c是gcda,b的倍数时才有解

也就是说,您可以使用

这里是一个C++函数,它实现了C=GCDA,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*gcda,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。

注意,并不总是有解。事实上,只有当c是gcda,b的倍数时才有解

也就是说,您可以使用

这里是一个C++函数,它实现了C=GCDA,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*gcda,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。

你的网络搜索结果是什么?@David Heffernan:我得到的是扩展的欧几里德算法,但我无法理解他们用一种非常奇怪的语言编写的伪代码。你的网络搜索结果是什么?@David Heffernan:我得到的是扩展的欧几里德算法,但我无法理解他们用一种非常奇怪的语言编写的伪代码。@Ivad:谢谢,你能简要解释一下它是如何工作的吗?我试图用C++实现它,但是我不能得到预期的结果。@ IVIad:谢谢,你能简要地解释一下它是如何工作的吗?我试图用C++实现它,但是我不能得到预期的结果。