最大公约数与欧几里得(Euclid)算法

---恢复内容开始---

记a, b的最大公约数为gcd(a, b)。显然, gcd(a,b)=gcd(|a|,|b|).

计算最大公约数的Euclid算法基于下面定理:

  【GCD递归定理】对于任意非负整数a和任意正整数b,gcd(a,b)=gcd(b,a%b)。

=============================================================

  gcd(a,b)=gcd(b, a+kb) a,b,k为任意整数

  即gcd(a,b)=gcd(b, a mod b) a≥0,b>0

  Example:gcd(55,22)=gcd(22, 55mod22)=gcd(22,11)=11

  证明:假定d=gcd(a,b),那么有d|a和d|b.对任何正整数b,a可表示为如下形式: a=kb+r ≡r mod b, a mod b =r , 因此,有(a mod b)= a-kb,k为某个整数。但由于d|b,b也能整除kb, 而d|a,故有d|(a mod b), 这表明d 也是b 和(amod b) 的公因子。由于这是可逆的,如果d 是b 和(a mod b) 的公因子,那么d|kb,且d|[kb+(a mod b)],这等同于d|a。这样a和b的公因子集合等同于b 和(a mod b) 的公因子集合。

==============================================================

Euclid算法最简单的递归版本如下:

1 int Euclid(int a,int b)
2 {
3     b == 0 ? return a : Enclid(b, a%b);
4 }

迭代版本:

---恢复内容结束---

时间: 2024-10-26 15:41:12

最大公约数与欧几里得(Euclid)算法的相关文章

实验一 算法问题求解基础--欧几里得递归算法和递归算法

1.欧几里得递归算法 2.欧几里得迭代算法 3.连续整数检测算法 4.递归算法 实验一算法问题求解基础 实验名称:算法问题求解基础 实验章节:算法设计与分析第一章内容 实验内容 第一部分 欧几里得算法求最大公约数 问题: 1. 计算:34931与 75236 的最大公约数: 1 #include<iostream.h> 2 3 //1.欧几里得递归算法 4 void Swap(int&a,int&b) 5 { 6 int c=a;a=b;b=c; 7 } 8 9 int RGc

扩展欧几里得总结

昨天做了一道题,发现我对扩展欧几里得理解的还不够透彻. 下面来说说扩展欧几里得. Ax+By+C=0:那么我们求解这个方程,我们可以将C移到方程右边那Ax+By=-C; 然后我们先分析下A,B的符号,那么如果A=0,那么By=-C;直接求解,如果B能够整除C的话,那么Y=-C/B;那么x可以取任意整数值,同理当B=0时,那么当A=B=0时,C=0,那么x,y取任意的值,当C不为0则无解. 下面来说下扩展欧几里得 的算法原理: 我们求解 ax+by=gcd(a,b);这里我们假定a>0&&am

总结——数论:欧几里得算法&amp;扩展欧几里得证明

一 欧几里得辗转相除法算法 设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),又因 r = a mod b,所以 gcd(a,b)=gcd(b,a mod b). 证明:①证明充分性. 设 d 为 a,b 的公约数,记作 d|a , d|b ,即a和b都可以被d整除 又因 r=a-kb , 两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数, d|r , 即 d 是 (b,a mod b)的公约数, ②证明必要性 设 d 为 b, a mod b

2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间为400个单位时间,跳转

[ACM] POJ 2677 Tour (动态规划,双调欧几里得旅行商问题)

Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3585   Accepted: 1597 Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must

欧几里得 &amp; 拓展欧几里得算法 讲解 (Euclid &amp; Extend- Euclid Algorithm)

欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法,用于计算两个正整数a,b的最大公约数.                                                                                                                                               --百度百科 代码: 递推的代

欧几里得 &amp;amp; 拓展欧几里得算法 解说 (Euclid &amp;amp; Extend- Euclid Algorithm)

欧几里得& 拓展欧几里得(Euclid & Extend-Euclid) 欧几里得算法(Euclid) 背景: 欧几里德算法又称辗转相除法.用于计算两个正整数a.b的最大公约数. --百度百科 代码: 递推的代码是相当的简洁: int gcd(int a,int b) { return b == 0 ? a : gcd(b, a % b); } 分析: 方法说了是辗转相除法,自然没有什么好介绍的了. . Fresh肯定会认为这样递归下去会不会爆栈?实际上在这里是不会爆栈的,由于递归的层数是

欧几里得求最大公约数--JAVA递归实现

欧几里得算法求最大公约数算法思想: 求p和q的最大公约数,如果q=0,最大公约数就是p:否则,p除以q余数为r,p和q的最大公约数即q和r的最大公约数. java实现代码: 1 public class Demo0 { 2 public static void main(String[] args) { 3 4 System.out.println(gcd(24,120)); 5 } 6 7 8 public static int gcd(int p,int q){ 9 10 if(q==0)

【扩展欧几里得】BZOJ1477-青蛙的约会

一直在WA,后来我发现我把东西看反了-- [题目大意] 给出一个长度为L的环状坐标轴,两个点开始时位于(X,0).(Y,0).每次两点分别往右边移动m和n,问能否相遇? [思路] 由题意,可得: X+mt=Y+nt(mod L) (X+mt)-(Y+nt)=L*k (n-m)t+L*k=X-Y. 可以用扩展欧几里得来做.具体来说,显然要满足n-m和L的最大公约数(记为d)要整除X-Y,否则无解.这个可以在扩展欧几里得中求出. 式子可以化简为:[(n-m)/d]*t+(L/d)*k=(X-Y)/d