什么是拓展欧几里得?简单的说,就是求关于x,y的方程 ax + by = gcd(a,b) 的所有整数解

现在我们令g = gcd(a,b)则方程变成了ax + by = g
假如我们现在知道了关于这个方程的一个特解x0, y0,我们就可以用一种方法求出所有的整数解。
说的比较模糊,现在整理一下。
上面提到了两个问题
一、怎么求出这个特解?
二、怎么由特解推出其它的所有解?

一、求特解
我们知道,欧几里得公式可以由这个式子表示:
gcd(a,b) = gcd(b, a%b)
不断往下连等,直到b = 0,此时a即为最大公约数
那么我们来讨论另一个问题,下面两个式子有没有关系呢?

a * x1 + b * y1 = g(a,b)
b * x2 + (a%b) * y2 = g(b,a%b)
我可以告诉你,只要找出x1和x2的关系、y1和y2的关系,我们就能求出方程a * x + b * y = g的一个特解

回到刚才那个问题,很显然,两个等式右边就是欧几里得的公式
那么我们就能得出
a * x1 + b * y1 = b * x2 + (a%b) * y2
其中a%b可以换成a-(a/b)*b
式子变成了
a * x1 + b * y1 = b * x2 + (a - (a / b) * b) * y2
因为我们要找x1 y1和x2 y2的关系
我们可以用待定系数法,按照这种方法把右边化成b * (x2 - (a / b) * y2) + a * y2
则等式变成了
a * x1 + b * y1 = a * y2 + b * (x2 - (a / b) * y2)      (上面的过程最好动手演算)
好,我们现在得出了下面两个等式:
x1 = y2(等式两边a的系数相同)
y1 = x2 - (a / b) * y2 (等式两边b的系数相同)
也就是说,我们知道了方程b * x2 + (a%b) * y2 = g(b,a%b) 的解x2, y2,就可以得到方程a * x1 + b * y1 = g(a,b) 的解x1,y1了,这个小问题告一段落。

对于方程a * x + b * y = gcd(a,b),我们可以不断的往下变成b * x + (a % b) y = gcd(a,b) ,按照欧几里得的过程,b会变成0,即此时方程a * x + b * y = gcd(a,b) 因为b = 0,变成了a * x = gcd(a,b) ,还是由欧几里得算法得到,此时a就等于gcd(a,b),所以得到由原方程往下推了不知道多少次的方程 a * x = gcd(a,b) 来说,得到一个解x = 1, y = 0。现在得到了这个方程的解,再回溯回去,就可以得出原方程 a * x + b * y = gcd(a,b) 的一个特解。

OK,这个问题解决了。

二、怎么利用特解推出其他所有整数解?
先说结论:
对于关于x,y的方程a * x + b * y = g 来说,让x增加b/g,让y减少a/g,等式两边还相等。(注意一个增加一个减少)
为什么呢?
这个很容易得到,我们算一下即可。
让x增加b/g,对于a * x这一项来说,增加了a * b / g,可以看出这是a,b的最小公倍数
同样,对于b * y这一项来说,y 减少 a/b,这一项增加了a * b / g,同样是a,b的最小公倍数。
可以看出,这两项一项增加了一个最小公倍数,一项减少了一个最小公倍数,加起来的和仍然等于g。
这样我们就明白了,其实这种操作就是增加一个最小公倍数,减少一个最小公倍数,这样来改变x,y的值,来求出所有x,y的通解的。

那为什么改变的是最小公倍数而不是更小的数呢?因为是 最小 公倍数呀…不会再找到更小的值了,这个自行体会吧…

到这里为止,开头提出的两个问题都已经解决。
也就是说,对于方程a * x + b * y = gcd(a,b),我们能找出所有符合条件的解了。而且,还可以告诉你,这个方程是一定有无数个解的。

那么来一个更一般的问题,对于方程a * x + b * y = c 来说,它的解怎么求呢?
答:如果c % gcd(a,b) != 0,即c不是gcd的整数倍,则无解。
如果c % gcd(a,b) == 0 且 c / gcd(a,b) = t,那么求出方程 a * x + b * y = gcd(a,b)的所有解x,y,将x,y乘上t,对应的x’,y’即是方程a * x + b * y = t * gcd(a,b)的解
很好理解,就不解释了,仔细看上面的这段话就能理解

附上拓展欧几里得的代码

void exgcd(int a, int b, int &gcd, int &x, int &y)
{if (b){exgcd(b, a % b, gcd, y, x);y -= x * (a / b)}else{x = 1;y = 0;gcd = a;}
}
或是
void exgcd(int a, int b,int &x, int &y)
{if (b){exgcd(b, a % b, gcd, y, x);y -= x * (a / b)}else{x = 1;y = 0;}
}

拓展欧几里得小结(初级理解)相关推荐

  1. 拓展欧几里得小结(转载)

    什么是拓展欧几里得?简单的说,就是求关于x,y的方程 ax + by = gcd(a,b) 的所有整数解 现在我们令g = gcd(a,b) 则方程变成了ax + by = g 假如我们现在知道了关于 ...

  2. 关于欧几里得定理和拓展欧几里得定理的理解 续

    前言 在我大一刚开始ACM的时候,写过一篇关于欧几里得定理理解的博客,这几天因为再次用到欧几里得定理,所以又转回去看了看,感觉自己以前写的不是很清楚,所以决定再写一篇关于欧几里得定理以及拓展欧几里得定 ...

  3. 欧几里得定理 及 拓展欧几里得 小结

    [欧几里得定理] 定义: gcd ⁡ ( a , b ) = gcd ⁡ ( b , a m o d    b ) \gcd(a,b)=\gcd(b,a\mod b) gcd(a,b)=gcd(b,a ...

  4. poj1061-青蛙的约会(拓展欧几里得java)

    题目: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚 ...

  5. 从欧几里得到拓展欧几里得

    欧几里得定理: 公式表述 gcd(a,b)=gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个 公约数,则有 d|a, d|b,而r ...

  6. 拓展欧几里得模板/求逆元模板(java)

    拓展欧几里得模板 参考:哈尔滨理工大学ACM培训资料汇编/ACM-ICPC培训资料汇编* 基本原理 :设 a 和 b 不全为 0,则存在整数 x,y 使得 xa yb=gcd(a,b)=c 对于辗转相 ...

  7. 杭电2669拓展欧几里得

    杭电2669 给a,b求Xa Yb = 1.如果没有则输出sorry. 可以通过拓展欧几里得指导Xa Yb = gcd(a,b). 不言而喻要判断gcd(a,b)是否等于1.如果不等于1,那么就是so ...

  8. A/B HDU - 1576 (逆元或拓展欧几里得或数学公式)多解法求大数结果

    题意:求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). 思维:(1)逆元+扩展欧几里得算法:满足a*k≡1 (mo ...

  9. 拓展欧几里得 [Noi2002]Savage

    对于一个野人,他(她?)所在的位置,(C[i]+x*p[i])%ans,是的,暴力枚举每一个ans,用拓展欧几里得求出每两个wildpeople(wildrage?)相遇的年份,如果小于最小的寿限(就 ...

最新文章

  1. 26 页高清大数据开发代码速查表,提升效率必备!【可下载】
  2. 电路图中常用的英文缩写的中文解释
  3. java 老年代回收_Java垃圾回收之老年代垃圾收集器
  4. 东莞网络推广浅析网站优化中常见的引流方式有哪些?
  5. Matplotlib实例教程(六)直方图
  6. POJ 1330 Nearest Common Ancestors 【LCA模板题】
  7. oracle 查看用户状态,Oracle数据库查看用户状态
  8. 【整理】C#2.0泛型编程之概述、default()方法、别名指定与泛型约束
  9. 用友U8案例教程财务报表
  10. 屏幕录像专家 V6.0+注册机
  11. HDMI/DVI分配器芯片
  12. 天地图和谷歌地图静态图像素坐标和经纬度坐标互转
  13. 新版标准日本语高级_第12课
  14. 鸿蒙系统安全模式,安全模式怎么连接wifi
  15. tadb.exe、sjk_daemon.exe导致 adb.exe启动失败
  16. Conflunce从JIRA同步用户账户的配置方法
  17. 4.0低功耗蓝牙解决方案
  18. 怎么用matlab画误差椭圆,matlab画误差椭圆
  19. 天兔(Lepus)数据库监控系统快速安装部署
  20. 简单讲解单片机数据、地址、控制总线结构

热门文章

  1. redis php方案,Redis三种部署方案图文详解
  2. 软件项目组织管理(五)项目范围管理
  3. java实体中文字段_java - Spring JPA实体类是否可以包含不在数据库表中的非数据库字段 - SO中文参考 - www.soinside.com...
  4. 命令注入_命令注入绕过方式总结
  5. 3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的大人孩子~
  6. 15张令人震撼的物理动图,看完惊呆了!
  7. 遭央视曝光的“AI算命”,背后竟然隐藏了一个价值千亿的市场!?
  8. 计算机如何实现共享接入,局域网内电脑实现共享设置方法
  9. linux连接建立的时间,用timedatectl在Linux中检查当前时区及更改时区(创建符号链接来更改时区)...
  10. linux 内核 三天吐血,编译安装——吐血经验,内附脚本