function [g,c,d] = gcdSym(a,b)
% [g,c,d] = gcdSym(a,b)
% Modification of MATLAB's gcd function (extended Euclidean algorithm) that
% has symbolic functionality.
%GCD    Greatest common divisor.
%   G = GCD(A,B) is the greatest common divisor of corresponding
%   elements of A and B.  The arrays A and B must contain non-negative
%   integers and must be the same size (or either can be scalar).
%   GCD(0,0) is 0 by convention; all other GCDs are positive integers.
%
%   [G,C,D] = GCD(A,B) also returns C and D so that G = A.*C + B.*D.



 
for k = 1:length(a)
   u = [1 0 abs(a(k))];
   v = [0 1 abs(b(k))];
   while v(3) ~= 0
       q = floor( u(3)/v(3) );
       t = u - v*q;
       u = v;
       v = t;
   end
 
   %c(k) = u(1) * sign(a(k));
   %d(k) = u(2) * sign(b(k)); %sign is not defined for symbolic objects
   if a(k)^2 - abs(a(k))*a(k) ~= 0 %this means a(k) is negative
       c(k) = -u(1);
   else
       c(k) = u(1);
   end
   if b(k)^2 - abs(b(k))*b(k) ~= 0 %this means b(k) is negative
       d(k) = -u(2);
   else
       d(k) = u(2);
   end
   g(k) = u(3);
end

