拓展欧几里得小结

本文详细介绍了拓展欧几里得算法的概念及其应用。包括如何求解方程ax+by=gcd(a,b)的一个特解,以及如何通过该特解求得所有整数解的方法。同时,还探讨了更一般形式的方程a*x+b*y=c的解的存在条件及求解过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是拓展欧几里得?简单的说,就是求关于x,y的方程 ax + by = gcd(a,b) 的所有整数解


现在我们令g = gcd(a,b)
则方程变成了ax + by = g
假如我们现在知道了关于这个方程的一个特解x0, y0,我们就可以用一种方法求出所有的整数解。
说的比较模糊,现在整理一下。
上面提到了两个问题
一、怎么求出这个特解?
二、怎么由特解推出其它的所有解?


一、求特解

我们知道,欧几里得公式可以由这个式子表示:
gcd(a,b) = gcd(b, a%b)
不断往下连等,直到b = 0,此时a即为最大公约数
那么我们来讨论另一个问题,下面两个式子有没有关系呢?

a * x1 + b * y1 = g(a,b)
b * x2 + (a%b) * y2 = g(b,a%b)

如果看这篇博客的你还没接触过拓展欧几里得,那么可能你还不知道现在在干什么。
那么,我可以告诉你,只要找出x1和x2的关系、y1和y2的关系,我们就能求出方程a * x + b * y = g的一个特解

回到刚才那个问题,很显然,两个等式右边就是欧几里得的公式
那么我们就能得出
a * x1 + b * y1 = b * x2 + (a%b) * y2
其中a%b可以换成a-(a/b)*b
式子变成了
a * x1 + b * y1 = b * x2 + (a - (a / b) * b) * y2
因为我们要找x1 y1和x2 y2的关系
我们可以用待定系数法,按照这种方法把右边化成b * (x2 - (a / b) * y2) + a * y2
则等式变成了
a * x1 + b * y1 = a * y2 + b * (x2 - (a / b) * y2)
(上面的过程最好动手演算)
好,我们现在得出了下面两个等式:
x1 = y2(等式两边a的系数相同)
y1 = x2 - (a / b) * y2 (等式两边b的系数相同)
也就是说,我们知道了方程b * x2 + (a%b) * y2 = g(b,a%b) 的解x2, y2,就可以得到方程a * x1 + b * y1 = g(a,b) 的解x1,y1了,这个小问题告一段落。

对于方程a * x + b * y = gcd(a,b),我们可以不断的往下变成b * x + (a % b) y = gcd(a,b) ,按照欧几里得的过程,b会变成0,即此时方程a * x + b * y = gcd(a,b) 因为b = 0,变成了a * x = gcd(a,b) ,还是由欧几里得算法得到,此时a就等于gcd(a,b),所以得到由原方程往下推了不知道多少次的方程 a * x = gcd(a,b) 来说,得到一个解x = 1, y = 0。现在得到了这个方程的解,再回溯回去,就可以得出原方程 a * x + b * y = gcd(a,b) 的一个特解。

OK,这个问题解决了。


二、怎么利用特解推出其他所有整数解?

先说结论:
对于关于x,y的方程a * x + b * y = g 来说,让x增加b/g,让y减少a/g,等式两边还相等。(注意一个增加一个减少)
为什么呢?
这个很容易得到,我们算一下即可。
让x增加b/g,对于a * x这一项来说,增加了a * b / g,可以看出这是a,b的最小公倍数
同样,对于b * y这一项来说,y 减少 a/b,这一项增加了a * b / g,同样是a,b的最小公倍数。
可以看出,这两项一项增加了一个最小公倍数,一项减少了一个最小公倍数,加起来的和仍然等于g。
这样我们就明白了,其实这种操作就是增加一个最小公倍数,减少一个最小公倍数,这样来改变x,y的值,来求出所有x,y的通解的。

那为什么改变的是最小公倍数而不是更小的数呢?因为是 最小 公倍数呀…不会再找到更小的值了,这个自行体会吧…


到这里为止,开头提出的两个问题都已经解决。
也就是说,对于方程a * x + b * y = gcd(a,b),我们能找出所有符合条件的解了。而且,还可以告诉你,这个方程是一定有无数个解的。

