(* ----------------------------------------------------------------------------
* $Id: ADEXTRA.mi,v 1.1 1995/10/12 14:44:44 pesch Exp $
* ----------------------------------------------------------------------------
* This file is part of MAS.
* ----------------------------------------------------------------------------
* Copyright (c) 1995 Universitaet Passau
* ----------------------------------------------------------------------------
* $Log: ADEXTRA.mi,v $
* Revision 1.1 1995/10/12 14:44:44 pesch
* Diplomarbeit Rainer Grosse-Gehling.
* Involutive Bases.
* Slightly edited.
*
* ----------------------------------------------------------------------------
*)
IMPLEMENTATION MODULE ADEXTRA;
(* Arbitrary Domain Extra Tools*)
FROM DIPC IMPORT DIPMAD, DIPMCP;
FROM DIPCJ IMPORT DILBBS;
FROM DIPGB IMPORT DIPNOR;
FROM DIPIB IMPORT ADPNFJ;
FROM MASADOM IMPORT ADGCD, ADNEG, ADQR, ADSIGN;
FROM MASBIOS IMPORT SWRITE;
FROM MASSTOR IMPORT ADV, INV, LENGTH, LIST, SIL;
FROM SACLIST IMPORT EQUAL;
CONST rcsidi = "$Id: ADEXTRA.mi,v 1.1 1995/10/12 14:44:44 pesch Exp $";
CONST copyrighti = "Copyright (c) 1995 Universitaet Passau";
PROCEDURE ADPCP(A: LIST): LIST;
(*Arbitrary Domain polynomial content and primitive part.
A is an arbitrary domain polynomial,
The result is the positive primitive part of A. *)
VAR AL, DL, EL, SL, AP, CL: LIST;
BEGIN
IF A = 0 THEN RETURN(A); END;
DIPMAD(A, DL,EL,AP); SL:=ADSIGN(DL);
IF SL < 0 THEN DL:=ADNEG(DL); END;
WHILE (AP <> SIL) AND (DL <> 1) DO
DIPMAD(AP, AL,EL,AP); DL:=ADGCD(DL,AL);
END;
CL:=DL; AP:=A;
IF DL = 1 THEN IF SL < 0 THEN CL:=-DL; AP:=ADPNEG(A); END;
ELSE IF SL < 0 THEN CL:=ADNEG(DL); END;
AP:=ADPIQ(A,CL);
END;
RETURN(AP);
END ADPCP;
PROCEDURE ADPNEG(A: LIST): LIST;
(*Arbitrary domain polynomial negative.
Input: an arbritrary domain polynomial A,
Output: -A *)
VAR AL, AS, B, BL, EL: LIST;
BEGIN
IF A = 0 THEN B:=0; RETURN(B); END;
AS:=A; B:=SIL;
REPEAT DIPMAD(AS, AL,EL,AS); BL:=ADNEG(AL); B:=DIPMCP(EL,BL,B);
UNTIL AS = SIL;
B:=INV(B); RETURN(B);
END ADPNEG;
PROCEDURE ADPIQ(A,b: LIST): LIST;
(* Arbitrary domain polynomial integer quotient.
Input: A is an arbitrary domain polynomial, b is a nonzero integer,
and b divides any coefficient of A.
Output: C=A/b.*)
VAR AL, AP, C, EL, QL, RL: LIST;
BEGIN
IF A = 0 THEN RETURN(0); END;
C:=SIL; AP:=A;
REPEAT DIPMAD(AP, AL,EL,AP); ADQR(AL,b, QL,RL);
C:=DIPMCP(EL,QL,C);
UNTIL AP = SIL;
C:=INV(C); RETURN(C);
END ADPIQ;
PROCEDURE ADLGinH(H, G: LIST): BOOLEAN;
(* Arbitrary domain polynomial list G in H.
Input: H is a list of lists of arbitrary domain polynomials,
G is a list of arbitrary domain polynomials.
Output: TRUE iff ex. h in H s.t. G = h, FALSE else. *)
VAR GG, h: LIST;
BEGIN
IF H = SIL THEN RETURN(FALSE); END;
GG:=G; DILBBS(GG);
WHILE (H<>SIL) DO
ADV(H,h,H); DILBBS(h);
IF ADLGeqH(h,GG) THEN RETURN(TRUE); END;
END;
RETURN(FALSE);
END ADLGinH;
PROCEDURE ADLGeqH(H, G: LIST): BOOLEAN;
(* Arbitrary domain polynomial list G equal H.
Input: H and G are lists of arbitrary domain polynomials,
Ouput: TRUE iff H=G, FALSE else. *)
VAR h,g: LIST;
BEGIN
IF LENGTH(H) <> LENGTH(G) THEN RETURN(FALSE); END;
WHILE H <> SIL DO
ADV(H,h,H); ADV(G,g,G);
IF NOT(ADPFeqG(h,g)) THEN RETURN(FALSE) END;
END;
RETURN(TRUE);
END ADLGeqH;
PROCEDURE ADPFeqG(F, G: LIST): BOOLEAN;
(* Arbitrary domain polynomial F equal G.
Input: arbitrary domain polynomials F and G,
Ouput: TRUE iff g = h, FALSE else. *)
VAR f,g: LIST;
BEGIN
IF LENGTH(F)<>LENGTH(G) THEN RETURN(FALSE); END;
WHILE F<>SIL DO
ADV(F,f,F); ADV(G,g,G);
IF NOT(EQUAL(f,g)) THEN RETURN(FALSE); END;
END;
RETURN(TRUE);
END ADPFeqG;
PROCEDURE ADIredG(I,G: LIST): LIST;
(* Arbitrary domain polynomial set I reducible modulo G.
Input: arbitrary domain polynomial sets I & G.
Output: 0 iff all i in I are reducible modulo G to zero,
a reduced polynomial p else *)
VAR II,f,p: LIST;
BEGIN
II:=I; p:=0;
WHILE II<>SIL DO ADV(II,f,II);
p:=DIPNOR(G,f);
IF p<>0 THEN RETURN(p) END;
END;
RETURN(0);
END ADIredG;
PROCEDURE ADGJredI(G,I: LIST): LIST;
(* Arbitrary domain polynomial G Janet-reducible modulo I.
Input: arbitrary domain polynomial sets G & I.
Output: 0 iff all g in G are Janet-reducible modulo I to zero,
a reduced polynomial p else *)
VAR GG,f,p: LIST;
red : BOOLEAN;
BEGIN
GG:=G; p:=0;
WHILE GG<>SIL DO ADV(GG,f,GG);
ADPNFJ(I,f,p,red);
IF p<>0 THEN RETURN(p) END;
END;
RETURN(0);
END ADGJredI;
PROCEDURE IBeqGB(G,I: LIST): LIST;
(* Inovlutive Base equal Groebner Base.
Input: Groebner Base G and involutive Base I,
Output: 0 iff Id(G) = Id(I), a reduced polynomial p else *)
VAR i,g: LIST;
BEGIN
i:=ADIredG(I,G);
IF i<>0 THEN RETURN(i) END;
g:=ADGJredI(G,I);
IF g<>0 THEN RETURN(g) ELSE RETURN(0); END;
END IBeqGB;
END ADEXTRA.
(* -EOF- *)