欧几里得算法

欧几里得算法(辗转相除)

gcd(a,b),用于计算a,b的最大公约数

gcd(a, b)  = g(b, a%b)

证明(反证法):

    设 r=a%b , c=gcd(a,b)

    则 a=xc , b=yc , 其中x , y互质

    r=a%b=a-pb=xc-pyc=(x-py)c

    因为gcd(a,b) = gcd(b,a%b)

    b = yc;

    a%b = r = (x-py)c

    所以 y 与 (x-py) 互质

    反证法:

      假设 y 与 (x-py) 不互质

                设 y = nk , x-py = mk , (k>1) 不互质有大于1的公因子

                将 y 带入可得

                x-pnk = mk

                x = (pn + m)k

                则 a = xc = (pn+m)kc , b = yc = nkc

                那么此时 a 与 b 的最大公约数为 kc 不为 k

                与原命题矛盾,则 y 与 x-py 互质

所以 gcd(a, b)  = gcd(b, a%b)成立

代码实现用递归的方法,当a%b等于0时退出,返回b

代码:

 int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

 

转载于:https://www.cnblogs.com/1998LJY/p/10680184.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值