当前位置: 首页 > news >正文

扩展欧几里得算法:求解乘法逆元

目录

什么是乘法逆元?

扩展欧几里得算法:

算法的形象化解释:一场分解游戏

实际操作示例一

实际操作示例二:扩展欧几里得算法在 GF(1759) 中求解 550 的乘法逆元

初始化

步骤详解

结论


扩展欧几里得算法不仅能帮助我们找到两个数的最大公约数,还能让我们在模运算中轻松找到乘法逆元。(网络安全的公钥加密时求解密钥)


什么是乘法逆元?

在模运算中,乘法逆元指的是:对于一个数 b,存在一个数 b^{-1},使得 b * b^{-1} ≡ 1 mod m。简单来说,就像在实数世界中,每个数都有一个倒数(比如 1/2),在模世界中,每个数也有一个特殊的“伙伴”,让它们的乘积等于 1

但并不是所有数都有乘法逆元!只有当 bm 互质(即它们的最大公约数是 1)时,b 才存在乘法逆元。扩展欧几里得算法就是用来找到这个逆元的利器。


扩展欧几里得算法:

扩展的 EUCLID(m, b)

  1. (A1,A2,A3)←(1,0,m); (B1,B2,B3)←(0,1,b)
  2. if B3=0 return 不存在乘法逆元
  3. if B3​=1 return B2=b-1 mod  m
  4. Q=⌊A3/B3⌋(向下取整)
  5. (T1,T2,T3)←(A1−QB1,A2−QB2,A3−QB3)
  6. (A1,A2,A3)←(B1,B2,B3​)
  7. (B1,B2,B3)←(T1,T2,T3)
  8. goto 2

扩展欧几里得算法的核心是通过一系列的除法和替换操作,逐步推进到最终的解。以下是算法的步骤:

  1. 初始化
    AB 初始化为 (1, 0, m)(0, 1, b)。这里的 AB 分别代表我们将要操作的数对。

  2. 终止条件

    • 如果 B_3 (数对B的第三个数,即 b 的当前值)为 0,说明 bm 不互质,乘法逆元不存在。
    • 如果 B_31,说明我们已经找到解,此时的 B_2 就是 b 的逆元。
  3. 逐步逼近

    • 计算商 Q = floor(A_3 / B_3)
    • 更新 AB 的值,逐步缩小范围,最终逼近解。

通过这些步骤,算法会不断地将问题简化,直到找到解或者确认解不存在。


算法的形象化解释:一场分解游戏

试想一下,我们需要找到两个数 mb 的组合,使得它们的线性组合等于 1,也就是:
1 = x * m + y * b
这里的 y 就是 b 的乘法逆元。

扩展欧几里得算法就像是在拆解这些数,找到它们的“内在联系”。每一步操作,都像是拆掉一块砖,逐渐接近目标。


实际操作示例一

假设我们需要找到 b = 3 在模 m = 7 下的逆元。我们来看看算法是如何工作的:

  1. 初始化
    A = (1, 0, 7)B = (0, 1, 3)

  2. 第一轮操作

    • A_3 = 7B_3 = 3,计算 Q = floor(7/3) = 2
    • 更新 AB
      • A = (0, 1, 3)
      • B = (1, -2, 1)
  3. 第二轮操作

    • 现在 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。

相关文章:

  • 【MySQL数据库】InnoDB存储引擎:逻辑存储结构、内存架构、磁盘架构
  • 门极驱动器DRV8353M设计(三)
  • OpenCV中的轮廓检测方法详解
  • OpenCV day2
  • 无人船 | 图解基于视线引导(LOS)的无人艇制导算法
  • OpenAI为抢跑AI,安全底线成牺牲品?
  • CA证书的申请及使用流程
  • 记录:安装 Docker Desktop 时直接设置安装路径及容器存储路径
  • 思维与算法共舞:AIGC语言模型的艺术与科学
  • 人力不足导致项目延期,如何补救
  • 【教学类-102-11】蝴蝶外轮廓01——Python对黑白图片进行PS填充三种颜色+图案描边+图案填充白色+制作1图2图6图24图
  • 如何在Linux系统中安装Vue环境
  • MyBatis-Plus快速入门
  • CVPR‘25 SOTA——GoalFlow论文精读
  • Linux环境下Swap配置方法与技巧
  • InnoDB 底层原理
  • Loop(循环)和Cycle(环)-《分析模式》漫谈55
  • 【笔记ing】AI大模型-05单层感知机与多层感知机
  • 周末学习笔记:Python文件操作(结构化数据转换与文件处理)
  • 算法:有一个整数数组,长度为n。她希望通过一系列操作将数组变成一个回文数组。
  • 为什么猛起身会头晕?你的身体在发出这个警报
  • 牛市早报|特朗普称或将“大幅降低”对华关税,外交部回应
  • 从“龙队”到“龙副”,国乒这批退役球员为何不爱当教练了
  • 浙江严禁中小学节假日集体补课,省市县教育部门公布举报电话
  • 旁白丨无罪后领到国家补偿,一位退休教师卸下了“包袱”
  • 魔都眼|上海半马鸣枪:白金标运动员、“箱根之子”齐参赛