浅谈拓展欧几里得算法

news2024/9/24 17:19:11
1、求特解 x 0 , y 0 x_0, y_0 x0,y0

普通的欧几里得算法依据是辗转相除法,也就是,比如求 a , b a,b ab 的最大公约数, a , b a,b ab 进行辗转相除直到 a − b a-b ab 或者 b − a b-a ba 等于0,证明此时的原先 a , b a, b a,b 的最大公约数就是当前的 a a a,例子如下:

a = 16, b = 6
a > b, a = a - b = 10
a > b, a = a - b = 4
b > a, b = b - a = 2
a > b, a = a - b = 2
a = b = 2 = gcd(a, b)
可见a > b必须减到a < b截至,
故多步的减法可以合成一个 %
int gcd(int a, int b) {
    return !b ? a : gcd(b, a % b);
}

在这里插入图片描述
有了上面的了解,我们就可以知道,欧几里得算法的底层原理,那么思考下面一个问题,给出 a , b a, b a,b,求出一组特解 x 0 , y 0 x_0, y_0 x0,y0 满足下面表达式。
a ∗ x + b ∗ y = g c d ( a , b ) a * x + b * y = gcd(a, b) ax+by=gcd(a,b)
同样的,我们根据辗转相除法的思路,当 b = 0 b=0 b=0 的时候找到最大公约数,此时 a ∗ 1 + 0 ∗ y = g c d ( a , 0 ) = a a * 1 + 0 * y = gcd(a, 0) = a a1+0y=gcd(a,0)=a,故此时的 x = 1 , y = 0 x = 1, y = 0 x=1,y=0
假如我们的递归如下:

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;
}

? ? ? 处为什么可以那样写,我们假定当前层:
a ∗ x + b ∗ y = g c d ( a , b ) a * x + b * y = gcd(a, b) ax+by=gcd(a,b)
下一层:
b ∗ y + ( a − a / b ∗ b ) ∗ x = g c d ( a , b ) b * y + (a - a / b * b) * x = gcd(a, b) by+(aa/bb)x=gcd(a,b)
化简:
a ∗ x + b ∗ y − a / b ∗ b ∗ x = g c d ( a , b ) a * x + b * y - a / b * b * x = gcd(a, b) ax+bya/bbx=gcd(a,b)
a ∗ x + b ( y − a / b ∗ x ) = g c d ( a , b ) a * x + b(y - a / b * x) = gcd(a, b) ax+b(ya/bx)=gcd(a,b)
在这里插入图片描述

2、求通解 x , y x, y x,y

对于一般方程, a ∗ x + b ∗ y = c a * x + b * y = c ax+by=c,当 g c d ( a , b ) ∣ c gcd(a, b) | c gcd(a,b)c 时才有解,我们定义 d = g c d ( a , b ) d = gcd(a, b) d=gcd(a,b) 此时的解是:
x 0 = x ∗ c / d x_0 = x * c / d x0=xc/d y 0 = y ∗ c / d y_0 = y * c / d y0=yc/d
对于特解 x 0 , y 0 x_0, y_0 x0,y0 x 0 x_0 x0 移动 n n n 格:
x = x 0 + n x = x_0 + n x=x0+n
( x 0 + n ) ∗ a + y ∗ b = d (x_0 + n) * a + y * b = d (x0+n)a+yb=d
y = y 0 − a / b ∗ n y = y0 - a / b * n y=y0a/bn
转化后:
x = x 0 + b ∗ n x = x_0 + b * n x=x0+bn
y = y 0 − a ∗ n y = y_0 - a * n y=y0an
发现 x x x 每次变化 b b b 个单位并不是最小单位,故通解如下:
x = x 0 + b / d ∗ k x = x_0 + b / d * k x=x0+b/dk
y = y 0 − a / d ∗ k y = y_0 - a / d * k y=y0a/dk

3、求最小正整数解

