拓欧复习课

今天学习了拓展欧几里得,你不是会吗?
很多题解对我来说啃起来有难度,我在这里写一下自己的理解吧。
(所以下面每句话都是对我来说的

\(Part\;1\).

欧几里得算法。
一行了事,没大问题。

\(Code\):

int gcd(int a, int b) return b==0?a:gcd(b,a%b);

相关定理:
\[gcd(a,b)=\dfrac{ab}{lcm(a,b)}\]
挺有用的。

\(Part\;2\).

裴蜀定理。
不定方程
\[ax+by=c\]
有整数解的充分条件是:
\[gcd(a,b)|c\]
很简单,设\(a=k_1gcd(a,b),b=k_2gcd(a,b)\),
左边\(=(k_1x+k_2y)gcd(a,b)=\)右边,存在解。
得证。
例题:P4549 【模板】裴蜀定理
裴蜀定理对多元不定方程仍成立。

\(Part\;3\).

不定方程。
考虑有解的不定方程:
\[ax+by=c\]
的一组解。
运用裴蜀定理,两边同时除以\(gcd(a,b)\),假设为:
\[a'x+b'y=c'\]
同时除以\(c'\),得:
\[a'\dfrac{x}{c'}+b'\dfrac{y}{c'}=1\]
\(x'=\dfrac{x}{c'},y'=b'\dfrac{y}{c'}\),方程化为:
\[a'x'+b'y'=1\]
可以跑拓欧了。
等一下,拓欧咋跑?

\(Part\;4\).

拓展欧几里得。
求解方程:
\[ax+by=1\]
或是
\[ax\equiv1\pmod{b}\]
找个\(y\)值,使得\(ax=by+1\),显然\(ax-by=1\),这里令\(y\leqslant0\),得:
\[ax+by=1\]
就是上式了。
显然\(a,b\)互质。
我们令\(a_1=b,b_1=(a\;mod\;b)\),得一新方程:
\[a_1x_1+b_1y_1=1\]
我们的任务就是找这两个方程的解了。
由取模定义:
\(a\;mod\;b=a-b\left\lfloor\dfrac{a}{b}\right\rfloor\),可得:
\[bx_1+(a-b\left\lfloor\dfrac{a}{b}\right\rfloor)y_1=1=ax+by\]
整理一下可知:
\[ay_1+b(x_1-y_1\left\lfloor\dfrac{a}{b}\right\rfloor)=ax+by\]
那么原方程的解为:
\[x=y_1,y=x_1-y_1\left\lfloor\dfrac{a}{b}\right\rfloor\]
那么\(x_1,y_1\)怎么求呢?
发现可以递归,最后会出现:
\[x=1,b_n=0,a_n=1\]
如果是求逆元,记得处理负数。
下面放上板子题代码:

\(Code\)

void exgcd(ll a,ll b)
{
    if(b==0)
    {
        x=1,y=0;
        return;
    }
    exgcd(b,a%b);
    ll t=x;
    x=y;
    y=t-a/b*y;
}
int main()
{
    ll a,b;
    cin>>a>>b;
    exgcd(a,b);
    x=(x+b)%b;
    cout<<x;
    return 0;
}

\(Part\;5\).

不定方程(进阶)。
上面说过一些,不过这里是找通解。
有个结论:
\[\begin{cases}x_t=x_0+b't\\y_t=y_0-a't\end{cases}\]
证明很费解:
发现只需证\(ax_t+by_t=1\)即可。
若成立
左边=\(a(x_0+b't)+b(y_0-a't)=ax_0+by_0+ab't+a'bt=1+\dfrac{abt}{gcd(a,b)}-\dfrac{abt}{gcd(a,b)}=1\)=右边。
得证。

\(Part\;6\).

关于\(x,y\)的最小(大)整数解。
对于\(x\),就是个碾转相除嘛,求出的特解\(x\)一定是:
\[x=x_{min}+b'k\]
\(b'\)取模即得\(x_{min}\)
其实是满足:
\[x_{min}+a'x_{max}=c'\]
的。
那么解的数量:
\[sum=\dfrac{x_{max}-x_{min}}{b'}+1\]
这些同理于\(y\)
就这些了,只差代码了,还没打,让他先咕一会吧。
咕中......

猜你喜欢

转载自www.cnblogs.com/tlx-blog/p/12334239.html
今日推荐