欧几里德算法(辗转相除法)
简介
欧几里得算法是用来求两个正整数最大公约数的算法,算法将除数和余数反复做除法运算,当余数为0时,当前算式的除数为最大公约数。
例子
求50和15的最大公约数 gcd(50,15)
50÷15=3(余5)(1) 50\div15=3(余5) \tag 1 50÷15=3(余5)(1)
以(1)的除数作为新的被除数,以(1)的余数作为新的除数
15÷5=3(余0)(2) 15\div5=3(余0) \tag 2 15÷5=3(余0)(2)
在(2)中,余数为0,所以gcd(50,15)=5
分析
求gcd(a, b)(方便起见,假设a>b)
设a=kb+r(k为系数,且是整数;r为余数)(3) 设a=kb+r(k为系数,且是整数;r为余数) \tag 3 设a=kb+r(k为系数,且是整数;r为余数)(3)
∴r=a−kb(即r=a mod b)(4) \therefore r=a-kb(即r=a\ mod\ b) \tag 4 ∴r=a−kb(即r=a mod b)(4)
令d为(a, b)的一个公约数,即
{
a mod d=0b mod d=0(5) \left\{\begin{aligned} a\ mod\ d=0 \\ b\ mod\ d=0 \end{aligned}\right. \tag 5 {
a mod d=0b mod d=0(5)
对(4)左右同除以d可得
r÷d=a÷d−(b÷d)k(6) r\div d=a\div d-(b\div d)k \tag 6 r÷d=a÷d−(b÷d)k(6)
参考(5)可知与a÷d 与 b÷d与a\div d\ 与\ b\div d与a÷d 与 b÷d的结果都为整数(余数为0),且k为整数,所以r÷dr\div dr÷d的结果为整数,即
r mod d=0(7) r\ mod\ d=0 \tag 7 r mod d=0(7)
所以d不仅是(a, b)的公约数,也是(b, r)即(b, a mod b)的公约数,(a, b)与(b, a mod b)公约数相同,那么最大公约数也相同
令a1=b, b1=a mod b; a2=a mod b, b2=b mod b1 以此类推(8) 令a_1=b,\ b_1=a\ mod\ b;\ a_2=a\ mod\ b,\ b_2=b\ mod\ b_1\ 以此类推 \tag 8 令a1=b, b1=a mod b;