扩展欧几里得算法

来源:互联网 发布:教学质量监控网络 编辑:程序博客网 时间:2024/06/06 07:27

这个是数论中的最基础的东西,用途也很明确,就是解线性二元一次不定方程的整数解(不一定非负),在解线性同余方程的时候也有用,易证若方程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(推荐,容易错)。(代码已贴至博客)

原创粉丝点击