`
gushengchang
  • 浏览: 29162 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

欧几里德(最大公约数)

 
阅读更多
也就是常说的辗转相除法。

最早我们理解的都是通过减法实现的,如下面递归方式:
long gcd (long m, long n)
{
  if (m==n) return n;
  else if(m<n) return gcd(m, n-m);
  else return gcd(m-n, n);
}



其实,取模效率要高很多。如下面公式所示:

gcd(a, b) = gcd (b, a%b)


long gcd ( long a, long b)
{
  if (b==0) return a;
  return gcd(b, a%b);
}



非递归方式实现也很简单:

long gcd (long a, long b)
{
  while (b>0)
  {
    long r = a%b;
    a = b;
    b = r;
  }  
}



实现起来虽然比较简单,原理却不是一下就能想通。
因此推导一下,如果a>b>0, 且r=a%b。

a = b*k + r
若d为a和b的一个约数,则d也是r的一个约数
即:
a = d*k1
b = d*k2
r = a - b*k = d*k1 - d*k*k2 = d*(k1 - k*k2)
d|b, d|a <-> d|r

然后就有:
(d|a)∧(d|b) <-> (d|b)∧(d|r), ∧表示同时成立。

找到第一个d就是最大公约数了,当k=1的时候就是减法的特例了。

复杂度方面有个推论:O(lg(n)), n=max(a, b)




分享到:
评论

相关推荐

    欧几里德算法求最大公约数——C++代码

    欧几里得算法,也称为辗转相除法,是计算两个正整数最大公约数(Greatest Common Divisor, GCD)的一种经典方法。该算法基于以下原理:两个正整数a和b(a&gt;b)的最大公约数等于a除以b的余数c和b之间的最大公约数。...

    欧几里德算法求解多个数的最大公约数

    了解了欧几里得算法和如何处理多个数的最大公约数后,你可以在实际项目中应用这些知识,比如在数据分析、密码学或任何需要处理整数因数分解的领域。欧几里得算法因其效率和简单性,成为了计算最大公约数的标准方法。

    java最大公约数

    java最大公约数是指两个或多个数的最大公因数,例如,12和15的最大公约数是3,因为3是它们的最大公因数。java中可以使用欧几里德算法来计算最大公约数,该算法的思路是:较大的数除以较小的数,然后将较小的数作为下...

    求两个不全为0的非负整数m和n的最大公约数 java

    欧几里德算法是一种古老而高效的计算两个正整数最大公约数的方法。其基本原理是基于以下事实:两个整数`a`和`b`(假设`a &gt; b`),它们的最大公约数等于`b`和`a mod b`(即`a`除以`b`的余数)的最大公约数。这个过程...

    欧几里德辗转相除法求最大公约数的C++实现

    欧几里德辗转相除法求最大公约数的C++实现 嗯,很经典、很简单的一个算法,是很多算法书的开篇第一个算法

    求最大公约数(欧几里德)

    在计算机科学领域,特别是编程和算法设计中,求解两个正整数的最大公约数(Greatest Common Divisor,简称GCD)是一个基础且重要的问题。欧几里得算法,也称为欧几里得辗转相除法,是解决这个问题的经典方法。这个...

    gcd(a,b),求两个数最大公约数

    gcd(a,b),求两个数最大公约数 在计算机科学和数学中,求两个数的最大公约数(Greatest Common Divisor,GCD)是一个基本的问题。最大公约数是指两个或多个整数共有约数中最大的一个。欧几里德算法和辗转相除法是两...

    C语言求最大公约数和最小公倍数算法总结

    辗转相除法又名欧几里德法,是一种经典的算法,用于计算两个正整数的最大公约数和最小公倍数。该算法基于以下定理:a=bq+r,gcd(a,b)=gcd(b,r),其中a和b是两个正整数,q是商,r是余数。 辗转相除法的算法步骤为: ...

    vb求最大公约数和最小公倍数

    在VB语言中,求最大公约数可以使用欧几里德算法,该算法的基本思想是:两个数的最大公约数等于它们的余数的最大公约数。具体实现方法如下: ```vb Dim a, b, max As Integer a = TextBox1.Text b = TextBox2.Text If...

    求最大公约数和最小公倍

    1. 欧几里德算法:该算法使用递归的方式计算两个整数的最大公约数。 2. 辗转相除法:该算法使用循环的方式计算两个整数的最大公约数。 计算最小公倍数的方法有多种,常见的方法包括: 1. 使用公式 B=(m*n)/A,...

    最大公约数算法欧几里德和stein

    用c#实现的最大公约数算法欧几里德和stein,递归和非递归的都有了,stein算法在大数方面比欧几里德要好些

    C语言 最大公约数的算法(三种)

    该三个程序由C语言编写,分别以穷举算法、连续整数检测、欧几里德算法三种方法求最大公约数

    求m,n最大公约数

    欧几里德算法,俗称求m,n最大公约数,使用java实现,在网上看其他的都是用其他语言实现的。

    求最大公约数的三种算法

    文档中包含了分别用欧几里德算法, 穷举算法, 递归算法求最大公约数的方法, 并包含了测试函数, 测试数据. 测试数据选择了斐波那契数从1开始的19组相邻的数据. 实验中, 由于运算时间很短, 故对时间进行放大,即:对于每...

    874复习笔记-求最大公约数+最小公倍数.docx

    本文将详细介绍最大公约数和最小公倍数的计算方法,包括辗转相除法(欧几里德法)、穷举法(枚举法)和更相减损法等。 一、辗转相除法(欧几里德法) 辗转相除法是计算最大公约数的经典方法,该方法基于欧几里德...

    最大公约数和最小公倍.docx

    ### 最大公约数和最小公倍数的概念及应用 #### 最大公约数(Greatest Common Divisor, GCD) 最大公约数(GCD),是指两个或多个整数共有约数中最大的一个。对于两个整数 \(a\) 和 \(b\)(\(a &gt; 0, b &gt; 0\)),其...

    最大公因式与广义欧几里得除法

    ### 最大公因数与广义欧几里得除法 #### 一、最大公因数 在数学中,特别是数论领域,最大公因数(Greatest Common Divisor, GCD)是一个非常重要的概念。它指的是对于一组整数而言,能够同时整除这些整数的最大正...

    论文研究-求最大公约数、模乘逆元或一次同余方程一般解的统一递归算法(概要) .pdf

    求最大公约数、模乘逆元或一次同余方程一般解的统一递归算法(概要),苏盛辉,王其文,区别于只能求取模乘逆元和最大公约数而不能直接解一次同余方程的扩展欧几里德算法,作者设计了一个被称为REESSE0的递归算法。...

    java求最大公约数与最小公倍数的方法示例

    Java语言中,可以使用欧几里德算法来计算最大公约数。下面是一个简单的Java程序,演示如何计算最大公约数和最小公倍数: ```java public class Gongyueshu { public static void main(String[] args) { int m = ...

Global site tag (gtag.js) - Google Analytics