扩展欧几里得算法——AcWing.877扩展欧几里得算法

扩展欧几里得算法

定义

扩展欧几里得算法是用来在已知整数 a、b 的情况下,求解一组整数 x、y 使得 ax + by = gcd(a, b)(gcd 表示最大公约数)。

运用情况

  • 求解线性同余方程。
  • 在密码学等领域有广泛应用。

注意事项

  • 要注意边界情况和特殊值的处理。
  • 在计算过程中要注意数据的范围,避免溢出。

解题思路

通过递归的方式不断缩小问题规模。从较大的数对(a, b)逐步递推到较小的数对,直到其中一个数为 0。在递推过程中同时计算出对应的 x 和 y 值。

首先,我们考虑当 a 为 0 时的特殊情况,此时 x 取 0,y 取 1,因为 0 * 0 + b * 1 = b = gcd(0, b)。

然后,对于一般情况,我们通过递归到下一层,即计算 b % a 和 a 的扩展欧几里得解 x1 和 y1

接下来,通过这一层得到的 x1 和 y1 来推导出当前层的 x 和 y。具体推导公式为 x = y1 - (b / a) * x1y = x1

这样不断递归下去,就可以逐步求解出最终满足 ax + by = gcd(a, b) 的 x 和 y

比如,当计算 gcd(12, 5) 时,先递归到计算 gcd(5, 2),再到 gcd(2, 1),最后到 gcd(1, 0) 得到 x = 0y = 1,然后逐步回推得到 x = -1y = 2 满足 12 * (-1) + 5 * 2 = 2 = gcd(12, 5)

在实际应用中,常常用于求解线性同余方程等问题,通过找到这样一组特殊的 x 和 y,可以帮助我们解决很多相关的数学问题。

AcWing.877扩展欧几里得算法

题目描述

877. 扩展欧几里得算法 - AcWing题库

运行代码

#include <iostream>
using namespace std;
void extend(int a, int b, int &x, int &y) {if (a == 0) {x = 0;y = 1;return;}int x1, y1;extend(b % a, a, x1, y1);x = y1 - (b / a) * x1;y = x1;
}
int main() {int n;cin >> n;while (n--) {int a, b;cin >> a >> b;int x, y;extend(a, b, x, y);cout << x << " " << y << endl;}return 0;
}

代码思路

  • extend函数是扩展欧几里得算法的实现。
    • 首先处理特殊情况,当a为 0 时,直接设置x为 0,y为 1 并返回,因为此时满足 0x + b1 = b = gcd(0,b)。
    • 对于一般情况,通过递归调用自身来计算b%aa的扩展欧几里得解x1y1
    • 然后根据当前层的参数和递归得到的结果来计算当前层的xy,即通过公式x = y1 - (b/a)*x1y = x1来确定。
  • main函数中:
    • 首先读取对数n
    • 然后通过循环,对于每一对输入的数ab,声明变量xy,调用extend函数来计算满足条件的xy,并将结果输出到控制台。

其他代码

#include<iostream>
using namespace std;
int exgcd(int a,int b,int &x,int &y)
{if(!b){x=1,y=0;return a;}int d=exgcd(b,a%b,y,x);y-=a/b*x;return d;
}
int main()
{int n;cin>>n;while(n--){int a,b,x,y;cin>>a>>b;exgcd(a,b,x,y);cout<<x<<' '<<y<<endl;}return 0;
}

