ExtendedEuclid 扩展欧几里得算法

问题

求两个整数x,yx, y,满足不定方程:

a×x+b×y=gcd(a,b)a \times x + b \times y = gcd(a, b)

其中a,ba, b是正整数,gcd(a,b)gcd(a,b)a,ba, b的最大公约数。

解法

扩展欧几里得算法来源于最大公约数的特性,即对于正整数a,ba, b的最大公约数gcd(a,b)gcd(a,b),必然存在整数x,yx, y满足本题的等式。

根据上一节Euclid中的迭代式:

a0=ab0=bak=bk1bk=ak1modbk1\begin{matrix} a_{0} & = & a \\ b_{0} & = & b \\ \cdots \\ a_{k} & = & b_{k-1} \\ b_{k} & = & a_{k-1} \bmod b_{k-1} \end{matrix}

存在相应的整数xk1,yk1,xk,ykx_{k-1}, y_{k-1}, x_{k}, y_{k}满足:

ak1×xk1+bk1×yk1=gcd(ak1,bk1)=gcd(ak,bk)=ak×xk+bk×yka_{k-1} \times x_{k-1} + b_{k-1} \times y_{k-1} = gcd(a_{k-1}, b_{k-1}) = gcd(a_{k}, b_{k}) = a_{k} \times x_{k} + b_{k} \times y_{k}

变换等式得到:

ak1×xk1+bk1×yk1=bk1×xk+(ak1modbk1)×yka_{k-1} \times x_{k-1} + b_{k-1} \times y_{k-1} = b_{k-1} \times x_{k} + (a_{k-1} \bmod b_{k-1}) \times y_{k}

注意到两正整数的取模运算满足:

pmodq=ppq×qp \bmod q = p - \lfloor \frac{p}{q} \rfloor \times q

其中p\lfloor p \rfloor表示向下取整,小于等于pp的最大整数。

可以推导出:

ak1×xk1+bk1×yk1=bk1×xk+(ak1ak1bk1×bk1)×yka_{k-1} \times x_{k-1} + b_{k-1} \times y_{k-1} = b_{k-1} \times x_{k} + (a_{k-1} - \lfloor \frac{a_{k-1}}{b_{k-1}} \rfloor \times b_{k-1}) \times y_{k}

将上面等式按照参数ak1,bk1a_{k-1}, b_{k-1}等式变换,得到:

ak1(xk1)+bk1(yk1)=ak1(yk1)+bk1(xkak1bk1yk)a_{k-1} \cdot (x_{k-1}) + b_{k-1} \cdot (y_{k-1}) = a_{k-1} \cdot (y_{k-1}) + b_{k-1} \cdot (x_{k} - \lfloor \frac{a_{k-1}}{b_{k-1}} \rfloor \cdot y_{k})

由于等式两边括号外的参数完全相同,可得:

xk1=ykyk1=xkak1bk1yk\begin{matrix} x_{k-1} & = & y_{k} \\ y_{k-1} & = & x_{k} - \lfloor \frac{a_{k-1}}{b_{k-1}} \rfloor \cdot y_{k} \end{matrix}

递归的最后一步n+1n + 1时有an+1=bn,bn+1=0a_{n+1} = b_{n}, b_{n+1} = 0。这时有一组解:

an+1×xn+1+bn+1×yn+1=gcd(an+1,bn+1)xn+1=1,yn+1=0\begin{matrix} a_{n+1} \times x_{n+1} + b_{n+1} \times y_{n+1} = gcd(a_{n+1}, b_{n+1}) \\ x_{n+1} = 1, y_{n+1} = 0 \end{matrix}

在辗转相除发计算最大公约数时,每一步中都可以顺带着计算出这一步的x,yx, y,最后得到一组解。该算法的时间复杂度约为O(log2(max(a,b)))O(log_2 (max(a, b)))

Exgcd

源码

ExtendedEuclid.h

ExtendedEuclid.cpp

测试

ExtendedEuclidTest.cpp

Last updated