在讲解扩展欧几里得之前我们先回顾下辗转相除法:

\[gcd(a,b)=gcd(b,a\%b)$$当$a\%b==0$的时候b即为所求最大公约数
好了切入正题:
简单地来说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/ b
y_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\)使得$$a
1+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)的更多相关文章

  1. 扩展欧几里得算法(exGCD)学习笔记

    @(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...

  2. gcd(欧几里得算法)与exgcd(扩展欧几里得算法)

    欧几里得算法: 1.定义:gcd的意思是最大公约数,通常用扩展欧几里得算法求 原理:gcd(a, b)=gcd(b, a%b) 2.证明: 令d=gcd(a, b)  =>  a=m*d,b=n ...

  3. 扩展欧几里得算法详解(exgcd)

    一.前言 本博客适合已经学会欧几里得算法的人食用~~~ 二.扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a.b是整数,那么一定存在整数x.y使得$ ...

  4. 扩展欧几里得算法(EXGCD)学习笔记

    0.前言 相信大家对于欧几里得算法都已经很熟悉了.再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过.这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程. 1.Bézo ...

  5. 详解扩展欧几里得算法(扩展GCD)

    浅谈扩展欧几里得(扩展GCD)算法 本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法.为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养.并且已经 ...

  6. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  7. vijos1009:扩展欧几里得算法

    1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...

  8. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  9. 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)

    题面 题目描述 给出一个有理数 c=\frac{a}{b}  ​ ,求  c mod19260817  的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...

随机推荐

  1. Ubuntu16.04安装mongodb

    Ubuntu16.04安装mongodb copy from: http://blog.csdn.net/zhushh/article/details/52451441 1.导入软件源的公钥 sudo ...

  2. eclipse出现错误:he type java.util.Map$Entry cannot be resolved. It is indirectly referenced

    eclipse出现错误:he type java.util.Map$Entry cannot be resolved. It is indirectly referenced jre 换成6的就好了选 ...

  3. MySQL 取得小时分钟部分

    MySQL 取得小时分钟部分 SELECT `CpParkID` , DATE_FORMAT( `UPDATE_TIME` , '%H:%i' )FROM `cp_park`WHERE HOUR( ` ...

  4. Python程序的执行方式

    Python代码有两种执行方式: 一.文件执行 二.交互器执行(推荐) 一.文件执行 1.用 notepad++ 或 Sublime Text,甚至 写字本创建一个文件. 2.比如:print('He ...

  5. JAVA中比较两个文件夹不同的方法

    JAVA中比较两个文件夹不同的方法,可以通过两步来完成,首先遍历获取到文件夹下的所有文件夹和文件,再通过文件路径和文件的MD5值来判断文件的异同.具体例子如下: public class TestFo ...

  6. 00_HTML入门第一天

    HTML入门 body标记的常见属性:bgcolor 设置背景颜色:text 设置文本颜色:link 设置链接颜色:vlink 设置已经访问了的链接颜色:alink 正在点击的链接颜色: meta是单 ...

  7. IT 人士如何避免中年危机?

    今天咱们不谈技术,来聊点别的. 这也可能是比学习具体技术更重要的话题 - 投资. 我把投资分成两类: 投资股票.期货.现货.黄金这类常见投资品种. 投资自己.比如看书.学习.参加培训.当然<每天 ...

  8. 开发快速定位需求(Coding之前的工作)

    自我总结,求高人指点,欢迎拍砖! 目的:快速定位feature需求,避免浪费不必要的时间 需求目的:它要用来解决什么问题?(客户需求,bug fixed,学习新技术) 需求对象:它针对的对象是谁?(明 ...

  9. JDK的下载,安装与环境的配置

    JDK的全称是JavaSE Development Kit,即java开发工具包,是sun公司提供的一套用于开发java应用程序的开发包,它提供了编译.运行java程序所需的各种工具和资源,包括jav ...

  10. 01_什么是数据结构以及C语言指针回顾

    一.数据结构是什么 如何把现实中大量而复杂的问题,以特定的数据类型和特定的数据存储结构保存到计算机的存储器中. 数据存储包括两方面:个体存储的集合.个体与个体之间的关系的存储 程序 = 算法 + 数据 ...