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

定义:

   对于不完全为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

转载于:https://www.cnblogs.com/onestow/p/4333228.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值