
【Alg】 扩展欧几里得算法

前言
扩展欧几里得算法是一个常用的数论算法,可以用于求解不定方程、线性同余方程、模意义下的乘法逆元等。
回顾普通欧几里得算法
大部分人初学算法肯定会接触到求最大公约数的欧几里得算法,它也叫做 「辗转相除法」。
它的求解过程十分简单:
1 | int gcd(int a, int b) { |
原理不解释了。由此我们还可以得出每一层递归时的
历史资料
欧几里得算法,又称辗转相除法,被认为是世界上最早的算法(公元前
扩展欧几里得算法
首先我们需要知道 「裴蜀定理」:对于任意
裴蜀定理的一个推论是,不定方程
于是我们可以通过这种方法来判断不定方程
但我还想知道在
注意:扩展欧几里得算法算法只能解
它的实现方法是在普通欧几里得算法递归求
计算
详细计算方法请看下面代码详解:
1 | int exgcd(int a, int b, int &x, int &y) { // 这里x和y都要被修改,所以使用引用参数 |
为什么 x = y, y = t - a / b * y;
推出来的
证明
设当前层要求的
则
由欧几里得定理可知:
故
又因为
将其代入
展开得
即
又因为
且注意到
故
以上证明过程来自 OI Wiki 扩展欧几里得算法 ,稍有改动。
最后我们要求不定方程
1 | int x, y; // 因为是引用参数,所以x和y需要单独开变量 |
- 标题: 【Alg】 扩展欧几里得算法
- 作者: Xlon WU
- 创建于 : 2024-09-24 06:55:43
- 更新于 : 2025-05-10 01:39:38
- 链接: https://xlon-wu.top/2024/09/24/exgcd/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论