INTERFACEBigIntegerRep ;
Arithmetic for Modula-3, see doc for detailsConcrete type of Value and implementation of unsigned arithmetic.
IMPORT Word AS W; IMPORT BigInteger AS BI; FROM Arithmetic IMPORT Error; REVEAL BI.Value = BRANDED "BigIntegerValue" REF ARRAY OF W.T; TYPE Value = BI.Value; T = BI.T; QuotRem = BI.QuotRem; PROCEDURE Clear ( (*OUT*)v: Value; ); PROCEDURE MinMax (VAR min, max: INTEGER; a, b: INTEGER; ); PROCEDURE CorrectSize (VAR x: T; start: INTEGER; ); PROCEDURE AddU (READONLY x, y: T; ): T; PROCEDURE SubU (READONLY x, y: T; ): T; PROCEDURE CompareU (READONLY x, y: T; ): [-1 .. 1]; PROCEDURE MulU (READONLY x, y: T; ): T; PROCEDURE DivModU (x, y: T; ): QuotRem RAISES {Error}; TYPE BitPos = RECORD word: INTEGER; bit : [0 .. W.Size - 1]; END; PROCEDURE AddBitPos (READONLY x, y: BitPos; ): BitPos; (* only for testing *) PROCEDURE SubBitPos (READONLY x, y: BitPos; ): BitPos; PROCEDURE CompareBitPos (READONLY x, y: BitPos; ): [-1 .. 1]; PROCEDURE BitPosEndToBegin (READONLY x: BitPos; ): BitPos; PROCEDURE GetMSBPos (READONLY x: T; ): BitPos; PROCEDURE GetSubword (READONLY x: T; sh: BitPos; ): W.T; PROCEDURE SubShiftedProd (VAR x: T; READONLY y: T; z: W.T; sh: BitPos; ); PROCEDURE AddShifted (VAR x: T; y: W.T; sh: BitPos; ); END BigIntegerRep.