[数学基础] 4 欧几里得算法&扩展欧几里得算法
欧几里得算法
欧几里得算法基于的性质:
若\(d|a, a|b\),则\(d|(ax+by)\)
\((a,b)=(b,a~mod~b)\)
第二条性质证明:
\(\because a~mod~b=a-\lfloor \frac{a}{b} \rfloor\times b\),令\(c=\lfloor \frac{a}{b} \rfloor\)
则问题等价于证明\((a,b)=(b,a-c\times b)\)
这个证明方法就和裴蜀定理的证明差不多。
证明:令\(d=gcd(a,b)\),则\(d|a,d|b\),易得\(d|(a-c\times b)\)。则\(d\)为\(b,(a-c\times b)\)的公因数。
那么令\(D=(b,a-c\times b)\),\(d\leq D\)。
\(D|b,D|(a-c\times b)\),易得\(D|a\),则\(D\leq (a,b)=d\)。
因此\(d=D\),即\(d=gcd(b,a-c\times b)\)
欧几里得算法模板
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
扩展欧几里得算法
1. 前置知识-裴蜀定理
裴蜀定理:\(\forall a,b\in \Z\),令\(d=(a,b)\),那么对于任意的整数\(x,y\in \Z\),\(ax+by=kd\)。特别的,一定\(\exist x,y\),使得\(ax+by=d\)成立。
丢番图方程\(ax+by=m\)有解,当且仅当\(m\)是\(d\)的倍数。丢番图方程有解时必然有无穷多个解,每组解\(x,y\)都称为裴蜀数,可用辗转相除法求得。
证明:
(前半句)\(\because d|a,d|b\),\(\therefore \forall x,y\in Z, d|(ax+by)\)
(特别的...)设\(s\)为\(ax+by\)的最小正值,令\(q=\lfloor \frac{a}{s} \rfloor\),\(r=a ~mod ~s\)。
则\(r=a-\lfloor \frac{a}{s} \rfloor\times s=a-q\times(ax+by)=a(1-qx)+b(-qy)\),即\(r\)也为\(a,b\)的线性组合
\(\because r=a~mod~s\) ,\(\therefore 0\leq r <s\)
又\(s\)为\(ax+by\)的最小正值,可得\(r=0\),即\(a ~mod~s=0\)。
\(\therefore s|a\),再设\(r_2=b~mod~s\),同理可得\(s|b\)。因此\(s\)为\(a,b\)的公因子,\(d\geq s\)。
\(\because d|a,d|b,s=ax+by\),\(\therefore d|s\),\(d\leq s\)。
因此\(d=s\),命题得证。
推论1:\((a,b)=1\)的充分必要条件是\(\exist x,y\in Z, s.t.~~ax+by=1\)。
推论2:裴蜀等式也可以用来给最大公约数定义:\(d\)其实就是最小的可以写成\(ax + by\)形式的正整数。
推论2:设\(a_1,a_2,...,a_n\)为\(n\)个整数,\(d\)是它们的最大公约数,那么\(\exist x_1,x_2,...,x_n\),使得\(a_1x_1+a_2x_2+...+a_nx_n=d\)成立。特别的,若\(a_1,a_2,...,a_n\)是互质的(不是两两互质),那么\(\exist x_1,x_2,...,x_n\),使得\(a_1x_1+a_2x_2+...+a_nx_n=1\)成立。
2. 扩展欧几里得算法
如何用扩展欧几里得算法求裴蜀数?
假如要求解的不定方程(又名丢番图方程)为\(ax+by=m\)
我们现在先求解不定方程\(ax+by=d\),其中\(d=(a,b)\),\(d|m\)。
由欧几里得算法性质1,2可知\((a,b)=(b,a~mod~b)=(b, a-\lfloor \frac{a}{b} \rfloor\times b)\)
若\(ax_1+by_1=d\)有解,则\(by_2+(a~mod~b)x_2=d\)一定有解,即\(by_2+(a-\lfloor \frac{a}{b} \rfloor\times b)x_2=d\)有解。
化简得\(ax_2+b(y_2-\lfloor \frac{a}{b} \rfloor\times x_2)=d\),那么\(x_1=x_2,y_1=y_2-\lfloor \frac{a}{b} \rfloor\times x_2\)。
于是可以递归进行操作,当\(b'=0\)时,\((a',0)=d\),也就是\(a'=d\),此时\(x=1,y=0\)为一组平凡解,再不断带回,即可得到不定方程的一组特解,设此特解为\(\{x_1,y_1\}\)。则通解即为\(\{x_1+k\times\frac{b}{d}, y_1-k\times\frac{a}{d}, k\in \Z\}\)
证明通解是方程的解:
\(ax+by=a\times(x_1+k\times\frac{b}{d})+b\times(y_1-k\times\frac{a}{d})\\=ax_1+by_1+k\times (\frac{ab}{d}-\frac{ab}{d})=d\)
因此,通解是可以使等式成立的。
那么同理,\(ax+by=m\),通解也是\(\{x_0+k\times \frac{b}{d}, y_0-k\times \frac{a}{d}\}\)。
- 代码
int exgcd(int a, int b, int &x, int &y){
if (!b){
x = 1, y = 0;
return a;
}
int d = exgcd(b, a%b, y, x);
y -= a / b * x;
return d;
}
[数学基础] 4 欧几里得算法&扩展欧几里得算法的更多相关文章
- noip知识点总结之--欧几里得算法和扩展欧几里得算法
一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a ...
- 扩展欧几里得算法(extgcd)
相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...
- 欧几里得算法与扩展欧几里得算法_C++
先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...
- vijos1009:扩展欧几里得算法
1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...
- ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)
1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...
- 浅谈扩展欧几里得算法(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...
- (light oj 1306) Solutions to an Equation 扩展欧几里得算法
题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...
- 『扩展欧几里得算法 Extended Euclid』
Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...
- 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)
题面 题目描述 给出一个有理数 c=\frac{a}{b} ,求 c mod19260817 的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...
随机推荐
- npm安装包出现UNMET DEPENDENCY报错
出现这个内容应该是包损坏,导致npm无法正常解析,通过 npm ls 命令也可以看到UNMET DEPENDENCY在依赖包上出现,在输出的信息最后有一个错误信息 npm view pkg versi ...
- Redis Set Type
集合中的元素个数最多为2的32次方-1个,集合中的元素师没有顺序的. Redis集合的操作命令和对应的api如下: smembers [set] JedisAPI:public Set<Stri ...
- 什么是持续集成(CI)?
持续集成(CI)是每次团队成员提交版本控制更改时自动构建和测试代码的过程. 这鼓励开发人员通过在每个小任务完成后将更改合并到共享版本控制存储库来共 享代码和单元测试.
- 什么是 UML?
UML 是统一建模语言(Unified Modeling Language)的缩写,它发表于 1997 年,综合了当时已经存在的面向对象的建模语言.方法和过程,是一个支持模型 化和软件系统开发的图形化 ...
- github 编写README时常用的写法
参考:https://github.com/HeTingwei/ReadmeLearn#%E7%BC%96%E5%86%99readme%E6%97%B6%E5%B8%B8%E7%94%A8%E7%9 ...
- OpenCV+QT5在Window下的环境配置记录
在安装OpenCV时最需要注意的是,OpenCV库,也就是我们需要的dll和动态库需要我们使用CMake来生成. 虽然在官网上下载得到的文件中已经包含了库文件和.h等头文件,但是在具体开发中编译器编译 ...
- Python学习--21天Python基础学习之旅(Day08-Day21)
Day08: Chapter 11 异常 1.1如果try代码块中代码运行没有问题,则运行时跳过except代码块.(有异常时执行except中的代码,没有异常则跳过except中的代码) try-e ...
- i2c总线编码
i2c总线编码 发送启动信号S 在同步时钟线SCL 为高电平时,数据线出现的由高到低的下降沿. 启动信号子程序STA 1 /************************************** ...
- js中的bool值转换及"&&" 、"||"、 "!!"详解
bool值转换 数据类型 bool值转化 undefined undefined 转化为 false Object null 转化为false,其他为 true Boolean false 转化为 f ...
- 浅谈Web前后端分离的意义
自然是有很大意义的.下面我可能说的比较多--方便题主能够更全面的了解为什么说是有有意义的.另外,本文是以Java的角度谈前后端分离.放心,大家一定会有种是我了,没错,的感觉. 一.先来明晰下概念 前后 ...