通过本文,我们将发现欧几里得算法(求两个数的最大公约数,也称作辗转相除),根本不需要死记硬背,仅仅通过数论中的一个小小的结论(有关可公度线段,commensurable),即可轻易推导出来。

既然算法来自欧几里得两千年前的几何原本一书,我们也回归代数与几何在书中含义上的统一,继续沿用书中的说法。假如我们要求线段 aa 和线段 bb 的最大公度单位(也即最大公约数),不妨设 aa 比 bb 更长。

  • 如果 bb 正好能度量 aa(bb 能度量 aa 的含义是 aa 是 bb 的整数倍),bb 自然也能度量它自身,因此 bb 就是 aa 和 bb 的一个公度单位;

  • 如果 bb 不能被 aa 整除,这说明 aa 的长度等于 bb 的某个整数倍,再加上一个零头(余数),不妨把该零头记为 cc,也即此时 a=k⋅b+ca = k\cdot b+c。如果此时某条线段能同时度量 bb 和 cc,那么它显然也能度量 aa。也即,此时为了找到 aa 和 bb 的共度单位,我们只需寻找 bb 和 cc 的公度单位即可。此时便构成了递归

def euclid(a, b):if a < b:a, b = b, areturn b if a % b == 0 else euclid(b, a%b)

证明

我们不妨把 Euclid 算法对 aa 和 bb 进行这番折腾后得到的结果记做 xx。xx 是 aa 和 bb 的公度单位。不过,它一定是最大的公度单位吗?证明 xx 为最大公度单位,也即证明 aa 和 bb 的任意一个公度单位,记为yy,一定能够度量 xx,从而不会超过 xx。

yy 能同时度量 aa 和 bb(a=k1⋅b+ca=k_1\cdot b+c),它能度量 bb 就意味着它能同时度量 bb 的任意正数倍(k1⋅bk_1\cdot b),要想让它也能同时度量 aa 的话,只需而且必须让它能够度量 cc。于是 yy 也能同时度量 bb 和 cc,又 b=k2⋅c+db=k_2\cdot c+d,根据同样的道理,又可推出 yy 一定能度量 dd,…., 最后发现,yy 一定能度量 xx。

效率

欧几里得算法(辗转相除法)的效率其实非常高。实际上,我们可大致估计出辗转相除的效率。第一次做除法时,我们 amodb=ca\mod b=c,

  • 如果 bb 的值不超过 aa 的一半,那么 cc 更不会超过 aa 的一半(因为余数小于除数)。

  • 如果 bb 的值超过了 aa 的一半,那么 cc 直接就等于 a−ba-b(a=k⋅b+ca=k\cdot b+c,此时 kk 只能为1),同样小于 aa 的一半;

也即辗转相除法的运算次数是对数级别的;

可公度线段与欧几里得(Euclid)算法相关推荐

  1. C语言求最大公约数欧几里得Euclid算法(附完整源码)

    最大公约数欧几里得Euclid算法 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) 最大公约数欧几里得Euclid算法完整源码(定义,实现,main函数测试) #inclu ...

  2. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)

    基于最大公约数欧几里得扩展算法求解算法导论中模线性方程解.具体要结合算法导论中的有关数论算法章节理解,具体代码如下: package cn.ansj;/*假设方程ax=b(mod n)有解,且x0是方 ...

  3. 扩展欧几里得exgcd算法 acm寒假集训日记22/1/12

    数学证明 ax + by = gcd(a,b) 令gcd(a,b) = d 得:ax + by = d ① 因为:gcd(a,b) = gcd(b,a%b) 所以:bx + a%b * y = d b ...

  4. 欧几里得及欧几里得扩展算法

    (1)欧几里得算法 defination:if x and y are positive and x >= y,then gcd(x,y) = gcd(x mod y,y). 又叫辗转相除法,用 ...

  5. 欧几里得扩展算法(动态规划实现)

    欧几里得算法 设u0u_0u0​,u1u_1u1​是给定的两个整数,u1≠0u_1\neq 0u1​​=0,反复使用带余数除法: u0=q0u1+u2,0<u2<∣u1∣,u1=q1u2 ...

  6. 欧几里得扩展欧几里得算法及相关的数学证明

    //欧几里得算法求最大公约数 int gcd(int m,int n) {int u0=m,u1=n,t;if( u0<u1 )// 保证u0>=u1u0^=u1,u1^=u0,u0^=u ...

  7. 欧几里得 扩展欧几里得

    欧几里得  &  扩展欧几里得 时间复杂度T(n):O(log2n); 空间复杂度S(n):O(n); Advantages: 1.    时间复杂度不高,和普通欧几里得一样: 2.    代 ...

  8. 关于扩展欧几里得求最小正整数解

    关于扩展欧几里得求最小正整数解 //扩展欧几里得算法求最小正整数解 这里讲的是欧几里得,不是那个洗澡测浮力的阿基米德 . 什么是欧几里得算法: 扩展欧几里得算法是用来求解一类特定的不定方程的,形如ax ...

  9. 【数论初步学习】扩展欧几里得定理

    本章节不以理解算法为目的,更注重于使用. 首先需要了解扩展欧几里得的算法 ---找出一对(x,y),使得其能满足ax+by=gcd(a,b)这一式子. 下面给出实现此算法的代码 void gcd(in ...

最新文章

  1. js获取过滤条件中参数的快捷方式
  2. python rtf转txt_将DOC、RTF格式文件批量转为TXT格式文件
  3. 使用C与C++混合编程封装UDP协议
  4. 用HTML,CSS和JavaScript创建iPhone/iPad应用程序
  5. 构造方法与构造代码块的区别
  6. spring boot 2使用Mybatis多表关联查询
  7. c语言皮尔森系数程序,皮尔森相关系数(Pearson correlation coefficient)-Go语言中文社区...
  8. 没有执行力,一切都是0,优秀都会沦为平庸
  9. 2021-10-26 Ubantu练习打字的小游戏
  10. 拍牌(沪牌)软件编写ideal(C#)------序
  11. 【Linux】Linux中755权限是什么意思
  12. Linux交换分区 swap分区
  13. 【Win10 UWP】微信SDK基本使用方法和基本原理
  14. ORA-01400错误
  15. matlab 文件输出到text文件总结
  16. macbookair苹果MAC笔记电脑本更换电池教程
  17. ESB企业服务总线到底是什么东西呢?
  18. shell脚本的俄罗斯方块 : )
  19. GCTA学习7 | 计算单性状遗传力和标准误
  20. 苹果笔记本MacBook Pro2019通病维修

热门文章

  1. 不同角色给rules重新赋值校验规则
  2. localhost 拒绝了我们的连接请求。_Zipkin请求链路日志聚合
  3. 编写程序,生成一个包含20个随机整数的列表,然后对其中偶数下标的元素进行降序排列,基数下标的元素不变
  4. 剑指offer面试题58 - I. 翻转单词顺序(双指针)
  5. Pytorch——回归问题
  6. Pascal VOC 数据集国内下载
  7. prim算法 + 最小生成树的打印 C语言
  8. POJ 2975 Nim(博弈论)
  9. 了解HTML CSS格式化排版 文字排版
  10. 第八届河南省赛D.引水工程(kruthcra+prime)