(* ----------------------------------------------------------------------------
 * $Id: DIPGCD.mi,v 1.3 1992/10/15 16:29:34 kredel Exp $
 * ----------------------------------------------------------------------------
 * This file is part of MAS.
 * ----------------------------------------------------------------------------
 * Copyright (c) 1989 - 1992 Universitaet Passau
 * ----------------------------------------------------------------------------
 * $Log: DIPGCD.mi,v $
 * Revision 1.3  1992/10/15  16:29:34  kredel
 * Changed rcsid variable
 *
 * Revision 1.2  1992/02/12  17:34:18  pesch
 * Moved CONST definition to the right place
 *
 * Revision 1.1  1992/01/22  15:14:52  kredel
 * Initial revision
 *
 * ----------------------------------------------------------------------------
 *)

IMPLEMENTATION MODULE DIPGCD;

(* DIP GCD Implementation Module. *)



(* Import lists and declarations. *)

FROM MASSTOR IMPORT LIST, SIL, BETA, ADV, COMP, INV;

FROM SACLIST IMPORT FIRST2, LIST2;

FROM SACIPOL IMPORT IPABS, IPPROD;

FROM SACPGCD IMPORT IPGCDC;

FROM SACPFAC IMPORT IPFAC;

FROM DIPC IMPORT PFDIP, DIPFP;    

FROM DIPI IMPORT DIIFRP;

FROM DIPRN IMPORT DIRFIP;
     
CONST rcsidi = "$Id: DIPGCD.mi,v 1.3 1992/10/15 16:29:34 kredel Exp $";
CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau";



PROCEDURE DIRFAC(P: LIST): LIST; 
(*Distributive rational polynomial factorisation.
P is a distributive rational polynomial.
PP=((e1,P1), ...,(en,Pn)), where P=P1**e1+ ... +Pn**en. *)
VAR  CL, EL, PL, PLP, PP, Q, QL, QLP, QLS, RL, SL: LIST; 
BEGIN
(*1*) (*convert to recursive integral. *) PP:=BETA; 
      IF P = 0 THEN RETURN(PP); END; 
      PL:=DIIFRP(P); PFDIP(PL, RL,PL); 
(*2*) (*factorize. *) IPFAC(RL,PL, SL,CL,Q); 
(*3*) (*convert factors to distributive rational polynomial. *) 
      WHILE Q <> SIL DO ADV(Q, QLS,Q); FIRST2(QLS, EL,QLP); 
            PLP:=DIPFP(RL,QLP); PLP:=DIRFIP(PLP); QL:=LIST2(EL,PLP); 
            PP:=COMP(QL,PP); END; 
(*4*) (*finish. *) PP:=INV(PP); 
(*7*) RETURN(PP); END DIRFAC; 


PROCEDURE IPLCM(RL,A,B: LIST): LIST; 
(*Integral polynomial least common multiple. A and B are integal
polynomials. C=LCM(A,B), a nonnegative integral polynomial.*)
VAR  AP, APP, BP, BPP, C, CP: LIST; 
BEGIN
(*1*) (*a or b eq 0.*) AP:=IPABS(RL,A); BP:=IPABS(RL,B); 
      IF AP = 0 THEN C:=BP; RETURN(C); END; 
      IF BP = 0 THEN C:=AP; RETURN(C); END; 
(*2*) (*a and b nonzero.*) IPGCDC(RL,AP,BP, CP,APP,BPP); 
      C:=IPPROD(RL,APP,BP); 
(*5*) RETURN(C); END IPLCM; 


END DIPGCD.



(* -EOF- *)