扩展欧几里得算法、不定方程、同余方程、乘法逆元求解
不定方程理论
设 k ≥ 2,
称为 k 元一次不定方程,
【求解方法理论】
的解相同,这里
证 必要性显然。下面来证充分性,若
因此
有解,
证 容易直接验证由式 (5) 给出的,对所有整数 t 都满足不等式(4)。反过来,设
进而有
又因为
扩展欧几里得算法
求 ax + by = gcd(a, b) 的一组整数解
扩展欧几里得算法:
(1)当 b = 0时,ax + by = a,故 x = 1,b = 0
(2)当 b ≠ 0时,由欧几里得算法,gcd(a, b) = gcd(b, a % b)
由裴蜀定理,得
所以
构造通解
模板: 时间复杂度 :
int exgcd(int a,int b, int &x, int &y) { if(!b) { x = 1, y = 0; return a; } int x1, y1, d; d = exgcd(b, a % b, x1, y1); x = y1, y = x1 - a / b * y1; return d; }
求解不定方程
求 ax + by = c 的一组整数解
求解步骤:
若 gcd(a, b) | c,则有整数解,先用扩欧算法求 ax + by = gcd(a, b) 的解,再乘以 c / gcd(a, b),即得原方程的特解
模板:时间复杂度 :
int main() { int a, b, c; cin >> a >> b >> c; int x, y; int d = exgcd(a, b, x, y); if(c % d == 0) printf("%d %d\n", c/d * x, c/d * y); else puts("No solution"); return 0; }
求解同余方程
给定整数a,b,m,求解同余方程 ax ≡ b (mod m)。
如果 x 存在整数解,则输出任意一个;
如果不存在,则输出 No solution。
例:8x ≡ 4 (mod 6),整数解 x = 2
求解步骤:
-
把同余方程转化成不定方程
由 ax ≡ b (mod m)
得 ax = m(-y) + b
即 ax + my = b
又有裴蜀定理,当 gcd(a, m) | b时有解
-
用扩欧算法,求 ax + my = gcd(a, m)的解,然后把 x 乘以 b / gcd(a, m) 即得原方程的特解。
模板:时间复杂度 :
int main() { int a, b, m; cin >> a >> b >> m; int x, y; int d = exgcd(a, m, x, y); if(b % d == 0) printf("%d\n", 1ll*x * b / d); else printf("No solution\n"); return 0; }
求解乘法逆元
给定整数a,m,且 a 与 m互质时,对于同余方程 ax ≡ 1 (mod m)。求 a 的乘法逆元 x (0 < x < m)
例: 3x ≡ 1 (mod 4),整数解 x = 3
求解步骤:
- 乘法逆元转化不定方程,等价变形 ax + my = 1。
- 扩欧算法 求 ax + my = gcd(a, m) 的解 x(由于此时 x / gcd(a, m) = x),之后 (x % m + m) % m即为答案。
技巧:“模加模”保证最小正整数
例:x = -7, m = 5,则(-7 % 5 + 5) % 5 = 3
例:x = 7, m = 5,则(7 % 5 + 5) % 5 = 2
模板:时间复杂度 :
int main() { int a, m; cin >> a >> m; int x, y; int d = exgcd(a, m, x, y); if(d == 1) printf("%d\n", (x % m + m) % m); // a, m互质才有逆元 return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App