欧几里得
LL gcd(LL a,LL b){return (b==0) ? a : gcd(b,a%b);}
扩展欧几里得
int ex_gcd(int a,int b,int &x,int &y){//返回的是最大公约数
if(b==0){
x = 1;
y = 0;
return a;
}
int d = ex_gcd(b,a%b,x,y);
int t = x;
x = y;
y = t-a/b*y;
return d;
}
扩展欧几里德定理 对于与不完全为0的非负整数a,b,gcd(a,b)表示a,b的最大公约数。那么存在整数x,y使得gcd(a,b)=ax+by。
求解x,y的方法的理解
我们不妨设a>b。 1,显然当b=0,gcd(a,b)=a。此时x=1,y=0; 2,ab<>0时 设ax1+by1=gcd(a,b); bx2+(a%b)y2=gcd(b,a%b); 根据朴素欧几里德原理有gcd(a,b)=gcd(b,a%b); 则:ax1+by1=bx2+(a%b)y2;
即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2; 根据恒等定理得:x1=y2; y1=x2-(a/b)*y2; 这样我们就得到了求解x1,y1的方法:x1,y1的值基于x2,y2. 上面的思想是递归定义了,因为gcd不断的递归求解一定会有个时候b=0,所以递归可以结束。