扩展欧几里得算法

 

扩展欧几里得:

问题描述:对于三个自然数 a,b,c,求解 ax+by=c 的关于x,y的整数解。

算法解决:

   首先需要判断不定方程是否有解,

   根据裴蜀定理

  对于整数a,b,一定存在一组关于x,y的整数解,使得ax+by=gcd(a,b)。

 

  于是方程存在解的充要条件是 gcd(a,b) | c (c是gcd(a,b)的倍数)。

 

  对于求解gcd(a,b),使用欧几里得算法。

描述: [公式]

 

int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }

 

  现在考虑方程ax+by=gcd(a,b),d=gcd(a,b),方程的所有解为

      

 

  其中,x0,y0是一组特解,t是整数

 

考虑方程ax+by=c, gcd(a,b)|c,的所有解为

 

   

其中,x0,y0是方程ax+by=gcd(a,b),d=gcd(a,b)的一组特解

 

证明:

https://blog.sengxian.com/algorithms/gcd-extgcd

 

 

代码:

ll ex_gcd(ll a,ll b,ll& x,ll& y){
    ll d = a;
    if (!b)  x = 1,y = 0;
    else
        d = ex_gcd(b,a%b,y,x),  y -= a/b*x;
    return d;
}

 

 

 

 

 

 

 

 

  

 

 

 

 

 

 

   

 

 

 

     

 

posted @ 2020-08-11 18:20  y~yang  阅读(94)  评论(0编辑  收藏  举报