
(* SAC Digit definition module. *)

DEFINITION MODULE SACD;


(* Import lists and Definitions *) 

FROM MASSTOR IMPORT LIST;


VAR THETA, ZETA, DELTA, ETA, EPSIL: LIST;

    
    TABP2: ARRAY[1..64] OF LIST;

    
PROCEDURE BITRAN(): LIST;
(*Bit, random.  b is a random bit, 0 or 1.*)


PROCEDURE DEGCD(AL,BL: LIST; VAR CL,UL,VL: LIST);
(*Digit extended greatest common divisor.  a and b are beta-integers,
a ge b ge 0.  c=GCD(a,b), a beta-integer.  a*u+b*v=c, with
ABS(u) le b/2c, ABS(v) le a/2c.*)


PROCEDURE DGCD(AL,BL: LIST): LIST;
(*Digit greatest common divisor.  a and b are beta-integers,
a ge b ge 0.  c=GCD(a,b).*)


PROCEDURE DLOG2(AL: LIST): LIST;
(*Digit logarithm, base 2.  a is a beta-digit.  If a=0 then n=0.
otherwise n=FLOOR(LOG2(ABS(a)))+1.*)


PROCEDURE DPCC(AL1,AL2: LIST; VAR UL,ULP,VL,VLP: LIST);
(*Digit partial cosequence calculation.  a1 and a2 are beta-integers,
a1 ge a2 gt 0.  u, up, v and vp are the last cosequence elements
of a1 and a2 which can be guaranteed to correspond to correct
quotient digits.*)


PROCEDURE DPR(AL,BL: LIST; VAR CL,DL: LIST);
(*Digit product.  a and b are beta-digits.  c and d are the unique
beta-digits such that a*b=c*beta+d and c*d ge 0.*)


PROCEDURE DQR(AL1,AL0,BL: LIST; VAR QL,RL: LIST);
(*Digit quotient and remainder.  a1, a0 and b are beta-integers with
a1*a0 ge 0 and ABS(b) gt ABS(a1).  q is the integral part of
(a1*beta+a0)/b and r is (a1*beta+a0)-b*q.  q and r are
beta-integers.*)


PROCEDURE DRAN(): LIST;
(*Digit, random.  a is a random beta-digit.*)


PROCEDURE DRANN(): LIST;
(*Digit, random non-negative.  a is a random non-negative beta-digit.
Caution, the low-order bits of a are not very random.*)


PROCEDURE DSQRTF(AL: LIST; VAR BL,TL: LIST);
(*Digit square root function.  a is a non-negative beta-integer.
b is the floor function of the square root of a and t is the sign
of a-b*b.*)


END SACD.


