扩展欧几里得算法:求解乘法逆元
目录
什么是乘法逆元?
扩展欧几里得算法:
算法的形象化解释:一场分解游戏
实际操作示例一
实际操作示例二:扩展欧几里得算法在 GF(1759) 中求解 550 的乘法逆元
初始化
步骤详解
结论
扩展欧几里得算法不仅能帮助我们找到两个数的最大公约数,还能让我们在模运算中轻松找到乘法逆元。(网络安全的公钥加密时求解密钥)
什么是乘法逆元?
在模运算中,乘法逆元指的是:对于一个数 b
,存在一个数 b^{-1}
,使得 b * b^{-1} ≡ 1 mod m
。简单来说,就像在实数世界中,每个数都有一个倒数(比如 1/2
),在模世界中,每个数也有一个特殊的“伙伴”,让它们的乘积等于 1
。
但并不是所有数都有乘法逆元!只有当 b
和 m
互质(即它们的最大公约数是 1
)时,b
才存在乘法逆元。扩展欧几里得算法就是用来找到这个逆元的利器。
扩展欧几里得算法:
扩展的 EUCLID(m, b)
- (A1,A2,A3)←(1,0,m); (B1,B2,B3)←(0,1,b)
- if B3=0 return 不存在乘法逆元
- if B3=1 return B2=b-1 mod m
- Q=⌊A3/B3⌋(向下取整)
- (T1,T2,T3)←(A1−QB1,A2−QB2,A3−QB3)
- (A1,A2,A3)←(B1,B2,B3)
- (B1,B2,B3)←(T1,T2,T3)
- goto 2
扩展欧几里得算法的核心是通过一系列的除法和替换操作,逐步推进到最终的解。以下是算法的步骤:
-
初始化:
将A
和B
初始化为(1, 0, m)
和(0, 1, b)
。这里的A
和B
分别代表我们将要操作的数对。 -
终止条件:
- 如果
B_3
(数对B的第三个数,即b
的当前值)为0
,说明b
和m
不互质,乘法逆元不存在。 - 如果
B_3
为1
,说明我们已经找到解,此时的B_2
就是b
的逆元。
- 如果
-
逐步逼近:
- 计算商
Q = floor(A_3 / B_3)
。 - 更新
A
和B
的值,逐步缩小范围,最终逼近解。
- 计算商
通过这些步骤,算法会不断地将问题简化,直到找到解或者确认解不存在。
算法的形象化解释:一场分解游戏
试想一下,我们需要找到两个数 m
和 b
的组合,使得它们的线性组合等于 1
,也就是:
1 = x * m + y * b
。
这里的 y
就是 b
的乘法逆元。
扩展欧几里得算法就像是在拆解这些数,找到它们的“内在联系”。每一步操作,都像是拆掉一块砖,逐渐接近目标。
实际操作示例一
假设我们需要找到 b = 3
在模 m = 7
下的逆元。我们来看看算法是如何工作的:
-
初始化:
A = (1, 0, 7)
,B = (0, 1, 3)
。 -
第一轮操作:
A_3 = 7
,B_3 = 3
,计算Q = floor(7/3) = 2
。- 更新
A
和B
:A = (0, 1, 3)
B = (1, -2, 1)
。
-
第二轮操作:
- 现在
B_3 = 1
,满足终止条件。 B_2 = -2
,即b^{-1} ≡ -2 mod 7
。- 将
-2
转换为正数:-2 + 7 = 5
,所以3 * 5 ≡ 1 mod 7
。
- 现在
实际操作示例二:扩展欧几里得算法在 GF(1759) 中求解 550 的乘法逆元
初始化
我们需要计算 550 和 1759 的扩展欧几里得算法,以找到贝祖系数。初始化步骤如下:
- ( Q ): 商。
- ( A_1, A_2, A_3 ): 初始值为 (1, 0, 1759)。
- ( B_1, B_2, B_3 ): 初始值为 (0, 1, 550)。
步骤详解
第一步
- Q = - : 没有商。
- A_1 = 1 , A_2 = 0 , A_3 = 1759 : 初始化 A。
- B_1 = 0 , B_2 = 1 , B_3 = 550 : 初始化 B 。
第二步
- Q = 3 : 计算商 Q = A_3 / B_3 = 1759 / 550 = 3 。
- T_1 = A_1 - Q * B_1 = 1 - 3 * 0 = 1 .
- T_2 = A_2 - Q * B_2 = 0 - 3 * 1 = -3 .
- T_3 = A_3 - Q * B_3 = 1759 - 3 *550 = 109 .
- 更新 A 和 B :
- A_1 = 0 , A_2 = 1 , A_3 = 550 .
- B_1 = 1 , B_2 = -3 , B_3 = 109 .
第三步
- Q = 5 : 计算商 Q = A_3 / B_3 = 550 / 109 = 5 。
- T_1 = A_1 - Q * B_1 = 0 - 5 * 1 = -5 .
- T_2 = A_2 - Q * B_2 = 1 - 5 * (-3) = 16 .
- T_3 = A_3 - Q * B_3 = 550 - 5 * 109 = 5 .
- 更新 A 和 B :
- A_1 = 1 , A_2 = -3 , A_3 = 109 .
- B_1 = -5 , B_2 = 16 , B_3 = 5 .
第四步
- Q = 21 : 计算商 Q = A_3 / B_3 =109 / 5 = 21 。
- T_1 = A_1 - Q * B_1 = 1 - 21 * (-5) = 106 .
- T_2 = A_2 - Q * B_2 = -3 - 21 * 16 = -339 .
- T_3 = A_3 - Q * B_3 = 109 - 21 * 5 = 4 .
- 更新 A 和 B :
- A_1 = -5 , A_2 = 16 , A_3 = 5 .
- B_1 = 106 , B_2 = -339 , B_3 = 4 .
第五步
- Q = 1 : 计算商 Q = A_3 / B_3 = 5 / 4 = 1 。
- T_1 = A_1 - Q * B_1 = -5 - 1 * 106 = -111 .
- T_2 = A_2 - Q * B_2 = 16 - 1 * (-339) = 355 .
- T_3 = A_3 - Q * B_3 = 5 - 1 * 1 .
- 更新 A 和 B :
- A_1 = 106 , A_2 = -339 , A_3 = 4 .
- B_1 = -111 , B_2 = 355 , B_3 = 1 .
结论
最终,当 B_3 = 1,我们得到 B_2 = 355。因此,元素 550 在域 GF(1759) 中的乘法逆元是 355。