求最大公因数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);
}

 

转载于:https://www.cnblogs.com/LLLAIH/p/10879877.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值