扩展欧几里得算法&同余方程&模m乘法逆元详解

扩展欧几里得算法 & 欧拉定理 求乘法逆元(无代码,仅示例计算方法) 目录 1 模m可逆元定义 2 扩展欧几里得算法求逆元 3 欧拉定理求逆元 1 模m可逆元定义 设m是一个正整数,a是一个整数。如果存在整数 a' 使得 成立,则 a 叫做 模 m 可逆元. 存在条件:a、m 互素 在模 m 的意义下,a' 是惟一存在的。这时 a' 叫做 a 的 模 m 逆元,记作 2 扩展欧几里得算法求逆元 由于 ,则满足方程的 x即为 a 模 b的逆元(同时 y 为 b 模 a 的逆元)。那么只需要使用扩展欧几里得求解,时间复杂度 ... 阅读详情

复习:求最大公约数算法

int gcd(int a, int b)
{
	return b ? gcd(b, a % b) : a;
}

首先介绍扩展欧几里得定理:

对于两个不全为0的整数a,b,必存在一组解x,y,使得ax+by=gcd(a,b)。

换句话说,形如ax+by的最小正整数等于gcd(a,b)。


实现代码如下:(一般题目都要用64位)

(复杂度:O(log max(a,b)))

typedef long long LL;

///求整数x和y,使得ax+by=gcd(a,b),且|x|+|y|最小(|x|<=b,|y|<=a)
///注意:即使a,b在int范围内,中间计算过程可能超出int范围

void exgcd(LL a, LL b, LL& d, LL& x, LL& y)
{
	if (!b) d = a, x = 1, y = 0;///此时ax+by=ax,gcd(a,b)=gcd(a,0)=a,故ax=a,所以x=1,y可以取任意整数,这里为计算方便取y=0,你也可以取y=1,同样可以得到一组不同的解!
	else exgcd(b, a % b, d, y, x), y -= x * (a / b);///注意后面这一步这么写是由于前面的递归使得x和y交换了位置
	
	/*
	上面公式的推导过程:
	设x,y表示第一次递归时的值,x',y'表示第二次递归时的值
	由于
	        gcd(a,b)=gcd(b,a%b)
	所以
	        ax+by=gcd(a,b)等价于bx'+(a%b)y'=gcd(b,a%b)=gcd(a,b)
	即
	        bx'+(a-(a/b)*b)y'=gcd(a,b)
	变形整理得
	        ay'+b*(x'-(a/b)*y')=gcd(a,b)
	所以
	        x=y',y=x'-(a/b)*y'
	*/
}


至于一般情况:ax+by=c,gcd(a,b)|c 的解,请参考《数论概论》P24-25

这里补充下为何通解是x=x0+kb,y=y0-ka(当然你也可以写成x=x0-kb,y=y0+ka):

首先把a化为a/gcd(a,b),b化为b/gcd(a,b),这样ax+by=1,gcd(a,b)=1(注意这里a,b实际上写作a'和b',为简单起见省掉撇号)

由于

ax+by = ax0+by0

所以

a(x-x0) = -b(y-y0) = P

所以

a|P,b|P

因为a,b互素,所以

ab|P

即

P=kab

所以

x-x0=kb,y-y0=-ka

整理得到

x=x0+kb,y=y0-ka


变形1:同余方程

扩展欧几里得算法除了解决线性不定方程ax+by=c之外,

还可以求解同余方程a≡c(mod m),b≡c(mod n)

将其化为a=c+mx,b=c+ny,作差得

mx-ny=a-b,从而化为线性不定方程解决


变形2:模m乘法逆元

定义:对于整数a,m,如果存在整数b,满足ab ≡ 1(mod m),则说,b是a的模m乘法逆元。


定理:a存在模m的乘法逆元的充要条件是gcd(a,m) = 1


充分性:
因为

gcd(a,m) = 1

根据欧拉定理,有

a^φ(m) ≡ 1(mod m)

因此

a * a^(φ(m)-1) mod m = 1

所以存在a的模m乘法逆元,即a^(φ(m)-1)

必要性:
假设存在a模m的乘法逆元为b,则

ab ≡ 1 (mod m)

所以

ab = km +1

所以

