c++写代码求 x mod y 的逆元。
时间: 2024-05-11 11:18:50 浏览: 60
如果需要求解 $x$ 对模 $y$ 的逆元,需要满足 $x$ 与 $y$ 互质。一个常见的求解方法是使用扩展欧几里得算法。
具体的代码实现如下:
```c
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;
}
int mod_inv(int x, int y) {
int a, b;
int d = exgcd(x, y, a, b);
if (d != 1) return -1; // 不存在逆元
return (a % y + y) % y;
}
```
其中,`exgcd` 函数是扩展欧几里得算法的实现,`mod_inv` 函数调用 `exgcd` 函数求解模数的逆元。如果不存在逆元,则返回 `-1`。
相关问题
如何算a^ mod 1000000007逆元(int范围以内),c++代码
在计算整数 `a` 对于模数 `1000000007` 的逆元时,我们通常需要找到一个小于等于 `1000000007 - 1` 的整数 `x`,使得 `(a * x) % 1000000007 = 1`。这是因为 `a` 的逆元就是 `x`,如果它们满足这个条件。这种方法可以使用扩展欧几里得算法或者带余乘法来寻找。
以下是C++代码示例:
```cpp
#include <bits/stdc++.h>
using namespace std;
// 求最大公约数
int gcd(int a, int b) {
if (b == 0)
return a;
else
return gcd(b, a % b);
}
// 扩展欧几里得算法求逆元
pair<int, int> extendedEuclidean(int a, int m) {
if (gcd(a, m) != 1) {
cout << "Inverse does not exist!\n";
return {0, 0};
}
int x = 0, y = 1, u = 1, v = 0;
while (a != 0) {
int q = m / a;
int t = m - q * a;
m = a; a = t;
t = x; x = u - q * x;
u = t;
t = y; y = v - q * y;
v = t;
}
return make_pair(x, m);
}
int modularInverse(int a, int m) {
auto result = extendedEuclidean(a, m);
// 如果存在逆元,则返回结果的第一个元素,因为它是x
if (result.first > 0)
return (result.first + m) % m; // 注意加上m确保在有效范围内
else
return (result.first - m) % m; // 若结果小于0,在范围内加上m
}
int main() {
int a = ...; // 输入的整数
int mod = 1000000007;
int inv = modularInverse(a, mod);
cout << "The inverse of " << a << " modulo " << mod << " is " << inv << endl;
return 0;
}
```
在这个代码中,`modularInverse` 函数首先通过 `extendedEuclidean` 函数获取 `a` 和 `1000000007` 的最大公约数以及相应的逆元。然后将逆元调整到 `0` 到 `m-1` 范围内。注意,这里假设输入的 `a` 和 `1000000007` 互质,如果不互质则找不到逆元。
C++求模运算的乘法逆元
对于正整数a和m,如果存在一个正整数x满足ax ≡ 1 (mod m),那么我们称x为a在模m意义下的乘法逆元。如果不存在这样的x,我们则称a在模m意义下没有乘法逆元。
求模运算的乘法逆元的方法有很多,以下是其中一种方法:
使用扩展欧几里得算法求解a和m的最大公约数gcd(a,m),如果gcd(a,m)>1,说明a在模m意义下没有乘法逆元;
如果gcd(a,m)=1,那么根据扩展欧几里得算法的推论,可以求解出一组整数x和y,使得ax+my=gcd(a,m)=1;
因为ax ≡ 1 (mod m),所以ax ≡ 1 + km,其中k是一个整数;
因此,x ≡ (1 + km)/a (mod m),其中k可以是任意整数,但是为了保证x在模m意义下的值最小,一般取k使得x的值在0~m-1之间。具体地,可以先计算(1 + km)%m,然后再计算 (1 + km)/a mod m。
以上就是求模运算的乘法逆元的基本方法。在实际计算中,可以预处理出所有1~m-1之间的整数在模m意义下的乘法逆元,存储在一个数组中,在需要使用时直接查表就可以了。
阅读全文