欧几里得算法

欧几里得算法基于的性质:

  1. 若\(d|a, a|b\),则\(d|(ax+by)\)

  2. \((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 欧几里得算法&扩展欧几里得算法的更多相关文章

  1. noip知识点总结之--欧几里得算法和扩展欧几里得算法

    一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a  ...

  2. 扩展欧几里得算法(extgcd)

    相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...

  3. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  4. vijos1009:扩展欧几里得算法

    1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...

  5. ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)

    1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...

  6. 浅谈扩展欧几里得算法(exgcd)

    在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...

  7. (light oj 1306) Solutions to an Equation 扩展欧几里得算法

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...

  8. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  9. 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)

    题面 题目描述 给出一个有理数 c=\frac{a}{b}  ​ ,求  c mod19260817  的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...

随机推荐

  1. Eclipse创建Spring XML配置文件插件

    引用:https://www.cnblogs.com/lideqiang/p/9067219.html 第一步:在 Eclipse Marketplace仓库中,搜索sts 第二步:安装Spring ...

  2. http和https到底区别在哪

    一.Http和Https的基本概念 Http:超文本传输协议(Http,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.设计Http最初的目的是为了提供一 ...

  3. Qt的.pro文件格式解析

    Qt的.pro文件格式解析 在Qt中用qmake生成makefile文件,它是由.pro文件生成而来的,.pro文件的具体格式语法如下: 1.注释 .pro文件中注释采用#号,从"#&quo ...

  4. 详解Mysql事务隔离级别与锁机制

    一.概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能 就会导致我们说的脏写. 胀读和不可重复读.幻读这些问题. 这些问题的本质都是数据库的多事务并 ...

  5. java中如何知道一个字符串中有多少个字,把每个字打印出来,举例

    9.6 About string,"I am ateacher",这个字符串中有多少个字,且分别把每个字打印出来. public class Test {     static i ...

  6. Servlet 3.1学习笔记

    Servlet 3.1学习笔记 参考文档 Servlet 3.1标准 什么是 Servlet ? Servlet 是基于 Java 平台的 Web 组件,由一个容器管理,能够生成动态内容. 什么是 S ...

  7. 帝国CMS 给简介字段添加一键排版按钮

    帝国CMS后台->管理数据表->选择数据表>打开smalltext字段输入表单替换html代码 添加如下代码: <script> function format() { ...

  8. 帝国CMS批量提取正文内容到简介

    最近接到一个帝国CMS模板改版项目,自带的数据可能是采集的,以前的简介字段内容只截取了60个字,新模板的简介60字符太少了,不美观,想让简介都截取200个字,怎么批量修改呢,文章太多了手动改肯定不行, ...

  9. 基础设施即代码(IAC),Zalando Postgres Operator UI 入门

    Postgres Operator UI 提供了一个图形界面,方便用户体验数据库即服务.一旦 database 和/或 Kubernetes (K8s) 管理员设置了 operator,其他团队就很容 ...

  10. Java语言学习day19--7月25日

    今日内容介绍1.继承2.抽象类3.综合案例---员工类系列定义 ###01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在Jav ...