参考图书:《程序设计算法基础》梁冰 第10章初等数论 10.2最大公约数和扩展欧几里得算法

最大公约数(Greatest Common Divisor,GCD)为几个整数的公约数中最大的一个,一般求解最大公约数的算法有列举法、质因数分解法和欧几里得算法等。

其中,效率较高且在算法竞赛中最常用欧几里得算法求最大公约数。

欧几里得算法

欧几里得算法(Euclidean algorithm)又称辗转相除法,用于计算两个正整数a、b的最大公约数。

定理:gcd(a,b) = gcd(b, a mod b)  (b != 0)

写成分段函数的形式:

则欧几里得算法的递归求解方式如下:

//求两个非负整数的最大公约数
int GCD(int a, int b)
{return b ? GCD(b, a % b) : a;
}

非递归形式:

int GCD(int a, int b)
{while(b != 0) {swap(a, b);b %= a;}return a;
}

在求多个整数的最大公约数的情况下,先求出前两个数的最大公约数,在用得到的最大公约数与第三个数进行最大公约数的运算,即可得到前三个数的最大公约数,用此方法不断迭代下去即可得到这些数的最大公约数。

两个整数的最小公倍数(Least Common Multiple,LCM)的计算可以利用最大公约数的结果,证明如下:

程序如下:

//求解两个非负整数的最小公倍数
int LCM(int a, int b)
{return a / gcb(a,b) * b;//为防止a*b超过整数类型范围,先将a的最大公约数约掉
}

扩展欧几里得算法

扩展欧几里得算法(Extended Euclidean algorithm)是用来咋已知a,b的条件下求解一组x,y使得(根据数论中的相关定理,解一定存在),其中a、b、x、y都为整数。将这样的方程称为线性同余方程。

求解代码:

//求解使ax + by = gcd(a,b)成立的x,y的解,返回 a 和 b 的最大公约数
int EX_GCD(int a, int b, int &x, int &y)
{if(b == 0){x=1,y=0;return a;}int g = EX_GCD(b, a % b, y, x);y -= a/b * x;return g;
}

初等数论——欧几里得算法相关推荐

  1. 初等数论--整除--欧几里得算法/辗转相除法/更相减损术

    初等数论--整除--欧几里得算法/辗转相除法/更相减损术 欧几里得算法/辗转相除法/更相减损术 博主本人是初学初等数论(整除+同余+原根),本意是想整理一些较难理解的定理.算法,加深记忆也方便日后查找 ...

  2. 离散数学/初等数论:用“质因子分解法”和“欧几里得算法”求最大公约数gcd;“质因子分解法”和“最简算法”求最小公倍数lcm;以及对“意义”的一些看法。

    需要在开头提前说明,本篇文章仅仅用于在学习初等数论或者离散数学时候对算术基本定理的理解,实际应用的时候把结论告诉大家,想求最大公约数就用欧几里得算法是最简单的,在本篇不再赘述,有机会我会在其他文章中说 ...

  3. 扩展欧几里得算法、乘法逆元与中国剩余定理

    文章目录 前言 定义.定理和部分证明 整除 定义 定理 定理的证明 同余 定义 同余的性质 同余的运算律 运算律的证明 扩展欧几里得算法 代码模板 算法详解 乘法逆元 求解逆元 乘法逆元的作用 中国剩 ...

  4. 用欧几里得算法求最大公约数_欧几里得算法:GCD(最大公约数),用C ++和Java示例解释...

    用欧几里得算法求最大公约数 For this topic you must know about Greatest Common Divisor (GCD) and the MOD operation ...

  5. 扩展欧几里得算法_扩展欧几里得递推算法

    欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...

  6. UVALive6428 A+B【扩展欧几里得算法+GCD】

    Regionals 2013 >> Europe - Southeastern 问题链接:UVALive6428 A+B. 问题分析: 可以看作是解方程ax+by=s的问题. 先用扩展欧几 ...

  7. Java实现算法导论中最大公约数欧几里得算法

    最大公约数的欧几里得算法,代码如下: package cn.ansj;public class GCD {public static void main(String args[]) { GCD g ...

  8. 欧几里得算法扩展欧几里得算法

    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...

  9. 【算法数据结构Java实现】欧几里得算法

    1.背景 欧几里得算法是一个求最大因子的快速算法.如果m,n存在最大因子k,假设m=x*n+r,那么m和n可以整出k的话,r也肯定可以整除k 因为定理:如果M>N,则M mod N<M/2 ...

最新文章

  1. groovy–运算符重载
  2. 完全基于Transformer的目标检测器,ICLR匿名论文实现视觉、检测统一
  3. spring boot--最基础的hello world
  4. 如何构建一个通用的垂直爬虫平台?
  5. viewPager开启界面导航之旅
  6. ASP.NET Core -中间件(Middleware)使用
  7. 论文浅尝 - ACL2022 | 基于多语言语义解耦表示的跨语言迁移方法实现多语言阅读理解...
  8. 服务器系统2008能升级2012吗,将 Windows Server 2008 R2 升级到 Windows Server 2012 R2
  9. MANIFEST.MF
  10. python小星_Python学习【第3篇】:列表魔法
  11. 安卓微信本地数据库解密与删除聊天记录恢复 EnMicroMsg.db FTS5IndexMicroMsg_encrypt.db
  12. excel合并计算机操作,Excel如何快速合并多个单元格的内容?
  13. dlp技术(dlp技术和单片lcd的区别)
  14. nandflash原理及硬件操作
  15. clr(clr a是什么指令)
  16. API和SDK是什么?有什么区别?如何测试SDK?一篇文章统统告诉你!
  17. 【Python入门指北】 Python计算机二级知识点
  18. Closing curly brace does not appear on the same line as the subsequent block - 代码规范性问题
  19. python匿名函数可以赋值给变量_python3的匿名函数 | 吴老二
  20. pycharm快捷键ctrl+alt+L失效

热门文章

  1. 【学习笔记】SpringMVC—@RequestMapping注解
  2. 如何快速产生流量,流量精灵使用方法
  3. 离散数学:Peano(皮亚诺) 算术
  4. 如何下载电脑版音频剪辑软件?
  5. 大家的人工智能——线性回归
  6. C++判断一个日期是某一年的多少天(含闰年判断)
  7. PaddleOCR的表格结构识别演示
  8. iOS直接获取摄像头数据
  9. CF 584A Olesya and Rodion
  10. 584 寻找用户推荐人