浅谈扩展欧几里得算法(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法:
好了切入正题:
简单地来说exgcd函数求解的是$ax+by=gcd(a,b)$的最小正整数解。根据数论的相关知识,一定存在一组解$x,y$使得$ax+by=gcd(a,b)$当且仅当$a$与$b$互质的时候。那就来谈谈具体如何来求解吧。
根据辗转相除法的内容$gcd(a,b)=gcd(b,a\%b)$我们可以得到:$$ax_1+by_1=gcd(a,b)=gcd(b,a\%b)=bx_2+a\%by_2······①\]
又由于\(a\%b=a- \lfloor a\div b\rfloor\times b\)
在计算机中\(a\%b= \lfloor a\div b\rfloor\times b=a/b*b%\)所以$$bx_2+a%by_2=bx_2+(a-a/bb)y_2$$
将等式①变形得:$$ax_1+b(y_1+a/ by_2)=ay_2+bx_2$$
因为等式左右两边结构相同我们可以解得:$$\begin{cases}x_1=y_2\y_1=x_2-a/by_2\end{cases}$$
在扩展欧几里得算法的最后一步即\(b=0\)的时候,显然有一对整数\(x=1,y=0\)使得$$a1+b*0=gcd(a,0)$$
那么我们就可以通过编程实现exgcd了,请仔细体验下代码的精妙之处:
int exgcd(int a,int b,int &x,int &y) {
if(b) {
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
} else {
x=1;
y=0;
return a;
}
}
浅谈扩展欧几里得算法(exgcd)的更多相关文章
- 扩展欧几里得算法(exGCD)学习笔记
@(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...
- gcd(欧几里得算法)与exgcd(扩展欧几里得算法)
欧几里得算法: 1.定义:gcd的意思是最大公约数,通常用扩展欧几里得算法求 原理:gcd(a, b)=gcd(b, a%b) 2.证明: 令d=gcd(a, b) => a=m*d,b=n ...
- 扩展欧几里得算法详解(exgcd)
一.前言 本博客适合已经学会欧几里得算法的人食用~~~ 二.扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a.b是整数,那么一定存在整数x.y使得$ ...
- 扩展欧几里得算法(EXGCD)学习笔记
0.前言 相信大家对于欧几里得算法都已经很熟悉了.再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过.这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程. 1.Bézo ...
- 详解扩展欧几里得算法(扩展GCD)
浅谈扩展欧几里得(扩展GCD)算法 本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法.为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养.并且已经 ...
- 欧几里得算法与扩展欧几里得算法_C++
先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...
- vijos1009:扩展欧几里得算法
1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...
- 『扩展欧几里得算法 Extended Euclid』
Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...
- 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)
题面 题目描述 给出一个有理数 c=\frac{a}{b} ,求 c mod19260817 的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...
随机推荐
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...
- pycharm python模版样式
问题: 我想在创建新的一些python程序的时候,希望在新文件开头添加python版本声明和一些关于时间相关的模版数据 那,如何解决? 1. pycharm ---> setting ---&g ...
- 转载-Linux Shell 数组建立及使用技巧
转载自:http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html 如侵犯版权,请联系我删除 linux shell在编程方面比win ...
- yaml 格式
来源:http://www.ruanyifeng.com/blog/2016/07/yaml.html?f=tt 1.YAML是一种通用的数据串行格式 2.基本语法规则: 大小写敏感 使用缩进表示层级 ...
- TP手册学习第二天
默认情况下,URL是不区分大小写的,访问规则:--模块/控制器/操作/参数/值,如果要访问驼峰法的控制器类BlogTest,则需要使用:blog_test MVC是一个设计模式,它强制性的使应用程序的 ...
- ng机器学习视频笔记(二) ——梯度下降算法解释以及求解θ
ng机器学习视频笔记(二) --梯度下降算法解释以及求解θ (转载请附上本文链接--linhxx) 一.解释梯度算法 梯度算法公式以及简化的代价函数图,如上图所示. 1)偏导数 由上图可知,在a点 ...
- Node.js在任意目录下使用express命令‘不是内部或外部命令’解决方法
1.一开始我只能在nodejs全局目录下使用express命令建一个新的项目,建在其他任意一个目录命令行都会提示"不是内部或外部命令",导致目录会乱,目录如下. 2.尝试了一会,发 ...
- java 如何将 word,excel,ppt如何转pdf --openoffice (1)
承上启下,可折叠 上一篇说的是:服务器是windows server时,用jacob将msoffice(指的是word,excel,ppt)转换成pdf. 若被部署项目的服务器是centOS等linu ...
- python 字符串操作方法详解
字符串序列用于表示和存储文本,python中字符串是不可变对象.字符串是一个有序的字符的集合,用于存储和表示基本的文本信息,一对单,双或三引号中间包含的内容称之为字符串.其中三引号可以由多行组成,编写 ...
- Tomcat+Servlet面试题都在这里
下面是我整理下来的Servlet知识点:  图上的知识点都可以在我其他的文章内找到相应内容. Tomcat常见面试题 Tomcat的缺省端口是多少,怎么修改 Tomcat的缺省端口是多少,怎么修改 ...