1/* 2 mpi.h 3 4 by Michael J. Fromberger <sting@linguist.dartmouth.edu> 5 Copyright (C) 1998 Michael J. Fromberger, All Rights Reserved 6 7 Arbitrary precision integer arithmetic library 8 9 $Id: mpi.h,v 1.2 2005/05/05 14:38:47 tom Exp $ 10 */ 11 12#ifndef _H_MPI_ 13#define _H_MPI_ 14 15#include "mpi-config.h" 16 17#define MP_LT -1 18#define MP_EQ 0 19#define MP_GT 1 20 21#if MP_DEBUG 22#undef MP_IOFUNC 23#define MP_IOFUNC 1 24#endif 25 26#if MP_IOFUNC 27#include <stdio.h> 28#include <ctype.h> 29#endif 30 31#include <limits.h> 32 33#define MP_NEG 1 34#define MP_ZPOS 0 35 36/* Included for compatibility... */ 37#define NEG MP_NEG 38#define ZPOS MP_ZPOS 39 40#define MP_OKAY 0 /* no error, all is well */ 41#define MP_YES 0 /* yes (boolean result) */ 42#define MP_NO -1 /* no (boolean result) */ 43#define MP_MEM -2 /* out of memory */ 44#define MP_RANGE -3 /* argument out of range */ 45#define MP_BADARG -4 /* invalid parameter */ 46#define MP_UNDEF -5 /* answer is undefined */ 47#define MP_LAST_CODE MP_UNDEF 48 49#include "mpi-types.h" 50 51/* Included for compatibility... */ 52#define DIGIT_BIT MP_DIGIT_BIT 53#define DIGIT_MAX MP_DIGIT_MAX 54 55/* Macros for accessing the mp_int internals */ 56#define SIGN(MP) ((MP)->sign) 57#define USED(MP) ((MP)->used) 58#define ALLOC(MP) ((MP)->alloc) 59#define DIGITS(MP) ((MP)->dp) 60#define DIGIT(MP,N) (MP)->dp[(N)] 61 62#if MP_ARGCHK == 1 63#define ARGCHK(X,Y) {if(!(X)){return (Y);}} 64#elif MP_ARGCHK == 2 65#include <assert.h> 66#define ARGCHK(X,Y) assert(X) 67#else 68#define ARGCHK(X,Y) /* */ 69#endif 70 71/* This defines the maximum I/O base (minimum is 2) */ 72#define MAX_RADIX 64 73 74typedef struct { 75 mp_sign sign; /* sign of this quantity */ 76 mp_size alloc; /* how many digits allocated */ 77 mp_size used; /* how many digits used */ 78 mp_digit *dp; /* the digits themselves */ 79} mp_int; 80 81/*------------------------------------------------------------------------*/ 82/* Default precision */ 83 84unsigned int mp_get_prec(void); 85void mp_set_prec(unsigned int prec); 86 87/*------------------------------------------------------------------------*/ 88/* Memory management */ 89 90mp_err mp_init(mp_int *mp); 91mp_err mp_init_array(mp_int mp[], int count); 92mp_err mp_init_size(mp_int *mp, mp_size prec); 93mp_err mp_init_copy(mp_int *mp, mp_int *from); 94mp_err mp_copy(mp_int *from, mp_int *to); 95void mp_exch(mp_int *mp1, mp_int *mp2); 96void mp_clear(mp_int *mp); 97void mp_clear_array(mp_int mp[], int count); 98void mp_zero(mp_int *mp); 99void mp_set(mp_int *mp, mp_digit d); 100mp_err mp_set_int(mp_int *mp, long z); 101mp_err mp_shrink(mp_int *a); 102 103 104/*------------------------------------------------------------------------*/ 105/* Single digit arithmetic */ 106 107mp_err mp_add_d(mp_int *a, mp_digit d, mp_int *b); 108mp_err mp_sub_d(mp_int *a, mp_digit d, mp_int *b); 109mp_err mp_mul_d(mp_int *a, mp_digit d, mp_int *b); 110mp_err mp_mul_2(mp_int *a, mp_int *c); 111mp_err mp_div_d(mp_int *a, mp_digit d, mp_int *q, mp_digit *r); 112mp_err mp_div_2(mp_int *a, mp_int *c); 113mp_err mp_expt_d(mp_int *a, mp_digit d, mp_int *c); 114 115/*------------------------------------------------------------------------*/ 116/* Sign manipulations */ 117 118mp_err mp_abs(mp_int *a, mp_int *b); 119mp_err mp_neg(mp_int *a, mp_int *b); 120 121/*------------------------------------------------------------------------*/ 122/* Full arithmetic */ 123 124mp_err mp_add(mp_int *a, mp_int *b, mp_int *c); 125mp_err mp_sub(mp_int *a, mp_int *b, mp_int *c); 126mp_err mp_mul(mp_int *a, mp_int *b, mp_int *c); 127mp_err mp_mul_2d(mp_int *a, mp_digit d, mp_int *c); 128#if MP_SQUARE 129mp_err mp_sqr(mp_int *a, mp_int *b); 130#else 131#define mp_sqr(a, b) mp_mul(a, a, b) 132#endif 133mp_err mp_div(mp_int *a, mp_int *b, mp_int *q, mp_int *r); 134mp_err mp_div_2d(mp_int *a, mp_digit d, mp_int *q, mp_int *r); 135mp_err mp_expt(mp_int *a, mp_int *b, mp_int *c); 136mp_err mp_2expt(mp_int *a, mp_digit k); 137mp_err mp_sqrt(mp_int *a, mp_int *b); 138 139/*------------------------------------------------------------------------*/ 140/* Modular arithmetic */ 141 142#if MP_MODARITH 143mp_err mp_mod(mp_int *a, mp_int *m, mp_int *c); 144mp_err mp_mod_d(mp_int *a, mp_digit d, mp_digit *c); 145mp_err mp_addmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c); 146mp_err mp_submod(mp_int *a, mp_int *b, mp_int *m, mp_int *c); 147mp_err mp_mulmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c); 148#if MP_SQUARE 149mp_err mp_sqrmod(mp_int *a, mp_int *m, mp_int *c); 150#else 151#define mp_sqrmod(a, m, c) mp_mulmod(a, a, m, c) 152#endif 153mp_err mp_exptmod(mp_int *a, mp_int *b, mp_int *m, mp_int *c); 154mp_err mp_exptmod_d(mp_int *a, mp_digit d, mp_int *m, mp_int *c); 155#endif /* MP_MODARITH */ 156 157/*------------------------------------------------------------------------*/ 158/* Comparisons */ 159 160int mp_cmp_z(mp_int *a); 161int mp_cmp_d(mp_int *a, mp_digit d); 162int mp_cmp(mp_int *a, mp_int *b); 163int mp_cmp_mag(mp_int *a, mp_int *b); 164int mp_cmp_int(mp_int *a, long z); 165int mp_isodd(mp_int *a); 166int mp_iseven(mp_int *a); 167 168/*------------------------------------------------------------------------*/ 169/* Number theoretic */ 170 171#if MP_NUMTH 172mp_err mp_gcd(mp_int *a, mp_int *b, mp_int *c); 173mp_err mp_lcm(mp_int *a, mp_int *b, mp_int *c); 174mp_err mp_xgcd(mp_int *a, mp_int *b, mp_int *g, mp_int *x, mp_int *y); 175mp_err mp_invmod(mp_int *a, mp_int *m, mp_int *c); 176#endif /* end MP_NUMTH */ 177 178/*------------------------------------------------------------------------*/ 179/* Input and output */ 180 181#if MP_IOFUNC 182void mp_print(mp_int *mp, FILE *ofp); 183#endif /* end MP_IOFUNC */ 184 185/*------------------------------------------------------------------------*/ 186/* Base conversion */ 187 188#define BITS 1 189#define BYTES CHAR_BIT 190 191mp_err mp_read_signed_bin(mp_int *mp, unsigned char *str, int len); 192int mp_signed_bin_size(mp_int *mp); 193mp_err mp_to_signed_bin(mp_int *mp, unsigned char *str); 194 195mp_err mp_read_unsigned_bin(mp_int *mp, unsigned char *str, int len); 196int mp_unsigned_bin_size(mp_int *mp); 197mp_err mp_to_unsigned_bin(mp_int *mp, unsigned char *str); 198 199int mp_count_bits(mp_int *mp); 200 201#if MP_COMPAT_MACROS 202#define mp_read_raw(mp, str, len) mp_read_signed_bin((mp), (str), (len)) 203#define mp_raw_size(mp) mp_signed_bin_size(mp) 204#define mp_toraw(mp, str) mp_to_signed_bin((mp), (str)) 205#define mp_read_mag(mp, str, len) mp_read_unsigned_bin((mp), (str), (len)) 206#define mp_mag_size(mp) mp_unsigned_bin_size(mp) 207#define mp_tomag(mp, str) mp_to_unsigned_bin((mp), (str)) 208#endif 209 210mp_err mp_read_radix(mp_int *mp, unsigned char *str, int radix); 211int mp_radix_size(mp_int *mp, int radix); 212int mp_value_radix_size(int num, int qty, int radix); 213mp_err mp_toradix(mp_int *mp, unsigned char *str, int radix); 214 215int mp_char2value(char ch, int r); 216 217#define mp_tobinary(M, S) mp_toradix((M), (S), 2) 218#define mp_tooctal(M, S) mp_toradix((M), (S), 8) 219#define mp_todecimal(M, S) mp_toradix((M), (S), 10) 220#define mp_tohex(M, S) mp_toradix((M), (S), 16) 221 222/*------------------------------------------------------------------------*/ 223/* Error strings */ 224 225const char *mp_strerror(mp_err ec); 226 227#endif /* end _H_MPI_ */ 228 229/* $Source: /cvs/libtom/libtommath/mtest/mpi.h,v $ */ 230/* $Revision: 1.2 $ */ 231/* $Date: 2005/05/05 14:38:47 $ */ 232