通解得到之后,如果 x > 0 x > 0 x>0 那么最小正整数解就是 x % ( b / d ) x \% (b / d) x%(b/d)
否则最小正整数解就是 ( x % ( b / d ) + ( b / d ) ) % ( b / d ) (x \% (b / d) + (b / d)) \% (b / d) (x%(b/d)+(b/d))%(b/d)
故最小正整数解就是 ( x % ( b / d ) + ( b / d ) ) % ( b / d ) (x \% (b / d) + (b / d)) \% (b / d) (x%(b/d)+(b/d))%(b/d)

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

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

相关文章

复盘:细数这些年写文字的成与败

引言 最近一直在思考和复盘&#xff0c;要说我这些年最后悔没坚持或者没做对的一件事就是没有好好写文字。时间过得很快&#xff0c;一晃笔者已经快毕业十年了&#xff0c;文章写得比较密集的时候还是大学时代和毕业头几年&#xff0c;后面输出就越来越少了&#xff0c;甚至一…

前端性能优化:提升网站速度与用户体验的终极指南

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 在今天的数字时代&#…

【C++ 学习 ㉑】- 详解 map 和 set(上)

目录 一、C STL 关联式容器 二、pair 类模板 三、set 3.1 - set 的基本介绍 3.2 - set 的成员函数 3.1.1 - 构造函数 3.1.2 - 迭代器 3.1.3 - 修改操作 3.1.4 - 其他操作 四、map 4.1 - map 的基本介绍 4.2 - map 的成员函数 4.2.1 - 迭代器 4.2.2 - operator[] …

避免使用违规词,企业新媒体营销应注重品牌形象维护

随着越来越多的主体入局新媒体平台&#xff0c;为了维护平台健康的内容生态和创造良好的社区氛围&#xff0c;社交平台在内容上的监管越发严格。 不可避免的&#xff0c;很多做新媒体营销的企业开始陷入与平台审核的“拉扯”之中。 为了让品牌账号在各平台上顺利运营&#xff0…

二十一、MySQL(多表)内连接、外连接、自连接实现

1、多表查询 &#xff08;1&#xff09;基础概念&#xff1a; &#xff08;2&#xff09;多表查询的分类&#xff1a; 2、内连接 &#xff08;1&#xff09;基础概念&#xff1a; &#xff08;2&#xff09;隐式内连接&#xff1a; 基础语法&#xff1a; select 表1.name,…

使用Oracle自带SqlPlus导入导出数据库脚本

sqlplus sys/passwordorcl as sysdba ----cmd 进入Oracle sqlplus 1、导入例子&#xff1a; imp username/username127.0.0.1:1521/orcl fileD:\datasource\username0919.dmp fully imp 用户名/密码127.0.0.1:1521/orcl fileD:\datasource\备份名字.dmp fully 2、导出例子&a…

Redis实战:在CentOS 7上安装部署与应用探索

PS&#xff1a;文章最后有“开心一刻”&#xff0c;记得看哦&#xff0c;给生活增加点儿趣味。 一、Redis初识 Redis&#xff0c;全称Remote Dictionary Server&#xff0c;是一个开源的键值对存储数据库。它支持多种数据类型&#xff0c;如字符串、列表、集合、有序集合、哈希…

SpringBoot-接口幂等性

幂等 幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数或幂等方法是指可以使用相同参数重复执行&#xff0c;并能获得相同结果的函数。这些函数不会影响系统状态&#xff0c;也不用担心重复执行会对系统造成改变。 尤其是支付、订单等与金钱挂…

进程创建fork函数

#include <sys/types.h> #include <unistd.h> pid_t fork(void); 函数的作用&#xff1a;用于创建子进程。 返回值&#xff1a; fork()的返回值会返回两次。一次是在父进程&#xff0c;一次是在子进程。 父进程中&#xff1a;返回创建的子进程的ID&#xff0c;返回…

ITIL 4指导、计划和改进—沟通和组织变革管理

第6章 沟通和组织变革管理 提供IT支持的产品和服务不仅是一种操纵技术的练习&#xff0c;而且是人类的努力。服务提供的各个方面都表现得更好&#xff0c;具有良好的沟通和对人为因素的关注。问题通常可以追溯到不正确、不匹配或时间错误的信息。人们需要帮助以适应变化中的组…

