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

news2024/11/29 22:52:18

扩展欧几里得算法

定义

扩展欧几里得算法是用来在已知整数 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.coloradmin.cn/o/1824875.html

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

相关文章

LabVIEW软件开发任务的工作量估算方法

在开发LabVIEW软件时&#xff0c;如何准确估算软件开发任务的工作量。通过需求分析、功能分解、复杂度评估和资源配置等步骤&#xff0c;结合常见的估算方法&#xff0c;如专家判断法、类比估算法和参数估算法&#xff0c;确保项目按时按质完成&#xff0c;提供项目管理和资源分…

理解Es的DSL语法(一):查询

目录 DSL相关联的基本概念 ElasticSearch的字段类型 ElasticSearch的查询类型 DSL语法 query 普通查询 布尔查询 字符串构建查询 _source from和size sort 关于sort和查询的相关性评分 关于sort的性能 DSL相关联的基本概念 Es的DSL并不是独立的知识点&#xff…

深入理解计算机系统 家庭作业6.35

第一步先求(S,E,B,m) 题目说共C128个字节,块大小B为16个字节,那就是分为八组:0,1,2,3,4,5,6,7.然后每组存4个int 每个4字节 CB*E*S .B16 ,直接映射的E就是1,所以S8 (S,E,B,m)(8,1,16,7) C128M128s3b4t0 sizeof(int)0100地址(二进制)COCIsrc[0][0]00000000000000组0src[0][1…

气膜球幕影院:大众追捧的全新体验—轻空间

近年来&#xff0c;气膜球幕影院因其独特的观影体验和灵活的应用&#xff0c;受到了广大观众的热烈欢迎。轻空间带您来探讨一下气膜球幕影院为何如此受欢迎。 沉浸式体验的吸引力 气膜球幕影院的360度全景沉浸式体验&#xff0c;让观众仿佛置身于影片的世界中。这种前所未有的观…

【计算机视觉】人脸算法之图像处理基础知识(一)

图像处理基础知识&#xff08;一&#xff09; 1.图像的构成 图像的构成可以包括以下几方面知识&#xff1a; 1.像素&#xff1a;图像的基本单位&#xff0c;是图像中的一个点。每个像素都有特定的位置和色彩值。在数字图像中&#xff0c;像素的颜色通常由红、绿、蓝&#xf…

cocos creator如何使用cryptojs加解密(及引入方法)

cocos creator如何使用cryptojs加解密&#xff08;及引入方法&#xff09; 如果想转请评论留个言并注明原博 Sclifftop 13805064305 阿浚 cocos creator如何使用cryptojs加解密&#xff08;及引入方法&#xff09; 步骤 获取库 1. npm install crypto-js -g&#xff0c;加不加…

跨域问题以及解决方案

文章目录 1.什么是跨域访问&#xff1f;2. AJAX 请求无法跨域访问的原因&#xff1a;同源策略3. 解决AJAX跨域访问的方案包括哪些3.1 代理服务器方案的实现原理 1.什么是跨域访问&#xff1f; (1) 在a页面中想获取b页面中的资源&#xff0c;如果a页面和b页面所处的协议、域名、…

如何在Spring Boot中实现图片上传至本地和阿里云OSS

在开发Web应用时&#xff0c;处理文件上传是常见的需求之一&#xff0c;尤其是在涉及到图片、视频等多媒体数据时。本文将详细介绍如何使用Spring Boot实现图片上传至本地服务器以及阿里云OSS存储服务&#xff0c;并提供完整的代码示例。 一、上传图片至本地 首先&#xff0c…

五、Nginx配置文件-server模块

目录 一、概述 二、虚拟主机设置的三种形式 1、基于端口号配置 2、基于域名配置 3、基于ip配置 三、常用参数 1、listen 2、server_name 3、location 3.1、常见的Nginx正则表达式 3.2、location正则&#xff1a; 3.3示例 4、root 5、index 6、error_page 7、deny…

C#——结构体详情

结构体 结构体也被称为结构类型&#xff08;“structure type”或“struct type”&#xff09;&#xff0c;它是一种可封装数据和相关功能的值类型&#xff0c;在语法上结构体与类&#xff08;class&#xff09;非常相似&#xff0c;它们都可以用来封装数据&#xff0c;并且都…

笔记本电脑安装属于自己的Llama 3 8B大模型和对话客户端

选择 Llama 3 模型版本&#xff08;8B&#xff0c;80 亿参数&#xff09; 特别注意&#xff1a; Meta 虽然开源了 Llama 3 大模型&#xff0c;但是每个版本都有 Meta 的许可协议&#xff0c;建议大家在接受使用这些模型所需的条款之前仔细阅读。 Llama 3 模型版本有几个&…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第八周) - 现代大语言模型

现代大语言模型 1. GPT-32. 上下文学习 2.1. 零样本提示2.2. 少样本提示2.3. 归纳头 3. 对齐 3.1. 指令微调3.2. 基于人类反馈的强化学习3.3. 事实与幻觉 1. GPT-3 GPT系列论文 GPT-1(2018): Improving Language Understanding by Generative Pre-TrainingGPT-2(2019): Lang…

missing authentication credentials for REST request

1、报错截图 2、解决办法 将elasticsearch的elasticsearch.yml的 xpack.security.enabled: true 改为 xpack.security.enabled: false

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

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

JAVA小知识20:万字详解List与ArrayList

一、集合简介 1.1、什么是集合&#xff1f; 可同时存储多个元素的数据结构就是集合。 1.2、为什么要有集合&#xff1f; 我们可以使用数组同时存储多个元素&#xff0c;但是数组有个弊端。数组创建之后长度就会固定&#xff0c;如需扩容则需要手动扩容&#xff0c;我们需要…

MEGALODON:突破传统,实现高效无限上下文长度的大规模语言模型预训练和推理

在人工智能领域&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;大模型&#xff08;LLMs&#xff09;的预训练和推理效率一直是研究的热点。最近&#xff0c;一项突破性的研究提出了一种新型神经网络架构——MEGALODON&#xff0c;旨在解决传统Tran…

2024年武汉市中级、高级职称水测考试开卷方法分享

2024年武汉市&#xff08;除开东湖高新区外&#xff09;职称首次组织全员水测&#xff0c;先考水测后报名&#xff0c;水测报名在5月16号截止。 武汉市水测组织形式&#xff1a; 武汉市2024年专业技术职务水平能力测试分为笔试和面试&#xff0c;面试答辩有关事项另行通知&…

全息图分类及相位型全息图制作方法

全息图是一种光学器件&#xff0c;全息图分为振幅型和相位型全息图&#xff0c;振幅型全息图记录光的振幅信息即强度信息&#xff0c;相位型全息图记录光的相位信息&#xff0c;利用相位信息可以恢复光的波前形状&#xff0c;从而记录物体形状&#xff0c;这里主要介绍相位全息…

C# Winform 用户控件,扩展控件,自定义控件综合实例

Control类是Windows窗体控件的基类&#xff0c;它提供了在 Windows 窗体应用程序中进行可视显示所需的基础结构&#xff0c;可以通过继承来扩展熟悉的用户控件和现有控件的功能。本列介绍三种不同自定义控件以及怎么创建他们。 自定义控件分类 用户控件&#xff1a;基本控件的…

django学习入门系列之第二点《浏览器能识别的标签1》

文章目录 文件的编码(head)网站表头信息(head)标题&#xff08;body&#xff09;div和span往期回顾 文件的编码(head) <!--浏览器会以"UTF-8"这种编码来读取文件--> <meta charset"UTF-8">网站表头信息(head) <title>Title</title&…