逆元

 

同余:

简单来说就是在除法中取模要找到其逆元

 

逆元:如果一个线性同余方程ax ≡ 1( mod b),则x称为a mod b的逆元

简单来说就是mod b是一种环境,而所求的x是a在mod b环境中的倒数

 

以下是求逆元的法子

  • 扩展欧几里得法求逆元,时间复杂度o(logn)
void exgcd(int a, int b, int& x, int& y) {
  if (b == 0) {
    x = 1, y = 0;
    return;
    }
  exgcd(b, a % b, y, x);
  y -= a / b * x;
}
  • 欧拉定理

若a和b互质,则有 a^(φ(b))≡1(mod b),其中φ(b)为欧拉函数

所以a^(φ(b)-1)为a在mod b环境下的逆元

int qpow(int a, int b, int mod) {
    int ans = 1, res = a % mod;
    while (b) {
        if (b & 1)    
            ans = ans * res % mod;
        res = res * res % mod;
        b >>= 1;
    }
    return ans % mod;
}
int inv(int a, int mod) {
    return qpow(a, φ(b) - 1, mod) % mod;
}
  • 费马小定理

若b为素数,则存在a^(b-1)≡1(mod b)

公式与欧拉定理类似

int qpow(int a, int b, int mod) {
    int ans = 1, res = a % mod;
    while (b) {
        if (b & 1) ans = ans * res % mod;
        res = res * res % mod;
        b >>= 1;
    }
    return ans % mod;
}
int inv(int a, int mod) {
    return qpow(a, mod - 2, mod) % mod;
}
  • 线性求逆元

当所求的逆元有很多的时候,可能会t,线性复杂度o(n)

inv[1] = 1;
for (int i = 2; i <= n; ++i)
    inv[i] = (long long)(mod - mod / i) * inv[mod % i] % p;

只学了这些。。

posted @ 2023-07-30 21:15  DLSQS  阅读(85)  评论(0)    收藏  举报