乘法逆元
乘法逆元
基本概念
逆元
若整数\(b, m\)互质, 并且对于任意的整数\(a\), 如果满足\(b | a\), 则存在一个整数\(x\), 使得\(a / b \equiv a \times x \pmod m\), 则称\(x\)为\(b\)的模\(m\)的乘法逆元, 记为\(b^{-1}\pmod m\)。
应用
我们已知:
\[(a + b) \pmod m = a \pmod m + b \pmod m
\]
\[(a \times b) \pmod m = a \pmod m \times b \pmod m
\]
以上两个性质对除法不成立
\[(a / b) \pmod m \neq a \pmod m / b \pmod m
\]
但是根据乘法逆元的定义我们可以知道:
\[a / b \equiv a \times x \pmod m
\]
即可以推出
\[a / b \pmod m = a \times x \pmod m = a \pmod m \times x \pmod m
\]
这样只要求出\(x\)就可以解决除法取模的问题
快速幂 + 费马小定理
- 快速幂
快速幂 - 费马小定理
若\(m\)为质数, 且\(b\)不是\(m\)的倍数时, 有\(b^{m - 1} \equiv 1 \pmod m\)
思路
求\(b \pmod m\)的逆元:
要求:
\(m\)为质数, 且\(b\)与\(m\)互质:
根据定义:
\[a / b \equiv a \times x \pmod m
\]
两边同乘\(b\)得:
\[a \equiv a \times x \times b \pmod m
\]
可得:
\[b \times x \equiv 1 \pmod m
\]
由费马小定理, 当\(b\)与\(m\)互质时:
\[b^{m - 1} \equiv 1 \pmod m
\]
可得:
\[b \times b^{m - 2} \equiv 1 \pmod m
\]
即得\(b\)模\(m\)的逆元:
\[x = b^{m - 2}
\]
注意:
费马小定理要求\(b\)与\(m\)互质, 即\(b\)不能为\(m\)的倍数, 否则逆元不存在.
代码
#include <iostream>
using namespace std;
long long qim(long long a, long long b, long long p)
{
long long ans = 1;
a = a % p;
while (b){
if (b & 1)
ans = ans * a % p;
a = a * a % p;
b >>= 1;
}
return ans ;
}
int main()
{
int n;
cin >> n;
long long a,p;
while (n -- ){
cin >> a >> p;
long long res = qim(a, p - 2, p);
if (a % p)
cout << res << endl;
else
cout << "impossible" << endl;
}
return 0;
}