(* ---------------------------------------------------------------------------- * $Id: DOMFF.mi,v 1.5 1995/11/05 09:29:05 kredel Exp $ * ---------------------------------------------------------------------------- * This file is part of MAS. * ---------------------------------------------------------------------------- * Copyright (c) 1989 - 1992 Universitaet Passau * ---------------------------------------------------------------------------- * $Log: DOMFF.mi,v $ * Revision 1.5 1995/11/05 09:29:05 kredel * Fixed DDDRD, DDDWR and other corrections. * * Revision 1.4 1994/09/06 11:48:54 rose * modified comment * * Revision 1.3 1994/05/19 10:42:47 rose * Added DPNF, DPSP, DPSUGNF, DPSUGSP in connection with the new module DIPAGB * * Revision 1.2 1992/10/15 16:30:15 kredel * Changed rcsid variable * * Revision 1.1 1992/09/28 17:47:10 kredel * Initial revision * * ---------------------------------------------------------------------------- *) IMPLEMENTATION MODULE DOMFF; (* MAS Domain Finite Field Implementation Module. *) (* Import lists and declarations. *) FROM MASSTOR IMPORT LIST, ADV, FIRST, RED, SIL, COMP, LIST1; FROM MASERR IMPORT harmless, severe, fatal, ERROR; FROM MASADOM IMPORT Domain, NewDom, SetDifFunc, SetExpFunc, SetFIntFunc, SetFIPolFunc, SetGcdFunc, SetInvFunc, SetInvTFunc, SetLcmFunc, SetNegFunc, SetOneFunc, SetProdFunc, SetQuotFunc, SetReadFunc, SetSignFunc, SetSumFunc, SetWritFunc, (*SetVlddFunc,*) SetDdrdFunc, SetDdwrFunc, SetPNormFunc, SetPSpolFunc, SetPSugNormFunc, SetPSugSpolFunc; FROM MASBIOS IMPORT BLINES, SWRITE, DIGIT, LETTER, MASORD, CREAD, CREADB, BKSP; FROM SACLIST IMPORT OWRITE, CLOUT, ADV2, THIRD, FIRST2, FIRST4, AWRITE, LIST4, SECOND, FOURTH; FROM SACI IMPORT IREAD, IWRITE; FROM SACPOL IMPORT VREAD; FROM MASFF IMPORT FFWRITE, FFREAD, FFFINT, FFHOM, FFRAND, FFCOMP, FFONE, FFNEG, FFSUM, FFDIF, FFINV, FFPROD, FFQ, FFEXP; FROM DIPC IMPORT PFDIP, DIPFP; FROM DIPI IMPORT DIIPWR, DIIPRD; FROM DIPAGB IMPORT EDIPSUGNOR, EDIPSUGSP; FROM DIPGB IMPORT DIPNOR, DIPSP; FROM SACMUFAC IMPORT MUPFBL; FROM SACPGCD IMPORT MUPSFF; FROM SACPRIM IMPORT IFACT; CONST rcsidi = "$Id: DOMFF.mi,v 1.5 1995/11/05 09:29:05 kredel Exp $"; CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau"; (* Domain: (dom, val, mod, modpol, prime, V) Domain descriptor: (mod, modpol, prime, V) where: val = finite field element mod = modulus integer modpol = modulus polynomial prime = 1 if mod is prime, 2 if mod is squarefree, 0 else V = variable list *) PROCEDURE DDIF(A,B: LIST): LIST; (*Domain difference. c=a-b. *) VAR AL, AP, BL, BP, C, CL, M, p: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); FIRST2(AP,p,M); ADV(B, BL,BP); (*2*) (*compute. *) CL:=FFDIF(p,M,AL,BL); (*3*) (*create. *) C:=COMP(CL,AP); (*6*) RETURN(C); END DDIF; PROCEDURE DEXP(A,NL: LIST): LIST; (*Domain exponentiation. c=a**nl. *) VAR AL, AP, C, CL, M, p: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); FIRST2(AP,p,M); (*2*) (*compute. *) CL:=FFEXP(p,M,AL,NL); (*3*) (*create. *) C:=COMP(CL,AP); (*6*) RETURN(C); END DEXP; PROCEDURE DFI(D, A: LIST): LIST; (*Domain from integer. D is a domain element with descriptor, A is an integer. *) VAR C, CL, p, M: LIST; BEGIN (*1*) (*select. *) D:=RED(D); FIRST2(D,p,M); (*2*) (*compute. *) CL:=FFFINT(p,M,A); (*3*) (*create. *) C:=COMP(CL,D); (*5*) RETURN(C); END DFI; PROCEDURE DFIP(D, A: LIST): LIST; (*Domain from integral polynomial. D is a domain element with descriptor, A is an integral polynomial in 1 variables. *) VAR C, CL, M, p, BL, DL: LIST; BEGIN (*1*) (*select. *) D:=RED(D); FIRST2(D,p,M); (*2*) (*compute. *) CL:=FFHOM(p,M,A); (*3*) (*create. *) C:=COMP(DL,D); (*5*) RETURN(C); END DFIP; PROCEDURE DINV(A: LIST): LIST; (*Domain inverse. c=1/a. *) VAR AL, AP, C, CL, M, p: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); FIRST2(AP,p,M); (*2*) (*compute. *) CL:=FFINV(p,M,AL); (*3*) (*create. *) C:=COMP(CL,AP); (*6*) RETURN(C); END DINV; PROCEDURE DINVT(A: LIST): LIST; (*Domain inverse existence test. tl=1 if a is invertible, tl=0 else. *) VAR AL, AP, TL: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); (*2*) (*compute. *) TL:=0; IF AL <> 0 THEN TL:=THIRD(AP); IF TL <> 1 THEN TL:=0 END; END; (*5*) RETURN(TL); END DINVT; PROCEDURE DNEG(A: LIST): LIST; (*Domain negative. c=-a. *) VAR AL, AP, C, CL, M, p: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); FIRST2(AP,p,M); (*2*) (*compute. *) CL:=FFNEG(p,M,AL); (*3*) (*create. *) C:=COMP(CL,AP); (*6*) RETURN(C); END DNEG; PROCEDURE DONE(A: LIST): LIST; (*Domain one. sl=1 if a=1, sl ne 1 else. *) VAR AL, AP, SL: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); (*2*) (*compute. *) SL:=FFONE(AL); (*5*) RETURN(SL); END DONE; PROCEDURE DPNF(G,P: LIST): LIST; (* domain polynomial normalform. G is a list of polynomials in distributive representation with coefficients from the domain, P is a polynomial as above, h is a polynomial such that P is reducible to h modulo G and h is in normalform with respect to G *) BEGIN RETURN(DIPNOR(G,P)); END DPNF; PROCEDURE DPROD(A,B: LIST): LIST; (*Domain product. c=a*b. *) VAR AL, AP, BL, BP, C, CL, M, p: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); FIRST2(AP,p,M); ADV(B, BL,BP); (*2*) (*compute. *) CL:=FFPROD(p,M,AL,BL); (*3*) (*create. *) C:=COMP(CL,AP); (*6*) RETURN(C); END DPROD; PROCEDURE DPSP(A,B: LIST): LIST; (* domain polynomial S-polynomial. A and B are polynomials in distributive representation with coefficients from the domain, S is the S-polynomial of A and B *) BEGIN RETURN(DIPSP(A,B)); END DPSP; PROCEDURE DPSUGNF(G,P: LIST): LIST; (* domain polynomial normal with sugar strategy normalform. G is a list of extended polynomials in distributive representation with coefficients from the domain, P is an extended polynomial as above, h is an extended polynomial such that P is reducible to h modulo G and h is in normalform with respect to G *) BEGIN RETURN(EDIPSUGNOR(G,P)); END DPSUGNF; PROCEDURE DPSUGSP(A,B: LIST): LIST; (* domain polynomial normal with sugar strategy S-polynomial. A and B are extended polynomials in distributive representation with coefficients from the domain, S is the extended S-polynomial of A and B *) BEGIN RETURN(EDIPSUGSP(A,B)); END DPSUGSP; PROCEDURE DQUOT(A,B: LIST): LIST; (*Domain quotient. c=a/b. *) VAR AL, AP, BL, BP, C, CL, M, p: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); FIRST2(AP,p,M); ADV(B, BL,BP); (*2*) (*compute. *) CL:=FFQ(p,M,AL,BL); (*3*) (*create. *) C:=COMP(CL,AP); (*6*) RETURN(C); END DQUOT; PROCEDURE DREAD(D: LIST): LIST; (*Domain read. d is the domain element with descriptor. *) VAR C, CL, M, p, RL, V, BL, DL, X: LIST; BEGIN (*1*) (*select. *) D:=RED(D); ADV2(D,p,M,X); V:=SECOND(X); (*2*) (*read and convert. *) CL:=FFREAD(V); DL:=FFHOM(p,M,CL); (*3*) (*create. *) C:=COMP(DL,D); (*5*) RETURN(C); END DREAD; PROCEDURE DSIGN(A: LIST): LIST; (*Domain sign. cl=sign(a). *) VAR AL, SL: LIST; BEGIN (*1*) (*advance. *) AL:=FIRST(A); (*2*) (*compute. *) IF AL = 0 THEN SL:=0 ELSE SL:=1 END; (*5*) RETURN(SL); END DSIGN; PROCEDURE DSUM(A,B: LIST): LIST; (*Domain sum. c=a+b. *) VAR AL, AP, BL, BP, C, CL, M, p: LIST; BEGIN (*1*) (*advance. *) ADV(A, AL,AP); FIRST2(AP,p,M); ADV(B, BL,BP); (*2*) (*compute. *) CL:=FFSUM(p,M,AL,BL); (*3*) (*create. *) C:=COMP(CL,AP); (*6*) RETURN(C); END DSUM; PROCEDURE DWRIT(A: LIST); (*Domain write. *) VAR AL, AP, SL, M, p, I, PL, CL, N, J, V: LIST; BEGIN (*1*) (*advance. *) ADV(A,AL,AP); V:=FOURTH(AP); (*2*) (*write. *) FFWRITE(AL,V); (*5*) RETURN; END DWRIT; PROCEDURE DDDRD(): LIST; (*Domain, domain descriptor read. A domain element with descriptor D is read from the input stream. *) VAR c, D, PL, pl, M, p, V, RL, L: LIST; BEGIN (*1*) (*initialization. *) p:=0; PL:=0; M:=0; V:=SIL; D:=LIST4(p,M,PL,V); D:=COMP(0,D); (*2*) (*read, syntax = (mod, var, pol). *) c:=CREADB(); IF c <> MASORD("(") THEN BKSP; ERROR(severe,"FF domain read: '(' expected."); RETURN(D) END; c:=CREADB(); BKSP; IF NOT DIGIT(c) THEN ERROR(severe,"FF domain read: 'modulus' expected."); RETURN(D) END; p:=IREAD(); c:=CREADB(); IF c <> MASORD(",") THEN BKSP; ERROR(severe,"FF domain read: ',' expected."); RETURN(D) END; c:=CREADB(); BKSP; IF NOT LETTER(c) THEN ERROR(severe,"FF domain read: 'variable' expected."); RETURN(D) END; V:=VREAD(); V:=LIST1(V); c:=CREADB(); IF c <> MASORD(",") THEN BKSP; ERROR(severe,"FF domain read: ',' expected."); RETURN(D) END; M:=DIIPRD(V); PFDIP(M, RL,M); c:=CREADB(); IF c <> MASORD(")") THEN BKSP; ERROR(severe,"FF domain read: ')' expected."); RETURN(D) END; (*3*) (*check for prime or squarefree. *) PL:=1; pl:=1; L:=IFACT(p); IF RED(L) <> SIL THEN OWRITE(L); BLINES(0); ERROR(harmless,"Warning: .. not prime number. "); pl:=0; END; L:=MUPSFF(p,M); IF RED(L) <> SIL THEN OWRITE(L); BLINES(0); ERROR(harmless,"Warning: .. not squarefree. "); PL:=0; ELSE L:=MUPFBL(p,M); IF RED(L) <> SIL THEN OWRITE(L); BLINES(0); ERROR(harmless,"Warning: .. not prime. "); PL:=2; ELSE PL:=1; END; END; PL:=PL*pl; D:=LIST4(p,M,PL,V); D:=COMP(0,D); (*5*) RETURN(D); END DDDRD; PROCEDURE DDDWR(D: LIST); (*Domain, domain descriptor write. d is a domain element with descriptor. d is written to the output stream. *) VAR AL, AP, M, p, PL, CL, V: LIST; BEGIN (*1*) (*select. *) ADV(D,AL,AP); FIRST4(AP,p,M,PL,V); (*2*) (*write. *) SWRITE("( "); IWRITE(p); SWRITE(", "); CLOUT(FIRST(V)); SWRITE(", "); CL:=DIPFP(1,M); DIIPWR(CL,V); SWRITE(" )"); SWRITE(" (* "); IF PL <> 1 THEN SWRITE("not ") END; SWRITE(" prime. *) "); (*5*) RETURN; END DDDWR; PROCEDURE DomLoadFF(); (*Domain load finite field. *) VAR d: Domain; BEGIN (*1*) d:=NewDom("FF","Finite Field"); DOMFFD:=d; (*2*) SetDifFunc(d,DDIF); SetExpFunc(d,DEXP); SetFIntFunc(d,DFI); SetFIPolFunc(d,DFIP); SetInvFunc(d,DINV); SetInvTFunc(d,DINVT); SetNegFunc(d,DNEG); SetOneFunc(d,DONE); SetProdFunc(d,DPROD); SetQuotFunc(d,DQUOT); SetReadFunc(d,DREAD); SetSignFunc(d,DSIGN); SetSumFunc(d,DSUM); SetWritFunc(d,DWRIT); SetDdrdFunc(d,DDDRD); SetDdwrFunc(d,DDDWR); (*3*) SetPNormFunc(d,DPNF); SetPSpolFunc(d,DPSP); SetPSugNormFunc(d,DPSUGNF); SetPSugSpolFunc(d,DPSUGSP); (*9*) END DomLoadFF; END DOMFF. (* -EOF- *)