辗转相除法的证明

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

该算法常用于计算两数的最大公约数。算法表示如下:
现有A, B两正整数,其中A为较大者,A>=B; 通过一下算法求其最大公约数
1> A / B = C … D 使用较大者除以较小者,获得余数D是否为0,若为0,则最大公约数为除数B
2> 若不能整除,则B作为较大者,余数D作为较小者(由除法性质知B >= D),重复该算法

竖式计算如下:

设A = 899, B = 493。

 1   | 899 | 493 |
     | 493 |
     ----------------     =》 
     | 406 |

 1   | 899 | 493 | 1
     | 493 | 406 |
     ----------------     =》
     | 406 |   87 |

 4   | 406 |   87 |
     |   87 | 
     ----------------     =》
     |    58 |

 4   | 406 |   87 | 1
     |   87 |   58 |
     ----------------     =》
     |    58 |   29|

 2   |    58 |   29| 
     |    29 |  
     ----------------     =》  29
     |     0 |

辗转相除法证明

到此,我们发现该算法确实能够很快的求解两数的最大公约数问题,但是为什么这个算法是正确的,如何通过合理的证明,来验证该算法的合理性呢?

证明过程如下:

现有正整数A, B。 其中A >= B; 有除法过程A / B = K … D 其中K为商,D为余数。 使用 A | B 表示 A被B整除
求证:A, B 的最大公约数 等于 B 与余数 D的最大公约数

设 A , B 的最大公约数为 C, 侧有 A | C, 与 B | C
有除法定义知:BK + D = A,且 B | C 所以:BK | C
有 A | C 即 (BK + D) | C 得 D | C
到此可证,若 C为A和B的公约数,则必为B和D的公约数。由于终止条件为两者求余为0,即 A = KB则得到最终的最大公约数。

更相减损术

九章算术中,使用减法进行计算,求取最大公约数的算法。与辗转相除法如出一辙

可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
白话文译文:
(如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用2来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分。

Stein算法

辗转相除法依赖于出触发运算,对于64位现代计算机能够很快处理,但对于更大的数,超出浮点计算能力时,计算效率将会急剧下降。比如在一个64位字宽的浮点处理器上,计算一个128位甚至更长的数字,需要在除法算法上层做很多运算,而不能直接有机器在几条指令内求解。

stein算法对大数求最大公约数做了优化。

参考

GCD(Greatest Common Divisor)最大公约数

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值