16th Nov 2007
扩展的欧几里得辗转相除法
参考《算法艺术与信息学竞赛》219页
令 (a,b)=d, 且 a<=b, 存在 ax+by=d, 求 x,y 可以用扩展的欧几里得辗转相除法.
function extended_gcd(a,b : longint; var x,y:longint):longint;
var
t : longint;
begin
if b=0 then begin
extended_gcd:=a;
x:=1;
y:=0;
end
else begin
extended_gcd:=extended_gcd(b, a mod b, x,y);
t:=x;
x:=y;
y:=t-(a div b)*y;
end;
end;
原书第9行代码有误, 原书为 extended_gcd:=extended_gcd(b, a mod b); , 应为 extended_gcd:=extended_gcd(b, a mod b, x,y);
下面给出推导过程:
若
ax+by=d
(a,b)=d
令
a’=b
b’=a mod b
则
(a’,b’)=d
假设已求出
a’x'+b’y'=d 有解 x’, y’
设 k=a div b, 则
a=ka’+b’, b=a’
所以
(ka’+b’)x+a’y=d
=> a’(kx+y)+b’x=d
所以可有
kx+y=x’
x=y’
即
x=y’
y=x’-kx=x’-(a’ div b’)y’
故算法正确
参考《算法艺术与信息学竞赛》219页
令 (a,b)=d, 且 a<=b, 存在 ax+by=d, 求 x,y 可以用扩展的欧几里得辗转相除法.
function extended_gcd(a,b : longint; var x,y:longint):longint;
var
t : longint;
begin
if b=0 then begin
extended_gcd:=a;
x:=1;
y:=0;
end
else begin
extended_gcd:=extended_gcd(b, a mod b, x,y);
t:=x;
x:=y;
y:=t-(a div b)*y;
end;
end;
原书第9行代码有误, 原书为 extended_gcd:=extended_gcd(b, a mod b); , 应为 extended_gcd:=extended_gcd(b, a mod b, x,y);
下面给出推导过程:
若
ax+by=d
(a,b)=d
令
a’=b
b’=a mod b
则
(a’,b’)=d
假设已求出
a’x'+b’y'=d 有解 x’, y’
设 k=a div b, 则
a=ka’+b’, b=a’
所以
(ka’+b’)x+a’y=d
=> a’(kx+y)+b’x=d
所以可有
kx+y=x’
x=y’
即
x=y’
y=x’-kx=x’-(a’ div b’)y’
故算法正确
Posted by autumncat under
Programming
1 Comment »







