扩展欧几里德算法是用来在已知a, b求解一组整数解x,y,使它们满足贝祖等式(具体不是很清楚是啥意思,反正就那样): \(ax+by = gcd(a, b) =d\)(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。
对于普通的公式\(ax+by = c\)有整数解的条件是\(c=k*gcd(a, b)\),k为任意常数。
对于公式\(ax+by = gcd(a, b) =d\),求解其中一个x,y的方法及其证明
显然当 \(b=0,gcd(a,b)=a\)时,此时 \(x=1, y=0\);
\(a>b>0\) 时,设
\[
ax_1+ by_1= gcd(a,b)
\]
\[ bx_2+ (a\ mod\ b)*y_2= gcd(b,\ a\ mod\ b) \]
根据朴素的欧几里德原理有
\[
gcd(a,b) = gcd(b,a\ mod\ b)
\]
则:
\[
ax_1+ by_1= bx_2+ (a\ mod\ b)y_2
\]
即:
\[
ax_1+ by_1= bx_2+ (a - [a / b] * b)y_2=ay_2+ bx_2- [a / b] * by_2
\]
说明: \(a-[a/b]b\)即为mod运算。\([a/b]\)代表取小于\(a/b\)的最大整数,下面同样适用。
也就是
\[
ax_1+ by_1 == ay_2+ b(x_2- [a / b] *y_2)
\]
根据恒等定理,对应项的系数相等得:
\[
x_1=y_2
\]
\[ y_1=x_2- [a / b] *y_2 \]
这样我们就得到了求解 \(x_1,y_1\) 的方法:\(,,,x_1,y_1\) 的值基于\(,,, x_2,y_2\)。使用递归的话,上一层的值,取决于下一层。
上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以结束。
递归边界:
\[
gcd(a,\ 0)=1*a-0*0=a
\]
对于公式\(ax+by = c\),求解x,和y的方法
如何求\(ax+by = gcd(a, b) =d\)最小整数解,对于\(ax+by = c\),c为常数,也适用。
\[ ax_1+by_1=ax_2+by_2 \]
? (因为它们都等于\(gcd(a,b)\) ),变形得
\[
a(x_1-x_2)=b(y_2-y_1)
\]
? 假设\(gcd(a,\ b)=g\),方程左右两边同时除以g(如果g=0,说明a或b等于0,可以特殊判断),得
\[
a'(x_1-x_2)=b'(y_2-y_1)
\]
? 其中\(,,,a'=a/g,b'=b/g\)。
? 注意,此时a‘和b‘互素(想想分数的化简)
\[
x_1-x_2=\frac{b'}{a'}*(y_2-y_1)
\]
? 则因此\(x_1-x_2\)一定是b‘的整数倍(因为a‘中不包含b‘,所以\(x_1-x_2\)一定包含b‘)。
? 设它为\(x_1-x_2=k*b'\),计算得\(y_2-y_1=k*a'\)。注意,上述的推导过程并没有用到\(ax+by\)的右边是什 么,因此得出以下结论:
? 设a,b,c为任意整数,若方程\(ax+by=c\)的一组解是\((x_0,y_0)\),则它的任意整数解都可以写
? \((x_0+k*b',y_0-k*a')\),其中\(a'=[a/gcd(a,b)]\),\(b'=[b/gcd(a,b)]\),k取任意整数。
? 这样我们就可以求出来最小的整数解了。(先用扩展欧几里得算法求出一组解,然后进行变换)
原文:https://www.cnblogs.com/alking1001/p/11268144.html