euclidedivtab.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:2k
源码类别:

波变换

开发平台:

Matlab

  1. function [EuclideTAB,first] = euclidedivtab(A,B)
  2. %EUCLIDEDIVTAB Table obtained by the Euclidean division algorithm.
  3. %   For two Laurent Polynomials A and B, [TAB,FIRST] = euclidedivtab(A,B)
  4. %   returns a cell array TAB and an integer FIRST such that:
  5. %
  6. %=========================================================================
  7. % Basic Euclidean Algorithm for Laurent Polynomials
  8. %--------------------------------------------------
  9. % A , B two Laurent polynomials with d(A) => d(B). (d = degree)
  10. % Initialization: A(0) = A , B(0) = B 
  11. % while B(i) ~= 0
  12. %   A(i) = B(i)*Q(i) + R(i)        <-- Euclidean Division
  13. %   A(i+1) = B(i) , B(i+1) = R(i)
  14. % end
  15. %--------------------------------------------------
  16. % There are several euclidian divisions of A by B (see EUCLIDEDIV).
  17. % Starting from TAB(1,:) = {A,B,laurpoly(0,0),1,0}, we compute
  18. % DEC = euclidediv(A,B). Then the first lines of TAB starting from 
  19. % the line 2 contain all possibles euclidian divisions of A by B,
  20. % A = B*Q+R:
  21. %   TAB(j,:) = {B , R , Q , flagDIV , 1} , j = 2, ... , (nbEuclideDIV+1)
  22. %   flagDIV  = 0 if the Remainder R = 0. Otherwise flagDIV  = 1.
  23. %
  24. % The CellArray TAB is computed by computing euclidian divisions
  25. % for each line on wich flagDIV = 1 ...
  26. % The general form of a line of the CellArray TAB is:
  27. %   TAB(j,:) = {B , R , Q , flagDIV , idxLine}
  28. %
  29. % The number "idxLine" gives the number of the line used to compute 
  30. % the euclidian division A = B*Q+R. 
  31. % So for each line with index k => first:
  32. %      TAB(k,1)*TAB(k,3)-TAB(k,2) = TAB(TAB(k,5),1)
  33. %=========================================================================
  34. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 25-Apr-2001.
  35. %   Last Revision 12-Nov-2003.
  36. %   Copyright 1995-2004 The MathWorks, Inc.
  37. %   $Revision: 1.1.6.2 $ $Date: 2004/04/13 00:38:41 $ 
  38. EuclideTAB = {A,B,laurpoly(0,0),1,0};
  39. idxLine = 1;
  40. continu = 1;
  41. while continu
  42.     toDIV = EuclideTAB{idxLine,4};
  43.     if toDIV
  44.         EuclideTAB{idxLine,4} = NaN;
  45.         A = EuclideTAB{idxLine,1};
  46.         B = EuclideTAB{idxLine,2};
  47.         DEC = euclidediv(A,B);
  48.         nbDEC = size(DEC,1);
  49.         for k=1:nbDEC
  50.             flagDIV = (DEC{k,2}~=0);
  51.             add = {B,DEC{k,2},DEC{k,1},flagDIV,idxLine};
  52.             EuclideTAB = [EuclideTAB(:,:) ; add];
  53.         end
  54.     end
  55.     idxLine = idxLine+1;
  56.     if idxLine>size(EuclideTAB,1) , continu = 0; end
  57. end
  58. first = 1;
  59. while isnan(EuclideTAB{first,4}) , first = first+1; end