Extend_Eculid

Extend_Eculid扩展欧几里得算法:ax + by = Gcd(a,b)

感谢优秀博客:扩展欧几里德算法详解
先回顾一下欧几里得算法求Gcd(a, b)

1
2
3
4
5
int Gcd(int a, int b){
if(b == 0)
return a;
return(b, a%b);
}

对于ax + by = Gcd(a,b)的求解,注意a,b要求为非负整数,并且该方程一定有解

先推导出一组特解x0
欧几里得算法利用的等式:Gcd(a,b)=Gcd(b,a
于是这里有:ax+by=bx+(a
bx1+(a
=bx1+(aa/bb)y1=ay1+b(x1(a/b)y1)

  • 那么可以在递归求Gcd过程中,计算ax + by = Gcd(a,b)了:
    依据上面的ax+by=ay1+b(x1(a/b)y1)
    令上一深度的x为下一深度的y,上一深度的y为下一深度的x-(a/b)y
    递归的出口即b = 0,x = 1, y = 0
    ——————————————————————————————————
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    void Extend_Eculid(ll a, ll b, ll &x, ll &y)
    { //求解ax + by = Gcd(a,b)
    if(!b)
    {
    x = 1; y = 0;
    return;
    }
    // Extend_Eculid(b, a%b, x, y);
    // int t = x;
    // x = y;
    // y = t-(a/b)*y;
    // 等于下面语句
    Extend_Eculid(b, a%b, y, x);
    y = y - a/b*x;
    }

通过以上推导可得到一组特解x0
ax1+by1=ax2+by2 ,同时除以Gcd(a,b)
a(x1x2)=b(y2y1)
除以Gcd(a,b)后 ab 互素
x1x2=t×b,y2y1=t×a(t=…-2,-1,0,1,2…)
得通解 x=x0+t×b/Gcd(a,b) (t=…-2,-1,0,1,2…)
y的解根据x可计算得出


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!