详解扩展欧几里得算法(扩展GCD)
浅谈扩展欧几里得(扩展GCD)算法
本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法。为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养。并且已经学会了学习这个算法的前置知识:欧几里得算法。
对于对欧几里得算法还有知识模糊的读者,请不要担心,这里为你准备了前导知识讲解,请移步至本蒟蒻的另两篇博客:
裴蜀定理
裴蜀定理的概念及证明
因为翻译版本的不同,这个定理可能还会被叫做贝祖定理、\(B\acute{e}zout\)定理等。
裴蜀定理是这样被描述的:
\]
满足:
\]
文字描述是这样的:对于任意的整数\(a,b\),都存在一对整数\(x,y\),使得\(ax+by=\gcd(a,b)\)成立。
证明:
来看欧几里得算法求解过程的这个函数:
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
可以看出,这是一个递归求解的函数。在函数递归到最后的时候,存在\(b=0\),不管\(a\)是什么,这时显然有一对整数\(x=1,y=0\)来使得:
\]
(ps:0和任何数的最大公约数都等于原数,可以从最大公约数和约数的定义得知)
那么,我们通过这个递归的实现过程来进行回溯的模拟。当\(b>0\),则程序还可以继续往下走:\(\gcd(b,a\%b)=\gcd(a,b)\)。这时假设存在一对整数\(x,y\),使得其一定会满足\(b\times x+(a\%b)\times y=\gcd(b,a\%b)\), 因为\(a\%b=a-b\lfloor a/b\rfloor\),所以有以下的推导:
\]
这个时候令\(x^{'}=y,y^{'}=x-\lfloor a/b\rfloor y\),再结合一开始的原式子,就得出:
\]
因为欧几里得算法的实现是递归的,而我们已经推出其中一个递归过程的实现,那么其他的递归过程就可以借助数学归纳法,一层层地向上推,必然会得出最终结论。
证毕。
裴蜀定理的应用
裴蜀定理:
\]
那么可以推出:如果一个数\(m\)满足:\(ax+by=m\),那么这个\(m\)一定是\(\gcd(a,b)\)的倍数。
那么对于一个经典方程\(ax+by=1\),利用裴蜀定理,我们有:\(\gcd(a,b)=1\),即\(a,b\)一定互质。
扩展欧几里得算法
在介绍扩展欧几里得算法之前,我想首先介绍它的应用:
1、求解不定方程
2、求解模的逆元
3、求解线性同余方程
为什么它能应用到这几个方面呢?回到裴蜀定理:
\]
对于这个不定方程,如果存在一组合法的解\((x,y)\),那么一定会有\(\gcd(a,b)|m\),即\(m\)是\(\gcd(a,b)\)的倍数。那么现在我不仅想知道到底有没有解,而是想知道在有解的情况下,这个解到底是多少。
这就是求解不定方程的过程。这个解决的算法就叫做扩展欧几里得算法。
可以发现,我们求解不定方程其实就是要求解一组合法的\((x,y)\),那么根据裴蜀定理的证明(基于欧几里得算法,采用递归的数学归纳),可以发现\(x,y\)的互相推导的关系。
这种采取递归来求解\(x,y\)的方法就叫做扩展欧几里得算法。
扩展欧几里得算法的实现:
先放板子:
int exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
int d=exgcd(b,a%b,x,y);
int k=x;
x=y;
y=k-a/b*y;
return d;
}
扩展欧几里得算法的实现基于裴蜀定理的证明。实质上相当于在做欧几里得算法(普通GCD)的时候对不定方程\(ax+by=m\)的\(x,y\)也做了更改。所以经过扩展欧几里得算法处理过的\(x,y\)就已经是一组合法的可行解了。
这里需要注意一个细节,因为扩展GCD需要对\(x,y\)本身进行修改,所以需要在传参数的时候加取址符,这样能保证被修改。
详解扩展欧几里得算法(扩展GCD)的更多相关文章
- 初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))
我们接着上面的欧几里得算法说 扩展欧几里得算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的 ...
- 扩展欧几里得算法详解(exgcd)
一.前言 本博客适合已经学会欧几里得算法的人食用~~~ 二.扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a.b是整数,那么一定存在整数x.y使得$ ...
- 模板——扩展欧几里得算法(求ax+by=gcd的解)
Bryce1010模板 /**** *扩展欧几里得算法 *返回d=gcd(a,b),和对应等式ax+by=d中的x,y */ long long extend_gcd(long long a,long ...
- 【learning】 扩展欧几里得算法(扩展gcd)和乘法逆元
有这样的问题: 给你两个整数数$(a,b)$,问你整数$x$和$y$分别取多少时,有$ax+by=gcd(x,y)$,其中$gcd(x,y)$表示$x$和$y$的最大公约数. 数据范围$a,b≤10^ ...
- gcd(欧几里得算法)与exgcd(扩展欧几里得算法)
欧几里得算法: 1.定义:gcd的意思是最大公约数,通常用扩展欧几里得算法求 原理:gcd(a, b)=gcd(b, a%b) 2.证明: 令d=gcd(a, b) => a=m*d,b=n ...
- 扩展欧几里得算法(extgcd)
相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...
- 欧几里得算法与扩展欧几里得算法_C++
先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...
- vijos1009:扩展欧几里得算法
1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...
- ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)
1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...
随机推荐
- MyBatis框架之第一篇
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.201 ...
- iOS AOP实战
AOP: 面向切面编程,偏向于处理业务的某个阶段 适用场景: 1. 参数校验:网络请求前的参数校验,返回数据的格式校验等等 2. 无痕埋点:统一处理埋点,降低代码耦合度 3. 页面统计:帮助统计页面访 ...
- Windows性能监控监视器(perfmon使用)
一.在命令窗口或运行中执行perfmon.exe,打开性能监视器 二.在用户定义中,即可新建--数据收集器--性能计数器,步骤如下: 三.添加监控Windows服务器的资源类型,例如:内存(Avail ...
- leetcode动态规划--基础题
跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 思路 根据题目意思,最大跳跃距离,说明可以跳0--n ...
- java之关键字static
static简单概述 static 关键字的基本使用,它可以用来修饰的成员变量和成员方法,一旦用了static关键字修饰,那么这样的内容不再属于对象而是属于类,凡是本类的对象都共享使用同一份.我们可以 ...
- Eureka工作原理及它和ZooKeeper的区别
1.Eureka 简介: Eureka 是 Netflix 出品的用于实现服务注册和发现的工具. Spring Cloud 集成了 Eureka,并提供了开箱即用的支持.其中, Eureka 又可细分 ...
- Leetcode题解 - 树部分简单题目代码+思路(105、106、109、112、897、257、872、226、235、129)
树的题目中递归用的比较多(但是递归是真难弄 我
- new String()与toString
str.toString是调用了str这个object对象的类的toString方法.一般是返回这么一个String:[class name]@[hashCode].new String(str)是根 ...
- go语言面向对象之方法
1.实现方法 package main import "fmt" //在面向对象编程中,一个对象其实就是一个简单的值或者一个变量,在这个 //对象中包含一些函数 //这种带有接受者 ...
- JavPlayer:AI破坏马赛克,大量马赛克破坏版影片流出
这是最近几个月业界讨论比较火的话题,发酵到现在, 终于可以给大家总结下最近的马赛克破坏版影片到底是怎么回事? 马赛克破坏版,简单讲就是利用AI技术,在打有马赛克影片的马赛克基础上进行修复操作, 来实现 ...