Gcd&Exgcd 学习笔记

欧几里得算法:

\[gcd(a,b)=gcd(b,a\bmod b)\]

证明:

显然(大雾)

扩展欧几里得及证明:

为解决一个形如

\[ax+by=c\]

的方程。

根据裴蜀定理,当且仅当

\[gcd(a,b)|c\]

时方程有解。

然后解这个方程。。。

我觉得大概就是:

我们设

\[ax_1+by_1=gcd(a,b)\]

\[bx_2+(a\bmod b) y_2=gcd(b,a\bmod b)\]

根据欧几里得以及\(a\bmod b=a-\lfloor a/b\rfloor\)

\[ax_1+by_1=bx_2+(a-\lfloor a/b\rfloor)y_2\]

\[ax_1+by_1=ay_2+bx_2-\lfloor a/b\rfloor y_2\]

根据恒等定理 (?)得:

\[x1=y2,y1=x2-\lfloor \frac{a}{b} \rfloor *y2\]

然后我们知道,\(gcd(a,b)|c\)

那么我们算出\(ax+by=gcd(a,b)\)的答案来之后,只要把他乘上\(c/gcd(a,b)\)就好啦。

反正我知道代码哼唧

Code


void exgcd(int a, int b, int &x, int &y)
{
    if(b == 0)
    {
        x = 1;y = 0;
        return;
    }
    exgcd(b,a%b,y,x);
    y-=a/b*x;
    //计算ax+by=gcd(a,b)的值
}

猜你喜欢

转载自www.cnblogs.com/oierwyh/p/11375115.html