Summary: gcd最大公约数算法

欧几里德算法 
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理:

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

证明:a可以表示成a = kb + r,则r = a mod b 
假设d是a,b的一个公约数,则有 
d|a, d|b,而r = a - kb,因此d|r 
因此d是(b,a mod b)的公约数

假设d 是(b,a mod b)的公约数,则 
d | b , d |r ,但是a = kb +r 
因此d也是(a,b)的公约数

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

欧几里德算法就是根据这个原理来做的,其算法用语言描述为:

1 int Gcd(int a, int b)
2 {
3     if(b == 0)
4         return a;
5     return Gcd(b, a % b);
6 }
时间: 2024-10-24 05:53:11

Summary: gcd最大公约数算法的相关文章

二进制最大公约数算法

求最大公约数的Euclid算法需要用到大量的取模运算,这在大多数计算机上是一项复杂的工作,相比之下减法运算.测试数的奇偶性.折半运算的执行速度都要更快些. 二进制最大公约数算法避免了Euclid算法的取余数过程. 二进制最大公约数基于下述事实: 若a.b都是偶数,则gcd(a,b)=2*gcd(a/2,b/2) 若a是奇数.b是偶数,则gcd(a,b)=gcd(a/2,b/2) 若a.b都是奇数,则gcd(a,b)=gcd((a-b)/2,b) 因此可写出二进制最大公约数算法如下(C语言版):

最大公约数算法

看到一个比较精炼的最大公约数算法: public static int gcd(int a, int b){ return b==0 ? a : gcd(b, a % b); }

GCD最大公约数递归定理的证明

定理如下: 对任意非负整数a和任意正整数b, gcd(a,b) = gcd(b,a mod b) 首先证明 gcd(a,b) | gcd(b,a mod b) 设 gcd(a,b) = d a mod b = a - b*k (k = a/b 向下取整的整数) 易得 d | a mod b 和 d | b 得出 d | gcd(b,a mod b) (d 为 最大公约数的一个因数) 接下来证明 gcd(b,a mod b) | gcd(a,b) 设 gcd(b,  a mod b) = d 得

gcd —— 最大公约数

//gcd 最大公约数 #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<cmath> using namespace std; int gcd (int a,int b) { if(b==0) return a; return gcd(b,

菜鸟学算法--简单的交换和最大公约数算法入门篇

工作之后我们大部分的时间实在研究如何如何学习一门语言 如何如何掌握一门技术,但是作为编程的本质 数据结构和算法 我们慢慢的忽略了 . 工作后的很多程序员真的没有大学生一样的时间 去静下心来去增加自己的底蕴,这是我深有体会的事情当然我这里指的是和我有累死感觉的人. 学习是一个过程,从简入繁 一贯如此,记录下来只为 记录自己的点点滴滴. 算法的本质并不是我们程序员去创造算法 而是我们 按照先人创造的算法思想 用代码来实现算法. 下面开始介绍两个 简单的例子 一个是交换 一个是最大公约数算法. 简单的

公约数算法

/* 对于已知的两个自然数m, n,假设m>n 计算m除以n,将得到的余数记做r 如果r=0,则此时的n为求得的最大公约数.否则,将n的值保存在m中,将r的值保存在n中, 重复执行下去. */ //欧几里得->辗转相除法 #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <iostream> #include &l

《转》两种最大公约数算法

1.辗转相除法 辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法.例如,求gcd(319,377):∵ 377÷319=1(余58)∴gcd(377,319)=gcd(319,58):∵ 319÷58=5(余29),∴ gcd(319,58)=gcd(58,29):∵ 58÷29=2(余0),∴ gcd(58,29)= 29:∴ gcd(319,377)=29. 2. 更相减损法: 更相减损术,是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需

【170723】一个简洁的求最大公约数算法

1 import java.util.Scanner; 2 3 public class ZuiDaGongYueShuClass { 4 5 public static void main(String[] args) { 6 Scanner in = new Scanner(System.in); 7 int a = in.nextInt(); 8 int b = in.nextInt(); 9 while (b != 0) { 10 int r = a % b; 11 a = b; 12

欧几里得最大公约数算法

最大公约数 想必大家小学就学过什么事最大公约数吧,现在给出一个数学上的定义:定义$g$是整数$a$和$b$的最大公约数,当且仅当$g$是同时整除$a$和$b$的数中最大的那个. 欧几里得算法 欧几里得算法可以写成如下简单的形式: $$gcd(a,b) =\begin{cases} a, & \mbox{if }b=0 \\gcd(b,a\ mod\ b), & \mbox{if }b\ne0\end{cases}$$ 算法的证明 算法的过程可以写成如下的形式: $$a=q_0b+r_0$$