拓展欧几里德算法

对于 \(ax+by=c\) (其中 \(a,b,c\) 已知),要求整数解(不一定是正数) \(x,y\).

根据裴蜀定理 \(\forall a,b,\exists x,y,\ 使 ax+by=g,(其中g=gcd(a,b))\)
\(ax+by=c\) 等式两边同时除以 \(g\)
\(a^{'}x+b^{'}y=c/g\),如果 \(c\ 不能被\ g\ 整除\) ,则等式右边为分数,左边为整数,显然无解.
如果\(\ c\ 能被\ g\ 整除\),设 \(c=\mu g\) ,我们先探讨一下 \(ax+by=g\) 的通解.
拓展欧几里德算法模板

void gcd(int a,int b,int &d,int &x,int &y)
{
	if(!b){d=a;x=1;y=0;}
	else { gcd(b,a%b,d,y,x);y -= x*(a/b);}
}

应用上面的算法已经求出了一组\(\{x_1,y_1\}\),那么如何求出所有的解呢?
设还有一组解 \(x_2,y_2\).那么有\(ax_1+by_1=ax_2+by_2=g\),移项得 \(a(x_1-x_2)=b(y_2-y_1)\),等式两边除以 \(g\) ,有 \(a^{'}(x_1-x_2)=b^{'}(y_2-y_1)\),考虑到 \(a^{'}与b^{'}\)互质,因此一定有\((x_1-x_2)=kb^{'},(y_2-y_1)=ka^{'}\).\(记x_0,y_0为ax+by=g的一组解\),那么\(ax+by=g\)的通解就是\(x=x_0+kb^{'},y=y_0-ka^{'},k\in Z,其中a^{'}=a/g,b^{'}=b/g\)
下面来求\(ax+by=\mu g\)的解.首先\(\mu x_0,\mu y_0一定是ax+by=\mu g\)的一组解
\(x_1,y_1,x_2,y_2\)是两组解
\(ax_1+by_1=\mu g\)
\(ax_2+by_2=\mu g\)
\(a(x_2-x_1)+b(y_2-y_1)=0\)
\(a(x_2-x_1)+b(y_2-y_1)\equiv 0\ mod\ \mu g\),那么一定也有
\(a(x_2-x_1)+b(y_2-y_1)\equiv 0\ mod\ g\)
\(a(x_2-x_1)=b(y_2-y_1)\),发现式子与上面 \(ax+by=g\) 求通解的过程是一样的,所以\(ax+by=\mu g\)的通解为\(x=\mu x_0+kb/g,y=\mu y_0-ka/g,(k\in Z,x_0,y_0是ax+by=g的一组解)\)

要求特解,只需求出 \(ax+by=g\) 的解,再乘以 \(\mu\) 即可.只需应用拓展欧几里得即可求解.所以我们以后只考虑 \(ax+by=g\) 的解,只需把这个式子的特解\(x_0,y_0\)再乘以 \(\mu\) 就是一个特解.那么通解即为\(x=\mu x_0+kb/g,y=\mu y_0-ka/g,(k\in Z)\)

注意到: \(ax+by=g\) 的解的 \(\mu\) 倍一定是 \(ax+by=\mu g\)的解,但根据通解的形式我们容易发现\(ax+by=\mu g\)的解并不全是 \(ax+by=g\) 的解的 $\mu $倍.

posted @ 2022-10-22 21:08  LZH_03  阅读(23)  评论(0编辑  收藏  举报