扩展欧几里德算法复习

NOI 前发点比较无聊的东西。

感觉这么多公式会让人看着想睡觉,也不知道怎么解决。

求不定方程 \(Ax+By=C(A,B,C\in \mathbb Z)\) 的所有整数解。
\(|A|,|B|,|C|\le 10^{18}\)

裴蜀定理:这个方程有解当且仅当 \(\gcd(A,B)|C\)
证明:\(\gcd(A,B)\not|C\) 时原方程无解是显然的。对于 \(\gcd(A,B)|C\) 的情况一定有解,接下来构造解。

  • \(A=B=0\) 时,必有 \(C=0\),显然任何整数对 \((x,y)\) 都属于解集。

  • \(A=0,B\ne 0\) 时,\(x\) 可以是任意整数,而 \(y=C/B\)\(A\ne 0,B=0\) 同理。

  • \(A,B\) 都非 \(0\) 时,可不妨假设 \(A>0,B>0\)(其他情况的解都可以取反得到)。

    \(d=\gcd(A,B),a=A/d,b=B/d,c=C/d\)

    那么 \(ax+by=c\) 的解就是我们想要的。注意到这时候 \(a,b\) 互质了。

    • \(c=0\) 时,因为 \(a,b\) 互质,\((x,y)=(kb,-ka),k\in \mathbb Z\)

    • \(c\ne 0\) 时,考虑两个不同的解 \((x_0,y_0)\)\((x_1,y_1)\),有
      \(ax_0+by_0=c\)
      \(ax_1+by_1=c\)
      相减得
      \(a(x_0-x_1)+b(y_0-y_1)=0\)

      根据 \(c=0\) 的情况,\((x_0-x_1,y_0-y_1)=(kb,-ka),k\in \mathbb Z\)

      因此如果我们有了一组特解 \((x_0,y_0)\),那么就有 \((x,y)=(x_0+kb,y_0-ka),k\in \mathbb Z\)

      那么现在的关键是得到 \((x_0,y_0)\)。尝试先构造 \(ax+by=1\) 的一组解,再乘上 \(c\)。这部分就使用了经典的扩展欧几里德算法了。

      假设我们已经构造出了 \(bx'+(a\mod b)y'=1\) 的解 \((x',y')\)
      \(bx'+(a-\lfloor a/b\rfloor b)y'=1\)
      \(ay'+b(x'-\lfloor a/b\rfloor y')=1\)

      我们发现 \(x=y',y=x'-\lfloor a/b\rfloor y'\)

      \((x',y')\) 的话,往下递归即可。边界是 \(b=0\) 的情况,此时必有 \(a=1\),那么令 \(x=1,y=0\) 即可(用这个解是为了方便,也是为了不爆精度)。

那么我们就做完了。

还有一个问题,为什么这样写不会爆精度。也就是说求出来的那个特解最大会是多少。

关于这个,有一位高级科学家给出了很高级的界,在这里。可惜我没有那么高级,我觉得够用就好。

所以我只证明这样子求出来的 \(ax+by=1\) 的那个解 \((x,y)\) 会满足 \(\max(|x|,|y|)\le \max(a,b)\)

不妨假设 \(a\ge b>0\)\(a<b\) 的话,第一次迭代只相当于把 \(a\)\(b\) 交换,\(x\)\(y\) 也交换)。其实这时候有 \(|x|\le b,|y|\le a\)。我们证明它。

\(a\mod b=0\) 时,必然有 \(b=1\)。经过简单模拟可以发现求出的 \(x=0,y=1\),必满足条件。

\(a\mod b\ne 0\) 时,有 \(b\ge a\mod b >0\)。如果已经证明对于方程 \(bx'+(a\mod b)y'=1\) 的解 \((x',y')\) 满足 \(|x'|\le a\mod b,|y'|\le b\),我们可以推出所得到的 \(ax+by=1\) 的解也符合条件,如下:

首先不管怎样,\(x'\)\(y'\) 不能全都为正数,但是必有一个正数,这是显然的。并且当 \(x'>0,y'\le 0\) 时,\(x\le 0,y>0\);而 \(x'\le 0,y'>0\) 时,\(x>0,y\le 0\)

由此容易得到,\(|x|=|y'|,|y|=|x'|+\lfloor a/b\rfloor|y'|\)

\(|x'|\le a\mod b,|y'|\le b\) 得,

\(|x'|\le a-\lfloor a/b\rfloor b\)
\(\lfloor a/b\rfloor|y'|\le \lfloor a/b\rfloor b\)

两式子相加即得 \(|y|=|x'|+\lfloor a/b\rfloor|y'|\le a\),同时 \(|x|=|y'|\le b\)

由数学归纳法,我们证完了。

posted on 2021-07-21 19:16  Dreamunk  阅读(102)  评论(0编辑  收藏  举报

导航