欧几里得算法&扩展欧几里得算法

欧几里得算法:

“欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) = gcd(b,a mod b)。”

这里我们考虑一个问题:

辗转相除法需要大数除小数,那我们这里是不是需要一个判断呢;

其实是不需要的,我们可以发现公式中是默认a>b的,这里我们不妨假设a<b;

gcd(a,b) = gcd(b,a%b),由于a<b, a%b =a, gcd(b,a%b) = gcd(b,a),这样也就保证了函数的第一个参数大于第二个参数了。

然后我们考虑,辗转相除法什么时候停止,就是当我们的第二个参数为零时,第一个参数的值就是我们的答案了。

一行的gcd代码:

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

这里有一个有关gcd算法的性质:

当 gcd(n,m) = 1时,我们称 n , m 互质。 

然后,我们在来看看我们的扩展欧几里得算法:

已知整数a,b ,扩展欧几里得算法在求和gcd(a,b)的同时,可以寻找一组 x ,y 使得

ax + by = gcd(a,b);

证明一下:

已知两个整数 a,b

 ax_{1} + by_{1} = gcd(a,b)

bx_{2} + (a mod b)y_{2} = gcd(b,a mod b)

由欧几里得算法可知:

gcd(a,b) = gcd(b, a mod b) 

ax_{1} + by_{1} = bx_{2} + (amodb)y_{2}

a mod b =a - \lfloor \frac{a}{b} \rfloor * b

ax_{1} + by_{1} =bx_{2} + (a-\lfloor \frac{a}{b} \rfloor * b) y_{2}

x_{1} = y_{2}  

y_{1} =x_{2} - (\lfloor \frac{a}{b} \rfloor ) y_{2}

上代码:

int exgcd(int a,int b,int &x,int &y)
{
    if(!b)
    {
        x = 1,y = 0;
        return a;
    }
    else
    {
        int s = exgcd(b,a%b,y,x);
        y = y - (a/b)*x;
        return s;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是饿梦啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值