欧几里得算法(辗转相除法)

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。

基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%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)的公约数是一样的,其最大公约数也必然相等,得证

第二种证明:

要证欧几里德算法成立,即证: gcd(a,b)=gcd(b,r),其中 gcd是取最大公约数的意思,r=a mod b
    下面证 gcd(a,b)=gcd(b,r)
    设  c是a,b的最大公约数,即c=gcd(a,b),则有 a=mc,b=nc,其中m,n为正整数,且m,n互为质数
    由 r= a mod b可知,r= a- qb 其中,q是正整数,
    则 r=a-qb=mc-qnc=(m-qn)c
    b=nc,r=(m-qn)c,且n,(m-qn)互质(假设n,m-qn不互质,则n=xd, m-qn=yd 其中x,y,d都是正整数,且d>1
                                                                则a=mc=(qx+y)dc, b=xdc,这时a,b 的最大公约数变成dc,与前提矛盾,
                                                                 所以n ,m-qn一定互质)
    则gcd(b,r)=c=gcd(a,b)
    得证。

算法的实现:

最简单的方法就是应用递归算法,代码如下:

1 int gcd(int a,int b)
2 {
3     if(b==0)
4         return a;
5     return
6         gcd(b,a%b);
7 }

代码可优化如下:

1 int gcd(int a,int b)
2 {
3     return b ? gcd(b,a%b) : a;
4 }

当然你也可以用迭代形式:

 1 int Gcd(int a, int b)
 2 {
 3     while(b != 0)
 4     {
 5       int r = b;
 6       b = a % b;
 7       a = r;
 8     }
 9     return a;
10 }
时间: 2024-10-11 06:13:55

欧几里得算法(辗转相除法)的相关文章

算法学习 - 欧几里得算法(辗转相除法)(c++实现)

欧几里得算法 欧几里得算法也叫辗转相除法,是求两个整数最大公约数的算法. 当然也可以求最小公倍数. 算法实现 其实算法的实现原理就是,有整数a b两个,每次求的一个数字r = a % b,然后把b放到a的位置,把r放到b的位置,递归调用. 就是gcd(a, b) { return gcd(b, a%b); }这个样子的. 结束条件是当 a%b == 0的时候停止. 最大公约数 // // main.cpp // Euclidean // // Created by Alps on 15/3/28

欧几里得算法--辗转相除法

今天在做一个很简单的算法题目,“求最大公约数和最小公倍数”.一看,太tm容易. 思考过程是这样的: 1.最大公约数,有两个个极端,一个是最大公约数是1,一个最大公约数是两个数之间较小的那个数. 2.我就理所当然地认为,so easy.不就一个for循环吗?从较小的那个数到1的这一段范围就,如果其中一个数能被较大的数整除不就ok罗,然后返回到那个数,不就得到最大公约数啦. 3.然后兴致冲冲地写下下列的代码 public static void commonDivisor(int n,int m)

欧几里得算法(辗转相除法)计算最大公约数

算法定义: 两个整数x和y且x>y的最大公因子等同于y与x mod y的最大公因子. 整数t整除x和y当且仅当t整除y和x mod y,因为x等同于x mod y 加上y的一个整数倍. 另:假设最后求解到的两个数的最大公约数是1,则认为两个数互素. 1 /*递归算法*/ 2 int gcd_rec(int m, int n) 3 { 4 if (n == 0) 5 return m; 6 return gcd_rec(n, m % n); 7 } 8 9 10 /*迭代算法*/ 11 int g

欧几里得算法

欧几里得算法 定义:欧几里得算法又叫做辗转相除法,用于计算两个整数的最大公约数. 首先,两个整数的最大公约数等于其中较小的那个数和两数的相除余数的最大公约数,证明如下: 假设两个整数a.b,其中a = kb + r,d为a.b任意公约数. 证明:因为d为a.b的公约数,所以a.b都可以被d整除,由a = kb + r可得,r = a - kb,则r/d = a/d - kb/d,因此r也可以被d整除.综上所述(a,b)的公约数和(b,r)相同.故最大公约数也是相同的. public static

证明欧几里得算法的正确性

欧几里得算法又叫辗转相除法,是求解最大公约数的一种古老的方法. 废话不多说,直接开证: 题目:求解正整数a,b(a >= b)的最大公约数. a总可以用b来表示:a = qb + p; 这个式子怎么理解呢? 我们可以这样理解:a是被除数,b是除数,q是商,p是余数(p = a % b). 设 r 为a,b的最大公约数. 则a,b能被r整除(废话- _ -). 下面重点来了:   上式成立. 又因为q*b/r为整除,a也为整数 所以p/r也为整数,即 p 能被 r 整除 此时 r 也是b, p的最

扩展欧几里得算法(extgcd)

相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义就是对欧几里得算法的扩展. 切入正题: 首先我们来看一个问题: 求整数x, y使得ax + by = 1, 如果gcd(a, b) != 1, 我们很容易发现原方程是无解的.则方程ax + by = 1有正整数对解(x, y)的必要条件是gcd(a, b) = 1,即a, b 互质. 此时正整数对解

ACM-欧几里得与拓展欧几里得算法

欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). 递归版算法: 1 int gcd(int a,int b) 2 { 3 if(b==0) 4 return a; 5 return 6 gcd(b,a%b); 7 } 递归优化版: 1 int gcd(int a,int b) 2 { 3 return b ? gcd(b,a%b) : a; 4

欧几里得算法以及扩展欧几里得算法(过河noip2005提高组第二题)

欧几里得算法:也被称作辗转相除法 gcd(a,b)=gcd(b,a%b); 终止条件a=gcd b=0; (gcd为a,b的最大公约数) 扩展欧几里得算法: a 和 b 的最大公约数是 gcd ,一定能够找到这样的 x 和 y ,使得: a*x + b*y = gcd 成立 我们只需要找到特殊解x0,y0; 则通解为 x = x0 + (b/gcd)*t    y = y0 – (a/gcd)*t 那如何求出下一组解呢 仿照欧几里得算法a=b,b=a%b代入. a%b = a - (a/b)*b

最小公约数(欧几里得算法&&stein算法)

求最小公约数,最容易想到的是欧几里得算法,这个算法也是比较容易理解的,效率也是很不错的.也叫做辗转相除法. 对任意两个数a,b(a>b),d=gcd(a,b),如果b不为零,那么gcd(a,b)=gcd(b,a%b) 证明: 令 r=a%b,即存在k,使得 a=b*k+r,那么r=a-b*k:显然r>=0,  r%d=((a%d)-(b*k)%d)%d,因为a%d=b%d=0,所以r%d=0: 因此求gcd(a,b)可以转移到求gcd(b,a%b),那么这就是个递归过程了,那什么时候递归结束呢

扩展欧几里得算法详解

一:欧几里得算法(辗转相除法) 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%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