function g = polygcd(p,q) |
% *** Find GCD of two given polynomials *** |
% through “Monic polynomial subtraction” |
% by F C Chang 03/03/2011 |
% |
mz = min(length(p)-max(find(p)),length(q)-max(find(q))); |
p0 = p(min(find(p)):max(find(p))); |
q0 = q(min(find(q)):max(find(q))); |
if min(length(p0),length(q0)) < 2, |
g = [1,zeros(1,mz)]; return, end; |
g1 = p0/p0(1); P{1} = g1; |
g2 = q0/q0(1); P{2} = g2; |
for k = 3:length(p0) + length(q0), |
l12 = length(g1)-length(g2); l21 = -l12; |
g3 = [g2,zeros(1,l12)]-[g1, zeros(1,l21)]; |
g3 = g3(min(find(abs(g3)>1.e-8)):max(find(abs(g3)>1.e-8))); |
if norm(g3,inf)/norm(g2,inf) < 1.e-3, break; end; |
if length(g1) >= length(g2), |
g1 = g2; end; |
g2 = g3/g3(1); P{k} = g2; |
end; |
g = [g1,zeros(1,mz)]; |
% celldisp(P); |