```(* ----------------------------------------------------------------------------
* \$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 \$";

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;
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- *)
```