1. 逆元概念与数学基础
1.1 什么是逆元
在模运算的世界里,逆元扮演着类似"倒数"的角色。给定整数a和模数m,如果存在整数x使得(a × x) ≡ 1 mod m,那么x就是a在模m下的乘法逆元。举个生活中的例子,就像数字3在常规算术中的倒数是1/3,而在模11的世界里,3的逆元是4,因为3×4=12≡1 mod 11。
逆元的存在性取决于a和m是否互质(即gcd(a,m)=1)。这意味着当模数m是质数时,所有1到m-1的整数都有对应的逆元。这个性质在密码学、编码理论等领域有着重要应用。
1.2 逆元的数学性质
理解逆元需要掌握以下关键数学概念:
- 同余关系:a ≡ b mod m 表示a-b能被m整除
- 贝祖定理:对于任何整数a,b,存在整数x,y使得ax+by=gcd(a,b)
- 费马小定理:当m是质数且a不被m整除时,a^(m-1) ≡ 1 mod m
这些定理不仅证明了逆元的存在条件,也提供了计算逆元的不同方法。例如,扩展欧几里得算法直接来源于贝祖定理,而快速幂方法则基于费马小定理。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 逆元计算方法详解
2.1 扩展欧几里得算法
这是计算逆元最通用的方法,适用于任意互质的a和m。算法步骤如下:
cpp复制int ext_gcd(int a, int b, int &x, int &y) {
if (b == 0) {
x = 1;
y = 0;
return a;
}
int d = ext_gcd(b, a % b, y, x);
y -= a / b * x;
return d;
}
int inv(int a, int m) {
int x, y;
ext_gcd(a, m, x, y);
return (x % m + m) % m; // 保证返回正数
}
注意:当a和m不互质时,此算法返回的d将是gcd(a,m)而非1,此时逆元不存在。实际应用中应该先检查返回值是否为1。
2.2 费马小定理法
当模数m为质数时,可以利用费马小定理简化计算:
a^(-1) ≡ a^(m-2) mod m
实现采用快速幂算法:
cpp复制int q
