(* ---------------------------------------------------------------------------- * $Id: DIPIDEAL.mi,v 1.4 1993/05/11 10:53:31 kredel Exp $ * ---------------------------------------------------------------------------- * This file is part of MAS. * ---------------------------------------------------------------------------- * Copyright (c) 1989 - 1992 Universitaet Passau * ---------------------------------------------------------------------------- * $Log: DIPIDEAL.mi,v $ * Revision 1.4 1993/05/11 10:53:31 kredel * Spelling errors corr. * * Revision 1.3 1992/10/15 16:29:35 kredel * Changed rcsid variable * * Revision 1.2 1992/02/12 17:34:19 pesch * Moved CONST definition to the right place * * Revision 1.1 1992/01/22 15:14:54 kredel * Initial revision * * ---------------------------------------------------------------------------- *) IMPLEMENTATION MODULE DIPIDEAL; (* DIP Ideal System Implementation Module. *) (* Import lists and declarations. *) FROM MASSTOR IMPORT LIST, BETA, SIL, LENGTH, LIST1, ADV, FIRST, RED, SFIRST, SRED, COMP, INV; FROM MASERR IMPORT ERROR, fatal, severe; FROM SACLIST IMPORT COMP2, LIST2, FIRST2, SECOND, RED2, CCONC, CINV, LELT, LIST4, MEMBER, CONC, ADV2; FROM SACPOL IMPORT PDEG; FROM DIPC IMPORT DIPNOV, DIPINV; FROM DIPTOO IMPORT DIPLDM; FROM DIPRN IMPORT DIRPPR; FROM DIPRNGB IMPORT DIRPNF, DIRPGB, DIRGBA; CONST rcsidi = "$Id: DIPIDEAL.mi,v 1.4 1993/05/11 10:53:31 kredel Exp $"; CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau"; PROCEDURE DIPLDV(A,V: LIST): LIST; (*Distributive polynomial list dependency on variables. A is a list of distributive polynomials. V is the variable list. U is the variable list of variables with positive exponents in A. *) VAR AL, AP, U, VL, VP, W, WL: LIST; BEGIN (*1*) (*initialise. *) IF A = SIL THEN VP:=V; RETURN(U); END; W:=DIPLDM(A); (*2*) (*extract variables. *) VP:=CINV(V); U:=BETA; WHILE VP <> SIL DO ADV(VP, VL,VP); ADV(W, WL,W); IF PDEG(WL) <> 0 THEN U:=COMP(VL,U); END; END; (*5*) RETURN(U); END DIPLDV; PROCEDURE DIRLCT(A,B: LIST): LIST; (*Distributive rational polynomial list ideal containment test. A and B are lists of distributive rational polynomials representing groebner bases. t = 1 if ideal(A) is contained in ideal(B), t = 0 else. *) VAR AL, AS, BL, TL: LIST; BEGIN (*1*) (*a or b empty.*) IF A = SIL THEN TL:=1; RETURN(TL); END; IF B = SIL THEN TL:=0; RETURN(TL); END; (*2*) (*general case.*) AS:=A; TL:=0; REPEAT ADV(AS, AL,AS); BL:=DIRPNF(B,AL); IF BL <> 0 THEN RETURN(TL); END; UNTIL AS = SIL; TL:=1; (*5*) RETURN(TL); END DIRLCT; PROCEDURE DIRLIP(PL,A,B: LIST): LIST; (*Distributive rational polynomial list ideal product. A and B are lists of distributive rational polynomials. C=GBASIS(p,A*B).*) VAR AL, AP, AS, BL, BS, C, CL: LIST; BEGIN (*1*) (*a or b empty.*) IF (A = SIL) OR (B = SIL) THEN C:=BETA; RETURN(C); END; (*2*) (*general case.*) AS:=A; BS:=B; C:=BETA; REPEAT ADV(BS, BL,BS); AP:=AS; REPEAT ADV(AP, AL,AP); CL:=DIRPPR(AL,BL); C:=COMP(CL,C); UNTIL AP = SIL; UNTIL BS = SIL; (*3*) (*groebner basis. *) IF PL <> 0 THEN C:=COMP(PL,C); END; C:=DIRPGB(C,1); (*6*) RETURN(C); END DIRLIP; PROCEDURE DIRLPI(A,P,VP: LIST): LIST; (*Distributive rational polynomial list primary ideal. A and P are non empty lists of distributive rational polynomials representing groebner bases. The polynomials in A have r variables. ideal(P) is a prime ideal in at most r+1 variables. VP is the variable list for P. QP=(P,e,VP,Q) where Q = ideal(P**e,A) with A contained in Q and e maximal. *) VAR AL, AP, AS, EL, J1Y, PL, PP, Q, QP, QS, RL, RLP, TL: LIST; BEGIN (*1*) (*initialise. *) EL:=0; PP:=P; PL:=0; QS:=PP; J1Y:=FIRST(A); RL:=DIPNOV(J1Y); J1Y:=LENGTH(VP); RLP:=J1Y-RL; AP:=A; IF RLP > 0 THEN AS:=BETA; ADV(PP, PL,PP); WHILE AP <> SIL DO ADV(AP, AL,AP); AL:=DIPINV(AL,0,RLP); AS:=COMP(AL,AS); END; AP:=INV(AS); END; (*2*) (*check if a is contained in p**el. *) REPEAT Q:=QS; EL:=EL+1; QS:=DIRLIP(PL,Q,PP); TL:=DIRLCT(AP,QS); UNTIL TL = 0; (*3*) (*check if p**el is contained in (a,p**(el+1)). *) REPEAT AS:=CCONC(AP,QS); AS:=DIRPGB(AS,1); TL:=DIRLCT(Q,AS); IF TL <> 1 THEN Q:=QS; EL:=EL+1; QS:=DIRLIP(PL,Q,PP); END; UNTIL TL = 1; (*4*) (*finish. *) QP:=LIST4(P,EL,VP,AS); (*7*) RETURN(QP); END DIRLPI; END DIPIDEAL. (* -EOF- *)