(* ---------------------------------------------------------------------------- * $Id: SACANF.mi,v 1.3 1992/10/15 16:28:54 kredel Exp $ * ---------------------------------------------------------------------------- * This file is part of MAS. * ---------------------------------------------------------------------------- * Copyright (c) 1989 - 1992 Universitaet Passau * ---------------------------------------------------------------------------- * $Log: SACANF.mi,v $ * Revision 1.3 1992/10/15 16:28:54 kredel * Changed rcsid variable * * Revision 1.2 1992/02/12 17:34:44 pesch * Moved CONST definition to the right place * * Revision 1.1 1992/01/22 15:15:50 kredel * Initial revision * * ---------------------------------------------------------------------------- *) IMPLEMENTATION MODULE SACANF; (* SAC Algebraic Number Field Implementation Module. *) (* import lists and declarations. *) FROM MASSTOR IMPORT LIST, SIL, BETA, LIST1, SFIRST, SRED, LENGTH, INV, FIRST, RED, COMP, ADV; FROM SACLIST IMPORT LIST3, CONC, CINV, ADV2, COMP2, FIRST2, EQUAL, RED2, SECOND, LIST2; FROM SACRN IMPORT RNSIGN, RNINT, RNINV, RNNEG; FROM SACPOL IMPORT PLDCF, PDEG, PBIN; FROM SACIPOL IMPORT IUPBES; FROM SACPGCD IMPORT IPPGSD, IPSRP; FROM SACRPOL IMPORT RPSUM, RPRNP, RPNEG, RPDIF, RPQR, RPPROD; FROM SACROOT IMPORT IUPVSI, RIB; CONST rcsidi = "$Id: SACANF.mi,v 1.3 1992/10/15 16:28:54 kredel Exp $"; CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau"; PROCEDURE AFDIF(AL,BL: LIST): LIST; (*Algebraic number field element difference. AL and BL are elements of Q(alpha) for some algebraic number alpha. CL=AL-BL.*) VAR CL: LIST; BEGIN (*1*) CL:=RPDIF(1,AL,BL); RETURN(CL); (*4*) END AFDIF; PROCEDURE AFINV(M,AL: LIST): LIST; (*Algebraic number field inverse. AL is a nonzero element of Q(alpha) for some algebraic number alpha. M is the rational minimal polynomial for alpha. BL=1/AL.*) VAR AL1, AL2, AL3, BL, CL, J1Y, QL, RL, VL1, VL2, VL3: LIST; BEGIN (*1*) AL1:=M; AL2:=AL; VL1:=0; RL:=RNINT(1); VL2:=LIST2(0,RL); LOOP J1Y:=PLDCF(AL2); CL:=RNINV(J1Y); VL2:=RPRNP(1,CL,VL2); IF PDEG(AL2) = 0 THEN BL:=VL2; RETURN(BL); END; AL2:=RPRNP(1,CL,AL2); RPQR(1,AL1,AL2, QL,AL3); J1Y:=RPPROD(1,QL,VL2); VL3:=RPDIF(1,VL1,J1Y); AL1:=AL2; AL2:=AL3; VL1:=VL2; VL2:=VL3; END; (*4*) RETURN(BL); END AFINV; PROCEDURE AFNEG(AL: LIST): LIST; (*Algebraic number field element negation. AL is an element of Q(alpha) for some algebraic number alpha. BL= -AL.*) VAR BL: LIST; BEGIN (*1*) BL:=RPNEG(1,AL); RETURN(BL); (*4*) END AFNEG; PROCEDURE AFPROD(M,AL,BL: LIST): LIST; (*Algebraic number field element product. AL and BL are elements of Q(alpha) for some algebraic number alpha. M is the minimal polynomial of alpha. CL=AL+BL.*) VAR CL, CLP, QL: LIST; BEGIN (*1*) CLP:=RPPROD(1,AL,BL); RPQR(1,CLP,M, QL,CL); (*4*) RETURN(CL); END AFPROD; PROCEDURE AFQ(M,AL,BL: LIST): LIST; (*Algebraic number field quotient. AL and BL are elements of Q(alpha) for some algebraic number alpha with BL nonzero. M is the minimal polynomial for alpha. CL=AL/BL.*) VAR CL, J1Y: LIST; BEGIN (*1*) IF AL = 0 THEN CL:=0; ELSE J1Y:=AFINV(M,BL); CL:=AFPROD(M,AL,J1Y); END; RETURN(CL); (*4*) END AFQ; PROCEDURE AFSIGN(M,I,AL: LIST): LIST; (*Algebraic number field sign. M is the integral minimal polynomial of a real algebraic number alpha. I is an acceptable isolating interval for alpha. AL is an element of Q(alpha). SL=SIGN(AL).*) VAR ALP, ALS, IS, J1Y, NL, RL, SL, SLH, SLP, SLS, UL, VL, WL: LIST; BEGIN (*1*) (*AL rational.*) IF AL = 0 THEN SL:=0; RETURN(SL); END; IF PDEG(AL) = 0 THEN J1Y:=SECOND(AL); SL:=RNSIGN(J1Y); RETURN(SL); END; (*2*) (*Obtain the greatest squarefree divisor of an integral polynomial similiar to AL.*) IPSRP(1,AL, RL,ALP); SLS:=RNSIGN(RL); ALS:=IPPGSD(1,ALP); IS:=I; FIRST2(IS, UL,VL); SLP:=0; (*3*) (*Obtain an isolating interval for alpha containing no roots of ALS. Return SIGN(AL(alpha)). *) LOOP NL:=IUPVSI(ALS,IS); WL:=RIB(UL,VL); IF NL = 0 THEN SL:=IUPBES(ALP,WL); SL:=SLS*SL; RETURN(SL); END; IF SLP = 0 THEN SLP:=IUPBES(M,VL); END; SLH:=IUPBES(M,WL); IF SLH <> SLP THEN UL:=WL; ELSE VL:=WL; SLP:=SLH; END; IS:=LIST2(UL,VL); END; (*6*) RETURN(SL); END AFSIGN; PROCEDURE AFSUM(AL,BL: LIST): LIST; (*Algebraic number field element sum. AL and BL are elements of Q(alpha) for some algebraic number alpha. CL=AL+BL.*) VAR CL: LIST; BEGIN (*1*) CL:=RPSUM(1,AL,BL); RETURN(CL); (*4*) END AFSUM; PROCEDURE RUPMRN(R: LIST): LIST; (*Rational univariate polynomial minimal polynomial of a rational number. R is a rational number. M is the rational minimal polynomial of R.*) VAR J1Y, J2Y, M: LIST; BEGIN (*1*) J1Y:=RNINT(1); J2Y:=RNNEG(R); M:=PBIN(J1Y,1,J2Y,0); RETURN(M); (*4*) END RUPMRN; END SACANF. (* -EOF- *)