1 = ab - km

由欧几里得定理,有

gcd(a,m) = 1


由定理知:

对于ax + by = 1,可以看出x是a模b的乘法逆元,y是b模a的乘法逆元。

反过来,要计算a模b的乘法逆元,就相当于求ax + by = 1的x的最小正整数解,从而化为线性不定方程解决。

(当然,你也可以求a^(φ(b)-1) mod b,但即使我们用φ函数公式和逐次平方法(复杂度也是O(log b)),由于取模的次数远大于扩展欧几里得算法和代码量略大,所以此法不实用)


****转载请注明出处:http://blog.youkuaiyun.com/synapse7/article/details/9901195****

逆元 与 扩展欧几里得(超级详细,c++) 若整数 b,m 互质,并且对于任意的整数 a,如果满足 b|a 则存在一个整数 x,使得 a /b ≡ a * x ( mod m ) 则称 x 为 b的模 m 的 乘法逆元,记为 b^−1 ( mod m)b 存在乘法逆元的充要条件是 b 与模数 m 互质。当模数 m 为质数时,b^(m−2) 即为 b 的乘法逆元。2) 快速幂逆元 (important)思路:当模m是质数时,x 的 逆元 就等于x的m-2次方 即x^-1 = x^(m-2) 阅读详情

相关推荐

欧几里得算法求解乘法逆元——Python

刚刚学习密码,老师让使用欧几里得算法来求解一下乘法逆元,因此,就顺道学习了一下。 (1)欧几里得算法,大体就是递归求解两个数的最大公约数,在本程序中它的作用就是求a,b的最大公约数,若是最大公约数不为0则判断,a关于b,或者b关于a的逆元是不存在的,否则就可以继续进行下去,具体欧几里得算法可以看百度百科中介绍的很是详细; 欧几里得算法 (2)扩展的欧几里得算法,求得是 a*x + b*y

baidu_38271024的博客 1万+

数论(一)模运算,同余

模运算 模运算即 mod,% 就是求余运算 1.a除以m的余数r,r= a mod m=a % m 即0 ≤ r ≤ m-1,a = k*m+r,其中 k=a/m取整,记作【a/m】 2.a%m 的正负由被除数的符号决定,c里面是和被除数的符号相同 同余 如果对于整数 m 和两个整数 a和 b,如果存在((a-b)mod)=0,就称a 和 b是同余的,记为a≡b(mod m)。 1.如果存...

qianzhezhi1127的博客 8963

【专题】欧几里得算法、扩展欧几里得、乘法逆元

1.欧几里得 用途 最大公因数和最小公倍数 定理:  gcd(a,b)=gcd(b,a%b)gcd(a,b)=gcd(b,a\%b)   证明: 我们令c=gcd(a,b)c=gcd(a,b) 令a=n∗ca=n*c , b=m∗cb=m*c a%b=a−k∗b=(n−m∗k)∗ca\%b=a-k*b=(n-m*k)*c,可知,c也是a%ba\%b的因子,现在只需证明c是b和

AIDreamer 2932

两种求模m逆元的方法

在a|b(a能整除b)的前提下,计算(b/a)mod m的时候转化为 计算(b*x)mod m ; 这时的x就是a的逆元(a模m的逆元);                                 此时x满足   (a*x mod m == 1);      这个x的求法有一下两种: 1)扩展欧几里得算法求解 a*x+m*y=1;  因为 a*x mod m =

emmmmmm 1万+

同余方程 + 乘法逆元

