拓展欧几里得算法

前言:在网上找半天拓展欧几里得算法的教学视频,没找到简单易懂的,终于找到一个老师讲得不错的,视屏链接贴在本文末尾

了解拓展欧几里得算法前所需要的基本知识:

1.欧几里得算法——其实就是辗转相除法。

2.gcd(a,b)含义,其实就是a,b的最小公约数。(性质:gcd(a,b)=gcd(b,a%b))

进入正题

问题:求ax +by= gcd(a,b)的一组整数解

扩展欧几里得算法

当b=0时ax+ by= a故而x= 1,y=0

当b≠0时,由欧几里得算法gcd(a, b) = gcd(b, a%b),

由裴蜀定理,

gcd(a,b)=ax + by 

gcd(b, a%b)= bx1 + (a%b)y1

                   =bx1+(a-a/b*b)y1  (这里的/ 是整除)

                   = ay1+ b(x1 - a/b*y1)

所以x=y1, y=x1-a/b*y1  (/是整除)

可以用递归算法,先求出下一层的x1,y1.

再回代到上一层,层层回代,可求特解(X0,Y0)

构造通解

x=x0+b/gcd(a,b)*k

y=y0-a/gcd(a,b)*k

(考虑ax+ by= 0构造)

例: 8x+6y=2

解:(1,-1),(4,-5),(7,-9)..

下面贴代码

欧几里得算法(辗转相除法)

int gcd(int a,int b){
    if(b==0) return a;
    return gcd(b,a%b);
}

拓展欧几里得算法

int exgcd(int a,int b,int &x,int &y){   //返回x,ytejie
    if(b==0){
        x=1,y=0; //当b==0时,x=1,y=0
        return a;  //返回最大公约数
    }
    int x1,y1,d;  //引入三个变量
    d=exgcd(b,a%b,x1,y1);
    x=y1;  //由上面的递推返回上一层
    y=x1-y1*(a/b);//同理
    return d;
}

内容来源

b站老师


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值