乘法逆元

乘法逆元

基本概念

逆元

若整数\(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\)就可以解决除法取模的问题

快速幂 + 费马小定理

  1. 快速幂
    快速幂
  2. 费马小定理
    \(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;
}
posted @ 2021-04-09 14:16  lhqwd  阅读(85)  评论(0)    收藏  举报