求最大公约数的算法

 

更相减损术

更相减损术,又称"等值算法"

关于约分问题,实质是如何求分子,分母最大公约数的问题。《九章算术》中介绍了这个方法,叫做”更相减损术”,数学家刘徽对此法进行了明确的注解和说明,是一个实用的数学方法。

例:今有九十一分之四十九,问约之得几何?

我们用(91,49)表示9149的最大公约数.按刘徽所说,分别列出分子,分母。

“以少减多,更相减损,求其等也,以等数约之,等数约之,即除也,其所以相减者皆等数之重叠,故以等数约之。”

译文如下:

约分的法则是:若分子、分母均为偶数时,可先被2除,否则,将分子与分母之数列在它处,然后以小数减大数,辗转相减,求它们的最大公约数,用最大公约数去约简分子与分母。

其与古希腊欧几里德所著的《几何原本》中卷七第一个命题所论的相同。列式如下:

91 49

42 49

42 7

35 7

28 7

21 7

14 7

7  7

这里得到的7就叫做“等数”,9149都是这等数的重叠(即倍数),7为其公约数.77的最大公约数就是7,(7,7)=7,所以(91,49)=(42,7)=(7,7)=7

更相减损术在现代仍有理论意义和实用价值.吴文俊教授说:“在我国,求两数最大公约数即等数,用更相减损之术,将两数以小减大累减以得之,如求2415的等数,其逐步减损如下表所示:(24,15)->(9,15)->(9,6)->(3,6)->(3,3)

每次所得两数与前两数有相同的等数,两数之值逐步减少,因而到有限步后必然获得相同的两数,也即所求的等数,其理由不证自明。

这个寓理于算不证自明的方法,是完全构造性与机械化的尽可以据此编成程序上机实施”.吴先生的话不仅说明了此法的理论价值,而且指明学习和研究的方向.

更相减损法很有研究价值,它奠定了我国渐近分数,不定分析,同余式论和大衍求一术的理论基础.望能仔细品味。

 

辗转相除法

辗转相除法,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法,其可追溯至前300年。它首次出现于欧几里德的《几何原本》(第VII卷,命题iii)中,而在中国则可以追溯至东汉出现的《九章算术》。它并不需要把二数作质因子分解。

证明:

设两数为ab(ba),求它们最大公约数(ab)的步骤如下:用ba,得abq......r1(0r)。若r1=0,则(ab)b;若r10,则再用r1b,得br1q......r2(0r2).r20,则(ab)r1,若r20,则继续用r2r1,……如此下去,直到能整除为止。其最后一个非零余数即为(ab)

辗转相除法是利用以下性质来确定两个正整数ab的最大公因子的:

1.ra÷b的余数,gcd(a,b)=gcd(b,r)

2.a和其倍数之最大公因子为a

另一种写法是:

1.a÷b,令r为所得余数(0rb)。若r=0,算法结束;b即为答案。

2.互换:置abbr,并返回第一步。

 

求最大公约数的C/C++算法

//更相减损法

int gcd(int a,int b)

{

    while(a!=b)

    {

       if(a>b)

           a-=b;

       else

           b-=a;

    }

    return a;

}

 

//辗转相除法--递归

int gcd(int a,int b)

{

    if(b==0)

       returna;

    else

       return gcd(b,a%b);

}

 

//辗转相除法--纯循环

int gcd(int a,int b)

{

    int r;

    while(b!=0)

    {

       r=a%b;

       a=b;

       b=r;

    }

    return a;

}

### 最大公约数算法的实现 最大公约数(Greatest Common Divisor, GCD),又称最高公因数(Highest Common Factor, HCF),是指能够同时整除两个或多个整数的最大正整数。为了高效计算最大公约数,通常采用 **欧几里得算法** 或其扩展形式。 #### 欧几里得算法简介 欧几里得算法的核心思想是通过反复取模运算来简化问题规模,直到余数为零为止。具体而言,对于任意两个非负整数 \(a\) 和 \(b\) (假设 \(a \geq b\)),如果 \(b=0\) 则 \(gcd(a,b)=a\);否则 \(gcd(a,b) = gcd(b,a \% b)\)[^1]。 以下是几种常见编程语言中的实现方式: --- #### JavaScript 实现 以下是一个基于欧几里得算法的 JavaScript 函数用于计算两数的最大公约数[^2]: ```javascript function findHCF(a, b) { // 确保 a 是较大值 if (a < b) { [a, b] = [b, a]; } while (b !== 0) { let remainder = a % b; a = b; b = remainder; } return a; // 返回最终结果即为最大公约数 } // 示例调用 let num1 = 36; let num2 = 48; let hcf = findHCF(num1, num2); console.log(`最大公约数:${hcf}`); ``` 上述代码展示了如何利用循环结构逐步缩小问题范围直至得到答案。 --- #### Python 实现 Python 中同样可以优雅地表达该逻辑,并支持递归与迭代两种风格[^3]: ##### 迭代版本 ```python def gcd_iterative(a, b): while b != 0: a, b = b, a % b return a # 测试案例 num1 = 36 num2 = 48 print(f"最大公约数(迭代): {gcd_iterative(num1, num2)}") ``` ##### 递归版本 ```python def gcd_recursive(a, b): if b == 0: return a else: return gcd_recursive(b, a % b) # 测试案例 num1 = 36 num2 = 48 print(f"最大公约数(递归): {gcd_recursive(num1, num2)}") ``` 这两种方法均遵循相同的数学原理,在实际应用中可根据个人偏好选择合适的形式。 --- #### 总结 无论是哪种语言或者具体的编码手法,核心都围绕着不断更新较小数值以及原较大数值对其做取模后的剩余部分这一过程展开。这种简洁而有效的策略使得即使面对非常庞大的输入数据也能快速得出结论。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值