扩展欧几里得算法求逆元

解方程 ax + by = gcd(a, b)

在欧几里得算法中通过定理gcd(a, b) = gcd(b, a%b),我们使用递归求得a与b的最大公约数,在递归边界当b = 0时,a = gcd(a, b),此时显然有a * 1 + b * 0 = gcd。对于这样的一个式子,我们能否对它进行推广呢?

  • 在递归的其中一步,通过相关定理(此处不叙述)可知 ax1+by1=gcd(a,b)ax_1 + by_1 = gcd(a, b)ax1​+by1​=gcd(a,b)中解x1、y1x_1、y_1x1​、y1​一定存在
  • 下一步计算gcd(b,a%b)gcd(b, a \% b)gcd(b,a%b)时,又有bx2+(a%b)y2=gcd(b,a%b)bx_2 + (a \% b)y_2 = gcd(b, a \% b)bx2​+(a%b)y2​=gcd(b,a%b)成立
  • 而gcd(a,b)=gcd(b,a%b)而gcd(a, b) = gcd(b, a\%b)而gcd(a,b)=gcd(b,a%b)
  • 所以ax1+by1=bx2+(a%b)y2ax_1 + by_1 = bx_2 + (a \% b)y_2ax1​+by1​=bx2​+(a%b)y2​成立,这样我们就发现x1、x2、y1、y2x_1、x_2、y_1、y_2x1​、x2​、y1​、y2​之间存在关系
  • a%b=a−(a/b)∗ba \% b = a - (a/b) * ba%b=a−(a/b)∗b成立(想一想为什么?)
  • 代入得ax1+by1=bx2+(a−(a/b)∗b)y2ax_1 + by_1 = bx_2 + (a - (a/b) * b)y_2ax1​+by1​=bx2​+(a−(a/b)∗b)y2​
  • 整理得ax1+by1=ay2+b(x2−(a/b)y2)ax_1 + by_1 = ay_2 + b(x_2 - (a/b)y_2)ax1​+by1​=ay2​+b(x2​−(a/b)y2​)
  • 由于对于递归过程中任一步都满足,对比两式,可得递归表达式

