拓展欧几里得算法

【模板】拓展欧几里得算法 IdeaIdeaIdea 拓展欧几里得算法是用来求已知 (a,b)(a,b)(a, b) 时,求解一组 (x,y)(x,y)(x, y) 使得 ax+by=gcd(a,b)ax+by=gcd(a,b)ax + by = \gcd(a,b) 。 因为 gcd(a,b)=gcd(b,amodb)=gcd(b,a−⌊ab⌋b)gcd(a,b)=gcd(b,amodb)=gcd(b,a−⌊ab⌋b)\... 阅读详情

上一篇:欧几里得算法


概念:

对于不全为0的非负整数 a , b a,b a,b, gcd ⁡ ( a , b ) \gcd(a, b) gcd(a,b) 表示 a , b a,b a,b 的最大公约数,必然存在整数对 x , y x,y x,y ,使得 g c d ( a , b ) = a x + b y gcd(a,b) = ax + by gcd(a,b)=ax+by 。
给定 a a a 和 b b b ,拓展欧几里得算法可以计算出这个整数对 x , y x,y x,y 。

证明&&基本算法:

(以下证明过程中所有的 / / / 均为整除)

设 a > b a > b a>b 。

  1. b = 0 b=0 b=0
    则 gcd ⁡ ( a , b ) = a \gcd(a,b)=a gcd(a,b)=a 。此时 x = 1 , y = 0 x=1,y=0 x=1,y=0 。
  2. b ≠ 0 b≠0 b̸​=0
    ∵ a > b > 0 \because a>b>0 ∵a>b>0
    ∴ a ≠ 0 \therefore a\ne 0 ∴a̸​=0
    设 a x 1 + b y 1 = gcd ⁡ ( a , b ) ax1+\qquad b\qquad y1=\gcd(a,b) ax1+by1=gcd(a,b)
    b x 2 +   ( a   m o d   b )   y 2 = gcd ⁡ ( b , a   m o d   b ) \quad bx2+\ (a\bmod b)\ y2=\gcd(b,a\bmod b) bx2+ (amodb) y2=gcd(b,amodb)
    ∵ gcd ⁡ ( a , b ) = gcd ⁡ ( b , a   m o d   b ) ∵\gcd(a,b) = \gcd(b,a\bmod b) ∵gcd(a,b)=gcd(b,amodb)(欧几里得原理)
    ∴ a x 1 + b y 1 = b x 2 + ( a   m o d   b ) y 2 ∴ax1+by1 = bx2+(a\bmod b)y2 ∴ax1+by1=bx2+(amodb)y2
    ​ 即 a x 1 + b y 1 = b x 2 + ( a − ( a / b ) × b ) y 2 = b x 2 + a y 2 − ( a / b ) × b y 2 = a y 2 + b x 2 − ( a / b ) × b y 2 \!\begin{aligned} 即ax1+by1 &= bx2 + (a - (a/b) × b)y2 \\ &=bx2 + ay2-(a/b)×by2 \\ &=ay2 + bx2-(a/b) × by2 \end{aligned} 即ax1+by1​=bx2+(a−(a/b)×b)y2=bx2+ay2−(a/b)×by2=ay2+bx2−(a/b)×by2​
    根据恒等定理得 x 1 = y 2 , y 1 = x 2 − ( a / b ) × y 2 x1 = y2,y1 = x2 - (a/b) × y2 x1=y2,y1=x2−(a/b)×y2
    利用上式,我们就可以将求 x 1 , y 1 x1,y1 x1,y1 转化为求 x 2 , y 2 x2,y2 x2,y2 。

因为 gcd ⁡ \gcd gcd 不断的递归求解过程中,一定会出现 b = 0 b=0 b=0 的情况,所以递归可以结束。

我们可以得出两点:

  1. 必然存在满足条件的整数对 x , y x,y x,y ,原命题得证。
  2. 算法是正确的,且时间复杂度仅为 log ⁡ \log log 级别。

代码实现

  1. 递归实现的代码

    int exgcd(int a,int b,int &x,int &y) 
    //最终答案存在x和y里面,函数值返回的是两数的gcd
    {
    	if (b==0) //递归边界
    	{
    		x=1; //可参考证明过程
    		y=0; //同上
    		return a;
    	}
    	int r=exgcd(b,a%b,x,y),t=x; //t是临时变量,保留x的值
    	x=y; //可参考证明过程
    	y=t-a/b*y; //同上
    	return r;
    }
    
  2. 非递归实现(无需掌握,甚至都无需了解)

    int exgcd(int m,int n,int &x,int &y) 
    //最终答案存在x和y里面,函数值返回的是两数的gcd
    {
    	int x1,y1,x0,y0;
    	x0=1; y0=0;
    	x1=0; y1=1;
    	x=0; y=1;
    	int r=m%n;
    	int q=(m-r)/n; //等同于m/n
    	while (r) //余数不为零
    	{
    		x=x0-q*x1;    y=y0-q*y1; //可参考证明过程
    		x0=x1;        y0=y1;     //迭代
    		x1=x;         y1=y;      //迭代
    		m=n; n=r; r=m%n;
    		q=(m-r)/n;
    	}
    	return n;
    }
    

