扩展欧几里得算法用于求解二元一次不定方程
ax+by=c
可以证明ax+by的最小正整数是gcd(a,b)。
设:ax+by=bx'+(a mod b)y'=gcd(a,b),
a mod b=a-[a/b]*b
则有:
g=bx'+(a mod b)y'
从最后的化简结果可以看出求解二元一次不定方程可以用递归做。
不断调用gcd,到最后a=1,b=0是就可以求出x=1,y=0,再往上带。
这里的x,y就相当于上一层递归中的x',y',代入ay'+b(x'-[a/b]y')=ax+by,求解x,y
最后x0=x*(c/g)
对于方程其他的解:
设:
ax+by=ax'+by'
移项得:
a(x-x')=b(y'-y)
[a(x-x')]/gcd(a,b)=[b(y'-y)]/gcd(a,b)
因为a/gcd(a,b)⊥b/gcd(a,b)
所以x-x'=t*b/gcd(a,b)
x=x'+t*b/gcd(a,b)
CODE
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
;