辗转相除法(欧几里得算法)
该算法常用于计算两数的最大公约数。算法表示如下:
现有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)最大公约数