后记

拓展欧几里得算法也可以用来求 a a a 膜 b b b 意义下的逆元:

  • 当 gcd ⁡ ( a , b ) > 1 \gcd(a,b)>1 gcd(a,b)>1 时,显然逆元不存在;
  • 当 gcd ⁡ ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1 时,可用拓展欧几里得算法求出 x , y x,y x,y 满足 a x + b y = gcd ⁡ ( a , b ) ax+by=\gcd(a,b) ax+by=gcd(a,b)。
    在膜 b b b 的意义下,上式即为 a x ≡ 1 ( m o d b ) ax\equiv 1 \pmod b ax≡1(modb) 。所以 x x x 就是 a a a 膜 b b b 意义下的逆元。

在模数不为质数时,求逆元通常都采用这种方法。


LaTeX \LaTeX LATE​X 和 M a r k d o w n \rm Markdown Markdown 打得好累啊,如果对您有帮助的话,请点个赞再走吧QAQ

扩展欧几里得详解证明 扩展欧几里得详解证明,里面没有例题,详细请看统一标题html的文档 立即下载

相关推荐

逆向工程师的Shopee爬虫避坑指南:af-ac-enc-dat参数生成原理与反反爬策略

本文深入剖析了Shopee电商平台的反爬虫加密机制,重点解析了核心请求头参数x-sap-ri、x-sap-sec及af-ac-enc-dat的生成原理与联动关系。文章从逆向工程视角,提供了定位加密代码、分析算法逻辑的实战方法,并分享了基于JS执行环境模拟与无头浏览器控制的可持续反反爬策略,为高效、稳定地采集数据提供专业指南。

weixin_28607671的博客 1495

扩展欧几里得算法

深入浅出介绍扩展欧几里得算法,详细阐述了如何求解一个不定方程,语言通俗易懂却又不是严谨性,值得一读!

OIer_wst的博客 1161

【点云语义分割】Ubuntu20.04下RangeNet++环境配置与实战指南

本文详细介绍了在Ubuntu20.04系统下配置和运行RangeNet++点云语义分割模型的完整实战指南。内容涵盖从Cuda、cudnn到TensorRT的深度学习环境搭建,RangeNet++源码编译的详细步骤与常见问题解决,以及如何运行首个分割Demo并可视化结果。最后,还探讨了处理自定义点云数据格式和进行性能调优的进阶技巧,旨在帮助开发者和研究者快速部署并应用这一先进的点云语义分割技术。

rnn9storyteller的博客 516

信息安全数学基础——扩展欧几里得算法

本文主要介绍了扩展欧几里得算法,其在求解乘法逆元时会非常有帮助。

weixin_45930035的博客 2948

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1732

实验五 循环结构第1关:斐波那契数列第2关:统计一段英文语句中的单词数和句子数第3关:密码判断第4关:通过数列求自然常数e第5关:双倍余额递减法计算固定资产折旧第6关:销售统计第7关:投资年限计算

第1关:斐波那契数列第2关:统计一段英文语句中的单词数和句子数第3关:密码判断 第4关:通过数列求自然常数e 第5关:双倍余额递减法计算固定资产折旧

pro_daily的博客 8168

扩展欧几里得算法及其应用

本文主要介绍扩展欧几里得算法及其相关应用。

张小艾博客 2635

下载猫 —— 会员体系安全分析与加固方案

下载猫的会员验证体系完全失效,破解不需要任何工具链、不需要写代码、不需要改文件。已验证的成功攻击路径:攻击者启动软件时加一个参数,然后用 3 行 JavaScript 即可将会员状态改为"有效期至 2099 年",全部功能闸门放行。等价于普通用户按F12打开控制台输入 3 行代码,全程不到 10 秒。项目结论破解难度⭐ 极低(会按 F12 即可,无需任何破解工具)是否修改文件否(重启软件自动恢复)是否需要服务器否是否影响其他用户单人即可完成,可复制分发修复所需工作量。

猫敷雪 51

扩展欧几里得算法的证明

扩展欧几里得算法实际上就是对于ax+by=gcd(a,b),一定有一组整数解x,y使其成立 对于这个式子的证明,可以采用数学归纳法进行实现,先证明当n= 1时命题成立。 假设n=m时命题成立,那么可以推导出在n=m+1时命题也成立。(m代表任意自然数) 然后命题得证。 在这个式子里,也就是当b=0是一定成立,假设bx+(a%b)y=gcd(b,a%b)成立,证明ax+by=gcd(a,b)成立 实际上已知bx1+(a%b)y1=gcd(b,a%b)需要证明ax2+by2=gcd(a,b) 我们令a=kb+c

徒手拆机甲的博客 754

在RV1126上实现人脸识别----MobileFaceNet转成rknn模型

目录 1.模型下载 2 转成rknn模型并推理 3 查看网络模型 1.模型下载 首先下载MobileFaceNet的模型,github下载地址为:https://github.com/sirius-ai/MobileFaceNet_TF/tree/master/arch/pretrained_model/ 2 转成rknn模型并推理 import numpy as np import cv2 from rknn.api import RKNN if __name__ == '__..

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3527