同余方程   分析:为了介绍扩展欧几里得,先介绍一下贝祖定理:即如果a、b是整数,那么一定存在整数x、y使得ax + by = gcd(a, b)。   即如果ax + by = m有解,那么m一定是gcd(a, b)的若干倍。(可以来判断一个这样的式子有没有解)   有一个直接的推论:如果ax + by = 1有解,那么gcd(a, b) = 1,也就是说a和b互质。   如果我们想要求出a和b的最大公因数gcd(a, b),最容易想到的就是古老悠久而又相当强大的辗转相除法: int gcd(int a,

iamcht的博客 1137

,密码学扩展的EUCLID算法求逆元

用的是VC++6.0编的 直接复制代码即可运行 代码通俗易懂,但不够简洁 希望大家看后多多指导指导 主要是大家一起学习学习

逆元

对于正整数a和m,如果有,那么把这个同余方程中的最小正整数解叫做a模m的逆元。 逆元一般用扩展欧几里得算法来求得,如果为素数,那么还可以根据费马小定理得到逆元为。 推导过程如下 求现在来看一个逆元最常见问题,求如下表达式的值(已知) 当然这个经典的问题有很多方法,最常见的就是扩...

★探梦少年☆的博客 577

[kriging](一)网上下载的kriging克里金的C++程序的初步调试

笔者在网上下载了一份克里金的C++程序,水平有限,正在逐步地调试中。 初步 克里金法现在在许多软件都已经有集成了,据笔者所知: arcgis : 看过有的arcgis培训视频里面简略介绍了里面的插值方法,有克里金。 surfer :笔者用过这个,效果很好。 gocad :听说有 landmark &amp;jason :研究生时候用的专业的石油物探软件,里面有克里金法,万恶的开始。 pykrig...

FOREST优快云 5612

整数a关于模m的乘法逆元

迭代算法;递归算法;中国剩余定理;一次同余组的关键因子求解

m0_53793870的博客 3723

电机控制——PMSM无感FOC控制(一)FOC入门

FOC 是一种电机控制技术,全称为 Field Oriented Control(磁场定向控制),也称作矢量控制。该技术可以提高电机的效率、控制稳定性和精度,广泛应用于电机驱动系统中,是目前无刷直流电机(BLDC)、永磁同步电机(PMSM)、感应电机的高效控制的最优方法之一。本节主要讲了FOC的大致流程,带大家先了解FOC到底是个什么东西在做什么,各个模块具体的原理会放到后面的章节详细讲解。FOC其实就是通过控制,相电流按照正弦变化,从而产生出旋转的磁场,控制电机转子转动。

zhuxinmingde的博客 2631

Mininet 2.2.1 图形可视化界面使用注意事项

前言 关于mininet的安装,网上教程不少,大致可以参考以下这篇文章: https://blog.youkuaiyun.com/linyixiao88/article/details/65651390 安装的时候,也可以不必根据上面这篇文章这么麻烦,直接sudo apt-get install mininet,即可。 Mininet可视化 Mininet 2.2.0以上版本内置了...

裕东方的博客 4192

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

欧几里德算法:复习:求最大公约数算法(欧几里得算法、也叫辗转相除法)。欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。第一种证明:a可以表示成a = kb + r,则r = a mod b假设d是a,b的一个公约数,则有d|a, d|b,而r = a...

weixin_33636371的博客 950

Unity游戏开发实战:用Flow Field实现RTS百人军团流畅寻路(附完整代码)

本文深入探讨了在Unity中利用流场寻路技术解决RTS游戏大规模单位移动性能瓶颈的实战方案。通过解析从Dijkstra算法生成成本场、积分场到最终向量场的核心原理,并结合分块、缓存及与DOTS/ECS架构集成的优化策略,实现了百人军团的流畅群体寻路。文章提供了完整的代码示例,助力开发者构建高性能的RTS寻路系统。

weixin_28363123的博客 587

扩展欧几里得求乘法逆元 - 手算(结尾附视频)

本文关键字:恶补高数、加密算法、RSA、乘法逆元、手算方法。整个求解的过程就是使用辗转相除法求两个数的公约数,并且我们知道公约数的结果为1,所以一直计算到1为止即可。当数值较小时,可以通过较少的式子得到最终的结果,当数值较大时建议直接使用程序解决。

微光点亮星辰 1万+

Vue3 - Arco Design Vue 表格组件 table 隐藏鼠标移入时 hover 高亮背景色,el-table 组件去除鼠标悬停在表格行的 hover 高亮效果(改变鼠标移入时的背景色)

vue3,arcodesignvue,arcodesign,表格,a-table,hover,表格hover的class类名是什么,class,hover,在arcodesignvue项目中,表格组件如何去掉鼠标移入时的hover效果,vue3arco.design表格组件修改鼠标移入行的背景颜色,table表格,取消表格行row移入高亮效果,去掉鼠标移入行时的hover效果,取消a-table的hover状态,取消高亮显示,隐藏表格鼠标hover效果,去除鼠标触摸变色效果,如何取消arco表

🏆 前端领域优质创作者 3773

SPAD IMX479规格_VOP

对于VOP的定义,很多人可能是不理解这一路的供电,实际上这一路供电是非常重要的,这是给器件SPAD供电,决定SPAD是否work,在大部分的paper以及大部分公司,基本都是叫VOP,名称是SPAD breakdown voltage power supply,严格意义上叫Operating Voltage,工作电压。当然有些公司也有一些其他叫法就不提了。其实大家可以明显的看出,典型值-20.5没有发生变化,市面上绝大多数VOP的典型值也都是在-20V这边。

致力于lidar应用开发 701

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

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

aw2371的博客 1398

Allegro如何用自带的功能将线段变成铜皮操作指导

在做PCB设计的时候,有时根据设计需要将线段变成铜皮,可以借助辅助工具来实现这一操作,但是Allegro自身也自带这个功能,如下图。勾选Delete original objects。如何用自带的功能将线段变成铜皮操作指导。勾选Convert to shape,需要把这段走线变成铜皮。

weixin_54787054的博客 2946

模意义下的乘法逆元

乘法逆元常用于计算概率、期望、组合数学等题目中,出现频率极高,这篇文章可以让你迅速学会这一知识点!

OIer_wst的博客 1194

YOLOv8 道路病害检测全栈工程|22 类路面裂缝坑洞 VOC&YOLO 数据集、PyQt 精美 GUI、ONNX 量化、全套训练评估曲线落地

城市道路、国省道、高速公路路面长期受车辆碾压、雨水侵蚀,衍生纵向 / 横向裂纹、坑洼、车辙、接缝剥落等二十余种路面病害。传统人工道路巡检存在致命行业痛点:人工徒步 / 乘车目视巡检效率极低,单日有效巡查里程不足 20 公里;毫米级细微线性裂纹肉眼极易漏检,雨水冲刷后微小病害快速扩张为大坑槽,养护成本翻倍;强光暴晒、阴雨积水、路面油污场景人工分辨难度大;海量巡检图片人工分类统计病害台账耗时数天,养护决策缺乏量化数据支撑。传统阈值、边缘检测图像处理仅能识别大面积坑洞,无法区分二十余种细分裂纹类型,泛化能力极差。

getusushu的博客 123

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

同余方程、欧拉定理、乘法逆元、定义在Zm上的矩阵求逆

上篇简单介绍了一下仿射密码:仿射密码的加密与解密,很多东西都没有深入去挖掘,这次上完课后对实现它的一些概念公式又有了一个更深的认识。 目录1.模同余2.一次同余方程唯一解定理 首先介绍几个概念: 1.模同余 模同余:给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b模m同余,记作a≡b(mod m)。对模m同余是整数的一个等价关系。 其中定义群Zm = {0, 1, 2, …, m-1} 证明: 必要性: 若a和b除以m留下相同的余数r, a=q1

Pioo_的博客 2445

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

求解乘法逆元的方法

求解乘法逆元有三种常用方法: 1、费马小定理/欧拉函数 2、扩展欧几里德算法 3、线性求逆元 取模公式 (a+b)&nbsp;mod&nbsp;p=(a&nbsp;mod&nbsp;p+b&nbsp;mod&nbsp;p)&nbsp;mod&nbsp;p(a+b)~mod~p=(a~mod~p+b~mod~p)~mod~p(a+b)&nbsp;mod&nbsp;p=(a&nbsp;mod&nbsp...

默的博客 4575

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an &ldquo;advanced algorithms&rdquo; book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

乘法逆元计算

逆元计算

m0_37146044的博客 7495

【详解】求解乘法逆元(快速幂 & 扩展欧几里得)

求解乘法逆元,费马小定理 & EXGCD

2403_87021226的博客 1726
上一篇: HDU 1021/ZOJ 2060 Fibonacci Again(数论&整除推导&位运算技巧)
下一篇: NEFU 119 组合素数(数论)
synapse7
博客等级 码龄14年 432粉丝 701原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值