with Multprec_Natural_Numbers; use Multprec_Natural_Numbers; package Multprec_Integer_Numbers is -- DESCRIPTION : -- This package allows to manipulate integer numbers of arbitrary length. -- The operations are such that this is a faithful representation of the -- integers as an Euclidean domain. -- DATA STRUCTURES : type Integer_Number is private; -- CREATORS : function Create ( n : Natural_Number ) return Integer_Number; function Create ( n : Array_of_Naturals ) return Integer_Number; function Create ( i : integer ) return Integer_Number; -- DESCRIPTION : -- Returns the representation as a natural number. function Convert ( n : Natural_Number ) return Integer_Number; -- DESCRIPTION : -- This operation has the same effect as create, except that -- n and i := Convert(n), share the same number: if n changes -- after conversion, i will change as well, and vice versa. -- This operation can be useful for integer/natural arithmetic. function Create ( i : Integer_Number ) return integer; -- DESCRIPTION : -- Returns the representation of i as a standard integer. -- REQUIRED : i < Natural_Numbers.Basis. -- SELECTORS : function Empty ( i : Integer_Number ) return boolean; -- DESCRIPTION : -- Returns true if the number has not been created yet, or when it has -- been destroyed by the operation Clear; otherwise false is returned. -- An empty number is considered as zero. function Size ( i : Integer_Number ) return natural; -- DESCRIPTION : -- Returns the index of the last entry in the coefficient representation. function Coefficient ( i : Integer_Number; k : natural ) return natural; -- DESCRIPTION : -- Returns the kth component in the coefficient representation of i. function Coefficients ( i : Integer_Number ) return Array_of_Naturals; -- DESCRIPTION : -- Returns the coefficient representation of the unsigned integer. function Decimal_Places ( i : Integer_Number ) return natural; -- DESCRIPTION : -- Returns the number of decimal places of i. -- The number of decimal places of 0 is 0. function Positive ( i : Integer_Number ) return boolean; function Negative ( i : Integer_Number ) return boolean; -- DESCRIPTION : -- If i > 0, then Positive(i) and not Negative(i). -- If i < 0, then not Positive(i) and Negative(i). -- For i = 0, sign switching by Min(i) can give either +0 or -0. function Sign ( i : Integer_Number ) return integer; -- DESCRIPTION : -- Returns +1,-1, or 0, depending whether i > 0, i < 0, or i = 0. function Unsigned ( i : Integer_Number ) return Natural_Number; -- DESCRIPTION : -- Returns the unsigned integer number. -- Note that this is a pointer with data sharing! -- COMPARISON AND COPYING : function Equal ( i1 : Integer_Number; i2 : integer ) return boolean; function Equal ( i1,i2 : Integer_Number ) return boolean; -- DESCRIPTION : -- Returns true when both numbers i1 and i2 are equal, false otherwise. function "<" ( i1 : Integer_Number; i2 : integer ) return boolean; function "<" ( i1 : integer; i2 : Integer_Number ) return boolean; function "<" ( i1,i2 : Integer_Number ) return boolean; -- DESCRIPTION : -- Returns true if i1 < i2, false otherwise. function ">" ( i1 : Integer_Number; i2 : integer ) return boolean; function ">" ( i1 : integer; i2 : Integer_Number ) return boolean; function ">" ( i1,i2 : Integer_Number ) return boolean; -- DESCRIPTION : -- Returns true if i1 > i2, false otherwise. procedure Copy ( i1 : in integer; i2 : in out Integer_Number ); procedure Copy ( i1 : in Integer_Number; i2 : in out Integer_Number ); -- DESCRIPTION : -- Clears i2 and makes a copy of i1 to be equal to i2. -- Note that i2 := i1 leads to data sharing. -- ARITHMETIC OPERATIONS as functions (no data sharing) : function "+" ( i1 : Integer_Number; i2 : integer ) return Integer_Number; function "+" ( i1 : integer; i2 : Integer_Number ) return Integer_Number; function "+" ( i1,i2 : Integer_Number ) return Integer_Number; function "+" ( i : Integer_Number ) return Integer_Number; -- copies i function "-" ( i : Integer_Number ) return Integer_Number; function "-" ( i1 : Integer_Number; i2 : integer ) return Integer_Number; function "-" ( i1 : integer; i2 : Integer_Number ) return Integer_Number; function "-" ( i1,i2 : Integer_Number ) return Integer_Number; function "*" ( i1 : Integer_Number; i2 : integer ) return Integer_Number; function "*" ( i1 : integer; i2 : Integer_Number ) return Integer_Number; function "*" ( i1,i2 : Integer_Number ) return Integer_Number; function "**" ( i : Integer_Number; n : natural ) return Integer_Number; function "**" ( i : integer; n : Natural_Number ) return Integer_Number; function "**" ( i : Integer_Number; n : Natural_Number ) return Integer_Number; function "/" ( i1 : Integer_Number; i2 : integer ) return Integer_Number; function "/" ( i1 : integer; i2 : Integer_Number ) return integer; function "/" ( i1,i2 : Integer_Number ) return Integer_Number; function Rmd ( i1 : Integer_Number; i2 : integer ) return integer; function Rmd ( i1 : integer; i2 : Integer_Number ) return integer; function Rmd ( i1,i2 : Integer_Number ) return Integer_Number; -- ARITHMETIC OPERATIONS as procedures for memory management : procedure Add ( i1 : in out Integer_Number; i2 : in integer ); -- "+" procedure Add ( i1 : in out Integer_Number; i2 : in Integer_Number ); procedure Min ( i : in out Integer_Number ); procedure Sub ( i1 : in out Integer_Number; i2 : in integer ); -- "-" procedure Sub ( i1 : in out Integer_Number; i2 : in Integer_Number ); procedure Mul ( i1 : in out Integer_Number; i2 : in integer ); -- "*" procedure Mul ( i1 : in out Integer_Number; i2 : in Integer_Number ); procedure Rmd ( i1 : in out Integer_Number; i2 : in integer ); procedure Rmd ( i1 : in out Integer_Number; i2 : in Integer_Number ); procedure Div ( i1 : in out Integer_Number; i2 : in integer ); -- "/" procedure Div ( i1 : in out Integer_Number; i2 : in Integer_Number ); procedure Div ( i1 : in Integer_Number; i2 : in integer; -- i1 = i2*q+r q : out Integer_Number; r : out integer ); procedure Div ( i1 : in out Integer_Number; i2 : in integer; r : out integer ); procedure Div ( i1,i2 : in Integer_Number; q,r : out Integer_Number ); procedure Div ( i1 : in out Integer_Number; i2 : in Integer_Number; r : out Integer_Number ); -- DESTRUCTOR : procedure Clear ( i : in out Integer_Number ); -- DESCRIPTION : -- Deallocation of the memory space. Empty(i) is true on return. private type Integer_Number_Rep; type Integer_Number is access Integer_Number_Rep; end Multprec_Integer_Numbers;