欧几里得算法
任务 : 求两个数a,b的最大公约数 gcd(a,b)
补充: 贝祖定理
证明:贝祖定理是代数几何中一个定理,其内容是若设a,b是整数,则存在整数x,y,使得ax+by=gcd(a,b),(a,b)代表最大公因数,则设a,b是不全为零的整数,则存在整数x,y,使得ax+by=(a,b)。
- 当 a >= b时,gcd(a,b) = gcd(b,a-b).
- 上面的减法易超时,所以一般用 gcd(a,b) = gcd(b,a mod b).
代码实现一波
int gcd(int a, int b)
{
return b == 0 ? a : gcd(b,a%b);
}
扩展欧几里得算法
目的: 求出A,B的最大公约数,且求出X,Y满足AX+BY= gcd(A,B)
推一下
当 B = 0时, 有X = 1, Y = 0 成立
当B > 0时
gcd(A,B) = gcd(B , A mod B)
递归一波
先求出X’ Y’
满足 : BX‘ + (A - A/B * B) Y’ = gcd(A,B)
化简得
X = Y’
Y = X’ - A/B * Y
应用 :
输入 a,b,&x,&y
输出 a,b的最大公约数
调用函数后 x,y 满足 ax + by = gcd(a,b)
代码函数实现
int exgcd(int a, int b ,int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
else
{
int r = exgcd(b, a%b, y, x);
y -= x * (a / b);
return r;
}
}