原文出处: https://blog.csdn.net/Floatiy/article/details/80452643
知识储备
1 . 朴素欧几里得原理:gcd(a,b) == gcd(b,a % b)
2 . 负数取模:忽略符号返回绝对值就好了
3 . 模数原理:对于整数a,b必然存在整数k使得a % b == a - k * b,
且此时k == a / b向下取整
定理内容
对于正整数a,b,必然存在整数(不一定是正数)x,y,
使得ax+by==gcd(x,y)
证明
(来自SDFZ-SPLI的援助)
把两边同时除以gcd(x,y),由朴素欧几里得定理可以得到恒等式,说明一定存在至少一组解使得$ax+by==gcd(x,y)

求解过程
a*x1+b*y1=gcd(a, b);
b*x2+gcd(a%b)*y2=gcd(b, a%b);

∵gcd(a, b)==gcd(b, a%b)
∴a*x1+b*y1==b*x2+(a%b)*y2

∵对于a和b存在整数k使得a % b == a - k * b
∴a%b可以拆成a-k*b,k==(a / b 向下取整)

∴a * x1 + b * y1 == b * x2 + ( a - k * b ) * y2 【把k==(a / b 向下取整)代入】
∴a * x1 + b * y1 == b * x2 + ( a - ( a / b ) * b ) * y2
即a * x1 + b * y1 == b * x2 + a * y2 - b * ( a / b ) * y2
所以有a * x1 + b * y1 == a * y2 + b * ( x2 - ( a / b ) * y2 )
观察上式可知 x1 = y2 , y1 = x2 - a / b * y2
可能上面五行是小学数学?不是很难吧

所以得出结论:x1,y1是由x2,y2得来的
那么x2,y2也一定是由x3,y3得来的,所以我们来递归吧
但递归需要终止条件:
记得在辗转相除法求最大公约数的时候,我们的递归终止条件是一方为0,那我们现在也可以参考一下,先递归gcd(a , b),当b==0时,此时a的值就是我们要的最大公约数,再根据扩展欧几里得定律a * x + b * y == gcd(a , b),将a = a,b = 0带入,可以求出x和y的值,此时x == 1,y == 0,在这里终止递归。

代码实现
清楚了原理以后代码应该很简单吧:

int exGcd(int a,int b,int &x,int &y)
{if(b==0){x=1;y=0;return a;}int r=exGcd(b,a%b,x,y);int t=x;x=y;y=t-a/b*y;return r;
}

对扩展欧几里得定理理解+证明相关推荐

  1. 扩展欧几里得定理的证明和代码

    1.欧几里得算法,gcd(a,b)为a b(a>b)的最大公约数,则gcd(a,b) = acd(b, a%b) 利用这个定理我们可以反复对ab模下去求得a和b的最大公约数 代码如下 int G ...

  2. 浅谈扩展欧几里得定理(附裴蜀定理)

    关于扩展欧几里得定理 众所周知,扩展欧几里得定理是用来求形如(a,b,c皆为整数)这样的方程的一组解[注,仅是一组解]的定理 它的原理比较复杂,本人学了挺久才懂了一点,这里就不谈了,扩欧的核心是它的思 ...

  3. 欧几里得定理与扩展欧几里得定理

    欧几里的定理(辗转相除法): gcd(a,b) = gcd(b,a%b) gcd(a,b)表示a,b的最大公约数 证明: 设 a > b c = a%b a = k * b + c (k为某个整 ...

  4. 数学基础知识(扩展欧几里得定理)

    一.欧几里得定理(辗转相除法) 性质:如果 i 能整除a,也能整除b,则 i 能整除a+b,也能整除ax+by(x,y为整数),同时a mod b = a-(a/b)*b 用以上的性质我们知道如果一个 ...

  5. 扩展欧几里得定理求ax + by = c 的通解

    扩展欧几里得定理求ax + by = c 的通解: 前置条件: ax + by = c , gcd(a, b) = d 计算: a d \frac{a}{d} da​x + b d \frac{b}{ ...

  6. 专题·扩展欧几里得定理【including 求解二元一次方程,线性同余方程

    初见安~这里是基础数论专题(3)~[详见数论专栏] p.s:本文章假设你已经掌握了欧几里得算法--辗转相除法求最大公约数(gcd) 一.二元一次方程 形如的含有两个未知数且最高次数为1的方程我们称之为 ...

  7. 扩展欧几里得定理详解和运用(就不信你看不懂!)

    1 :扩展欧几里得内容: 扩展欧几里德算法是用来在已知a, b求解一组x,y使得ax+by =c.(若 c%gcd(a,b)!=0)则无解 所以 我们求ax+by=c是不是可以转化为求 ax+by=k ...

  8. 数论基础(1)扩展欧几里得定理

    一.引言 扩欧在朴素欧几里得定理中扩展得到,主要用于解决什么问题? 1.求两个数的最大公约数(朴素欧也可以解决这个问题) 2.ax+by=gcd(a,b),求解这个线性不定方程的一组特解. (补充:贝 ...

  9. 扩展欧几里得定理 新手向证明及代码

    知识储备 1 . 朴素欧几里得原理:gcd(a,b) == gcd(b,a % b) 2 . 负数取模:忽略符号返回绝对值就好了 3 . 模数原理:对于整数a,b必然存在整数k使得a % b == a ...

最新文章

  1. Java Web 程序设计----基于SSM框架(正在更新中)
  2. 获取时间C语言-按秒数
  3. 【例题+习题】【数值计算方法复习】【湘潭大学】(三)
  4. 从硬盘安装在XP下装红旗linux双系统
  5. rhel5.5下安装oracle10g报libXp.so.6错误
  6. lambda表达式不使用委托(delegate) 用FUNC
  7. 一个元素调用css3动画 fixed元素会微抖动
  8. 【路径规划】基于NSGA2实现无人机三维路径规划matlab源码
  9. 中国大学MOOC 视频字幕获取及处理方法
  10. 宝马android系统升级,宝马史上最大规模软件升级,换新OS7系统和安卓Auto,您的换了吗...
  11. dm9000a驱动源码分析
  12. 正则表达式(一):php常用的正则匹配
  13. 开头的单词_为什么以“S”开头的单词最多?| 英汉比较教学法·语音思维No.16...
  14. 开启和关闭Windows远程管理(WinRM)
  15. excel表格内容合并的操作方法
  16. 个人学习java的真实经历!
  17. win7 可以装matlab 吗,win7系统怎么安装matlab软件(图文教程)
  18. Xfire+WebService “Discarding unexpected response: HTTP/1.1 100 Continue”错误解决
  19. Linux查找之find/df/du命令
  20. NYOJ628 小媛在努力

热门文章

  1. linux cp 覆盖确认,cp在复制文件的时候被提示确认覆盖
  2. linux cp命令 强制覆盖,解决 Linux cp 命令加了 -f 后依然提示覆盖的问题
  3. c++ 读入一个字符
  4. 统计一个字符串中每个字符出现的次数
  5. twitter中国官网
  6. c语言解析yaml文件,YAML课程
  7. 找不到与以下参数匹配的产品_熟悉以下这8种套路,民间借贷案件打官司的时候不怕找不到好律师...
  8. js原型对象和原型链理解
  9. 惊艳死你的各种好用工具
  10. PHP做闹钟APP,私藏很久的4款效率APP,一个比一个好用,30万网友推荐