Blame src/mpi/mpi.h

Packit Service 37472d
/*
Packit Service 37472d
  mpi.h
Packit Service 37472d
  
Packit Service 37472d
  by Michael J. Fromberger <http://www.dartmouth.edu/~sting/>
Packit Service 37472d
  Copyright (C) 1998 Michael J. Fromberger, All Rights Reserved
Packit Service 37472d
  
Packit Service 37472d
  Arbitrary precision integer arithmetic library
Packit Service 37472d
  
Packit Service 37472d
  modified for use in Meanwhile as a convenience library
Packit Service 37472d
*/
Packit Service 37472d
Packit Service 37472d
#ifndef _H_MPI_
Packit Service 37472d
#define _H_MPI_
Packit Service 37472d
Packit Service 37472d
#include "mpi-config.h"
Packit Service 37472d
Packit Service 37472d
#if MP_DEBUG
Packit Service 37472d
#undef MP_IOFUNC
Packit Service 37472d
#define MP_IOFUNC 1
Packit Service 37472d
#endif
Packit Service 37472d
Packit Service 37472d
#if MP_IOFUNC
Packit Service 37472d
#include <stdio.h>
Packit Service 37472d
#include <ctype.h>
Packit Service 37472d
#endif
Packit Service 37472d
Packit Service 37472d
#include <limits.h>
Packit Service 37472d
Packit Service 37472d
#define  MP_NEG  1
Packit Service 37472d
#define  MP_ZPOS 0
Packit Service 37472d
Packit Service 37472d
/* Included for compatibility... */
Packit Service 37472d
#define  NEG     MP_NEG
Packit Service 37472d
#define  ZPOS    MP_ZPOS
Packit Service 37472d
Packit Service 37472d
#define  MP_OKAY          0 /* no error, all is well */
Packit Service 37472d
#define  MP_YES           0 /* yes (boolean result)  */
Packit Service 37472d
#define  MP_NO           -1 /* no (boolean result)   */
Packit Service 37472d
#define  MP_MEM          -2 /* out of memory         */
Packit Service 37472d
#define  MP_RANGE        -3 /* argument out of range */
Packit Service 37472d
#define  MP_BADARG       -4 /* invalid parameter     */
Packit Service 37472d
#define  MP_UNDEF        -5 /* answer is undefined   */
Packit Service 37472d
#define  MP_LAST_CODE    MP_UNDEF
Packit Service 37472d
Packit Service 37472d
#include "mpi-types.h"
Packit Service 37472d
Packit Service 37472d
/* Included for compatibility... */
Packit Service 37472d
#define DIGIT_BIT         MP_DIGIT_BIT
Packit Service 37472d
#define DIGIT_MAX         MP_DIGIT_MAX
Packit Service 37472d
Packit Service 37472d
/* Macros for accessing the mw_mp_int internals           */
Packit Service 37472d
#define  SIGN(MP)     ((MP)->sign)
Packit Service 37472d
#define  USED(MP)     ((MP)->used)
Packit Service 37472d
#define  ALLOC(MP)    ((MP)->alloc)
Packit Service 37472d
#define  DIGITS(MP)   ((MP)->dp)
Packit Service 37472d
#define  DIGIT(MP,N)  (MP)->dp[(N)]
Packit Service 37472d
Packit Service 37472d
#if MP_ARGCHK == 1
Packit Service 37472d
#define  ARGCHK(X,Y)  {if(!(X)){return (Y);}}
Packit Service 37472d
#elif MP_ARGCHK == 2
Packit Service 37472d
#include <assert.h>
Packit Service 37472d
#define  ARGCHK(X,Y)  assert(X)
Packit Service 37472d
#else
Packit Service 37472d
#define  ARGCHK(X,Y)  /*  */
Packit Service 37472d
#endif
Packit Service 37472d
Packit Service 37472d
/* This defines the maximum I/O base (minimum is 2)   */
Packit Service 37472d
#define MAX_RADIX         64
Packit Service 37472d
Packit Service 37472d
typedef struct {
Packit Service 37472d
  mw_mp_sign       sign;    /* sign of this quantity      */
Packit Service 37472d
  mw_mp_size       alloc;   /* how many digits allocated  */
Packit Service 37472d
  mw_mp_size       used;    /* how many digits used       */
Packit Service 37472d
  mw_mp_digit     *dp;      /* the digits themselves      */
Packit Service 37472d
} mw_mp_int;
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Default precision                                                      */
Packit Service 37472d
Packit Service 37472d
unsigned int mw_mp_get_prec(void);
Packit Service 37472d
void         mw_mp_set_prec(unsigned int prec);
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Memory management                                                      */
Packit Service 37472d
Packit Service 37472d
mw_mp_err mw_mp_init(mw_mp_int *mp);
Packit Service 37472d
mw_mp_err mw_mp_init_array(mw_mp_int mp[], int count);
Packit Service 37472d
mw_mp_err mw_mp_init_size(mw_mp_int *mp, mw_mp_size prec);
Packit Service 37472d
mw_mp_err mw_mp_init_copy(mw_mp_int *mp, mw_mp_int *from);
Packit Service 37472d
mw_mp_err mw_mp_copy(mw_mp_int *from, mw_mp_int *to);
Packit Service 37472d
void   mw_mp_exch(mw_mp_int *mp1, mw_mp_int *mp2);
Packit Service 37472d
void   mw_mp_clear(mw_mp_int *mp);
Packit Service 37472d
void   mw_mp_clear_array(mw_mp_int mp[], int count);
Packit Service 37472d
void   mw_mp_zero(mw_mp_int *mp);
Packit Service 37472d
void   mw_mp_set(mw_mp_int *mp, mw_mp_digit d);
Packit Service 37472d
mw_mp_err mw_mp_set_int(mw_mp_int *mp, long z);
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Single digit arithmetic                                                */
Packit Service 37472d
Packit Service 37472d
mw_mp_err mw_mp_add_d(mw_mp_int *a, mw_mp_digit d, mw_mp_int *b);
Packit Service 37472d
mw_mp_err mw_mp_sub_d(mw_mp_int *a, mw_mp_digit d, mw_mp_int *b);
Packit Service 37472d
mw_mp_err mw_mp_mul_d(mw_mp_int *a, mw_mp_digit d, mw_mp_int *b);
Packit Service 37472d
mw_mp_err mw_mp_mul_2(mw_mp_int *a, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_div_d(mw_mp_int *a, mw_mp_digit d, mw_mp_int *q, mw_mp_digit *r);
Packit Service 37472d
mw_mp_err mw_mp_div_2(mw_mp_int *a, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_expt_d(mw_mp_int *a, mw_mp_digit d, mw_mp_int *c);
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Sign manipulations                                                     */
Packit Service 37472d
Packit Service 37472d
mw_mp_err mw_mp_abs(mw_mp_int *a, mw_mp_int *b);
Packit Service 37472d
mw_mp_err mw_mp_neg(mw_mp_int *a, mw_mp_int *b);
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Full arithmetic                                                        */
Packit Service 37472d
Packit Service 37472d
mw_mp_err mw_mp_add(mw_mp_int *a, mw_mp_int *b, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_sub(mw_mp_int *a, mw_mp_int *b, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_mul(mw_mp_int *a, mw_mp_int *b, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_mul_2d(mw_mp_int *a, mw_mp_digit d, mw_mp_int *c);
Packit Service 37472d
#if MP_SQUARE
Packit Service 37472d
mw_mp_err mw_mp_sqr(mw_mp_int *a, mw_mp_int *b);
Packit Service 37472d
#else
Packit Service 37472d
#define mw_mp_sqr(a, b) mw_mp_mul(a, a, b)
Packit Service 37472d
#endif
Packit Service 37472d
mw_mp_err mw_mp_div(mw_mp_int *a, mw_mp_int *b, mw_mp_int *q, mw_mp_int *r);
Packit Service 37472d
mw_mp_err mw_mp_div_2d(mw_mp_int *a, mw_mp_digit d, mw_mp_int *q, mw_mp_int *r);
Packit Service 37472d
mw_mp_err mw_mp_expt(mw_mp_int *a, mw_mp_int *b, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_2expt(mw_mp_int *a, mw_mp_digit k);
Packit Service 37472d
mw_mp_err mw_mp_sqrt(mw_mp_int *a, mw_mp_int *b);
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Modular arithmetic                                                     */
Packit Service 37472d
Packit Service 37472d
#if MP_MODARITH
Packit Service 37472d
mw_mp_err mw_mp_mod(mw_mp_int *a, mw_mp_int *m, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_mod_d(mw_mp_int *a, mw_mp_digit d, mw_mp_digit *c);
Packit Service 37472d
mw_mp_err mw_mp_addmod(mw_mp_int *a, mw_mp_int *b, mw_mp_int *m, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_submod(mw_mp_int *a, mw_mp_int *b, mw_mp_int *m, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_mulmod(mw_mp_int *a, mw_mp_int *b, mw_mp_int *m, mw_mp_int *c);
Packit Service 37472d
#if MP_SQUARE
Packit Service 37472d
mw_mp_err mw_mp_sqrmod(mw_mp_int *a, mw_mp_int *m, mw_mp_int *c);
Packit Service 37472d
#else
Packit Service 37472d
#define mw_mp_sqrmod(a, m, c) mw_mp_mulmod(a, a, m, c)
Packit Service 37472d
#endif
Packit Service 37472d
mw_mp_err mw_mp_exptmod(mw_mp_int *a, mw_mp_int *b, mw_mp_int *m, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_exptmod_d(mw_mp_int *a, mw_mp_digit d, mw_mp_int *m, mw_mp_int *c);
Packit Service 37472d
#endif /* MP_MODARITH */
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Comparisons                                                            */
Packit Service 37472d
Packit Service 37472d
int    mw_mp_cmw_mp_z(mw_mp_int *a);
Packit Service 37472d
int    mw_mp_cmw_mp_d(mw_mp_int *a, mw_mp_digit d);
Packit Service 37472d
int    mw_mp_cmp(mw_mp_int *a, mw_mp_int *b);
Packit Service 37472d
int    mw_mp_cmw_mp_mag(mw_mp_int *a, mw_mp_int *b);
Packit Service 37472d
int    mw_mp_cmw_mp_int(mw_mp_int *a, long z);
Packit Service 37472d
int    mw_mp_isodd(mw_mp_int *a);
Packit Service 37472d
int    mw_mp_iseven(mw_mp_int *a);
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Number theoretic                                                       */
Packit Service 37472d
Packit Service 37472d
#if MP_NUMTH
Packit Service 37472d
mw_mp_err mw_mp_gcd(mw_mp_int *a, mw_mp_int *b, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_lcm(mw_mp_int *a, mw_mp_int *b, mw_mp_int *c);
Packit Service 37472d
mw_mp_err mw_mp_xgcd(mw_mp_int *a, mw_mp_int *b, mw_mp_int *g, mw_mp_int *x, mw_mp_int *y);
Packit Service 37472d
mw_mp_err mw_mp_invmod(mw_mp_int *a, mw_mp_int *m, mw_mp_int *c);
Packit Service 37472d
#endif /* end MP_NUMTH */
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Input and output                                                       */
Packit Service 37472d
Packit Service 37472d
#if MP_IOFUNC
Packit Service 37472d
void   mw_mp_print(mw_mp_int *mp, FILE *ofp);
Packit Service 37472d
#endif /* end MP_IOFUNC */
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Base conversion                                                        */
Packit Service 37472d
Packit Service 37472d
#define BITS     1
Packit Service 37472d
#define BYTES    CHAR_BIT
Packit Service 37472d
Packit Service 37472d
mw_mp_err mw_mp_read_signed_bin(mw_mp_int *mp, unsigned char *str, int len);
Packit Service 37472d
int    mw_mp_signed_bin_size(mw_mp_int *mp);
Packit Service 37472d
mw_mp_err mw_mp_to_signed_bin(mw_mp_int *mp, unsigned char *str);
Packit Service 37472d
Packit Service 37472d
mw_mp_err mw_mp_read_unsigned_bin(mw_mp_int *mp, unsigned char *str, int len);
Packit Service 37472d
int    mw_mp_unsigned_bin_size(mw_mp_int *mp);
Packit Service 37472d
mw_mp_err mw_mp_to_unsigned_bin(mw_mp_int *mp, unsigned char *str);
Packit Service 37472d
Packit Service 37472d
int    mw_mp_count_bits(mw_mp_int *mp);
Packit Service 37472d
Packit Service 37472d
#if MP_COMPAT_MACROS
Packit Service 37472d
#define mw_mp_read_raw(mp, str, len) mw_mp_read_signed_bin((mp), (str), (len))
Packit Service 37472d
#define mw_mp_raw_size(mp)           mw_mp_signed_bin_size(mp)
Packit Service 37472d
#define mw_mp_toraw(mp, str)         mw_mp_to_signed_bin((mp), (str))
Packit Service 37472d
#define mw_mp_read_mag(mp, str, len) mw_mp_read_unsigned_bin((mp), (str), (len))
Packit Service 37472d
#define mw_mp_mag_size(mp)           mw_mp_unsigned_bin_size(mp)
Packit Service 37472d
#define mw_mp_tomag(mp, str)         mw_mp_to_unsigned_bin((mp), (str))
Packit Service 37472d
#endif
Packit Service 37472d
Packit Service 37472d
mw_mp_err mw_mp_read_radix(mw_mp_int *mp, unsigned char *str, int radix);
Packit Service 37472d
int    mw_mp_radix_size(mw_mp_int *mp, int radix);
Packit Service 37472d
int    mw_mp_value_radix_size(int num, int qty, int radix);
Packit Service 37472d
mw_mp_err mw_mp_toradix(mw_mp_int *mp, unsigned char *str, int radix);
Packit Service 37472d
Packit Service 37472d
int    mw_mp_char2value(char ch, int r);
Packit Service 37472d
Packit Service 37472d
#define mw_mp_tobinary(M, S)  mw_mp_toradix((M), (S), 2)
Packit Service 37472d
#define mw_mp_tooctal(M, S)   mw_mp_toradix((M), (S), 8)
Packit Service 37472d
#define mw_mp_todecimal(M, S) mw_mp_toradix((M), (S), 10)
Packit Service 37472d
#define mw_mp_tohex(M, S)     mw_mp_toradix((M), (S), 16)
Packit Service 37472d
Packit Service 37472d
/*------------------------------------------------------------------------*/
Packit Service 37472d
/* Error strings                                                          */
Packit Service 37472d
Packit Service 37472d
const  char  *mw_mp_strerror(mw_mp_err ec);
Packit Service 37472d
Packit Service 37472d
#endif /* end _H_MPI_ */