

DEFINITION MODULE SUPINT;

CONST
   Beta         = 32;			(* Nombre de bits d'un mot machine    *)
   Exposant     = (Beta - 2) DIV 2;     (* Puissance de 2 maximale permettant *)
					(* la multiplication d'entiers sans   *)
                                        (* qu'il y ait de debordement.        *)
   Base         = 32768;   		(* Base dans laquelle les             *)
                                        (* SuperIntegers sont representes     *)
					(* Note: Base = 2 ** Exposant         *)
   LowPower     = 2;			(* La longueur minimale d'un vecteur  *)
                                        (* d'entiers est 2 ** LowPower        *)
   HighPower    = Exposant;             (* La longueur maximale d'un vecteur  *)
					(* d'entiers est 2 ** HighPower       *)
   MaxIndex     = 4095;  		(* Indice maximum d'un vecteur        *)
			   		(* d'entiers. Ici = 2 ** 12 - 1.      *)
TYPE
   Vector = POINTER TO ARRAY [0..MaxIndex] OF LONGINT;
   InfoSuperInteger = RECORD
      Negative  : BOOLEAN;              (* Signe du SuperInteger.             *)
                                        (* TRUE si < 0, FALSE si >= 0.        *)
      SigPos,   			(* Indice du digit le plus            *)
                                        (* significatif du SuperInteger.      *)
                                        (* 0 <= SigPos <= 2 ** Power - 1      *)
                                        (* Note: la position la moins         *)
					(* significative est 0.               *)
      Power     : CARDINAL;		(* Longueur de Digit^ = 2 ** Power.   *)
      Digit     : Vector;		(* Pointeur sur le bloc de memoire    *)
                                        (* contenant les chiffres.            *)
                                        (* La longueur reelle de ce bloc est  *)
                                        (* (2 ** Power) mots memoire.         *)
      END;

   SuperInteger = POINTER TO InfoSuperInteger;

VAR
   TwoExp : ARRAY [0..HighPower] OF CARDINAL; (* Puissances de 2.             *)
   LongBase : LONGINT;


PROCEDURE Create
   ( VAR A : SuperInteger;
     k : CARDINAL
   );


PROCEDURE Delete
   ( VAR A : SuperInteger
   );


PROCEDURE ReleaseStack;


PROCEDURE IncreaseLen
   ( A : SuperInteger
   );

PROCEDURE CopyBlock
   ( VAR AA, AB  : ARRAY OF LONGINT;
     Pos         : CARDINAL;
     k           : INTEGER
   );


PROCEDURE NumDigits
   ( A : SuperInteger
   ) : CARDINAL;


PROCEDURE NumBits
   ( A : SuperInteger
   ) : CARDINAL;


PROCEDURE Affect
   ( A, B : SuperInteger
   );


PROCEDURE Exchange
   ( VAR A, B : SuperInteger
   );

PROCEDURE StringToSup 
   ( S : ARRAY OF CHAR; 
     A : SuperInteger; 
     B : CARDINAL
   );

PROCEDURE ReadSup
   ( A : SuperInteger;
     B : CARDINAL
   );


PROCEDURE WriteSup
   ( A : SuperInteger;
     B : CARDINAL;
     D : CARDINAL
   );


PROCEDURE WriteSupSci
   ( A : SuperInteger;
     B : CARDINAL;
     n : CARDINAL
   );


END SUPINT.
