欧几里得算法和扩展欧几里得算法——杨子曰数学

超链接:数学合集


不说废话,咱们直接开始

欧几里得算法

一句话:
g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a\ mod\ b) gcd(a,b)=gcd(b,a mod b)
简单证明:

首先我们先来证一证这个: g c d ( a , b ) = g c d ( b , a − b ) gcd(a,b)=gcd(b,a-b) gcd(a,b)=gcd(b,a−b)

假设: d = g c d ( a , b ) , a = k a ∗ d , b = k b ∗ d ( k a 和 k b 互 质 ) d=gcd(a,b),a=k_a*d,b=k_b*d(k_a和k_b互质) d=gcd(a,b),a=ka​∗d,b=kb​∗d(ka​和kb​互质)

这样一来,我们会发现:
a − b = k a ∗ d − k b ∗ d = ( k a − k b ) ∗ d a-b=k_a*d-k_b*d=(k_a-k_b)*d a−b=ka​∗d−kb​∗d=(ka​−kb​)∗d
欧,有没有发现a-b和b还是都有公因子d

a − b = ( k a − k b ) ∗ d a-b=(k_a-k_b)*d a−b=(ka​−kb​)∗d

b = k b ∗ d b=k_b*d b=kb​∗d

BUT,我们还要证明d是它们的最大公因子,也就是要证明,它们的系数 k a − k b k_a-k_b ka​−kb​和 k b k_b kb​的互质(它们如果不互质,那么最大公因数就会变成 d ∗ g c d ( k a − k b , k b ) d*gcd(k_a-k_b,k_b) d∗gcd(ka​−kb​,kb​))

我们用反证法:

假设 k a − k b k_a-k_b ka​−kb​和 k b k_b kb​不互质

设 : g c d ( k a − k b , k b ) = λ ( λ > 1 ) , k a − k b = α ∗ λ , k b = β ∗ λ 设:gcd(k_a-k_b,k_b)=\lambda(\lambda>1),k_a-k_b=\alpha*\lambda,k_b=\beta*\lambda 设:gcd(ka​−kb​,kb​)=λ(λ>1),ka​−kb​=α∗λ,kb​=β∗λ
于是
k a = k a − k b + k b = α ∗ λ + β ∗ λ = ( α + β ) ∗ λ k_a=k_a-k_b+k_b=\alpha*\lambda+\beta*\lambda=(\alpha+\beta)*\lambda ka​=ka​−kb​+kb​=α∗λ+β∗λ=(α+β)∗λ

有没有发现 k a k_a ka​和 k b k_b kb​有了公因数 λ \lambda λ,别忘了上面还有一个条件叫 k a 和 k b 互 质 k_a和k_b互质 ka​和kb​互质

于是得证!

然后我们就得到了: g c d ( a , b ) = g c d ( b , a − b ) gcd(a,b)=gcd(b,a-b) gcd(a,b)=gcd(b,a−b)

然后,我们把a-b看成等式左边新的b,然后一直拿a减,直到不能减了为止,其实就是:
g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a\ mod\ b) gcd(a,b)=gcd(b,a mod b)

得证!


int gcd(int a,int b){return b==0?a:gcd(b,a%b);
}

扩展欧几里得算法

这个东西只有一个作用
求 a x + b y = g c d ( a , b ) 的 整 数 解 求ax+by=gcd(a,b)的整数解 求ax+by=gcd(a,b)的整数解

假设存在一组x’和y’使得:
b x ′ + ( a m o d b ) y ′ = g c d ( b , a m o d b ) bx'+(a\ mod\ b)y'=gcd(b,a\ mod\ b) bx′+(a mod b)y′=gcd(b,a mod b)

根据上面的欧几里得算法:
g c d ( a , b ) = g c d ( b , a m o d b ) gcd(a,b)=gcd(b,a\ mod\ b) gcd(a,b)=gcd(b,a mod b)

我们就得到了:
a x + b y = b x ′ + ( a m o d b ) y ′ ax+by=bx'+(a\ mod\ b)y' ax+by=bx′+(a mod b)y′

幼儿园小盆友都知道:
a m o d b = a − ⌊ a b ⌋ ∗ b a\ mod\ b=a-\lfloor\frac{a}{b}\rfloor*b a mod b=a−⌊ba​⌋∗b

