[数学基础] 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 \) .第二行,一个整 ...
随机推荐
- 在 Spring 中如何注入一个 java 集合?
Spring 提供以下几种集合的配置元素:类型用于注入一列值,允许有相同的值.类型用于注入一组值,不允许有相同的值.类型用于注入一组键值对,键和值都可以为任意类型.类型用于注入一组键值对,键和值都只能 ...
- Effective Java —— 覆盖equals时总要覆盖hashCode
本文参考 本篇文章参考自<Effective Java>第三版第十一条"Always override hashCode when you override equals&quo ...
- 【SpringBoot学习一】开发入门--快速创建springboot程序
前言 本片博客记录快速创建springboot工程的两种方式.一种是使用maven创建,一种是使用spring initializr创建.开发环境JDK1.8.IDEA.maven. SpringBo ...
- 动态规划 洛谷P1616 疯狂的采药
动态规划 洛谷P1616 疯狂的采药 同样也是洛谷的动态规划一个普及-的题目,接下来分享一下我做题代码 看到题目,没很认真的看数据大小,我就提交了我的代码: 1 //动态规划 洛谷P1616 疯狂的采 ...
- 动态规划 洛谷P1048 [NOIP2005 普及组] 采药
洛谷P1048 [NOIP2005 普及组] 采药 洛谷的一个谱架-的题目,考的是01背包问题,接下来分享一下我的题解代码. AC通过图: 我的代码: 1 //动态规划 洛谷P1048 [NOIP20 ...
- Tensorflow安装教程(Anaconda)
写在最前: 在安装过程中遇到很多坑,一开始自己从官网下载了Python3.6.3或者Python3.6.5或者Python3.7.1等多个版本,然后直接pip install tensorflow或者 ...
- Javascript--function的name属性
1.非标准的name属性 function sayHi(){ console.log("Hi");} console.log(sayHi.name);
- Vuet.js规则详解,它是你不知道的强大功能?
Vuet.js是什么? Vuet.js是给Vue.js提供状态管理的一个工具,与vuex不同,它是一种崇尚规则定制的状态管理模式.事先将状态更新的规则写好,然后将规则注入到组件中,然后状态按照预订的规 ...
- CCF201312-2ISBN号码
问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",其中符号"-&qu ...
- Node自动重启工具 nodemon
为什么要使用 在编写调试Node.js项目,修改代码后,需要频繁的手动close掉,然后再重新启动,非常繁琐.现在,我们可以使用nodemon这个工具,它的作用是监听代码文件的变动,当代码改变之后,自 ...