前言:在网上找半天拓展欧几里得算法的教学视频,没找到简单易懂的,终于找到一个老师讲得不错的,视屏链接贴在本文末尾
了解拓展欧几里得算法前所需要的基本知识:
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;
}
内容来源