Apache Kylin 命令注入漏洞复现(CVE-2020-1956)

Apache Kylin 中的静态 API 存在安全漏洞,可以将os命令与用户输入字符串连接起来,攻击者可以在Kylin没有任何保护或验证的情况下执行任何os命令。

0xSec 1558

扩展欧几里得算法(含严谨证明)

要整扩展欧几里得,我们肯定要学会欧几里得算法,如果你没有学过gcd(a,b)=gcd(b,a%b),那么打开这个链接:欧几里得算法 好了,如果你已经学完了欧几里得,那么就能默认你知道gcd(a,b)=gcd(b,a%b),那么什么是扩展欧几里得,就是对于ax+by=gcd(a,b),一定有一组整数解x,y(注意!不要用24和36这个例子卡我,x,y是整数,可以为负的!) 在证明之前,...

dfssbqyrq96616258的博客 430

Android 14.0 系统设置显示主菜单添加屏幕旋转菜单实现旋转屏幕功能

在14.0的系统rom定制化开发中,在对系统设置进行定制开发中,有产品需求要求增加 旋转屏幕功能的菜单,就是在点击旋转屏幕菜单后弹窗显示旋转0度,旋转 90度,旋转180度, 旋转270度针对不同分辨率的无重力感应的大屏设备的屏幕旋转功能的实现, 接下来就来分析实现这个功能

安卓兼职framework和app工程师的博客 1312

【算法】欧几里得与拓展欧几里得算法

算法学习笔记之欧几里得算法与拓展欧几里得算法

Eristic0618的博客 1634

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

欧几里得算法及拓展欧几里得算法

快速链接前言欧几里得算法拓展欧几里得算法 前言 本文主要介绍的是求gcd⁡(a,b)\gcd(a,b)gcd(a,b)及方程ax+by=gcd⁡(a,b)ax+by=\gcd(a,b)ax+by=gcd(a,b)的解的方法,即欧几里得算法和拓展欧几里得算法。 欧几里得算法 定理:∀a,b∈N,b≠0,gcd⁡(a,b)=gcd⁡(b,a mod b)\forall a,b\in\N,b\ne 0,\gcd(a,b)=\gcd(b,a\bmod b)∀a,b∈N,b​=0,gcd(a,b)=gcd(b,

静谧幽蓝の神奇小屋 320

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【数学知识】拓展欧几里得算法

欧几里得算法和扩展欧几里得算法 拓展欧几里得算法的简单讲解和应用

柘尾鱼的博客 2468

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

欧几里得算法及其拓展欧几里得算法

直接利用欧几里得算法(辗转相除法)的原理(点击这里)就可以解决。 最大公约数 递归版本: int gcd(int a,int b) { while(b) { a=a%b; swap(a,b); } return a; } 简化的递归版本: int gcd(int a,int b) { if(b==0) return a; ...

D.k的博客 604

扩展欧几里得算法java_拓展欧几里得算法

写在前面:by celebi-yoshi结论拓展欧几里得算法能解决的问题有:① 已知正整数a,b,求一组p,q使满足p*a+q*b ≡ 0 (MOD GCD(a,b))② 已知正整数a,b,素数p,求一个整数x使满足x*a ≡ b (MOD p)③已知正整数a,b,素数p,求一个整数x使满足ax ≡ b (MOD p)④已知正整数a,b,c,求一个整数x使满足x*a ≡ b (MOD c)⑤已知正...

weixin_32129187的博客 770

欧几里得算法--二进制欧几里得算法--拓展欧几里得算法

首先说一下,欧几里得算法:求两个数的最大公约数 教材的写法是: 1 //输入要求a>=b>=0 2 unsigned euclid(unsigned a,unsigned b){ 3 if(b==0) return a; 4 return euclid(b,a%b); 5 } 当然也可以改成非递归的迭代版本: 1 int Gcd(in...

weixin_30480651的博客 816

欧几里得和拓展欧几里得算法

欧几里得和拓展欧几里得算法 1.欧几里得算法 ⑴算法内容 欧几里得算法又称辗转相除法,用于计算两个整数的最大公约数。 gcd(a,b)=gcd(b,a(modb)) gcd(a, b) = gcd(b, a (mod b)) gcd(a,b)=gcd(b,a(modb)) ⑵下面给出证明: (首先规定:gcd为求解最大公约数, mod 是取余,符号" | "为整除) 对于欧几里得算法的证明,...

qq_43561370的博客 350

欧几里得算法与拓展欧几里得

欧几里得算(辗转相除法) 算法描述 设 a>=b a÷b=k⋅⋅⋅⋅⋅⋅r a \div b = k ······ r a÷b=k⋅⋅⋅⋅⋅⋅r a和b的最大公约数等于b和r的最大公约数。 gcd(a,b)=gcd(b,a%b),当b为0时,a为(a,b)最大公约数 C++实现 //递归方式 int gcd(int a,int b) { if(b==0) return a; ...

咸鱼爱学习的博客 216
上一篇: 欧几里德算法
下一篇: 高精gcd模板
Cr.rech
博客等级 码龄8年 12粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值