卖出看跌期权策略(Short Put)

卖出看跌期权策略&#xff08;Short Put&#xff09; 看跌期权的买家有权利按照期权的行权价卖出标的资产&#xff0c;看跌期权的卖家有义务按照期权的行权价买入标的资产。通过承担按照特定价格买入标的资产的义务&#xff0c;看跌期权的卖家可以收到期权的权利金&#xff0c…

深入解析 qsort 函数(下),用冒泡排序模拟实现 qsort 函数

前言&#xff1a;对于库函数有适当了解的朋友们&#xff0c;对于 qsort 函数想必是有认知的&#xff0c;因为他可以对任意数据类型进行排序的功能属实是有点厉害的&#xff0c;本次分享&#xff0c;笔者就给大家带来 qsort 函数的全面的解读 本次知识的分享笔者分为上下俩卷文章…

LeetCode:两数之和

题目描述&#xff1a; 这是一道用暴力解法&#xff0c;逻辑十分简单、清晰的一道题&#xff0c;直接遍历数target-num[i]就行 而官方给了第二种巧妙的解法&#xff1a;运用哈希表。此法可将时间复杂度从O&#xff08;N^2&#xff09;降到O&#xff08;1&#xff09; 其思路是…

rhel8防火墙firewalld操作

1.查看默认区域 [rootlocalhost r]# firewall-cmd --get-default-zone public2.查看网卡关联的区域 [rootlocalhost r]# firewall-cmd --get-zone-of-interfaceifcfg-ens160 external 3.设置网卡的默认区域修改为work [rootlocalhost r]# firewall-cmd --zonework --change…

综合管廊安全监测,助力市政管廊智能化管理

综合管廊是一种集管线维护、建设、管理于一体的地下综合通道&#xff0c;可以将电力、通讯、燃气、供热、供水等工程管线集于一体&#xff0c;综合管廊对于城市建设具有重要意义&#xff0c;可以防止管线破裂&#xff0c;杜绝反复开挖路面&#xff0c;有效缓解交通拥堵&#xf…

ISAC通信感知一体化学习记录

文章目录 写在前面Fundamental Limits for ISAC: Information and Communication Theoretic PerspectiveIntroductionperformance metricsCommunication and Estimation Rates PHY Tradeoff and Resource Allocation for ISACbackgroundThe Related Works Preliminaries of the…

JDK9特性——概述

文章目录 引言JDK9特性概述JDK9的改变JDK和JRE目录变化总结 引言 JAVA8 及之前&#xff0c;版本都是特性驱动的版本更新&#xff0c;有重大的特性产生&#xff0c;然后进行更新。 JAVA9开始&#xff0c;JDK开始以时间为驱动进行更新&#xff0c;以半年为周期&#xff0c;到时…

淘宝问大家怎么投诉不良评价?

大花客服外包 商家朋友们都知道&#xff0c;正向的“问大家”可以很大程度提高转化率&#xff0c;负面的会对转化率有很不好的影响。那当遇到“问大家”中存在不良内容时&#xff0c;该如何投诉呢&#xff1f; 一、手机淘宝APP举报问大家不良内容 【问大家的提问】举报受理范围…

Makefile基础

迷途小书童 读完需要 4分钟 速读仅需 2 分钟 1 引言 下面这个 C 语言的代码非常简单 #include <stdio.h>int main() {printf("Hello World!.\n");return 0; } 在 Linux 下面&#xff0c;我们使用下面的命令编译就可以 gcc hello.c -o hello 但是随着项目的变大…

FPGA projet : VGA

在vga屏幕上显示 &#xff1a; 野火科技 相比于上个工程&#xff0c;只需要修改 vga_pix 模块即可。 注意存储器类型变量的定义&#xff1a;reg 【宽度】<名称>【深度】 赋值 always &#xff08;poseedge vga_clk&#xff09;begin 为每一行赋值&#xff0c;不可位赋…