gcd与类欧几里得

本文整理一下欧几里得算法和一些能用类欧解决的式子。

欧几里得算法与辗转相除

如何求两个数的gcd?

如果$d=gcd(x, y)$,那么$d|x,d|y,d|(x-y)$,我们把他们相减之后这个因子依然存在,但是倍数变小了。
一直这样往下做,我们最后可以把那个较小的数字变成$d$的一倍,也就是求出了$gcd(x,y)$。

复杂度

每次较大的数字至少会缩小一半,所以复杂度级别。

exgcd

线性方程组求解

求$x,y$。

那么有

1
2
3
4
5
void exgcd(ll a, ll b, ll& x, ll& y, ll& c)
{
if(!b) {y = 0; x = 1; c = a; return;}
exgcd(b, a % b, y, x); y -= a / b * x;
}

类欧

常见的类欧式子有三种。分别做出一点证明。

$f$

$g$

如果

否则

0%