乘法逆元

发布时间 2023-07-24 16:11:32作者: Keith-

在数论中,如果a和m是正整数,且它们互质,那么a在模m意义下的逆元是一个正整数x,满足ax ≡ 1 (mod m)。也就是说,x是一个整数,满足ax除以m的余数为1。

求解a模m意义下的逆元有多种方法,其中一种常见的方法是使用快速幂算法。以下是使用快速幂算法求解a模m意义下的逆元的示例代码:

int64_t modpow(int64_t a, int64_t b, int64_t m) {
    int64_t ans = 1;
    a %= m;
    while (b > 0) {
        if (b & 1) {
            ans = ans * a % m;
        }
        a = a * a % m;
        b >>= 1;
    }
    return ans;
}

int64_t modinv(int64_t a, int64_t m) {
    return modpow(a, m - 2, m);
}

其中,modpow函数使用快速幂算法计算a的b次方模m的结果,modinv函数使用快速幂算法计算a模m意义下的逆元。这里使用了费马小定理,即a^(p-1) ≡ 1 (mod p)(p是质数),因此可以将逆元计算为a^(m-2)模m的结果。

需要注意的是,在使用快速幂算法计算幂次时,由于指数可能很大,可能会导致数据溢出。因此,在计算过程中,应该对每一步的结果都取模,以保证结果不会溢出。

另外,还需要注意的是,只有当a和m互质时,a模m的逆元才存在。如果a和m不互质,那么a模m的逆元不存在。