gcd(欧几里得算法)与exgcd(扩展欧几里得算法)
欧几里得算法:
1.定义:gcd的意思是最大公约数,通常用扩展欧几里得算法求
原理:gcd(a, b)=gcd(b, a%b)
2.证明:
令d=gcd(a, b) => a=m*d,b=n*d
则m*d=t*n*d+a%b => a%b=d*(m-t*n)
gcd(b, a%b)=gcd(n*d, (m-t*n)*d)
令gcd(n, m-t*n)=e => n=x*e,m-t*n=y*e
则m-x*e*n=y*e => m=e*(x*n+y)
由gcd(n, m)=1知gcd(e*(x*n+y), e*x)=1
故e=1
故gcd(n*d, (m-t*n)*d)=d即gcd(b, a%b)=gcd(a, b)
3.边界:
当b=0时return a
可以视为gcd(a, 0)=a,任何数都能整除0
也可以视为gcd(a, b)=b,这里的a和b是上一层的,满足a%b=0
4.特殊情况:
当a<b时,a%b=a,所以在下一层gcd(b, a%b)中相当于把a与b交换
5.代码:
int gcd(int a,int b){ return b ? gcd(b,a%b) : a;}
一行gcd
扩展欧几里得算法:
1.丢番图方程:
有一个或者几个变量的整系数方程,它们的求解仅仅在整数范围内进行。
扩展欧几里得算法研究的是形如 a*x+b*y=c 的丢番图方程的解
2.裴蜀定理:
对于正整数a和b,令gcd(a, b)=d,则对于任意整数x和y,都有d|(a*x+b*y)
证明:
令a=n*d,b=m*d,则a*x+b*y=d*n*x+d*m*y
显然d|(d*n*x+d*m*y)
3.引理:
丢番图方程 a*x+b*y=c 有解当且仅当d|c
对于任意整数x和y,a*x+b*y的最小正值为gcd(a, b)
证明:
①必要性:
由裴蜀定理,不存在整数x和y,使得d不整除(a*x+b*y)
②充分性:
要证a*x+b*y=c有解,只需a*x+b*y=d有解
令对于任意整数x和y,a*x+b*y能得到的最小正值为s
由裴蜀定理,d|s,则d<=s
令q=⌊a/s⌋,p=a%s
则p=a-q*(a*x+b*y)=a*(1-q*x)-q*b*y=a*(1-q*x)+b*(-q*y)
由p=a%s知0<=p<s
又s为a*x+b*y能得到的最小正值
故p=0,即s|a
同理,s|b,即s|d,故s<=d
综上,s=d
即对于任意整数x和y,a*x+b*y能得到的最小正值为d
故存在整数x和y,使a*x+b*y=d
即存在整数x和y,使a*x+b*y=c
4.扩展欧几里得算法:
通常将求解a*x+b*y=c转化为求解a*x+b*y=gcd(a, b),得解后乘上c/gcd(a, b)即可
令
a*x1+b*y1=gcd(a, b)
b*x2+(a%b)*y2=gcd(b, a%b)
由gcd(a,b)=gcd(b,a%b)知
a*x1+b*y1=b*x2+(a%b)*y2
=b*x2+(a-b*⌊a/b⌋)*y2=a*y2+b*(x2-⌊a/b⌋*y2)
故x1=y2,y1=(x2-⌊a/b⌋*y2)
如此递归直至边界情况
5.边界:
当b=0时,gcd(a, b)=a(任何数都能整除0)
a*x+b*y=a*x=gcd(a, b)*x
若使a*x+b*y=gcd(a, b),只需x=1,y可以为任何值,通常设为0,减少溢出的风险
y的多值对应方程的多解
6.通解:
对于对于第一个解x0和y0,其他解可以表示为x0+(b/d)*k和y0-(a/d)*k
推导:
令a*(x+m)+b*(x-n)=d
=> a*m=b*n => m/n=b/a
因gcd(a, b)=d,m和n均为整数
故m和n的最小值分别为b/d和a/d
若要求其中一个解为正整数,可在得到负解后用通解转化为正数
7.代码:
void exgcd(int a,int b,int &x,int &y){
if(!b){
x=,y=;
return ;
}
exgcd(b,a%b,x,y);
int z=x;
x=y,y=(z-a/b*y);
}
8.易错点:
算法中存在乘法,有溢出的风险,应见机开long long
例题:
洛谷4549 裴蜀定理
洛谷1516 青蛙的约会
洛谷3951 小凯的疑惑
洛谷1082 同余方程
gcd(欧几里得算法)与exgcd(扩展欧几里得算法)的更多相关文章
- 详解扩展欧几里得算法(扩展GCD)
浅谈扩展欧几里得(扩展GCD)算法 本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法.为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养.并且已经 ...
- 欧几里得算法与扩展欧几里得算法_C++
先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...
- [数学基础] 4 欧几里得算法&扩展欧几里得算法
欧几里得算法 欧几里得算法基于的性质: 若\(d|a, a|b\),则\(d|(ax+by)\) \((a,b)=(b,a~mod~b)\) 第二条性质证明: \(\because a~mod~b=a ...
- 浅谈扩展欧几里得算法(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...
- 【learning】 扩展欧几里得算法(扩展gcd)和乘法逆元
有这样的问题: 给你两个整数数$(a,b)$,问你整数$x$和$y$分别取多少时,有$ax+by=gcd(x,y)$,其中$gcd(x,y)$表示$x$和$y$的最大公约数. 数据范围$a,b≤10^ ...
- 扩展欧几里得算法(exGCD)学习笔记
@(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...
- 扩展欧几里得算法详解(exgcd)
一.前言 本博客适合已经学会欧几里得算法的人食用~~~ 二.扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a.b是整数,那么一定存在整数x.y使得$ ...
- 扩展欧几里得算法(EXGCD)学习笔记
0.前言 相信大家对于欧几里得算法都已经很熟悉了.再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过.这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程. 1.Bézo ...
- 扩展欧几里得算法(exgcd)
Bezout定理: 对于任意整数a,b,存在一对整数x,y满足:a*x+b*y=gcd(a,b) 证明如下: 在欧几里得算法的最后一步:b=0,即:gcd(a,0)=a 对于b>0,根据欧几里得 ...
随机推荐
- JAVA是否适合非科班者自学入行?石油工程专业从培训到JAVA入门自学亲身经历
如今的我已经过了三十而立的年纪,虽然在三十岁我没有立下任何事业,相反,还在茫茫苦海中挣扎. 但是我并不是没有收获.当然,曾经在我拥有大好青春年华的时候选择了迷茫,以至于当我有所明悟的时候,却已经错过了 ...
- DHCP服务+PXE自动安装系统
DHCP服务+PXE自动安装系统 DHCP安装 安装DHCP服务器 yum install dhcp -y 安装完dhcp默认无法启动,需要编辑配置文件设置分配地址范围等相关信息,服务器自身IP地址要 ...
- 决策树、随机森林与k-means聚类算法
决策树的构建满足信息熵增益最大化原则 决策树的优点: 可解释性高 能处理非线性的数据 不需要数据归一化 可以用于特征工程 对数据分布没有偏好 广泛使用 容易软件实现 可以转化为规则 决策树的弱点 启发 ...
- 【机器学习】Matlab中实现QQ-plot的一个好工具gqqplot
Matlab中实现QQ-plot的一个好工具gqqplot 26JUN June 26, 2013 这几天看了一下QQ-plot以及在Matlab中的实现,可是Matlab自带的qqplot函数不能满 ...
- 解决使用wamp怎么使用php命令行
用了wamp,把php加到环境变量就报错啊! 那怎么用命令行啊! 可以找么着:(比如想执行 php think build --module demo) E:\php-project\tp5.> ...
- [bzoj1775][Usaco2009 Dec]Vidgame 电视游戏问题_背包dp
1775: [Usaco2009 Dec]Vidgame 电视游戏问题 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1775 题解: 发 ...
- linux内核编程入门 hello world
注意: Makefile 文件的命名注意M需要大写,否则会报错. 在Makefile文件中make命令前应为tab制表符. 下文转载至:https://blog.csdn.net/bingqing07 ...
- URL去重与文章去重的一些基本方法
一.url去重url存到数据库所有url放到set中(一亿条占用9G内存)md5之后放到set中(一亿条占用2,3G的内存)scrapy采用的就是类似方法bitmap方法(url经过hash后映射到b ...
- spark教程(18)-sparkSQL 自定义函数
sparkSQL 也允许用户自定义函数,包括 UDF.UDAF,但没有 UDTF 官方 API class pyspark.sql.UDFRegistration(sparkSession)[sour ...
- Boot-crm管理系统开发教程(总结)
这个Boot-crm管理系统我花了大概两周写完,因为是刚学完SSM框架,所以立马开始了这个项目,项目初期,运行书本上给的前端代码都报了许多错误,导致这个原因是因为书本给的 设计说明文档 没有看清楚.然 ...