from
egcd.m
by Steven Gregory
Extended greatest common divisor. Finds g = GCD(x(1), ..., x(end)) and v such that g == sum(v.*x).
|
| egcd(x)
|
function [g, v] = egcd(x)
%EGCD Extended greatest common divisor calculator.
% x is expected to be a vector of 2 or more integers
% class(x) = class(v) = 'vpi'
%
% [g, v] = egcd(x) returns
% g: the GCD of the members of the integer vector x
% v: sum(x.*v) returns the value of g.
g=[];v=[];
% precondition testing---------------
[r, c] = size(x);
n = length(x);
if (r>1 && c>1) || n<2
disp('ERROR: x is expected to be a vector of at least two elements');
return
end
%--------------------------------------
if all(x==0)
g = 0;
v = x;
return
end
x = vpi(abs(x));
m = eye(n,n);
tmp = x(x~=0);
while length(tmp)>1
ibase = find(my_min(tmp)==x,1);
for ix = 1:n
if x(ix)~=0 && ix~=ibase
r = x(ix)/x(ibase);
x(ix) = x(ix) - r*x(ibase);
m(ix,:) = m(ix,:) - r*m(ibase,:);
end
end
tmp = x(x~=0);
end
ibase = find(my_min(tmp)==x,1);
g = x(ibase);
v = m(ibase,:);
function y = my_min(x)
y = x(1);
for t=x
if t<y
y=t;
end
end
|
|
Contact us at files@mathworks.com