扩展欧几里得算法——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,一经查实,立即删除!

相关文章

找工作小项目:day15-macOS支持、完善逻辑

macOS支持、完善逻辑 目前的代码可以在Linux上完美运行编译&#xff0c;在Windows上也可以通过WSL编译运行源代码&#xff0c;但是在MacBook上却无法运行编译&#xff0c;这主要是由于macOS上没有epoll&#xff0c;取而代之的很相似的kqueue。由于操作系统不同&#xff0c;我们…

LED显示屏色差处理方法

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

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

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

js的数据类型以及数据类型的判断

js的数据类型 在ECMAScript中有5中简单数据类型(基本数据类型) 分别是 Undefined, Null,Boolean,Number,String。在es6中引入了一个新基本数据类型是symbol。 还有复杂数据类型(引用类型) Object,本质上是由一组无序键值对组成的&#xff0c; Object, Array, function。 数据…

JVM 生产环境优化

如果一台机器上,有多个独立java程序,比如有5个独立java大型应用,只有总共32个CPU的情况下(现在普通的服务器几百个CPU了) -XX:ParallelGCThreads4 -XX:ConcGCThreads2 上面总线程数不易比如(42)*5<32,超过这个数字,容易引起资源竞赛,反而很大程度引起jvm 垃圾回收的时候停…

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…

lwip中server和client的socket、地址和端口号

1、server的socket通过lwip_socket建立&#xff1a; server_sd lwip_socket(AF_INET, SOCK_STREAM, 0);2、client的socket在监听到连接后建立&#xff1a; client_sd lwip_accept(server_sd, (struct sockaddr *)&client_addr_port, (socklen_t *)&size);3、server…

【STM32】基于RTOS的CAN异步接收转发数据

文章目录 前言实现 前言 现象&#xff1a;全局变量在 CAN 中断中存储数据&#xff0c;并设置同步标志&#xff0c;在主程序中检测标志后&#xff0c;打包并转发 CAN 数据&#xff0c;会出现 CAN 数据错乱 现象分析&#xff1a;CAN 数据打包处理过程中&#xff0c;新的数据到来…

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…

pytest + yaml 框架 -62.支持yaml和json2种格式用例

前言 v1.5.7版本开始新增json格式用例支持,本次版本改动内容 1.支持 .json 文件用例2.优化日志中文件后缀名称.yml .yaml .json3.ruamel.yaml 版本兼容0.18.6yaml 格式用例 yaml 格式用例示例,test_a.yml test_demo:name: postrequest:method: POSTurl: http://httpbin.or…

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博客电网论文源…

PostgreSQL基础知识

PostgreSQL简介 PostgreSQL是一个强大的开源对象关系数据库系统&#xff0c;它使用并扩展了SQL语言&#xff0c;并结合了许多功能&#xff0c;可以安全地存储和扩展最复杂的数据工作负载。PostgreSQL的起源可以追溯到1986年&#xff0c;是加州大学伯克利分校POSTGRES项目的一部…

细说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;核心特征 …