算法:欧几里得辗转相除法的原理
目录
- 辗转相除法的原理
- 更相减损术(辗转相减法)
- 算法实现
- 求最小公倍数
辗转相除法的原理
辗转相除法具体是谁提出的也难以考证,但是这个算法最早出现在古希腊数学家欧几里得的著作-----《几何原本》中,所以也都叫做欧几里得算法
辗转相除法:用a除以b(这里是a>b,当然,在程序编程中,求两个数的最大公约数,可以不限a和b的大小,a<b也就是多一次循环)得到结果q和余数r,再用除数b除以余数r 再得到一个余数,再用除数除以余数,…如此循环,直到余数为0,那么此时的除数就是最大公因数
例如:
求(较大数,较小数)的最大公因数
大数➗小数 = ... 余数 r1小数➗r1 = ...余数r2r1➗r2 = ...余数r3... ...直到 X➗Y = ...余数0此时Y就是最大公约数
辗转相除法能够成立基于以下定理:
Theorem1:gcd(m,n)= gcd(n,r)
也就是m(被除数),n(除数)的最大公约数,等于除数n和余数r的最大公约数。
当定理不好证明或者不是那么显而易见的话,就引入一些引理:
Lemma1:若整数i是m,n的公约数,那么i也是n和r的公约数。
Lemma2:若整数i是n,r的公约数,那么i也是m和n的公约数。
这两个引理很好想,看下面的式子
m ÷ n = q......r则 m = nq + r 可得到引理2则 r = m - nq 可得到引理1看到这里,就知道如果一个整数i能被m和n整除,那么这个整数i肯定能被r整除,(这句话也是更相减损术的原理),从而m和n的公约数集合就等于n和r 的公约数集合
但当时我还想到一个问题,就是为什么除下去,最后可以得到余数为0的情况呢,其实有了上述定理,再分析一下就知道:
如此循环下去,因为每次的余数r肯定小于除数n那么相当于每次的被除数(变为上次的除数)变小,除数(变为上次的余数)也变小,而公因数的集合一直不变也就是被除数和除数越来越小,而二者所包含的公共公因数集合又不变,这样下去,除数总有一次会变为最大的公因数。
所以直到越来越小时,
当除数就等于最大公约数的时候,余数就变为0了
更相减损术(辗转相减法)
更相减损术是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它也适用于任何求最大公约数的场合。
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,原文是:
可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,
求其等也。以等数约之。
翻译就是:
(如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用2来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分。
更相减损术在课本中是:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是公约数。求“等数”的办法是“更相减损”法。
而在算法中可以改进,不用进行约分2
也就是
求m,n的最大公因数
先比较m,n的大小
若m=n,则最大公因数就是m或者n
若m>n,则m-n=c,
再比较n和c的大小,再用大的数减去小的数,一直下去,直到结果为0,
也就是被减数和减数相等,则此时被减数或者减数就是最大公因数
若m<n,则n-m=c,
在比较m和c的大小,和上面一样。
原理
原理很简单:m和n的公因数也必定是,n和c或者m和c的公因数,和辗转相除法一样,被减数或者减数会一直减小,当两者相等的时候,此时就是最大公因数
与辗转相除法不同的是,辗转相除法是直到除数变为最大公因数,而更项相减术是被减数和减数都变为最大公因数,所以按道理,辗转相除法的效率更高。
算法实现
辗转相除法:
int gcd(int x, int y) //x,y不论谁大谁小,但是需要是正数
{ int z = y;while(x%y!=0){z = x%y;x = y;y = z; }return z;
}
这里如果x比y小,一边循环下来,x变成了y,y变成了x,所以不用要求x>y
更相减损术
int gcd(int a,int b)
{ while(a != b){if(a>b){a = a - b;}else {b = b - a;}}return a;
}
求最大公因数还有一些算法,但是效率很低
有一种是穷举法,还有一种是通过分解因子来求解,这一种效率更低
穷举法
int gcd(int x,int y)
{int i = 0;if(x>y)i=x;elsei=y;while(i){if(x%i == 0 && y%i==0) break; }return i;
}
求最小公倍数
公式
m * n = 最大公因数 * 最小公倍数
很容易理解,
(m / 最大公因数) * n = 最小公倍数
或者 m * (n / 最大公因数)= 最小公倍数
算法:欧几里得辗转相除法的原理相关推荐
- 欧几里得《几何原本》电子版的内容大纲
为什么说,传统微积分源自欧几里得<几何原本>,而现代微积分源自希尔伯特<几何基础>? 本文附件列出了欧几里得<几何原本>电子版的内容大纲,其中完全没有公理系统相容性 ...
- SYDZ 辗转相除法的原理与实现
辗转相除法又叫欧几里得辗转相除法,最早出现在公元前300年古希腊著名数学家欧几里得的<几何原本>>(第VII卷,命题i和ii)中.而在中国则可以追溯至东汉出现的<九章算术> ...
- 欧几里得最短距离公式_推荐算法原理(二)欧几里得距离计算物品间相似度
在上篇文章中介绍了如何利用余弦定理计算两个物品间的相似度:KiKlaus:推荐算法原理(一)余弦定理计算物品间相似度zhuanlan.zhihu.com 这种计算方法虽然简单,但是在衡量空间两个向量 ...
- 经典算法之辗转相除法(欧几里得定理)
问题描述: 两个数a,b,要求求得这两个数的最大公约数和最小公倍数. 解题思路: 辗转相除法(欧几里得定理)思想:一个数,能整除数a和数b,那么这个数一定可以整除(a-b),即gcd(a, b) = ...
- 快乐地谈谈:关于RSA算法中求私钥d的欧几里得方法(辗转相除法)考试向的欸
关于RSA算法本身,就提及一下,它是属于非对称密码体制. 基本的加密方式就如下图所示: c为加密后的密文,m为加密前的明文 其中一般会给出公开密钥n.e的值,这样根据规则,便可以实现加密过程.而题目往 ...
- 【算法讲2:拓展欧几里得(简略讲)】求解 ax+by=c
拓展欧几里得算法 欧几里得算法简介 拓展欧几里得算法简介 [递归方法:倒序带入法] [递归代码] [递推方法:滚动变量记录法] [递推代码] 应用:如何解 ax+by=c 测试代码 欧几里得算法简介 ...
- 可公度线段与欧几里得(Euclid)算法
通过本文,我们将发现欧几里得算法(求两个数的最大公约数,也称作辗转相除),根本不需要死记硬背,仅仅通过数论中的一个小小的结论(有关可公度线段,commensurable),即可轻易推导出来. 既然算法 ...
- 欧几里得算法求最大公约数python,算法:欧几里得求最大公约数(python版)
#欧几里得求最大公约数 #!/usr/bin/env python #coding -*- utf:8 -*- #iteration def gcd(a,b): if b==0: return a e ...
- 欧几里得原理及扩展欧几里得原理(Euclidean Theory and Extended Euclidean Theory)学习笔记
题记:这是我第四次复习扩展欧几里得原理,因为不常用到,想要使用的时候又想不起细节,总是要查资料,于是索性这次整理一下欧几里得原理及其扩展原理存档至博客以备查用. 一.欧几里得原理 欧几里得原理(Euc ...
最新文章
- 机器学习成为未来趋势 北美未来将保持最大市场规模
- ibtmp1文件过大
- 浅谈Python http库 httplib2
- JSP页面取当前日期 oracle导入导出 branch与tag
- linux下导入mysql表乱码_在linux下导入.sql文件,数据库中文乱码
- 动态规划问题中最长公共子序列---C语言实现
- git lib 创建新的项目在某个路径下_版本控制管理工具git的使用
- 风变Python编程13类的学习2
- R语言与抽样技术学习笔记(Randomize)
- 蓝色理想:建站初期如何低成本运营网站
- web服务器基于那个协议,网页浏览服务基于什么协议 Web服务器是基于什么协议...
- ThinkPHP 手册摘录之(跨模块)调用
- 从python入门到人生巅峰
- 股票短线详解,股票短线的方法技巧?
- html中的开启礼盒的代码,CSS3 蛋糕+生日礼盒打开动效
- VideoStream流媒体(VOD视频点播)系统平台
- 用C++实现一个小小的爬虫
- 小议SEO做网站关键字优化
- Outlook sender items 丢失邮件
- visual code rg.exe或者git for window占用内存越来越大
热门文章
- tplink886n变无线打印服务器,TP-LINK TL-WR886N如何设置无线桥接
- 测试方法——等价类划分基础测试方法
- 软件工程项目-站立会议(4)
- leetcode69x的平方根(JAVA版)
- 3D可视化库Mayavi安装和使用
- 分布式事务框架Seata
- 气密测试内螺纹快速密封接头 格雷希尔快速连接器 G1/8 G1/4 G3/8 G1/2 G3/4内螺纹封堵接头
- 字节、字、bit、byte的关系
- 原创_移动版天邑TY1611_晶晨S905L3-B_RTL8822CS机顶盒免拆卡刷包及线刷机包刷机教程
- Linux开发板显示字体右对齐,一种命令行右侧对齐显示的方法、设备及介质与流程...