`
lovnet
  • 浏览: 6704833 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

扩展欧几里得算法

 
阅读更多

如果事先不了解 欧几里得算法 ,请点击

扩展欧几里得算法:对于不完全为0的非负整数 a,b,必然存在整数对 X,Y,使得 aX + bY = gcd(a,b)。

解法见注释。

/*
    How to solve "aX + bY = gcd(a,b)" ?

1、if b=0,

     gcd(a,b) = a,

     X = 1 , Y is any number.

     For convenience,we make Y equals 0.

2、if b!=0,

    gcd(a,b)   = aX1 + bY1;

    gcd(b,a%b) = bX2 + (a%b)Y2;
                 ----> (a-a/b*b)Y2;

--> aX1 + bY1  = aY2 +  b(X2-a/b*Y2);

--> X1 = Y2 , Y1 = X2-a/b*Y2;

    So we can use recursion to sovle it.

*/
#include <stdio.h>

int GCD;

void ExGcd(int a,int b,int &x,int &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        GCD = a;
        return ;
    }
    ExGcd(b,a%b,x,y);
    int t = x;
    x = y;
    y = t - a/b*y;
}

int main()
{
    int a,b,x,y;
    scanf("%d%d",&a,&b);
    ExGcd(a,b,x,y);
    printf("gcd(%d,%d) -> %d * %d + %d * %d\n",a,b,a,x,b,y);
	return 0;
}
下面讨论如何用扩展欧几里得算法解决不定方程 aX + bY = c。

1、当 c mod gcd(a,b) = 0 的时候,该方程才有整数解。

2、方程可转化为 aX + bY = gcd(a,b) * c/gcd(a,b)。

等价于 aX/(c/gcd(a,b)) + bY/(c/gcd(a,b))= gcd(a,b)。

所以将方程 aX + bY = gcd(a,b) 的解乘以 c/gcd(a,b) 即可得到解 X0,Y0。


对于上述两个方程的其他解,我们可以用方程 a(X0+△X) + b(Y0+△Y) = c 表示。

于是得到 a△X + b△Y = 0,即 △X / △Y = - b/a = - ( b/gcd(a,b) ) / ( a/gcd(a,b) ) = t。( t 为与X、Y无关的参数)

于是方程的所有解可以用 X = X0 + b/gcd(a,b)*t , Y = Y0 - a/gcd(a,b)*t 来表示。


另外有一个没有证明过的猜想:利用上述方法求出的 (X0,Y0) 是所有 |X| + |Y| 的值中最小的(并不一定唯一),从而有X0 < |b|。(假设a < b)



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics