拓展欧几里得小结(初级理解)

什么是拓展欧几里得?简单的说,就是求关于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;}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用java做一个模拟彩票程序_JAVA模拟----- 彩票机子-----抽奖过程的实例化

/*时间:2012-10-05作者:烟大阳仔程序要求:模拟彩票抽奖机的功能编写一个程序,实现随即输出六个号码程序解释:该段程序没有传递参数*/class Day1005_Caipiao{public static void main(String[] args){System.out.println("估计…

[C++STL]deque容器用法介绍

代码如下&#xff1a; #include <iostream> #include <string> #include <deque> using namespace std;void printDeque(const deque<int>& d) {for (deque<int>::const_iterator it d.begin(); it ! d.end(); it){cout << *it <…

“我工作八年,换了四家小公司,今后的职业生涯该怎么走?”

去年&#xff0c;我曾在GIAC大会上分享过一个有关程序员职场变化和转型的话题。在分享结束之后&#xff0c;有一位小伙伴拦在大门口&#xff0c;问了我一个问题&#xff1a;"王老师&#xff0c;虽然你分享的内容很务实&#xff0c;落地性也很强&#xff0c;但我觉得跟自己…

最长回文 HDU - 3068(求最长回文串的长度【马拉车算法Manacher】)

马拉车算法 Manacher‘s Algorithm 是用来查找一个字符串的最长回文子串的线性方法&#xff0c;由一个叫 Manacher 的人在 1975 年发明的&#xff0c;这个方法的最大贡献是在于将时间复杂度提升到了线性 dp[i] ma > i ? min(dp[2 * mod - i], ma - i) : 1; 可以这么说&…

java中的循环结构_Java中的循环结构进阶

循环结构进阶学习本章用到的单词triangle:三角形circle:圆形diamond:钻石password:密码row:行.排列二重循环结构简单的说:二重循环就是一个循环体内又包含另一个完整的循环结构.while循环结构,do-while循环结构,for循环结构三种循环结是可以相互嵌套的语法://while与while循环嵌…

.NET Core + Kubernetes:Deployment

在上篇文章 .NET Core Kubernetes&#xff1a;Pod 中&#xff0c;主要介绍了 Pod 的相关内容&#xff0c; 基于 Pod 为单位能更加合理进行容器编排&#xff0c;然而 Pod 只是个启动了一个或一组容器的资源类型&#xff0c;在实际应用中&#xff0c;我们也需要 Pod 能实现动态扩…

java dos平台压缩_Dos命令 压缩 解压缩

你的机器 有RAR吗> 装个rar里面有个Rar.exe文件用法: rar - - a 添加文件到压缩文件c 添加压缩文件注释cf 添加文件注释cw 写入压缩文件注释…

Oulipo HDU - 1686(哈希或KMP)匹配字符串

题意&#xff1a;字符串匹配&#xff1a;寻找字符串S中&#xff0c;字符串T出现的次数 思路&#xff1a;KMP或哈希 The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter e. He was a member of the Oulipo group. A quote …

我整理了100G的.Net学习资料,速来领取!

听说免费送课会上瘾&#xff1f;不分享点干货给大家学习&#xff0c;完全无法衬托本号主的好人特质啊&#xff01;正所谓白嫖一时爽&#xff0c;一直白嫖一直爽&#xff01;举起你滴双手&#xff0c;擦亮你的眼睛&#xff01;今天我要丢个硬核干货&#xff01;一次性怒砸几百个…

maven mysql的jdbctemplate_JDBC、JDBCTemplate、MyBatis、Hiberante 比较与分析

JDBC (Java Data Base Connection,java数据库连接)JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发…

[C++STL]list容器用法介绍

代码如下: #include <iostream> #include <string> #include <list> using namespace std;void printList(const list<int>&L) {for (list<int>::const_iterator it L.begin(); it ! L.end(); it){cout << *it << " &quo…

C#黔驴技巧之去重(Distinct)

关于C#中默认的Distinct方法在什么情况下才能去重&#xff0c;这个就不用我再多讲&#xff0c;针对集合对象去重默认实现将不再满足&#xff0c;于是乎我们需要自定义实现来解决这个问题&#xff0c;接下来我们详细讲解几种常见去重方案&#xff0c;孰好孰歹自行判之。分组首先…

Almost Union-Find UVA - 11987(并查集的删除操作)

题意&#xff1a;求出每个集合的元素个数&#xff0c;及总和&#xff0c;给出三个操作&#xff1a; 1 将含有a元素和b元素的集合合并&#xff1b;2 将a元素放入含有b元素的集合中&#xff1b;3 输出a元素所在集合的元素个数及总和&#xff1b; 思路&#xff1a;正常并查集&am…

java.sql 拒绝连接_hive jdbc 拒绝连接问题

本帖最后由 willgone 于 2017-06-21 10:56 编辑平台配置在附件中。private static String driverName1 "org.apache.hive.jdbc.HiveDriver";Class.forName(driverName1);String url"jdbc:hive2://192.168.160.241:21076/default";Connection con DriverM…

ASP.NET Core分布式项目实战(oauth2 + oidc 实现 server部分)--学习笔记

任务15&#xff1a;oauth2 oidc 实现 server部分基于之前快速入门的项目&#xff08;MvcCookieAuthSample&#xff09;&#xff1a;ASP.NET Core快速入门&#xff08;第5章&#xff1a;认证与授权&#xff09;--学习笔记ASP.NET Core快速入门&#xff08;第6章&#xff1a;ASP…

[C++STL]set容器用法介绍

代码如下: #include <iostream> #include <set> using namespace std;void printSet(set<int>&s) {for (set<int>::iterator it s.begin(); it ! s.end(); it){cout << *it << " ";}cout << endl; }void test01() {…

Equations HDU - 1496(哈希或三层for循环)求满足公式有多少种情况

题意:求x在(-100<x<100)区间上&#xff0c;已知a,b,c,d&#xff0c;满足a*x1^2b*x2^2c*x3^2d*x4^20 的情况有多少种 思路&#xff1a;很明显四层for循环肯定超时&#xff0c;可用三层for循环来判断&#xff0c;或是&#xff0c;两两组合&#xff0c;求多少种情况。分正负…

java.time.format例子_java格式化时间示例

实现日期的格式化&#xff0c;需要用到类: java.text.DateFormatDateFormat没有可以直接使用的构造函数&#xff0c;一般使用DateFormate的子类---java.text.SimpleDateFormat完成构造.public SimpleDateFormat(String pattern)测试代码import java.text.DateFormat;import jav…