(* ----------------------------------------------------------------------------
* $Id: MASPGCD.mi,v 1.2 1994/06/16 13:01:00 pfeil Exp $
* ----------------------------------------------------------------------------
* This file is part of MAS.
* ----------------------------------------------------------------------------
* Copyright (c) 1989 - 1994 Universitaet Passau
* ----------------------------------------------------------------------------
* $Log: MASPGCD.mi,v $
* Revision 1.2 1994/06/16 13:01:00 pfeil
* corrected errors found by mocka.
*
* Revision 1.1 1994/06/10 12:10:21 pfeil
* Initial revision. Procedures for squarefree factorization of integral
* polynomials.
*
* ----------------------------------------------------------------------------
*)
IMPLEMENTATION MODULE MASPGCD;
(* MAS Polynomial GCD and RES System Implementation Module. *)
(* Import lists and declarations. *)
FROM MASSTOR IMPORT ADV, COMP, INV, LIST, SIL;
FROM SACEXT4 IMPORT PCONST;
FROM SACIPOL IMPORT IPPROD;
FROM SACLIST IMPORT FIRST2, LIST2;
FROM SACPGCD IMPORT IPCPP, IPSF;
CONST rcsidi = "$Id: MASPGCD.mi,v 1.2 1994/06/16 13:01:00 pfeil Exp $";
CONST copyrighti = "Copyright (c) 1989 - 1994 Universitaet Passau";
PROCEDURE IPSFF(r,f: LIST): LIST;
(* integral polynomial squarefree factorization
f is a primitive polynomial in r variables,
returns a list ((e1,p1),...,(ek,pk)),
ei positive integers, pi squarefree polynomials,
where f = p1**e1 * ... * pk**ek *)
VAR cf,f0,CF,CF1,F0,F,EP,e,p: LIST;
BEGIN
IF r=1 THEN RETURN(IPSF(1,f));
ELSE
IPCPP(r,f,cf,f0); (* compute content and primitive part *)
IF PCONST(r-1,cf)=1
THEN CF:=SIL;
ELSE CF:=IPSFF(r-1,cf); (* factorize content *)
END;
CF1:=SIL;
WHILE CF<>SIL DO
ADV(CF,EP,CF);
FIRST2(EP,e,p);
EP:=LIST2(e,LIST2(0,p));
CF1:=COMP(EP,CF1);
END; (* WHILE CF... *)
CF:=INV(CF1);
IF PCONST(r,f0)=1
THEN F0:=SIL;
ELSE F0:=IPSF(r,f0); (* factorize primitive part *)
END;
F:=IPFLMER(r,F0,CF); (* merge factorizations *)
RETURN(F);
END; (* IF r... *)
END IPSFF;
PROCEDURE IPFLMER(r,F1,F2: LIST): LIST;
(* integral polynomial factorlist merge.
F1 and F2 are factorlists ((e1,p1),...,(ek,pk)),
ei positive integers, pi integer polynomials in r variables,
as computed in IPSFF.
returns the merge of F1 and F2. *)
VAR F,EP1,EP2,e1,e2,f1,f2,f: LIST;
BEGIN
F:=SIL;
LOOP (* 1 *)
IF F1=SIL THEN
WHILE F2<>SIL DO ADV(F2,EP2,F2); F:=COMP(EP2,F); END;
RETURN(INV(F));
END;
ADV(F1,EP1,F1);
FIRST2(EP1,e1,f1);
IF F2=SIL THEN
F:=COMP(EP1,F);
WHILE F1<>SIL DO ADV(F1,EP1,F1); F:=COMP(EP1,F); END;
RETURN(INV(F));
END;
ADV(F2,EP2,F2);
FIRST2(EP2,e2,f2);
LOOP (* 2 *)
IF e1=e2 THEN
f:=IPPROD(r,f1,f2);
F:=COMP(LIST2(e1,f),F);
EXIT;
END;
IF e1<e2 THEN
F:=COMP(EP1,F);
IF F1=SIL THEN
F:=COMP(EP2,F);
WHILE F2<>SIL DO ADV(F2,EP2,F2); F:=COMP(EP2,F); END;
RETURN(INV(F));
END;
ADV(F1,EP1,F1);
FIRST2(EP1,e1,f1);
ELSE (* e1>e2 *)
F:=COMP(EP2,F);
IF F2=SIL THEN
F:=COMP(EP1,F);
WHILE F1<>SIL DO ADV(F1,EP1,F1); F:=COMP(EP1,F); END;
RETURN(INV(F));
END;
ADV(F2,EP2,F2);
FIRST2(EP2,e2,f2);
END; (* IF e1<e2... *)
END; (* LOOP 2 *)
END; (* LOOP 1 *)
END IPFLMER;
END MASPGCD.