浅谈扩展欧几里得算法
一.算法简析
扩展欧几里得算法(又称exgcd),是来求解形如下面格式方程的解。
ax + by = c
其中a,b,c已经给出,x,y为待求解的变量。
扩欧算法规定,当 c%gcd(a,b)!=0的时候,上面方程不存在整数解。
这个结论可以由贝祖定理推出:
即如果a、b是整数,那么一定存在整数x、y使得ax+by=gcd(a,b)
当上面的方程有解时,我们可以一定得到一组特解。下面我们就要推导下求特解的过程。
二.算法推导
首先,我们知道gcd(a,b) = gcd(b,a%b),再由上面的式子,我们可以推导得到
ax1+by1 = gcd(a,b) = gcd(b,a%b) = bx2 +(a%b)y2
而a%b又等于a - a/b*b(此处除法为向下取整)
根据等式两边对应项对应相等的原则,我们可以得到以下关系
x1 = y2
y1 = x2 - a/b*b*y2
通过比较辗转相除法,考虑递归解决问题,应用上面的式子,我们可以发现连接递归上下层的是gcd(a,b) = gcd(b,a%b),因此,递归的终止条件是b==0,此时将x=1,y = 0。
然后根据上面x1,y1,x2,y2的关系,就可以不断递归推导出原方程的解。详细细节可以看代码。
三.代码实现
typedef long long ll; void exgcd(ll a,ll b,ll& x1,ll& y1) { if(b==0) { x1 = 1; y1 = 0; return ; } ll x2,y2; exgcd(b,a%b,x2,y2); x1 = y2; y1 = (x2-a/b*y2); return ; }
四.相关例题