{算法}论蒟蒻如何掌握ExGcd

来源:互联网 发布:vscode 代码提示 编辑:程序博客网 时间:2024/06/06 02:15

首先,欢迎和大家交流并打脸
有兴趣来看的各位,估计也都知道Gcd是个什么。但是为了凑字数部分同学的利益,还是要简单介绍一下。

Gcd(a,b):即a,b的最大公约数
且有Gcd(a,b)=Gcd(b,amodb)(a>b)

来一段死板的证明
证明:
a可以表示成a=kb+r,则r=a mod b
假设d是a,b的一个公约数
则有d|a,d|b,而r=akb,因此d|r
因此d也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,
最大公约数也必然相等,得证
注意:这里(a,b)和(b,a mod b)的所有公因数皆相等。
一般来讲,只需知道它的用法即可。
模板

int Gcd(int a,int b){    if(b == 0) return a;    return Gcd(b, a % b);}

什么是ExGcd呢?
已知a,b,解形如ax+by=c的方程时
根据拓展欧几里德,当且仅当c是Gcd(a,b)的倍数时,方程有整数解。我不会证
所以原方程可变形为ax+by=Gcd(a,b)
由上文,Gcd(a,b)=Gcd(b,a mod b)
那么原方程又变形为bx+(a mod b)y=Gcd(b,a mod b) 对吗?
a mod b亦可表示为a(a div b)b
gcd(a,b)=xb+y(a(a div b)b)
=xb+yay×(a div b)×b
=ay+(x(a div b)×y)×b
因此,在原本Gcd的递归过程中,一起计算x,y的解。
当b=0时,x=1,y=0。
给段代码理解理解

int ExGcd(int a,int b,int &x,int &y){    if(b==0)    {        x=1;        y=0;        return a;    }    int r=ExGcd(b,a%b,x,y);    int t=x;    x=y;    y=t-a/b*y;    return r;}
3 0