扩展欧几里得(exgcd)

解形如 ax+by=c   或   ax ≡ c (mod b)  的方程


    用exgcd() 先解出 ax + by = gcd(a,b)中的 x 和 y
    x 和 y 再乘上 c / gcd(a,b)就是原方程的解

exgcd的原理:

a*x0 + b*y0 = gcd(a,b)  = gcd(b , a%b) =  b*x1+(a%b)* y1
    又a%b=a-(a/b)*b;
所以
        b*x1+(a%b)*y1 = bx1+ (a-(a/b)*b) *y1;
                移项,得
                a*y1 + b*(x1-a/b*y1)
        即
              a*x0+b*y0 =  a*y1 + b* (x1-a/b*y1) 
    所以 x0 = y1 ,  y0= x1- a/b*y1;

    所以求x0,y0先求得 x1,y1;
    求x1,y1就得先求x2,y2;
    一直求下去,直到 gcd(a,b)的b为0时,此时gcd(a,b)=a;
    a*xn + b*yn = gcd(a,b)=a;
        所以xn=1,yn=0,然后推回去,求得 x1,y1;


代码实现:
int  exgcd(int a , int b , int &x , int &y)//返回的是gcd(a,b)
{
    int d;    // d是gcd(a,b)

    if(b==0)   //表示gcd(a,b)求出来了
    {
            x=1,y=0;
            return a;
    }    
    d= exgcd(b , a%b , x , y);  //递归到最后一层
    int xx = x;
    x = y ;        //上一层的 x = 当前层的 y
    y  = xx - (a/b) * y;      //上一层的 y = 当前层的 x - (a/b)*y
    return d;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值