问题
求两个整数x,y,满足不定方程:
a×x+b×y=gcd(a,b) 其中a,b是正整数,gcd(a,b)是a,b的最大公约数。
解法
扩展欧几里得算法来源于最大公约数的特性,即对于正整数a,b的最大公约数gcd(a,b),必然存在整数x,y满足本题的等式。
根据上一节Euclid中的迭代式:
a0b0⋯akbk====abbk−1ak−1modbk−1 存在相应的整数xk−1,yk−1,xk,yk满足:
ak−1×xk−1+bk−1×yk−1=gcd(ak−1,bk−1)=gcd(ak,bk)=ak×xk+bk×yk 变换等式得到:
ak−1×xk−1+bk−1×yk−1=bk−1×xk+(ak−1modbk−1)×yk 注意到两正整数的取模运算满足:
pmodq=p−⌊qp⌋×q 其中⌊p⌋表示向下取整,小于等于p的最大整数。
可以推导出:
ak−1×xk−1+bk−1×yk−1=bk−1×xk+(ak−1−⌊bk−1ak−1⌋×bk−1)×yk 将上面等式按照参数ak−1,bk−1等式变换,得到:
ak−1⋅(xk−1)+bk−1⋅(yk−1)=ak−1⋅(yk−1)+bk−1⋅(xk−⌊bk−1ak−1⌋⋅yk) 由于等式两边括号外的参数完全相同,可得:
xk−1yk−1==ykxk−⌊bk−1ak−1⌋⋅yk 递归的最后一步n+1时有an+1=bn,bn+1=0。这时有一组解:
an+1×xn+1+bn+1×yn+1=gcd(an+1,bn+1)xn+1=1,yn+1=0 在辗转相除发计算最大公约数时,每一步中都可以顺带着计算出这一步的x,y,最后得到一组解。该算法的时间复杂度约为O(log2(max(a,b)))。
Exgcd
源码
ExtendedEuclid.h
ExtendedEuclid.cpp
测试
ExtendedEuclidTest.cpp