关于欧几里德算法(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,砝码有左右位置 ...
随机推荐
- Docker | 第七章:Docker Compose服务编排介绍及使用
前言 前面章节,我们学习了如何构建自己的镜像文件,如何保存自己的镜像文件.大多都是一个镜像启动.当一个系统需要多个子系统进行配合时,若每个子系统也就是镜像需要一个个手动启动和停止的话,那估计实施人员也 ...
- 开发环境中快速部署Oracle Essbase(Rapid deployment of oracle essbase in development envrioments)
版本:Oracle Enterprise Performance Management System Release11.1.2.4 快速部署自动安装组件: Essbase Oracle Essbas ...
- 构建第一个Spring Boot2.0应用之集成mybatis、Druid(七)
一.环境: IDE:IntelliJ IDEA 2017.1.1 JDK:1.8.0_161 Maven:3.3.9 springboot:2.0.2.RELEASE 二.说明: 本文综合之 ...
- Android 使用greenDAO 3.2.2 操作外部数据库
项目开发中有时需要用到一些写死的数据,如公司的产品信息之类的.这就需要我们先把数据库文件保存在资源文件夹下,然后当应用创建时将数据库文件拷到应用安装目录的/databases/文件夹下,然后再对数据进 ...
- 使用kvm制作Eucalyptus镜像(CentOS 6.5为例)
1.前言 Elastic Utility Computing Architecture for Linking Your Programs To Useful Systems (Eucalyptus) ...
- Unity光晕剑效果的Shader简单实现
最近遇到了一个需求,想要一种在刀剑上带有光晕的酷炫效果,甚至是还想要有闪烁呼吸效果,于是就写了一个简单的叫LightSwrod的Shader去实现,先上图看看效果吧. 简单展示 这是剑本身的样子 这是 ...
- 如何在Ubuntu server中修改IP
详细请移步至博客https://blog.csdn.net/shenzhen_zsw/article/details/74025066 方法一. sudo ifconfig eth0 100.100 ...
- Spark的调度
作业调度简介 设计者将资源进行不同粒度的抽象建模,然后将资源统一放入调度器,通过一定的算法进行调度,最终要达到高吞吐或者低访问延时的目的. Spark在各种运行模式中各个角色实现的功能基本一致,只不过 ...
- CUDA高性能编程中文实战11章例子中多设备的例子编译提示问题
提示的问题如下: error : argument of type "void *(*)(void *)" is incompatible with parameter of ty ...
- 委托、事件与Observer设计模式
范例说明 上面的例子已不足以再进行下面的讲解了,我们来看一个新的范例,因为之前已经介绍了很多的内容,所以本节的进度会稍微快一些: 假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1. ...