代码思路

  1. 扩展欧几里得算法(exgcd函数):

    • 函数exgcd(int a, int b, int &x, int &y)接收四个参数,其中a和b是要计算最大公约数的两个整数,x和y是引用类型,用于输出满足 ax + by = gcd(a, b) 的一组整数解。
    • 当b为0时,根据欧几里得算法的基本原理,直接得出a是当前的GCD,此时设置x=1, y=0,因为a1 + 0b = a。
    • 否则,递归调用exgcd(b, a % b, y, x)。这里进行了变量交换,原本的x变为y,原本的y变为x,这是为了正确回溯解的值。
    • 递归调用返回后,根据递归过程中的关系调整y的值,使其满足原始方程 ax + by = gcd(a, b)。具体操作为:y -= a/b*x;
    • 最终返回计算得到的最大公约数d。
  2. 主函数(main:

    • 首先读取一个整数n,表示接下来有n组数据。
    • 使用一个循环,对于每组数据,读取两个整数a和b。
    • 调用exgcd(a, b, x, y)函数,计算a和b的最大公约数,并找到对应的x和y。
    • 输出x和y的值,每组解之间用空格分隔,每组数据输出后换行。
    • 循环处理完所有数据后,程序结束。

应用场景举例:

  • 模逆元计算:在RSA加密算法、中国剩余定理等问题中,需要找到一个整数x,使得 ax ≡ 1 (mod b),这里可以通过扩展欧几里得算法找到x,当且仅当a和b互质时,x即为a关于模b的乘法逆元。
  • 解线性同余方程:求解形式如ax + by = c的方程,尤其是在模意义下的求解,扩展欧几里得算法是基础工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/27678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LED显示屏色差处理方法

LED显示屏以其高亮度、低功耗和长寿命等优点&#xff0c;在广告、信息发布和舞台背景等领域得到广泛应用。然而&#xff0c;由于生产批次的不同&#xff0c;LED显示屏在亮度和色度上可能存在差异&#xff0c;影响显示效果。本文将探讨如何通过逐点校正技术来解决这一问题。 逐点…

字节智能体平台:扣子原理和实践案例

完整内容&#xff1a; 字节智能体平台&#xff1a;扣子原理和实践案例

Navicat和SQLynx产品功能比较二(SQL查询)

数据库管理工具最常用的功能就是SQL的查询&#xff0c;没有之一。本文针对Navicat和SQLynx做了SQL查询相关的性能测试&#xff0c;从测试结果来看&#xff0c;Navicat主要适合开发类的小型数据量需求&#xff0c;SQLynx可以适应大型数据量或小型数据量的需求&#xff0c;用户可…

拓扑排序、关键路径(AOV、AOE网)

拓扑排序&#xff08;AOV网&#xff09; 相关知识 在现代化管理中&#xff0c;人们常用有向图来描述和分析一项工程的计划和实施过程&#xff0c;一个工程常被分为多个小的子工程&#xff0c;这些子工程被称为活动&#xff08;Activity)。 在有向图中若以顶点表示活动&#xff…

Sentence Transformers x SwanLab:可视化Embedding训练

Sentence Transformers(又名SBERT)是访问、使用和训练文本和图像嵌入&#xff08;Embedding&#xff09;模型的Python库。 你可以使用Sentence Transformers快速进行模型训练&#xff0c;同时使用SwanLab进行实验跟踪与可视化。 1. 引入SwanLabCallback from swanlab.integra…

AI时代新爬虫:网站自动转LLM数据,firecrawl深度玩法解读

在大模型的时代&#xff0c;爬虫技术也有了很多新的发展&#xff0c;最近出现了专门针对大模型来提取网站信息的爬虫&#xff0c;一键将网页内容转换为LLM-ready的数据。今天我们介绍其中的开源热门代表&#xff1a;firecrawl。 firecrawl 是什么 FireCrawl是一款创新的爬虫工…

《2023-2024中国数据资产发展研究报告》

中国电子信息产业发展研究院发布《2023-2024中国数据资产发展研究报告》&#xff08;下称《报告》&#xff09;&#xff0c;紧跟国家战略部署&#xff0c;调研国内数据资产发展现状&#xff0c;掌握数据价值实现路径&#xff0c;助力释放数字经济新动能。 《报告》从数据资产相…

这家来自内蒙古的物流企业,用另一种方式减碳超500吨

2016年&#xff0c;多蒙德实业集团整合旗下物流及运销板块&#xff0c;组建成立了内蒙古多蒙德科技有限公司&#xff08;以下简称“多蒙德”&#xff09;&#xff0c;整合互联网、大数据及智慧物流为一体&#xff0c;自主研发多蒙达网络货运平台及多个供应链智慧系统&#xff0…

24年下教资笔试报名照片要求及处理方法

24年下教资笔试报名照片要求及处理方法

关闭kylin(麒麟)系统的安全认证(烦人的安全认证)

打开grub sudo vim /etc/default/grup修改安全认证选项 增加12行&#xff0c;把13行注释掉 保存更改, 然后执行下面的命令&#xff1a; sudo sync sudo reboot重启成功后&#xff0c;就关闭了安全认证了~~~~~。 总体来讲&#xff0c;kylin还是基于ubuntu的内核的&#xff0c;…

文章解读与仿真程序复现思路——电工技术学报EI\CSCD\北大核心《考虑源网储协同配合下的移动式波浪能发电平台并网优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

细说ARM MCU的串口接收数据的实现过程

目录 一、硬件及工程 1、硬件 2、软件目的 3、创建.ioc工程 二、 代码修改 1、串口初始化函数MX_USART2_UART_Init() &#xff08;1&#xff09;MX_USART2_UART_Init()串口参数初始化函数 &#xff08;2&#xff09;HAL_UART_MspInit()串口功能模块初始化函数 2、串口…

深入解析Prometheus:强大的开源监控与告警系统

目录 引言 一、运维监控平台的设计思路 &#xff08;一&#xff09;设计思路 1.数据收集模块 2.数据提取模块 3.监控告警模块 &#xff08;二&#xff09;监控平台层级 二、Prometheus简介 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;核心特征 …

vue+elementUI实现在表格中添加输入框并校验的功能

背景&#xff1a; vue2elmui 需求&#xff1a; 需要在一个table中添加若干个输入框&#xff0c;并且在提交时需要添加校验 思路&#xff1a; 当需要校验的时候可以考虑添加form表单来触发校验&#xff0c;因此需要在table外面套一层form表单&#xff0c;表单的属性就是ref…

救命!接手了一个老项目,见到了从业10年以来最烂的代码!

后台回复“书籍”&#xff0c;免费领取《程序员书籍资料一份》 后台回复“5000”&#xff0c;免费领取面试技术学习资料一份 在程序员这个行业从业快10年了&#xff0c;每过几个月回头看看自己写的代码&#xff0c;都会觉得写的也太烂了&#xff0c;不敢想象是自己之前写的。…

2024黄河流域比赛的复现

目录 WEB [GKCTF 2021]easynode unser 知识点 WEB 根据此题先复现[GKCTF 2021]easynode这个题&#xff0c;这两个题类似 [GKCTF 2021]easynode 1.打开页面发现是登录页面&#xff0c;找到源文件里面的代码&#xff0c;分析如何进行登录&#xff0c;发现经过safeQuery()函…

深度学习 - CNN

第一部分&#xff1a;基础知识 1. 什么是卷积神经网络&#xff08;CNN&#xff09; 定义和基本概念 卷积神经网络&#xff08;CNN&#xff09;是一种专门用于处理具有网格结构数据&#xff08;如图像&#xff09;的深度学习模型。它们在图像识别和计算机视觉领域表现尤为突出…

SX2106B 2A同步降压型DC/DC转换器芯片IC

一般描述 SX2106B是一款同步降压DC/DC转换器&#xff0c;提供宽广的4.5V至24V输入电压范围和2A连续负载电流能力。 SX2106B故障保护包括逐周期电流限制、UVLO、输出过电压保护和热关机。可调软启动功能&#xff0c;防止启动时的浪涌电流。该器件采用电流模式控…

R语言数据分析案例28-对数据集可视化和T检验

一、分析主题&#xff1a; 本分析旨在对数据集进行可视化和 T 检验&#xff0c;以探索数据集中的变量之间的关系和差异。通过可视化数据&#xff0c;我们可以直观地了解数据的分布和趋势&#xff0c;而 T 检验则可以帮助我们确定这些差异是否具有统计学意义。 二、具体分析 …

【字符函数】

接下来介绍部分字符函数测试 2. 字符转换函数 1.字符分类函数 1.1iscntrl 注&#xff1a;任何控制字符 检查是否有控制字符 符合为真 int main() {int i 0;char str[] "first line \n second line \n";//判断是否遇到控制字符while (!iscntrl(str[i])){p…