关于欧几里德算法(gcd)的证明
求a,b的最大公约数我们经常用欧几里得算法解决,也称辗转相除法,
代码很简短,
int gcd(int a,int b){
return (b==0)?a:gcd(b,a%b);
}
但其中的道理却很深刻,完全理解不简单,以前都只是记一下代码,今天研究了很久,才差不多理解了其中的原因
从代码可以看出,gcd(a,b)=gcd(b,a%b),关键就在于证明这个等式
证明如下,
设c=gcd(a,b),则a=kc,b=nc(n,c为正整数),
设r=a%b,可得r=a-mb(m为a/b向下取整),
将a,b代入,得r=kc-mnc=(k-mn)c,
可证(k-mn)与n互质,过程如下
反证法,若(k-mn)与n不互质,则存在正整数d(d>1)使得k-mn=xd,n=yd,
则k=mn+xd=myd+xd=(my+x)d,
那么a=kc=(my+x)dc,b=nc=ydc,在这里gcd(a,b)变成了dc,而d>1则dc<>c,不成立
所以k-mn与n互为质数
接下来令t=k-mn,那么r=tc,可以发现b=nc且n与t互质,那么gcd(b,r)会等于c
从而得出gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)的结论
Hint
那么为什么不能是gcd(a,b)=gcd(a,r)呢?这个问题其实不难,因为a=kc,无法证明k与k-mn互质
按照上面的步骤,k-mn=xd,k=yd(d>1),只能得出k=mn+xd=yd,这个式子并没有什么卵用
可以自己举几个例子试试,
例如gcd(99,15),99%15=9,9与15互质,可化为gcd(15,9),最终答案为3
而如果用gcd(a,r),转为gcd(99,9),最终答案为9,这就是是因为9=3*3,99=3*33,而3与33不互质
End
蒟蒻的推理到此结束,如有不对的地方还望提出
关于欧几里德算法(gcd)的证明的更多相关文章
- 欧几里德算法gcd及其拓展终极解释
这个困扰了自己好久,终于找到了解释,还有自己改动了一点点,耐心看完一定能加深理解 扩展欧几里德算法-求解不定方程,线性同余方程. 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n ...
- 欧几里德算法 GCD
递归: int gcd(int a,int b) { ?a:gcd(b,a%b); } 非递归: int gcd(int m,int n) { int r; ) { m=n; n=r; } retur ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- 欧几里德算法及其扩展(推导&&模板)
有关欧几里德算法整理: 1.一些相关概念: <1>.整除性与约数: ①一个整数可以被另外一个整数整除即为d|a(表示d整除a,通俗的说是a可以被d整除),其含义也可以说成,存在某个整数k, ...
- ACM_扩展欧几里德算法
<pre name="code" class="cpp">/* 扩展欧几里德算法 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表 ...
- ACM数论之旅4---扩展欧几里德算法(欧几里德(・∀・)?是谁?)
为什么老是碰上 扩展欧几里德算法 ( •̀∀•́ )最讨厌数论了 看来是时候学一学了 度娘百科说: 首先, ax+by = gcd(a, b) 这个公式肯定有解 (( •̀∀•́ )她说根据数论中的相 ...
- [Python3 练习] 008 欧几里德算法
题目:写个"欧几里德算法"的小程序 (1) 描述 我知识浅薄,一开始被"欧几里德"的大名唬住了,去搜了一下才知道这就是高中时学过的"辗转相除法&quo ...
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...
- POJ 1061青蛙的约会(拓展欧几里德算法)
题目链接: 传送门 青蛙的约会 Time Limit: 1000MS Memory Limit: 65536K Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见 ...
- poj2142-The Balance(扩展欧几里德算法)
一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...
随机推荐
- 最简实例演示asp.net5中用户认证和授权(3)
上接: 最简实例演示asp.net5中用户认证和授权(2) 在实现了角色的各种管理接口后,下一步就是实现对用户的管理,对用户管理的接口相对多一些,必须要实现的有如下三个: 1 public inter ...
- jquery调用asp.net 页面后台的实现代码
先创建一个aspx页面编写一个客户端控件<input type="button" id="AjaxDemo" value="AjaxDemo&q ...
- asp.net弹出窗口并返回值
a.html <form name="form1" method="post" action=""> <a href=&q ...
- ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十天(非原创)
文章大纲 一.课程介绍二.单点登录系统分析三.单点登录系统代码实战四.项目源码与资料下载五.参考文章 一.课程介绍 一共14天课程(1)第一天:电商行业的背景.淘淘商城的介绍.搭建项目工程.Svn ...
- 设置mapcontrol的鼠标样式
http://blog.itpub.net/14999074/viewspace-586515/ mapcontrol的鼠标样式 this.axMapControl1.MousePointer=esr ...
- 构建第一个Spring Boot2.0应用之项目创建(一)
1.开发环境 IDE: JAVA环境: Tomcat: 2.使用Idea生成spring boot项目 以下是使用Idea生成基本的spring boot的步骤. (1)创建工程第一步 (2)创建工 ...
- MeshLab中插件的添加过程
MeshLab中主要插件类型有 filter plugins, i/o plugins, edit plugins,这些插件实现了MeshLab的大部分功能.新加入的插件命名规则最好也遵循规范,可命名 ...
- mustache.js 数组循环的索引
在使用mustache作为模板引擎时,想要利用数组中的对象的索引排序,却发现mustache中无法获得数组索引,在一番搜索之后,发现在数组的对象中加入索引,就可以了,示例如下 /html {{#dat ...
- windows 7 X64 提示“com surrogate 已停止工作”的解决方案
C:\Windows\SysWOW64\dllhost.exe 把以上文件添加至“数据执行保护”.
- 微软高性能缓存AppFabric(二)使用
原文链接:http://www.cnblogs.com/Qbit/p/6102614.html 从AppFabric 的安装目录中选择两个dll添加到项目中, 默认安装位置:C:\Program Fi ...