C语言扩展欧几里德算法求模逆元
时间: 2023-11-23 18:56:56 浏览: 109
扩展欧几里得算法求逆元
5星 · 资源好评率100%
扩展欧几里德算法可以用来求解模线性方程,其中就包括求解模逆元的问题。假设我们需要求解 a 在模 m 意义下的逆元 x,即 ax ≡ 1 (mod m),那么就可以使用扩展欧几里德算法来求解。
具体步骤如下:
1. 用欧几里得算法求出 a 和 m 的最大公约数 gcd(a, m),如果 gcd(a, m) 不等于1,则 a 在模 m 意义下没有逆元。
2. 使用扩展欧几里德算法求出 ax + my = gcd(a, m) 的一组整数解 (x, y)。
3. 如果 gcd(a, m) 等于1,则 ax ≡ 1 (mod m) 的一个解就是 x,但是 x 可能为负数或者大于等于 m,因此需要对 x 做一些调整,使得 x 在 [0, m) 范围内。
以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
// 扩展欧几里德算法求解 ax + my = gcd(a, m) 的一组整数解 (x, y)
int exgcd(int a, int b, int *x, int *y) {
if (b == 0) {
*x = 1;
*y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
*y -= a / b * (*x);
return d;
}
// 求解模逆元 ax ≡ 1 (mod m)
int mod_inv(int a, int m) {
int x, y;
int d = exgcd(a, m, &x, &y);
if (d != 1) {
printf("%d 在模 %d 意义下没有逆元\n", a, m);
return -1;
}
return (x % m + m) % m;
}
int main() {
int a = 3, m = 11;
int x = mod_inv(a, m);
if (x != -1) {
printf("%d 在模 %d 意义下的逆元是 %d\n", a, m, x);
}
return 0;
}
```
上面的代码中,exgcd 函数用于求解 ax + my = gcd(a, m) 的一组整数解 (x, y)。如果 gcd(a, m) 不等于1,则表示 a 在模 m 意义下没有逆元,此时 mod_inv 函数返回 -1。否则,mod_inv 函数返回 x 的值,表示 a 在模 m 意义下的逆元。注意,最后需要对 x 做一些调整,使得 x 在 [0, m) 范围内。
阅读全文