扩展欧几里德算法的定义、解释、证明及其应用

定义:

   对于不完全为0的两个整数a,b,gcd(a,b)表示a,b的最大公约数

   则必然存在整数对x,y,使得gcd(a,b)=ax+by。

   (由数论中的相关定理可知,至于这个相关定理是什么,我也不清楚扩展欧几里德算法的定义、解释、证明及其应用我也不深究这个)

解法及证明:

    显然当b=0时,有x=1,y=0。

   由欧几里德算法我们知道gcd(a,b)=gcd(b,a%b)(PS:%为求余运算符)

   所以我们可以得到以下关系式:a*x1+b*y1=b*x2+a%b*y2,该式等同于a*x1+b*y1=b*x2+(a-[a/b]*b)*y2

   变形可得a*x1+b*y1=a*y2+b*(x2-[a/b])

   所以我们可以得到以下递推式:x1=y2,y1=x2-[a/b],结合①为递推结束条件,即可求解.

   

代码实现:

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

由一组解推出所有解:

   已知x1,y1是二元一次方程ax+by=c的一组整数解,则其所有解的通式为x=x1+kb,y=y1-ka(k为整数)

   证明:略

推广到一般二元一次方程求整数解:

   例如我们要求二元一次方程ax+by=c的整数解

   令d=gcd(a,b),如果c%d!=0的话,则无整数解(这个很容易证明,我就不多说了扩展欧几里德算法的定义、解释、证明及其应用

方程两边除以d得a/d*x+b/d*y=c/d,这里显然gcd(a/d,b/d)=1
所以我们可以先用扩展欧几里德算法求出a/d*x+b/d*y=1的解
然后求出的x和y再乘以c/d即为原二元一次方程的一组整数解
 
 
 
相关题目:poj1061、poj2115
posted @ 2013-07-31 22:17  Netop  阅读(139)  评论(0编辑  收藏  举报