欧几里得算法的递归写法

在看《数论》是看到欧几里得算法可以这样写,脑洞大开。

1 int Gcd(int a,int b)
2 {
3    if(b==0)
4     return a;//出口
5    return Gcd(b,a%b);
6
7 }
时间: 2024-11-09 05:03:50

欧几里得算法的递归写法的相关文章

c语言求两个数的最大公因数(穷举法,欧几里得算法,递归)

/*主函数Gcd为求公因数的函数输入为负时返回-1*/ int main(){   int a, b;  printf("Input a,b:");  scanf("%d,%d",&a,&b);  if (a < 0 || b < 0)   printf("Input number should be positive!\n");  else  printf("Greatest Common Divisor

数论初步-欧几里得算法

1 int judge(int* X) { 2 X[2] /= gcd(X[2], X[1]); 3 for(int i = 3; i <= k; i++) X[2] /= gcd(X[i], X[2]); 4 return X[2] == 1; 5 } 这个算法称为欧几里得算法.不会溢出,因为gcd函数的递归层数不超过4.785lgN + 1.6723,其中N=max{a,b}. 让gcd递归层数最多的是gcd(Fn,Fn-1).利用gcd还可以求出两个整数a和b的最小公倍数lcm(a,b).

欧几里得算法与扩展欧几里得算法_C++

先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证明,对后续知识有用) 欧几里得算法,也叫辗转相除,简称 gcd,用于计算两个整数的最大公约数 定义 gcd(a,b) 为整数 a 与 b 的最大公约数 引理:gcd(a,b)=gcd(b,a%b) 证明: 设 r=a%b , c=gcd(a,b) 则 a=xc , b=yc , 其中x , y互质

数论及其应用——欧几里得算法

欧几里得是数论当中最基本的定理,以其为基础的拓展欧几里得算法在解决同余方程.求模逆元等问题. 首先来介绍几个概念,数论当中一些基本的概念其实在小学就学过,但是很长一段时间并没有用到它们,因此这里再拿出来温习一下. 我们常常用a|b来表示b能够整除a(b > a),即b/a是整数,但是“|”在使用的过程中容易和绝对值.几何定义符.条件概率混淆,所以,这里我们用a\b来表示a能够整除b. 约数:如果b\a,则称b是a的约数. 倍数:如果b\a,则称a是b的倍数. 最大公约数:gcd(a,b) = m

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

欧几里得算法又叫辗转相除法,是求解最大公约数的一种古老的方法. 废话不多说,直接开证: 题目:求解正整数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的最

欧几里得算法 - 计算两个正整数的最大公约数

欧几里得算法-计算两个正整数a,b的最大公约数 #定理:gcd(a,b) = gcd(b, a mod b) 终止条件:余数等于0 返回结果:余数等于0时的除数b # -*- coding: utf-8 -*- __author__ = 'nob' #迭代欧几里得 def iterative_gcd(a, b):     r = a % b     while(r):         a = b         b = r         r = a % b     return b     #

扩展欧几里得算法(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 互质. 此时正整数对解

算法学习 - 欧几里得算法(辗转相除法)(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

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