- 以下
ba代表的均是下取整之后的结果
欧几里得算法(gcd)
欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数。也叫辗转相除法(取自百度)
代码为
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
只需要证明
gcd(a,b)==gcd(b,a%b) 即可
假设a与b的最大公约数为c,由于
a%b=a−ba∗b
明显最大公约数一样
扩展欧几里得算法
一般用于求方程
ax+by=gcd(a,b)的解
又由欧几里得算法知
gcd(a,b)=gcd(b,a%b)
则方程可以写成
bx1+(a%b)y1=gcd(b,a%b)=gcd(a,b)
把上式左边展开合并同类项有
ay1+b(x1−ba∗y1)=gcd(a,b)
因此我们可以通过递归来求解,求出下一层解之后,只需要通过
x=y1,y=x1−ba∗y1来替换即可
而当b递归到零时,
ax+by=a,明显
x=1,y=0即为次方程的解,而将这个一步一步递归到最顶层时,即可求出方程
ax+by=gcd(a,b)的解
代码为
int x, y;
int exgcd(int a, int b)
{
if(!b)
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b);
int t = x;
x = y;
y = x - a / b * y;
return d;
}