欧几里得算法:

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

  1. 详解扩展欧几里得算法(扩展GCD)

    浅谈扩展欧几里得(扩展GCD)算法 本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法.为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养.并且已经 ...

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

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

  3. [数学基础] 4 欧几里得算法&扩展欧几里得算法

    欧几里得算法 欧几里得算法基于的性质: 若\(d|a, a|b\),则\(d|(ax+by)\) \((a,b)=(b,a~mod~b)\) 第二条性质证明: \(\because a~mod~b=a ...

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

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

  5. 【learning】 扩展欧几里得算法(扩展gcd)和乘法逆元

    有这样的问题: 给你两个整数数$(a,b)$,问你整数$x$和$y$分别取多少时,有$ax+by=gcd(x,y)$,其中$gcd(x,y)$表示$x$和$y$的最大公约数. 数据范围$a,b≤10^ ...

  6. 扩展欧几里得算法(exGCD)学习笔记

    @(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...

  7. 扩展欧几里得算法详解(exgcd)

    一.前言 本博客适合已经学会欧几里得算法的人食用~~~ 二.扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a.b是整数,那么一定存在整数x.y使得$ ...

  8. 扩展欧几里得算法(EXGCD)学习笔记

    0.前言 相信大家对于欧几里得算法都已经很熟悉了.再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过.这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程. 1.Bézo ...

  9. 扩展欧几里得算法(exgcd)

    Bezout定理: 对于任意整数a,b,存在一对整数x,y满足:a*x+b*y=gcd(a,b) 证明如下: 在欧几里得算法的最后一步:b=0,即:gcd(a,0)=a 对于b>0,根据欧几里得 ...

随机推荐

  1. 《精通并发与Netty》学习笔记(01 - netty介绍及环境搭建)

    一.Netty介绍     Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.     ...

  2. 条件DCGAN(2019/09/10)

    最近看到keras的官方GAN代码中有CGAN(全连接层)和卷积GAN(DCGAN),但他并没有给出“条件卷积GAN”,预测就把这两者结合了一下.虽然很多人用其他框架(e.g.TensorFlow)写 ...

  3. 2019年最新Web安全攻防班课程

    咨询请加QQ:1373721311 或 2644148223 课程核心大纲总览 Web安全攻防班以业界权威的OWASP TOP 10的漏洞为主干课程.更加详细教学思维导图可访问如下链接:https:/ ...

  4. 【科普杂谈】IP地址子网划分

    1.学习子网前的准备知识-什么是数制 现场讲解版 二进制和十进制的关系   二进制和十六进制的关系  16进制的每个位是2进制的4位 F=1111  二进制转16进制,按上面4位一组分开转 2.IP地 ...

  5. windows登录密码忘记了怎么办?

    利用PE工具进行进行修改密码或者重置系统密码,正对于服务器也同样试用 目前U启动制作效果还不错,黑鲨一键装机,以及老毛桃我觉得还是算了,U深度也不错 经过这么久,小编也把该测试的测试了,,小编比较懒, ...

  6. 什么是时序时空数据库TSDB

    时序时空数据库(Time Series & Spatial Temporal Database,简称 TSDB)是一种高性能.低成本.稳定可靠的在线时序时空数据库服务,提供高效读写.高压缩比存 ...

  7. Educational Codeforces Round 68 (Rated for Div. 2)补题

    A. Remove a Progression 签到题,易知删去的为奇数,剩下的是正偶数数列. #include<iostream> using namespace std; int T; ...

  8. Python—None

    None是一个特殊的常量. None不是False. None不是0. None不是空字符串. None有自己的数据类型NoneType,并且是NoneType中唯一的值. None只是一个空值的对象 ...

  9. 异或运算符(^)、与运算符(&)、或运算符(|)、反运算符(~)、右移运算符(>>)、无符号右移运算符(>>>)

    目录 异或(^).异或和 的性质及应用总结 异或的含义 异或的性质:满足交换律和结合律 异或的应用 按位 与运算符(&) 按位 或运算符(|) 取 反运算符(~) 右移运算符(>> ...

  10. STM32的堆与栈与编译信息查看

    STM32的堆与栈与编译信息查看 因为一个项目中使用malloc函数动态分配内存400多个字节,返回为0,分配失败.查找失败原因,为堆空间不足分配导致.查看堆和栈分别设置了2K,按正常情况看应能满足分 ...