扩展欧几里得算法学习记

  话说以前我刷(noip)题的时候就想学这个东西了,结果却一直拖到了现在……

  到了高二才会这种东西的我实在是个蒟蒻啊!

  讲扩展欧几里得算法之前,先讲讲欧几里得算法是什么:(gcd(a,b)=gcd(b,a mod b))。很显然是不?但我们还是要给出证明(设(r=a mod b)):

  设$x$是$a,b$的一个公约数,由于存在$k=lfloorfrac{a}{b} floor$使得$a=k*b+r$,又由于$x|a$,$x|b$,则有$x|r$,所以$x$是$b,r$的公约数

  设$x$是$b,r$的一个公约数,因为存在$k=lfloorfrac{a}{b} floor$使得$a=k*b+r$,且$x|b$,$x|r$,那么$x|a$,所以$x$是$a,b$的公约数

  综上所述,$a$和$b$的所有公约数 等价于 $b$和$a mod b$的所有公约数,于是得证。


  所以,扩展欧几里得算法又是什么呢?这个算法就是用来求方程$a*x+b*y=gcd(a,b)$的整数解$x,y$的。

  那么,如何求呢?(用到的除号皆为取下整,即$1/3=0$,$6/4=1$)

  ①显然当$b=0$时有:$x=1,y=0$

  ②设$r=a mod b$,有$r=a-(a/b)*b$

    $ecause gcd(a,b)=a*x+b*y=gcd(b,r) $

    又$ecause gcd(b,r)=b*x_1+r*y_1 $

    $egin{aligned} herefore a*x+b*y &= b*x_1+r*y_1 \ &= b*x_1+(a-(a/b)*b)*y_1 \ &= a*y_1+b*(x_1-(a/b)*y_1)  end{aligned}$

    $ herefore x=y_1,y=x_1-(a/b)*y_1$

    递归地求下去即可

  于是我们得到了一组特解$x_0,y_0$

  不难发现其实通解就是 $x=x_0+b/gcd(a,b)*t,y=y_0-a/gcd(a,b)*t$


  说了这么多,扩展欧几里得算法有什么用呢?写出一长串形如$a*x+b*y=gcd(a,b)*z$的通解?

  其实还可以用来求$a$在$mod$ $b$下的乘法逆元$g$(即$a*g mod b=1$)

  首先这个等式可以写成$a*g+b*x=1$

  于是当$gcd(a,b) eq1$时该式无解,所以$gcd(a,b)=1$

  于是就变成了拓展欧几里得算法可以求的东西

  最后注意$x=x_0+b/gcd(a,b)*t=x_0+b*t$    记得把$x$对$b$取模

  学了之后才发现这东西和莫队算法一样,是个很简单的东西,几分钟的事

原文地址:https://www.cnblogs.com/lcf-2000/p/5847387.html