首先,欢迎和大家交流并打脸
有兴趣来看的各位,估计也都知道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=a−kb
,因此
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+ya−y×(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;
}