使用扩展欧几里得算法对逆元求解
扩展欧几里得算法求逆元
解方程 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=y2y1=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的逆元,就是求解同余式ax≡1(modm)ax \equiv 1(mod m)ax≡1(modm)
- ax≡1(modm)ax \equiv 1(mod m)ax≡1(modm)
- (ax−1)%m=0(ax - 1) \% m = 0(ax−1)%m=0
- 存在一个整数z满足ax−1=mzax - 1 = mzax−1=mz
- ax−mz=1ax - mz = 1ax−mz=1
- 存在y = -z使得ax+my=1ax + my = 1ax+my=1
- 所以求a模m的逆元,就是求解同余式ax≡1(modm)ax \equiv 1(mod m)ax≡1(modm),也就是求方程ax+my=1ax + my = 1ax+my=1的解,并且在实际使用中,一般把x的最小正整数解称为a模m的逆元
//返回值是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的逆元
}
使用扩展欧几里得算法对逆元求解相关推荐
- 扩展欧几里得算法求逆元---乘法密码
欧几里得算法 背景知识: 欧几里得算法:又叫做辗转相除法,用来求两个数的最大公约数.通过辗转相除,当余数为0的时候,最后的除数就是两个数的最大公约数. 例如:求20和11的最大公约数 每次将除数作为下 ...
- 扩展欧几里得算法求逆元_从辗转相除法到求逆元,数论算法初体验
今天是算法和数据结构专题的第22篇文章,我们一起来聊聊辗转相除法. 辗转相除法又名欧几里得算法,是求最大公约数的一种算法,英文缩写是gcd.所以如果你在大牛的代码或者是书上看到gcd,要注意,这不是某 ...
- 扩展欧几里得算法求逆元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 ...
- 3升5升得4升——倒水问题的万能解法(扩展欧几里得算法)
扩展欧几里得算法及其应用 问题:假设你有一个3升的容器和一个5升的容器(以及充足的水源),如何精确地取出4升水来?(为了下文叙述的方便,我们不妨把3升的容器和5升的容器分别记做容器A和容器B).这里提 ...
- Python在GF(2⁸)有限域上求解多项式的乘法逆元——基于扩展欧几里得算法
文章目录 一.前言 二.数学基础 1.GF(2⁸)有限域内的多项式 2.不可约多项式 3.多项式模运算 3.乘法逆元 三.算法步骤 1.扩展欧几里得算法 2.多项式除法 3.多项式乘法 四.代码实现 ...
- 扩展欧几里得算法、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 ...
- c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解
欧几里德算法: 复习:求最大公约数算法(欧几里得算法.也叫辗转相除法).欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd ...
- 扩展欧几里得算法 求解 丢番图方程
丢番图方程: 有一个或者几个变量的整系数方程,它们的求解仅仅在整数范围内进行. a * x + b * y = c ( 其中所有数均为整数, 已知 x, y, c ) 例如:鸡兔同笼问 ...
- 扩展欧几里得算法、乘法逆元与中国剩余定理
文章目录 前言 定义.定理和部分证明 整除 定义 定理 定理的证明 同余 定义 同余的性质 同余的运算律 运算律的证明 扩展欧几里得算法 代码模板 算法详解 乘法逆元 求解逆元 乘法逆元的作用 中国剩 ...
- 扩展欧几里得算法(求逆元)
扩展欧几里得算法(求逆元)总结 1.在RSA算法生成私钥的过程中涉及到了扩展欧几里得算法(简称exgcd),用来求解模的逆元. 2.首先引入逆元的概念: 逆元是模运算中的一个概念,我们通常说 A 是 ...
最新文章
- 手把手教你写移动端瀑布流控件布局篇
- windows环境下redis.conf配置文件
- JAVA _构造函数
- SQL SERVER 通用分页存储过程
- boost::units模块实现展示信息单元系统
- IOS正则表达式的用法简介
- HBase MapReduce
- 哈希表和有序表的简单介绍
- Git使用教程-idea系列中git使用教程
- linux打包备份到其他机器,linux系统备份恢复到本机或是别的机器上
- 小程序需要php知识吗,小程序和PHP学习笔记 ----- 不定期更新。
- pymysql安装_jqdatasdk手动安装
- DOM、JDOM、DOM4J解析XML
- FaWave(发微)多微博版内测
- excel 第12讲:vlookup函数和 macth与index函数
- 使用python实现短信,邮箱的功能
- 漫谈广告竞价模式(二)
- codeforces 730 A Toda 2
- matlab求解积分总结
- #笔记(三十二)#dvwa漏洞wp