数论 | 扩展欧几里得算法
扩展欧几里得算法:已知整数
预备知识
欧几里得算法 (Euclidean algorithm)
常叫辗转相除法,其证明了
这里给出代码供下文参考:
int gcd(int a, int b)
{
if (!b)
return a;
return gcd(b, a % b);
}
笔记链接:https://io.zouht.com/17.html
裴蜀定理 (Bézout's lemma)
对任何整数
有整数解时当且仅当
扩展欧几里得算法 (Extended Euclidean algorithm)
算法描述
已知整数
算法过程
特解
在欧几里得算法中,递归边界时
易得
在递归中间部分时,我们得到了
因此当层的解为:
于是返回
通解
该算法求出的是一对满足条件的
得到通解:
代码实现
代码中,返回值并未用三元组,而是返回最大公约数,同时通过引用传回了
int exgcd(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1;
y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
解决线性同余方程
扩展欧几里得算法可以解决形如
由
再令
可使用扩展欧几里得算法得到
解决模数非质数的乘法逆元
当
但当
再使用上一节的方法,利用扩展欧几里得算法解该方程即可,代码如下:
int inv(int a, int p)
{
int x, y;
if (exgcd(a, p, x, y) != 1)
return -1; // 无解
return (x % p + p) % p;
}
注意无解的情况,由裴蜀定理的约束条件,
即:数
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi