求逆元是在模运算中找到一个数x,使得a乘以x模m等于1,即ax≡1(mod m)。以下是几种常见的求逆元的方法:
扩展欧几里得算法
原理:通过求解扩展欧几里得方程ax+by=gcd(a,b),可以得到x和y,其中x即为a模m的逆元。
代码示例(C++):
```cpp
ll exgcd(ll a, ll b, ll &x, ll &y) {
if (b == 0) {
x = 1, y = 0;
return a;
}
ll ret = exgcd(b, a % b, y, x);
ll tmp = x;
x = y;
y = tmp - (a / b) * y;
return ret;
}
ll modReverse(ll a, ll n) {
ll x, y;
ll d = exgcd(a, n, x, y);
return d == 1 ? (x % n + n) % n : -1;
}
```
费马小定理或欧拉定理
原理:如果m是素数,且a与m互质,则a的逆元是a^(m-1) mod m。
代码示例(C++):
```cpp
ll inv(ll a, ll m) {
return a == 1 ? 1 : inv(m % a, m) * (m - m / a) % m;
}
```
快速幂算法
原理:利用幂的二进制展开,通过快速幂算法计算a^(m-2) mod m得到a的逆元。
代码示例(C++):
```cpp
ll powM(ll a, ll b, ll m) {
ll tmp = 1;
while (b > 0) {
if (b & 1) tmp = tmp * a % m;
a = a * a % m;
b >>= 1;
}
return tmp;
}
```
以上方法中,扩展欧几里得算法是最通用的,适用于任何互质的a和m。快速幂算法适用于模数为素数的情况。
请根据具体情况选择合适的方法来求逆元