(* ----------------------------------------------------------------------------
 * $Id: DIPIPOL.mi,v 1.3 1992/10/15 16:28:36 kredel Exp $
 * ----------------------------------------------------------------------------
 * This file is part of MAS.
 * ----------------------------------------------------------------------------
 * Copyright (c) 1989 - 1992 Universitaet Passau
 * ----------------------------------------------------------------------------
 * $Log: DIPIPOL.mi,v $
 * Revision 1.3  1992/10/15  16:28:36  kredel
 * Changed rcsid variable
 *
 * Revision 1.2  1992/02/12  17:33:51  pesch
 * Moved CONST definition to the right place
 *
 * Revision 1.1  1992/01/22  15:14:03  kredel
 * Initial revision
 *
 * ----------------------------------------------------------------------------
 *)

IMPLEMENTATION MODULE DIPIPOL;

(* DIP Integer Polynomial Implementation Module. *)



(* Import lists and declarations. *)

FROM MASSTOR IMPORT INV, LIST, SIL, BETA, ADV, 
                    SFIRST, SRED, COMP, FIRST, RED, LENGTH;

FROM SACLIST IMPORT LIST2, FIRST2, COMP2, LIST3;

FROM SACD IMPORT DRANN, DQR;

FROM SACI IMPORT IRAND;

FROM SACIPOL IMPORT IPABS, IPPROD, IPIP, IPSUM;

CONST rcsidi = "$Id: DIPIPOL.mi,v 1.3 1992/10/15 16:28:36 kredel Exp $";
CONST copyrighti = "Copyright (c) 1989 - 1992 Universitaet Passau";



PROCEDURE VIPIIP(RL,A,B: LIST): LIST;
(*Vector of integral polynomials with vector of integers inner product. 
A is a vector of integral polynomials in r variables, r non-negative.
B is a vector of integers. C is the inner product of A and B.*)
VAR  AL, AP, BL, BP, CL, C: LIST;
BEGIN
(*1*) (*a=0 or b=0.*) C:=0;
      IF (A = SIL) OR (B = SIL) THEN RETURN(C); END;
(*2*) (*general case.*) AP:=A; BP:=B;
      REPEAT ADV(AP, AL,AP); ADV(BP, BL,BP);
             CL:=IPIP(RL,BL,AL); C:=IPSUM(RL,C,CL); 
             UNTIL AP = SIL;
      RETURN(C);
(*5*) END VIPIIP;


PROCEDURE HIPRAN(RL,KL,QL,NL: LIST): LIST; 
(*Homogeneous integral polynomial random.  k is a positive
beta-digit. q is a rational number q1/q2 with
0 lt q1 le q2 lt beta. n is a non-negative beta-digit
r ge 0.  A is a random homogeneous integral polynomial
in r variables with homogeneous degree n. max norm of
A lt 2**k and q is the probability that any
particular term of A has a non-zero coefficient.*)
VAR  A, AL, DL, EL, J1Y, QL1, QL2, QLS, RLP, TL: LIST; 
BEGIN
(*1*) (*rl gt 1.*) 
      IF RL > 1 THEN RLP:=RL-1; A:=BETA; EL:=0; 
         WHILE EL <= NL DO J1Y:=NL-EL; AL:=HIPRAN(RLP,KL,QL,J1Y); 
               IF AL <> 0 THEN A:=COMP2(EL,AL,A); END; 
               EL:=EL+1; END; 
         IF A = SIL THEN A:=0; END; 
         RETURN(A); END; 
(*2*) (*compute qls=int(ql*beta).*) FIRST2(QL, QL1,QL2); 
      DQR(QL1,0,QL2, QLS,TL); A:=0; AL:=0; DL:=DRANN(); 
      IF DL < QLS THEN AL:=IRAND(KL); END; 
      IF AL = 0 THEN RETURN(A); END; 
(*3*) (*rl=1 or 0.*) 
      IF RL = 0 THEN A:=AL; ELSE A:=LIST2(NL,AL); END; 
      RETURN(A); 
(*6*) END HIPRAN; 


PROCEDURE IPRAN(RL,KL,QL,N: LIST): LIST; 
(*Integral polynomial random.  k is a positive beta-digit.
q is a rational number q1/q2 with 0 lt q1 le q2 lt beta.
N is a list (n sub r, ...,n sub 1) of non-negative beta-digits
r ge 0.  A is a random integral polynomial in r variables
with deg sub i of a le n sub i + 1 for 1 le i le r.
Max norm of A lt 2**k and q is the probability that any
particular term of A has a non-zero coefficient. Modified
version, original version by G. E. Collins. *)
VAR  A, AL, DL, EL, NL, NP, QL1, QL2, QLS, RLP, TL: LIST; 
BEGIN
(*1*) (*compute qls=int(ql*beta).*) FIRST2(QL, QL1,QL2); 
      DQR(QL1,0,QL2, QLS,TL); 
(*2*) (*rl=0.*) 
      IF RL = 0 THEN DL:=DRANN(); 
         IF DL < QLS THEN A:=IRAND(KL); ELSE A:=0; END; 
         RETURN(A); END; 
(*3*) (*rl gt 0.*) RLP:=RL-1; ADV(N, NL,NP); A:=BETA; EL:=0; 
      WHILE EL <= NL DO
            IF RLP = 0 THEN DL:=DRANN(); 
               IF DL < QLS THEN AL:=IRAND(KL); ELSE AL:=0; END; 
               ELSE AL:=IPRAN(RLP,KL,QL,NP); END; 
            IF AL <> 0 THEN A:=COMP2(EL,AL,A); END; 
            EL:=EL+1; END; 
      IF A = SIL THEN A:=0; END; 
      RETURN(A); 
(*6*) END IPRAN; 


END DIPIPOL.


(* -EOF- *)