Gcd&Exgcd

欧几里得算法:

[gcd(a,b)=gcd(b,amod b) ]

证明:

显然(大雾)

扩展欧几里得及证明:

为解决一个形如

[ax+by=c ]

的方程。

根据裴蜀定理,当且仅当

[gcd(a,b)|c ]

时方程有解。

然后解这个方程。。。

我觉得大概就是:

我们设

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

[bx_2+(amod b) y_2=gcd(b,amod b) ]

根据欧几里得以及(amod b=a-lfloor a/b floor)

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

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

根据恒等定理 (?)得:

[x1=y2,y1=x2-lfloor frac{a}{b} floor *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)的值
}

原文地址:https://www.cnblogs.com/oierwyh/p/11375115.html