INTERFACEBigInteger ;
Arithmetic for Modula-3, see doc for detailsAbstract: Integers of arbitrary size
DragonInt seems to be less flexible and lacks some essential operations like multiplication and division.
Daniel Beer, Henning Thielemann
FROM Arithmetic IMPORT Error; CONST Brand = "BigInteger";
BigIntegers are immutable, do not change them manually, because some routines use references to existing BigIntegers for performance reasons.
TYPE Value <: REFANY; T = RECORD data: Value; size: INTEGER; (* not all entries in 'data' may be used *) sign: BOOLEAN; END; QuotRem = RECORD quot, rem: T END; PROCEDURE FromInteger (x: INTEGER; ): T; PROCEDURE ToInteger (READONLY x: T; ): INTEGER; PROCEDURE Copy (READONLY x: T; ): T; VAR (*CONST*) Zero, (*CONST*) One, (*CONST*) Two, (*CONST*) MinusOne: T; PROCEDURE Add (READONLY x, y: T; ): T; PROCEDURE Sub (READONLY x, y: T; ): T; <* INLINE *> PROCEDURE Neg (READONLY x: T; ): T; <* INLINE *> PROCEDURE Conj (READONLY x: T; ): T; <* INLINE *> PROCEDURE IsZero (READONLY x: T; ): BOOLEAN; PROCEDURE Equal (READONLY x, y: T; ): BOOLEAN; PROCEDURE Compare (READONLY x, y: T; ): [-1 .. 1]; PROCEDURE Mul (READONLY x, y: T; ): T; PROCEDURE Div (READONLY x, y: T; ): T RAISES {Error}; PROCEDURE Rec (READONLY x: T; ): T RAISES {Error}; PROCEDURE Mod (READONLY x, y: T; ): T RAISES {Error}; PROCEDURE DivMod (READONLY x, y: T; ): QuotRem RAISES {Error}; END BigInteger.