• 扩展欧几里德算法


    不定方程ax+by=c
    重点:解二元一次不定方程。看起来扩展Euclid算法是不定方程的一种特殊情况,实际上呢,不定方程却是用Euclid算法解的。
    对 于不定方程ax+by=c,设gcd(a,b)=d,如果ax+by=c有解,则d|c(这也是许多奥数题的切入点)。所以一旦d不是c的约数,那么 ax+by=c一定无解。当d|c时,先求出ax'+by'=d=gcd(a,b)的x'和y',则x=x'*c/d,y=y'*c/d。由上一段可知, 只要ax+by=c有一个解,它就有无数个解。
    Euclid算法还可以求解同余方程ax≡b(mod m)。这其实和不定方程ax+my=b没有区别。(不定方程和同余方程一般都有范围限制,这其实也很容易解决,就不说了)

    基本原理
    设 a 和b 不全为 0,则存在整数 x,y 使得 gcd(a,b)=xa+yb 对于辗转相除法的最后一项
    此时 b=0,则gcd(a,b)=1*a+0*b,因为 gcd(a,b)=gcd(b,a%b)则有 x*a+y*b=x1*b+y1*(a%b)
    将等式右边变形,b*x1+(a%b)*y1=b*x1+(a-(a/b)*b)*y1=a*y1+b*(x1-(a/b)*y1)
    则,x=y1,y=x1-(a/b)*y1 则可由后向前迭代得到 x,y

    解题思路
    对于扩展欧几里德定理的题,一般都需要进行一定的推导之后得到一个形式为xa+yb=c 的方程,然后根据 c 确定解是否存在,
    如果 c 可以被 gcd(a,b)整除,那么方程有解,否则方程无解。而且所得的解释不唯一的,对于一组解 x0,y0 则其所有解可以表示为
    x=x0+b/gcd(a,b)*t,y-y0-a/gcd(a,b)*t,t=0,+1,+2……一般会要求找出 x 或者 y 的最小正整数解,这个时候需要做一些调整。

     1 int exgcd(int a,int b,int &x,int &y) 
     2 { 
     3     if(b==0) 
     4     { 
     5         x=1; 
     6         y=0; 
     7         return a; 
     8     } 
     9     int d=exgcd(b,a%b,x,y); 
    10     int t=x; 
    11     x=y; 
    12     y=t-a/b*y; 
    13     return d; 
    14  } 

     注:

    从最简单的情况开始。当b=0时,我们取x=1,y=0。当b≠0时呢?
    假设gcd(a,b)=d,则gcd(b,a mod b)=d。若我们已经求出了gcd(b,a mod b)的线性组合表示bx'+(a mod b)y',则
    gcd(a,b)=d
            =bx'+(a mod b)y'
            =bx'+(a-[a/b]b)y'
            =ay'+b(x'-[a/b]y')
    那么,x=y',y=x'-[a/b]y'。这样就可以在Euclid的递归过程中求出x和y。

  • 相关阅读:
    springmvc 配置多视图,返回jsp,velocity,freeMarker,tiles(模板)等等
    spring,mybatis,多数据源配置
    springMVC分页,interceptor实现
    springMVC全局Exception异常处理SimpleMappingExceptionResolver
    百度FIS入门
    如何安装nodejs
    如何高效部署前端代码,如css,js...
    javascript url几种编码方式
    【转】RBAC权限管理
    elasticsearch 之IK分词器安装
  • 原文地址:https://www.cnblogs.com/vivider/p/3650661.html
Copyright © 2020-2023  润新知