mpi.h 7.7 KB

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