扩展欧几里得算法

这个是数论中的最基础的东西,用途也很明确,就是解线性二元一次不定方程的整数解(不一定非负),在解线性同余方程的时候也有用,易证若方程ax+by=c有整数解,则gcd(a,b)|c(在此不证明),我们便可以利用它的这一性质与欧几里得算法结合,先巩固一下欧几里得算法,其实就是求最大公约数,采用更相减损术的思想,代码已贴至上篇博文。

下面介绍拓展欧几里得算法。

考虑方程ax+by=c,我们可以改写成ax+by=gcd(a,b)*k(k为整数)。这个方程又可以推出另一个方程bx'+(a mod b)y'=gcd(b,a mod b)*k,由前面的欧几里得算法的原型可以推出gcd(a,b)=gcd(b,a mod b)从而推出bx'+(a mod b)y'=ax+by,令x=y',由a mod b=a-a div b*b则可解出y=x'-(a div b)*y'递归实现直到b=0,方程为ax=c,解为x=c/a,y=0,再一路传上去就可以得到方程的解了(讲得很纠结。。)。代码如下:

procedure ex_gcd(a,b,c:longint; var x,y:longint);
var t:longint;
begin
 if b=0 then begin
  x:=c div a; y:=0;
 end else begin
           ex_gcd(b,a mod b,c,x,y);
           t:=x; x:=y; y:=t-(a div b)*y;
          end;
end;

在这里推荐两个题目巩固这个算法,poj1061-青蛙的约会(基础,列方程套算法即可求解)和sgu106-The Equation(推荐,容易错)。(代码已贴至博客)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值