然后把它带回去:
a x + b y = b x ′ + ( a − ⌊ a b ⌋ ∗ b ) y ′ ax+by=bx'+(a-\lfloor\frac{a}{b}\rfloor*b)y' ax+by=bx′+(a−⌊ba​⌋∗b)y′

把括号拆开:
a x + b y = b x ′ + a y ′ − ⌊ a b ⌋ ∗ b y ′ ax+by=bx'+ay'-\lfloor\frac{a}{b}\rfloor*by' ax+by=bx′+ay′−⌊ba​⌋∗by′

再合并一下:
a x + b y = a y ′ + b ( x ′ − ⌊ a b ⌋ ∗ y ′ ) ax+by=ay'+b(x'-\lfloor\frac{a}{b}\rfloor*y') ax+by=ay′+b(x′−⌊ba​⌋∗y′)

So,你有没有惊奇的发现一定有一组解长这样:
{ x = y ′ y = x ′ − ⌊ a b ⌋ ∗ y ′ \left\{ \begin{aligned} x&=y'\\ y&=x'-\lfloor\frac{a}{b}\rfloor*y' \end{aligned} \right. ⎩⎨⎧​xy​=y′=x′−⌊ba​⌋∗y′​

也就是说我们只要求出x’和y’就可以求出x和y了

我们再来回头看一下它们的方程:
a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)

b x ′ + ( a m o d b ) y ′ = g c d ( b , a m o d b ) bx'+(a\ mod\ b)y'=gcd(b,a\ mod\ b) bx′+(a mod b)y′=gcd(b,a mod b)
有没有发现形式是一样滴,So,我们可以通过递归来解决它

那么临界情况是什么捏?

一个幼儿园小盆友都知道的事实:
g c d ( a , 0 ) = a gcd(a,0)=a gcd(a,0)=a
So,当b=0时:
a x + 0 = g c d ( a , 0 ) ax+0=gcd(a,0) ax+0=gcd(a,0)
然后就可以,美滋滋地让x=1,y是任意值了(一般是0,它会影响最后的解的大小)

OK,完事

void ex_gcd(int a,int b,int &x,int &y){if(!b) x=1,y=0;else ex_gcd(b,a%b,y,x),y-=(a/b)*x;
}

应用1:解方程ax+by=c

首先,在上面已经讲过了,扩展欧几里得可以求长这样的方程:
a x + b y = g c d ( a , b ) ax+by=gcd(a,b) ax+by=gcd(a,b)
那有什么卵用!我从来没有在哪道题里见长成这样的方程

BUT,我们可以利用它来解长成这样的方程:
a x + b y = c ax+by=c ax+by=c
让 d = g c d ( a , b ) d=gcd(a,b) d=gcd(a,b)
这时,如果我们把这个方程同时乘上一个 d c \frac{d}{c} cd​

方程就变成了:
a d c ∗ x + b d c ∗ y = g c d ( a , b ) a\frac{d}{c}*x+b\frac{d}{c}*y=gcd(a,b) acd​∗x+bcd​∗y=gcd(a,b)

我们就可以来解一个这样的方程:

a x ′ + b y ′ = g c d ( a , b ) ax'+by'=gcd(a,b) ax′+by′=gcd(a,b)

于是你就会发现,原方程的解就是:
{ x = x ′ ∗ c d y = x ′ ∗ c d \left\{ \begin{aligned} x&=x'*\frac{c}{d}\\ y&=x'*\frac{c}{d} \end{aligned} \right. ⎩⎪⎨⎪⎧​xy​=x′∗dc​=x′∗dc​​

你一定会问了c如果不是d的倍数肿么办?

那就没有整数解呗!这有什么好问的?

应用2:解模线性方程: a x ≡ b ( m o d p ) ax\equiv b(mod\ p) ax≡b(mod p)

其实就是应用1,有没有发现 a x ≡ b ( m o d p ) ax\equiv b(mod\ p) ax≡b(mod p),就是: a x + p y = b ax+py=b ax+py=b,然后再用上面的那个东东解出来就好了
解模线性方程,就可以做很多事情了,比如:求逆元,戳我

参考:
https://www.zybuluo.com/samzhang/note/541890
于HG机房

欧几里得算法和扩展欧几里得算法——杨子曰数学相关推荐

  1. 密码学基础算法(一)基于整数的欧几里得算法和扩展欧几里得算法

    图片来源: 随便谷歌的一个图片 图片地址: https://jason-chen-1992.weebly.com/uploads/1/0/8/5/108557741/euclidean_3_orig. ...

  2. 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)

    一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...

  3. 欧几里得算法和扩展欧几里得算法详解

    欧几里得算法: int gcd(int x,int y){if(y) return gcd(y,x%y);return x; } 扩展欧几里得算法: 先说一个整体思路: 先求Ax+By=gcd(A,B ...

  4. 欧几里得算法和扩展欧几里得算法的简单例子

    欧几里得算法: #include <cstdio> #include <cstdlib>/* * 挑战...p113 */struct point{ //格点int x;int ...

  5. 数学合集——杨子曰数学

    数学合集--杨子曰数学 这两天写了一堆数学的博客,汇总一下: 数论: 欧几里得算法和扩展欧几里得算法 欧拉函数,欧拉定理(费马小定理),扩展欧拉定理的证明和应用 逆元 中国剩余定理 欧拉筛和筛法求欧拉 ...

  6. 错位排列——杨子曰数学

    错位排列--杨子曰数学 超链接:数学合集 首先,什么是错位排列? 就是你有1号物品,2号物品,3号物品--,它们都有自己对应的箱子:1号箱,2号箱,3号箱-- 现在你把物品放到箱子里,结果一个物品也没 ...

  7. 威尔逊定理证明——杨子曰数学

    威尔逊定理证明--杨子曰数学 超链接:数学合集 这是一个很没有用的定理(没有任何实际应用价值,(´ー∀ー`)): ( p − 1 ) ! ≡ p − 1 ( m o d p ) ( p 为 质 数 ) ...

  8. 1+2+3+...∞=-1/12?——杨子曰数学

    1+2+3+-∞=-1/12?--杨子曰数学 超链接:数学合集 1+2+3+-∞=-1/12?哦哦哦,第一次看到我惊了щ(ʘ╻ʘ)щ,不科学啊!一堆正整数居然加出了一个负分数,Oh My God,绝对 ...

  9. 海伦公式的证明——杨子曰数学

    海伦公式的证明--杨子曰数学 超链接:数学合集 瞎BB:我之所以会推这样一篇博客是为了练习一下MarkDown数学公式的语法 再瞎BB一句:不要一提到海伦,脑子里就浮现出一个女人的画面,这里的海伦是一 ...

最新文章

  1. 内联函数inline
  2. sql中union 和 union all的区别
  3. 数字数据fzu 2120 数字排列
  4. java 时间l_java中获取系统时间并格式化输出
  5. 机器学习从入门到精通150讲(一)-推荐系统经典模型Wide Deep(附部分代码)
  6. 暗棋单机版_中国暗棋游戏下载-中国暗棋下载v1.0.0 安卓版-单机手游网
  7. 《人月神话》阅读体会(三)
  8. ubuntu之搭建http服务器apache2
  9. php数组排除某个键_PHP根据key删除数组中指定的元素
  10. java复制数组函数_java 数组复制:System.arrayCopy 深入解析
  11. VMware提早放出好消息
  12. 《晚明》小说各战役配图
  13. fedora 11 配置 thinkpad trackpoint 中键
  14. 计算机基础知识竞赛报道,学校举办第十四届计算机基础知识竞赛
  15. 从零学习node爬虫
  16. 正则表达式-验证座机号码
  17. JAVA学习笔记——BLOB类型和数据批量操作
  18. 记一次成功的iPhone维修
  19. HTML5 代码实例
  20. font-face 自定义字体

热门文章

  1. vue项目中的小知识--快捷键-vue插件版本号--vscode插件等
  2. 90%AI企业都亏损?阿里、华为等高管来苏畅谈人工智能
  3. 阿里云Web应用防火墙-WAF
  4. CSDN写文章Markdown个人笔记
  5. DB2数据库安装与配置
  6. 圣人、君子、小人、庸人的划分标准
  7. permutation importance
  8. google hacking常用语法
  9. Hi3516D V300功能介绍
  10. 重学JavaSE 第12章 : 枚举和注解、注解的实战使用