欧几里定理 :gcd(a,b)=gcd(b,a%b) 第二位=0时 第一位=gcd
所谓扩展欧几里得就是在欧几里得定理的基础上求解 ax+by=gcd(a,b)的东东;
推导:
1. 当b等于0的时候,a就是最后的gcd(a,b),那么我们很容易构造出一组x,y 即为x=1,y=0,也就是 1a+0b==a,剩下的我们想办法通过这组解推出来。
2. 设 a x1+ b y1= gcd(a,b) ;
b x2+ (a mod b) y2 = gcd(b,a mod b);
根据朴素的欧几里德原理有 gcd(a,b) = gcd(b,a mod b); 则:ax1+ by1= bx2+ (a mod b)y2;
即:ax1+ by1= bx2+ (a - [a / b] * b)y2=ay2+ bx2- [a / b] * by2;
也就是ax1+ by1 == ay2+ b(x2- [a / b] *y2);
根据恒等定理得:x1=y2; y1=x2- [a / b] *y2;
3.由以上的推导可知,在求解gcd(a,b)的回溯过程中,我们可以由x=1,y=0,的第一组解倒退回来找到原方程的解;
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
int gcd=0;
void gcd(int a,int b,int &x,int &y)
{
if(b==0) {x=1,y=0;gcd=a;return ;}
exgcd(b,a%b,y,x);
y=y-a%b*x;
}
int main()
{
int a,b,x,y;
gcd(a,b,x,y);
return 0;
}
exgcd(b,a%b,y,x); // 将x,y 倒置
y=y-a%b*x;自己推一下就好啦 , 一定不能打错哦