问题描述: d=gcd(a,b)=ax+by, (1)求出满足条件的x和y。
这个问题的求解有助于计算模乘法的逆。
Extended-Eculid要求输入两个非负整数,返回一个满足方程(1)的 triple (d,x,y)
a b floor(ab) d x y
[function begin]
extended-euclid(a,b)
if b==0 return (a,1,0) // 递归的出口:求解x和y不需要初始值,因此递归的出口处有初始值,x=1,y=0;
(d',x',y')=extended-euclid(b,a mod b) //递归步骤:与经典euclid方法一致,因为最大公约数都是一样的。
(d,x,y)=(d',y',x'-floor(a/b)*y)// 更新步骤
return (d,x,y)
[function end]
解说
(d',x',y')=extended-euclid(b,a mod b) //递归
这个关键的递归步骤中,d=ax+by(1)
因此 d=bx'+(amodb), 即extended-euclid(b,a mod b)中b充当a的角色,amodb充当b的角色
所以d=bx'+[a-floor(a/b)*b]*y'=ay'+b(x'-floor(a/b)*y'), 因此对于d=ax+by(1),此时选择了 x=y',y=x'-floor(a/b)*y',即递归下面的更新步骤