欧几里得算法和扩展欧几里得算法——杨子曰数学
欧几里得算法和扩展欧几里得算法——杨子曰数学
超链接:数学合集
不说废话,咱们直接开始
欧几里得算法
一句话:
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机房
欧几里得算法和扩展欧几里得算法——杨子曰数学相关推荐
- 密码学基础算法(一)基于整数的欧几里得算法和扩展欧几里得算法
图片来源: 随便谷歌的一个图片 图片地址: https://jason-chen-1992.weebly.com/uploads/1/0/8/5/108557741/euclidean_3_orig. ...
- 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)
一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...
- 欧几里得算法和扩展欧几里得算法详解
欧几里得算法: int gcd(int x,int y){if(y) return gcd(y,x%y);return x; } 扩展欧几里得算法: 先说一个整体思路: 先求Ax+By=gcd(A,B ...
- 欧几里得算法和扩展欧几里得算法的简单例子
欧几里得算法: #include <cstdio> #include <cstdlib>/* * 挑战...p113 */struct point{ //格点int x;int ...
- 数学合集——杨子曰数学
数学合集--杨子曰数学 这两天写了一堆数学的博客,汇总一下: 数论: 欧几里得算法和扩展欧几里得算法 欧拉函数,欧拉定理(费马小定理),扩展欧拉定理的证明和应用 逆元 中国剩余定理 欧拉筛和筛法求欧拉 ...
- 错位排列——杨子曰数学
错位排列--杨子曰数学 超链接:数学合集 首先,什么是错位排列? 就是你有1号物品,2号物品,3号物品--,它们都有自己对应的箱子:1号箱,2号箱,3号箱-- 现在你把物品放到箱子里,结果一个物品也没 ...
- 威尔逊定理证明——杨子曰数学
威尔逊定理证明--杨子曰数学 超链接:数学合集 这是一个很没有用的定理(没有任何实际应用价值,(´ー∀ー`)): ( p − 1 ) ! ≡ p − 1 ( m o d p ) ( p 为 质 数 ) ...
- 1+2+3+...∞=-1/12?——杨子曰数学
1+2+3+-∞=-1/12?--杨子曰数学 超链接:数学合集 1+2+3+-∞=-1/12?哦哦哦,第一次看到我惊了щ(ʘ╻ʘ)щ,不科学啊!一堆正整数居然加出了一个负分数,Oh My God,绝对 ...
- 海伦公式的证明——杨子曰数学
海伦公式的证明--杨子曰数学 超链接:数学合集 瞎BB:我之所以会推这样一篇博客是为了练习一下MarkDown数学公式的语法 再瞎BB一句:不要一提到海伦,脑子里就浮现出一个女人的画面,这里的海伦是一 ...
最新文章
- 内联函数inline
- sql中union 和 union all的区别
- 数字数据fzu 2120 数字排列
- java 时间l_java中获取系统时间并格式化输出
- 机器学习从入门到精通150讲(一)-推荐系统经典模型Wide Deep(附部分代码)
- 暗棋单机版_中国暗棋游戏下载-中国暗棋下载v1.0.0 安卓版-单机手游网
- 《人月神话》阅读体会(三)
- ubuntu之搭建http服务器apache2
- php数组排除某个键_PHP根据key删除数组中指定的元素
- java复制数组函数_java 数组复制:System.arrayCopy 深入解析
- VMware提早放出好消息
- 《晚明》小说各战役配图
- fedora 11 配置 thinkpad trackpoint 中键
- 计算机基础知识竞赛报道,学校举办第十四届计算机基础知识竞赛
- 从零学习node爬虫
- 正则表达式-验证座机号码
- JAVA学习笔记——BLOB类型和数据批量操作
- 记一次成功的iPhone维修
- HTML5 代码实例
- font-face 自定义字体