zoukankan      html  css  js  c++  java
  • 扩展欧几里得算法学习记

      话说以前我刷(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$取模

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

  • 相关阅读:
    Cocos2dx-背景无限循环播放
    centos 7端口和防火墙
    图片裁剪
    spring-boot图片压缩
    vue cli简介
    spring-boot的配置(实时生效)
    spring-boot打成war包放入tomcat运行
    spring-boot上传图片并访问
    linux链接ssh
    mysql远程访问
  • 原文地址:https://www.cnblogs.com/lcf-2000/p/5847387.html
Copyright © 2011-2022 走看看