浅谈欧几里得算法和扩欧
Starry___sky · · 个人记录
引入
给定两个整数
1.欧几里得算法求最大公约数
利用性质
采用递归或非递归实现
递归版:
int gcd(int x, int y)
{
if(!)
return x;
return gcd(y, x % y);
}
非递归版:
int x, y;
while(y)
{
int r = x % y;
x = y;
y = r;
}//x即为gcd(x, y)
有了
利用性质:
证明:记
int lcm(int x, int y)
{
return x * y / gcd(x, y);
}
2.扩展欧几里得算法
前置芝士——
若
1.扩欧就能解出满足下列条件的整系数
证明:
所以就可以在求
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, x, y);
int t = x;
x = y;
y = t - a / b * y;
return d;
}
2.求解乘法逆元
乘法逆元,请在另一篇博客阅读