{x1=y2y1=x2−(a/b)y2\left\{ \begin{array}{c} x_1 = y_2 \\ y_1 = x_2 - (a / b)y_2 \end{array} \right. {x1​=y2​y1​=x2​−(a/b)y2​​

  • 已知递归边界a * 1 + b * 0 = gcd,递归表达式,能够递归得到ax + by = gcd(a, b)的其中一个解
//求最大公约数的同时求ax + by = gcd(a, b)的解
//使用引用,exGcd函数结束时,x,y中就是所求解
int exGcd(int a, int b, int &x, int &y) {//递归边界if (b == 0) {x = 1; y = 0; return a;}//递归计算最大公约数gcdint gcd = exGcd(b, a % b, x, y);//递推公式,求解int temp = x;x = y;y = temp - a / b * y;return gcd;
}

乘法逆元的求解

//返回值是a模m的逆元
int inv(int a, int m) {int x;int y;int gcd = exGcd(a, m, x, y);    //此时得到的x是方程的一个解,但不一定是方程的最小正整数解,x可能为负return (x % m + m) % m;         //(x % m + m) % m 是方程最小正整数解,也就是a模m的逆元
}

使用扩展欧几里得算法对逆元求解相关推荐

  1. 扩展欧几里得算法求逆元---乘法密码

    欧几里得算法 背景知识: 欧几里得算法:又叫做辗转相除法,用来求两个数的最大公约数.通过辗转相除,当余数为0的时候,最后的除数就是两个数的最大公约数. 例如:求20和11的最大公约数 每次将除数作为下 ...

  2. 扩展欧几里得算法求逆元_从辗转相除法到求逆元,数论算法初体验

    今天是算法和数据结构专题的第22篇文章,我们一起来聊聊辗转相除法. 辗转相除法又名欧几里得算法,是求最大公约数的一种算法,英文缩写是gcd.所以如果你在大牛的代码或者是书上看到gcd,要注意,这不是某 ...

  3. 扩展欧几里得算法求逆元c语言,关于扩展欧几里得算法和逆元

    关于扩展欧几里得算法和逆元 1.扩欧 a*x1+b*y1=gcd(a,b); b*x2+(a%b)*y2=gcd(b, (a%b))= gcd(a,b); a%b=a-(a/b)*b; 联立可得 x1 ...

  4. 3升5升得4升——倒水问题的万能解法(扩展欧几里得算法)

    扩展欧几里得算法及其应用 问题:假设你有一个3升的容器和一个5升的容器(以及充足的水源),如何精确地取出4升水来?(为了下文叙述的方便,我们不妨把3升的容器和5升的容器分别记做容器A和容器B).这里提 ...

  5. Python在GF(2⁸)有限域上求解多项式的乘法逆元——基于扩展欧几里得算法

    文章目录 一.前言 二.数学基础 1.GF(2⁸)有限域内的多项式 2.不可约多项式 3.多项式模运算 3.乘法逆元 三.算法步骤 1.扩展欧几里得算法 2.多项式除法 3.多项式乘法 四.代码实现 ...

  6. 扩展欧几里得算法、ax+by=c求解、ax≡c(mod m)、逆元求解、(b/a)%m计算c++代码

    参考 <算法笔记>(胡凡) 扩展欧几里得算法 求解ax+ by = gcd(a, b) int exGcd(int a, int b, int &x, int &y) {i ...

  7. c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解

    欧几里德算法: 复习:求最大公约数算法(欧几里得算法.也叫辗转相除法).欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd ...

  8. 扩展欧几里得算法 求解 丢番图方程

    丢番图方程: 有一个或者几个变量的整系数方程,它们的求解仅仅在整数范围内进行. a * x + b * y = c  ( 其中所有数均为整数, 已知 x, y, c )        例如:鸡兔同笼问 ...

  9. 扩展欧几里得算法、乘法逆元与中国剩余定理

    文章目录 前言 定义.定理和部分证明 整除 定义 定理 定理的证明 同余 定义 同余的性质 同余的运算律 运算律的证明 扩展欧几里得算法 代码模板 算法详解 乘法逆元 求解逆元 乘法逆元的作用 中国剩 ...

  10. 扩展欧几里得算法(求逆元)

    扩展欧几里得算法(求逆元)总结 1.在RSA算法生成私钥的过程中涉及到了扩展欧几里得算法(简称exgcd),用来求解模的逆元. 2.首先引入逆元的概念: 逆元是模运算中的一个概念,我们通常说 A 是 ...

最新文章

  1. 手把手教你写移动端瀑布流控件布局篇
  2. windows环境下redis.conf配置文件
  3. JAVA _构造函数
  4. SQL SERVER 通用分页存储过程
  5. boost::units模块实现展示信息单元系统
  6. IOS正则表达式的用法简介
  7. HBase MapReduce
  8. 哈希表和有序表的简单介绍
  9. Git使用教程-idea系列中git使用教程
  10. linux打包备份到其他机器,linux系统备份恢复到本机或是别的机器上
  11. 小程序需要php知识吗,小程序和PHP学习笔记 ----- 不定期更新。
  12. pymysql安装_jqdatasdk手动安装
  13. DOM、JDOM、DOM4J解析XML
  14. FaWave(发微)多微博版内测
  15. excel 第12讲:vlookup函数和 macth与index函数
  16. 使用python实现短信,邮箱的功能
  17. 漫谈广告竞价模式(二)
  18. codeforces 730 A Toda 2
  19. matlab求解积分总结
  20. #笔记(三十二)#dvwa漏洞wp

热门文章

  1. 关于Spring Cloud Netflix
  2. Android版-支付宝APP支付
  3. Codeforces Round #389 (Div. 2) 752E(二分答案)
  4. H5 data-* 属性,设置获取方法总结
  5. First Missing Positive missing number
  6. windows服务初识
  7. 写了一个字符串的二维表: TSta
  8. kafka如何确定分区数
  9. docker容器跨宿主机通信
  10. Linux 下构建域名服务器