求最大公因数GCD(欧几里得)

(a,b)表示a,b的最大公因数

设 a = b*k + r , 则 r = a mod b.

证明 (a,b) = (b,r) 

(1).

设 a = s*u, b = t*u.(表示对于a,b的任意一个公因子u,都有唯一的s,t与之对应。)

将 a = s*u, b = t*u 代入 a = b*k + r;

得 s*u = t*u*k + r;

移项得,r = s*u - t*u*k  = u * (s - t*k);

可知,对于a,b的任意一个公因子u,都是 r 的因子;

(2).

设 b = s*v, r = t*v.(表示对于b,r的任意一个公因子v,都有唯一的s,t与之对应。)

将 b = s*v, r = t*v 代入 a = b*k + r;

得 a = s*v*k + t*v = v*(s*k + t);

可知,对于a,b的任意一个公因子v,都是 a 的因子;

由(1)知,(a,b)是r的因子

由(2)知,(b,r)是a的因子

所以 (a,b) = (b,r)

由(带余除法)

a = bq1 + r1

b = r1q2 + r2

r1 = r2q3 + r3

... = ...   + ...

rn-2 = rn-1qn + rn

rn-1 = rnqn+1 + 0

因为 (a,b) = (b,r1) = (r1,r2) = (r2,r3) =...= (rn-1,rn)=(rn,0)=rn.

ll _gcd(ll a,ll b)
{
    if(b == 0)
        return a;
    else
        return _gcd(b,a%b);
}

猜你喜欢

转载自www.cnblogs.com/LLLAIH/p/10879877.html
今日推荐