Code covered by the BSD License  

Highlights from
egcd.m

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