gcd,扩展gcd

欧几里得算法

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

扩展欧几里得

一个结论:ax+by的最小正整数等于gcd(a,b);

如何求出ax+by=gcd(a,b)的解呢?

例如 60x+36y = gcd(60,36)

模拟一下gcd过程

序号     a       b
  1       60     36    1*36+24
  2       36     24    1*24+12
  3       24     12    2*12+0
我们令 a = 60  b=36。
1  60=1*36+24  即 a=b+24 =》  24 = a-b
2  36=1*24+12  即 b=(a-b)+12  =》 12=2b-a
所以 2b-a=12 即x=-1,y=2是 60x+36y=gcd(60,36)的一组解。

代码
typedef __int64 ll;  
void ex_gcd(ll a, ll b, ll& d, ll& x, ll &y)  
{  
    if(!b)  
    {  
        d = a, x = 1, y = 0;  
    }  
    else  
    {  
        ex_gcd(b, a % b, d, y, x);  
        y -= x * (a / b);  
    }  
}  

求出x,y的一组解(x1,y1)之后,根据线性方程定理,可得任意解(x1+k*b/gcd(a,b),y1-k*a/gcd(a,b)),其中k为任意整数。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值