www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/@laurpoly/euclidedivtab.m
function [EuclideTAB,first] = euclidedivtab(A,B) %EUCLIDEDIVTAB Table obtained by the Euclidean division algorithm. % For two Laurent Polynomials A and B, [TAB,FIRST] = euclidedivtab(A,B) % returns a cell array TAB and an integer FIRST such that: % %========================================================================= % Basic Euclidean Algorithm for Laurent Polynomials %-------------------------------------------------- % A , B two Laurent polynomials with d(A) => d(B). (d = degree) % Initialization: A(0) = A , B(0) = B % while B(i) ~= 0 % A(i) = B(i)*Q(i) + R(i) <-- Euclidean Division % A(i+1) = B(i) , B(i+1) = R(i) % end %-------------------------------------------------- % There are several euclidian divisions of A by B (see EUCLIDEDIV). % Starting from TAB(1,:) = {A,B,laurpoly(0,0),1,0}, we compute % DEC = euclidediv(A,B). Then the first lines of TAB starting from % the line 2 contain all possibles euclidian divisions of A by B, % A = B*Q+R: % TAB(j,:) = {B , R , Q , flagDIV , 1} , j = 2, ... , (nbEuclideDIV+1) % flagDIV = 0 if the Remainder R = 0. Otherwise flagDIV = 1. % % The CellArray TAB is computed by computing euclidian divisions % for each line on which flagDIV = 1 ... % The general form of a line of the CellArray TAB is: % TAB(j,:) = {B , R , Q , flagDIV , idxLine} % % The number "idxLine" gives the number of the line used to compute % the euclidian division A = B*Q+R. % So for each line with index k => first: % TAB(k,1)*TAB(k,3)-TAB(k,2) = TAB(TAB(k,5),1) %========================================================================= % M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 25-Apr-2001. % Last Revision: 04-Aug-2008. % Copyright 1995-2008 The MathWorks, Inc. EuclideTAB = {A,B,laurpoly(0,0),1,0}; idxLine = 1; continu = 1; while continu toDIV = EuclideTAB{idxLine,4}; if toDIV EuclideTAB{idxLine,4} = NaN; A = EuclideTAB{idxLine,1}; B = EuclideTAB{idxLine,2}; DEC = euclidediv(A,B); nbDEC = size(DEC,1); for k=1:nbDEC flagDIV = (DEC{k,2}~=0); add = {B,DEC{k,2},DEC{k,1},flagDIV,idxLine}; EuclideTAB = [EuclideTAB(:,:) ; add]; end end idxLine = idxLine+1; if idxLine>size(EuclideTAB,1) , continu = 0; end end first = 1; while isnan(EuclideTAB{first,4}) , first = first+1; end