当前位置: 首页 > news >正文

【算法学习笔记】34:扩展欧几里得算法

裴蜀定理

描述

对于任意正整数 a a a b b b,一定存在整数系数 x x x y y y,使得:
a x + b y = g c d ( a , b ) ax + by = gcd(a, b) ax+by=gcd(a,b)

并且 g c d ( a , b ) gcd(a, b) gcd(a,b)是对于任意的系数 x x x y y y放在 a a a b b b上能凑出的最小正整数。

证明

如下如果有整数系数 x x x y y y,那么 a x + b y ax + by ax+by一定是 g c d ( a , b ) gcd(a, b) gcd(a,b)的倍数,因为 a a a b b b都分别是 g c d ( a , b ) gcd(a, b) gcd(a,b)的倍数。因此能凑出来的数字最小就是 g c d ( a , b ) gcd(a, b) gcd(a,b)

接下来证明一定存在 x x x y y y能凑出 g c d ( a , b ) gcd(a, b) gcd(a,b)。证明存在性的东西可以用构造法,只要把这个东西构造出来了,那么就一定存在了。这个构造的方法就是扩展欧几里得算法,使得对于任意的 a a a b b b,都能构造出来 x x x y y y使得 a x + b y = g c d ( a , b ) ax + by = gcd(a, b) ax+by=gcd(a,b)

扩展欧几里得算法

欧几里得算法是 g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a, b) = gcd(b, a~mod~b) gcd(a,b)=gcd(b,a mod b),递归出口是当 b b b 0 0 0时返回 a a a,因为 0 0 0和任何数的最大公约数就是那个数。

扩展欧几里得算法则是在欧几里得算法的基础上,把系数 x x x y y y构造出来。

考虑到欧几里得算法的递归特性,可以用之前递归出的结果计算出前面的结果。

如,欧几里得算法计算gcd的递归出口是 b b b 0 0 0时返回 a a a,此时 a a a b b b的最大公约数就是 a a a,要使得 a x + b y = a ax + by = a ax+by=a,显然有一组整数解 x = 1 x = 1 x=1 y = 0 y = 0 y=0

考虑除了递归出口之外的递归分支,需要计算 g c d ( b , a m o d b ) gcd(b, a~mod~b) gcd(b,a mod b),假设此时已经求出一组解 y y y x x x(这里将 y y y x x x调换便于计算,不调换也是可以的,结论是另一种写法公式),即使得:
b y + ( a m o d b ) x = g c d ( b , a m o d b ) = g c d ( a , b ) by + (a~mod~b)x = gcd(b, a~mod~b) = gcd(a, b) by+(a mod b)x=gcd(b,a mod b)=gcd(a,b)

考虑到 a m o d b = a − ⌊ a b ⌋ ⋅ b a~mod~b = a - \lfloor \frac{a}{b} \rfloor \cdot b a mod b=abab,整理一下 a a a b b b的系数,得到:
a x + ( y − ⌊ a b ⌋ ⋅ x ) b = g c d ( a , b ) ax + (y - \lfloor \frac{a}{b} \rfloor \cdot x) b = gcd(a, b) ax+(ybax)b=gcd(a,b)

因此,从上一组解的 x x x不变, y y y减去 ⌊ a b ⌋ ⋅ x \lfloor \frac{a}{b} \rfloor \cdot x bax就是为 a a a b b b构造的系数解。

#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 t; cin >> t;while (t -- ) {int a, b; cin >> a >> b;int x, y;exgcd(a, b, x, y);cout << x << ' ' << y << endl;}return 0;
}
http://www.lryc.cn/news/524011.html

相关文章:

  • 云原生周刊:K8s 生产环境架构设计及成本分析
  • WGAN - 瓦萨斯坦生成对抗网络
  • 海量数据的处理
  • 区块链的数学基础:核心原理与应用解析
  • 1.5 GPT 模型家族全解析:从 GPT-1 到 GPT-4 的演进与创新
  • 自动驾驶之DriveMM: All-in-One Large Multimodal Model for Autonomous Driving
  • Spring Boot 配置(官网文档解读)
  • SparkSQL数据源与数据存储
  • 【BQ3568HM开发板】开箱测试
  • 3D 模型格式转换之 STP 转 STL 深度解析
  • MySQL数据库的数据文件保存在哪?MySQL数据存在哪里
  • 低代码系统-UI设计器核心介绍
  • ubuntu20.04有亮度调节条但是调节时亮度不变
  • USART_串口通讯轮询案例(HAL库实现)
  • 【前端】CSS学习笔记(2)
  • 【esp32小程序】小程序篇02——连接git
  • echarts柱状图象形图,支持横向滑动
  • YOLO系列代码
  • HTML根元素<html>的语言属性lang:<html lang=“en“>
  • opencv在图片上添加中文汉字(c++以及python)
  • Perplexity AI 周六向 TikTok 母公司字节跳动递交了一项提案
  • Java连接TDengine和MySQL双数据源
  • Web3 游戏周报(1.13 - 1.19)
  • [深度学习]机器学习和深度学习
  • 区块链技术
  • vim函数定义跳转相关设置
  • 如何使用Python爬虫获取微店商品详情:代码示例与实践指南
  • Autosar CP RTE规范解读之不同 BSW 接口的通知与软件组件激活机制:标准化接口与 AUTOSAR 接口的实现方式
  • 基于STM32的智能门锁安防系统(开源)
  • 搭建Hadoop源代码阅读环境