那么来一个更一般的问题,对于方程a * x + b * y = c 来说,它的解怎么求呢?
答:如果c % gcd(a,b) != 0,即c不是gcd的整数倍,则无解。
如果c % gcd(a,b) == 0 且 c / gcd(a,b) = t,那么求出方程 a * x + b * y = gcd(a,b)的所有解x,y,将x,y乘上t,对应的x’,y’即是方程a * x + b * y = t * gcd(a,b)的解
很好理解,就不解释了,仔细看上面的这段话就能理解


附上拓展欧几里得的代码

void e_gcd(int a, int b, int &gcd, int &x, int &y)
{
	if (b == 0)
	{
		x = 1;
		y = 0;
		gcd = a;
	}
	else
	{
		e_gcd(b, a % b, gcd, y, x);
		y -= x * (a / b)
	}
}

这就是一个比较基础的拓展欧几里得的小结~

### 费马小定理与扩欧几里得算法的关系及应用 #### 定义与基本原理 费马小定理指出,当 \( p \) 是一个素数且 \( a \) 不被 \( p \) 整除时,则有 \( a^{p-1} \equiv 1 \pmod{p} \)[^1]。这一性质可用于求解模意义下的乘法逆元。 而扩欧几里得算法是一种基于辗转相除法的高效方法,能够找到两个整数 \( x \) 和 \( y \),使得满足方程 \( ax + by = gcd(a, b) \)[^3]。特别地,在 \( gcd(a, m) = 1 \) 的情况下,可以通过该算法得到 \( a^{-1} \mod m \) 的值。 两者虽然出发点不同,但在某些场景下具有相似的应用目标——即寻找模反元素(Modular Multiplicative Inverse)。具体来说: - **通过费马小定理计算乘法逆元** 若 \( p \) 是素数且 \( gcd(a, p) = 1 \),则由费马小定理可推导出 \( a^{p-2} \mod p \) 即为 \( a \) 对于模 \( p \) 的乘法逆元[^1]。 - **借助扩欧几里得算法获取乘法逆元** 当给定任意正整数 \( m \neq p \) (不一定是素数),只要保证 \( gcd(a, m) = 1 \),那么可通过调用扩欧几里得算法来获得对应的乘法逆元\( x \), 满足条件 \( ax ≡ 1 \pmod{m} \)[^3]。 #### 实际应用场景对比分析 ##### 场景一:加密领域中的RSA算法初始化阶段 在构建 RSA 密码体系过程中,需要频繁涉及大质数及其相关操作。此时通常会采用费马小定理来进行快速指数运算以验证候选参数的有效性或者加速部分中间环节处理速度[^4]。 另一方面,在实际部署环境当中可能还会遇到非标准情况(比如复合型模块化基数),这时就需要依赖更加通用灵活的方式—也就是前面提到过的扩增版Euclid Method 来完成相应任务需求。 以下是使用Python实现上述两种方法的一个简单例子: ```python def fermat_mod_inverse(a, p): """ 使用费马小定理计算a关于模p的乘法逆元 """ return pow(a, p - 2, p) from sympy import mod_inverse as ext_euclidean_mod_inv # 测试数据 if __name__ == "__main__": prime_p = 17 element_a = 3 inv_fermat = fermat_mod_inverse(element_a, prime_p) print(f"Fermat's method inverse of {element_a} modulo {prime_p}: ", inv_fermat) try: inv_ext_eucld = ext_euclidean_mod_inv(element_a, prime_p) print(f"Extended Euclidean algorithm inverse of {element_a} modulo {prime_p}: ", inv_ext_eucld) except ValueError: print("No modular multiplicative inverse exists.") ``` 此脚本示了如何分别运用这两种技术手段解决问题,并比较它们的结果一致性。 #### 结论总结 综上所述,尽管费马小定理和扩欧几里得算法各自独立存在并发挥作用,但都能够在特定条件下帮助我们有效地解决有关离散数学结构方面的问题,特别是在现代信息安全技术和理论研究中占据重要地位。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值