INTERFACE MPNat; (* This interface defines types, constants, procedures, etc. defined in the package GNU Multi Precision (gmp - file "gmp.h"). We will restrict us to multiple precision integers (MPInt) functions, that is, we'll not define constants and procedures for rational and float operations as defined in "gmp.h". Created in Jun 03, 1997 by Marcus Vinicius A. Andrade. *) IMPORT Ctypes; TYPE mp_limbT = Ctypes.unsigned_int; (* a piece of an unsigned MPInt *) mp_limbSignedT = Ctypes.int; (* a piece of a signed MPInt *) mp_ptr = UNTRACED REF mp_limbT; (* a reference to a piece of a MPInt *) mp_srcptr = UNTRACED REF mp_limbT; mp_sizeT = Ctypes.long; mp_expT = Ctypes.long; T = mp_ptr; CONST BYTE_SIZE = 8; (* number of bits in a byte *) WORD_SIZE = BITSIZE(INTEGER); (* number of bits in an INTEGER *) DIGIT_SIZE = BITSIZE(mp_limbT); (* number of bits per digit *) (* --------------Constants defined in MPN ("gmp-mparam.h") ------------ *) CONST BITS_PER_MP_LIMB = 32; BYTES_PER_MP_LIMB = BITS_PER_MP_LIMB DIV BYTE_SIZE; BITS_PER_LONGINT = 32; BITS_PER_INT = 32; BITS_PER_SHORTINT = 16; BITS_PER_CHAR = 8; (* ---------------------- Addition Procedures -------------------------- *) <* EXTERNAL "__mpn_add_n" *> PROCEDURE Add_n(r: mp_ptr; a,b: mp_ptr; size: mp_sizeT) : mp_limbT; <* EXTERNAL "__mpn_add_1" *> PROCEDURE Add_1(r: mp_ptr; a: mp_ptr; size: mp_sizeT; b: mp_limbT): mp_limbT; <* EXTERNAL "__mpn_add" *> PROCEDURE Add (r: mp_ptr; a: mp_ptr; a_size: mp_sizeT; b: mp_ptr; b_size: mp_sizeT): mp_limbT; (* ------------------ Subtraction Procedures -------------------------- *) <* EXTERNAL "__mpn_sub_n" *> PROCEDURE Sub_n(r: mp_ptr; a,b: mp_ptr; size: mp_sizeT): mp_limbT; <* EXTERNAL "__mpn_sub_1" *> PROCEDURE Sub_1(r: mp_ptr; a: mp_ptr; size: mp_sizeT; b: mp_limbT): mp_limbT; <* EXTERNAL "__mpn_sub" *> PROCEDURE Sub (r: mp_ptr; a: mp_ptr; a_size: mp_sizeT; b: mp_ptr; b_size: mp_sizeT): mp_limbT; (* ------------------ Multiplication Procedures ---------------------- *) <* EXTERNAL "__mpn_mul_n" *> PROCEDURE Mul_n(r: mp_ptr; a,b: mp_ptr; size: mp_sizeT); <* EXTERNAL "__mpn_mul_1" *> PROCEDURE Mul_1(r: mp_ptr; a: mp_ptr; size: mp_sizeT; b: mp_limbT): mp_limbT; <* EXTERNAL "__mpn_addmul_1" *> PROCEDURE AddMul_1(r: mp_ptr; a: mp_ptr; size: mp_sizeT; b: mp_limbT): mp_limbT; <* EXTERNAL "__mpn_submul_1" *> PROCEDURE SubMul_1(r: mp_ptr; a: mp_ptr; size: mp_sizeT; b: mp_limbT): mp_limbT; <* EXTERNAL "__mpn_mul" *> PROCEDURE Mul(r: mp_ptr; a: mp_ptr; a_size: mp_sizeT; b: mp_ptr; b_size: mp_sizeT): mp_limbT; (* ------------------ Division Procedures ---------------------------- *) <* EXTERNAL "__mpn_divrem" *> PROCEDURE DivRem(q: mp_ptr; xsize: mp_sizeT; a: mp_ptr; a_size: mp_sizeT; b: mp_ptr; b_size: mp_sizeT): mp_limbT; <* EXTERNAL "__mpn_divrem_1" *> PROCEDURE Div_1(q: mp_ptr; xsize: mp_sizeT; a: mp_ptr; a_size: mp_sizeT; b: mp_limbT): mp_limbT; <* EXTERNAL "__mpn_mod_1" *> PROCEDURE Mod_1(a: mp_ptr; a_size: mp_sizeT; b: mp_limbT): mp_limbT; <* EXTERNAL "__mpn_divmod_1" *> PROCEDURE DivMod_1(r: mp_ptr; a: mp_ptr; a_size: mp_sizeT; d: mp_limbT): mp_limbT; (* <* EXTERNAL "__mpn_bdivmod" *> PROCEDURE DivMod(r: mp_ptr; a: mp_ptr; a_size: mp_sizeT; b: mp_ptr; b_size: mp_sizeT; d: mp_limbT): mp_limbT; *) (* ------------------ Shift Procedures ------------------------------- *) <* EXTERNAL "__mpn_lshift" *> PROCEDURE LShift(r: mp_ptr; a: mp_ptr; a_size: mp_sizeT; d: Ctypes.unsigned_long_int): mp_limbT; <* EXTERNAL "__mpn_rshift" *> PROCEDURE RShift(r: mp_ptr; a: mp_ptr; a_size: mp_sizeT; d: Ctypes.unsigned_long_int): mp_limbT; (* ------------------ Comparasion Procedures ------------------------- *) <* EXTERNAL "__mpn_cmp" *> PROCEDURE Cmp(a,b: mp_ptr; size: mp_sizeT): Ctypes.int; (* ------------------ GCD Procedures --------------------------------- *) <* EXTERNAL "__mpn_gcd" *> PROCEDURE GCD(r: mp_ptr; a: mp_ptr; a_size: mp_sizeT; b: mp_ptr; b_size: mp_sizeT): mp_limbT; <* EXTERNAL "__mpn_gcd_1" *> PROCEDURE GCD_1(a: mp_ptr; a_size: mp_sizeT; b: mp_limbT): mp_limbT; <* EXTERNAL "__mpn_gcdext" *> PROCEDURE GCDExt(r1,r2: mp_ptr; a: mp_ptr; a_size: mp_sizeT; b: mp_ptr; b_size: mp_sizeT): mp_sizeT; (* ------------------ Sqrt Procedures -------------------------------- *) <* EXTERNAL "__mpn_sqrtrem" *> PROCEDURE Sqrt(r1,r2: mp_ptr; a: mp_ptr; a_size: mp_sizeT): mp_sizeT; (* ------------------ Input/Output Procedures ------------------------ *) <* EXTERNAL "__mpn_get_str" *> PROCEDURE getstr(str: Ctypes.unsigned_char_star; base: Ctypes.int; s: mp_ptr; size: mp_sizeT): mp_sizeT; <* EXTERNAL "__mpn_set_str" *> PROCEDURE setstr(r: mp_ptr; str: Ctypes.unsigned_char_star; strsize: mp_sizeT; base: Ctypes.int): mp_sizeT; <* EXTERNAL "__mpn_scan0" *> PROCEDURE scan0(r: mp_ptr; bit: Ctypes.unsigned_long_int): Ctypes.unsigned_long_int; <* EXTERNAL "__mpn_scan1" *> PROCEDURE scan1(r: mp_ptr; bit: Ctypes.unsigned_long_int): Ctypes.unsigned_long_int; <* EXTERNAL "__mpn_random2" *> PROCEDURE random2(r: mp_ptr; rsize: mp_sizeT); <* EXTERNAL "__mpn_popcount" *> PROCEDURE PopCount(r: mp_ptr; size: Ctypes.unsigned_long_int): Ctypes.unsigned_long_int; <* EXTERNAL "__mpn_hamdist" *> PROCEDURE HamDist(r,s: mp_ptr; size: Ctypes.unsigned_long_int): Ctypes.unsigned_long_int; (* ------------------ Perfect Square Procedures --------------------- *) <* EXTERNAL "__mpn_perfect_square_p" *> PROCEDURE PerfectSquare(s: mp_ptr; size: mp_sizeT): Ctypes.int; END MPNat.