欧几里得算法:
“欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。”
这里我们考虑一个问题:
辗转相除法需要大数除小数,那我们这里是不是需要一个判断呢;
其实是不需要的,我们可以发现公式中是默认a>b的,这里我们不妨假设a<b;
gcd(a,b) = gcd(b,a%b),由于a<b, a%b =a, gcd(b,a%b) = gcd(b,a),这样也就保证了函数的第一个参数大于第二个参数了。
然后我们考虑,辗转相除法什么时候停止,就是当我们的第二个参数为零时,第一个参数的值就是我们的答案了。
一行的gcd代码:
int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
这里有一个有关gcd算法的性质:
当 gcd(n,m) = 1时,我们称 n , m 互质。
然后,我们在来看看我们的扩展欧几里得算法:
已知整数a,b ,扩展欧几里得算法在求和gcd(a,b)的同时,可以寻找一组 x ,y 使得
ax + by = gcd(a,b);
证明一下:
已知两个整数 a,b
由欧几里得算法可知:
上代码:
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x = 1,y = 0;
return a;
}
else
{
int s = exgcd(b,a%b,y,x);
y = y - (a/b)*x;
return s;
}
}