扩展欧几里得算法 求解 丢番图方程

丢番图方程:

   有一个或者几个变量的整系数方程,它们的求解仅仅在整数范围内进行。

  a * x + b * y = c  ( 其中所有数均为整数, 已知 x, y, c )        例如:鸡兔同笼问题.

扩展 欧几里得算法

   拓展欧几里得算法是基于欧几里得算法而来解 一类特殊的线性丢番图方程: a * x + b * y = gcd(a,b)        (已知 a, b)

当gcd(a,b) = 1,即a,b互质的时候,这个方程的解实际上就对应了a关于模b 的逆元。

 

简单看出   x  = 1 , y = 0 是方程的一组特解

 

根据欧几里得算法:a * x + b * y = gcd(a, b)  可以得出,

                              b * x + (a % b) * y = gcd(a, b)

                              又因为, a % b = a - (a / b) * b (a/b 为整除关系, 即a / b 向下取整)

                              所以    b * x + (a - (a / b) * b )) * y = gcd(a, b)

  整理之后得到:a * y + b * (x - (a / b) * y) = gcd(a,b);

          x = y            y = (x - (a / b) * y )

代码实现(结果返回了 a和 b 的最大公约数, x , y 使得方程成立

int exgcd(int a,int b,int &x,int &y){
   if(b == 0){
      x = 1;
      y = 0;
      return a;
   }
   int r = exgcd(b,a%b,x,y);
   int temp = x;
   x = y;
   y = temp - a / b * y;
   return r;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值