【算法笔记】欧几里得算法

欧几里得算法(Euclidean algorithm)

\qquad 欧几里德算法又称辗转相除法,用于计算两个正整数 a a a b b b的最大公约数。

计算公式

g c d ( a , b ) = g c d ( b , a   m o d   b ) gcd(a,b)=gcd(b,a\ mod\ b) gcd(a,b)=gcd(b,a mod b) \qquad 其中 a   m o d   b a\ mod\ b a mod b a a a除以 b b b的余数(取余运算),也可以写成 a % b a\%b a%b

证明方法

\qquad 对于任意正整数 a a a b b b,都有
a = k b + r            ( k , r ∈ N ) a=kb+r \ \ \ \ \ \ \ \ \ \ (k,r\in N) a=kb+r          (k,rN) \qquad 所以有
r = a % b r=a\%b r=a%b \qquad 假设 c c c a a a b b b的最大公约数,即
c = g c d ( a , b ) c=gcd(a,b) c=gcd(a,b) \qquad 所以可得 c ∣ a c|a ca c ∣ b c|b cb ∣ | 表示能整除),又因为 r = a − k b r=a-kb r=akb,得
c ∣ r c|r cr \qquad 又因为 c ∣ b c|b cb,可得
c = g c d ( b , r ) c=gcd(b,r) c=gcd(b,r) \qquad
g c d ( a , b ) = g c d ( b , a % b ) gcd(a,b)=gcd(b,a\%b) gcd(a,b)=gcd(b,a%b)

代码实现

\qquad 迭代方法:

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

\qquad 递归方法:

int gcd(int a,int b)
{
    while(b)
    {
        a = a%b;
        swap(a,b);
    }
    return a;
}

\qquad 两种算法的本质是一样的。

你可能感兴趣的:(算法笔记)