1. 逆元的概念与应用
在数论中,逆元是一个非常重要的概念。简单来说,给定一个整数a和一个模数m,a关于模m的逆元是指一个整数x,使得a与x的乘积对m取模等于1。用数学表达式表示就是:
a * x ≡ 1 (mod m)
这个x就称为a在模m下的逆元,记作a⁻¹。逆元在密码学、计算机科学等领域有着广泛的应用,特别是在需要进行模运算的场合。
注意:逆元存在的充要条件是a和m互质(即gcd(a,m)=1)。如果m是质数,那么根据费马小定理,a的逆元可以直接计算为a^(m-2) mod m。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 费马小定理与快速幂求逆元
2.1 费马小定理原理
费马小定理告诉我们,如果p是一个质数,且a不是p的倍数,那么:
a^(p-1) ≡ 1 (mod p)
由此可以推导出,a的逆元就是a^(p-2) mod p。这就是为什么在代码中我们看到当m是质数时,可以直接用快速幂计算x^(m-2) mod m来得到x的逆元。
2.2 快速幂算法实现
快速幂算法是一种高效计算大数幂取模的方法,其时间复杂度为O(log n)。下面我们详细解析提供的代码:
cpp复制LL qpow(LL a, LL b, LL m)
{
LL ret = 1;
while(b)
{
if(b & 1) ret = ret * a % m;
b >>= 1;
a = a * a % m;
}
return ret;
}
这个函数的工作原理是:
- 初始化结果为1
- 当指数b不为0时循环:
- 如果b的最低位是1,将结果乘以当前的a并取模
- 将b右移一位(相当于除以2)
- 将a平方并取模
- 返回最终结果
这种方法的巧妙之处在于它将指数b表示为二进制形式,通过不断平方和取模来减少计算量。
2.3 实际应用示例
cpp复制int main()
{
LL x, m; cin >> x >> m;
cout << qpow(x, m - 2, m) << endl;
return 0;
}
这段主程序读取x和m的值,然后调用快速幂函数计算x^(m-2) mod m,输出结果就是x在模m
