Blame isl-0.16.1/imath/imrat.h

Packit fb9d21
/*
Packit fb9d21
  Name:     imrat.h
Packit fb9d21
  Purpose:  Arbitrary precision rational arithmetic routines.
Packit fb9d21
  Author:   M. J. Fromberger <http://spinning-yarns.org/michael/>
Packit fb9d21
Packit fb9d21
  Copyright (C) 2002-2007 Michael J. Fromberger, All Rights Reserved.
Packit fb9d21
Packit fb9d21
  Permission is hereby granted, free of charge, to any person obtaining a copy
Packit fb9d21
  of this software and associated documentation files (the "Software"), to deal
Packit fb9d21
  in the Software without restriction, including without limitation the rights
Packit fb9d21
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Packit fb9d21
  copies of the Software, and to permit persons to whom the Software is
Packit fb9d21
  furnished to do so, subject to the following conditions:
Packit fb9d21
Packit fb9d21
  The above copyright notice and this permission notice shall be included in
Packit fb9d21
  all copies or substantial portions of the Software.
Packit fb9d21
Packit fb9d21
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit fb9d21
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit fb9d21
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit fb9d21
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit fb9d21
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Packit fb9d21
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Packit fb9d21
  SOFTWARE.
Packit fb9d21
 */
Packit fb9d21
Packit fb9d21
#ifndef IMRAT_H_
Packit fb9d21
#define IMRAT_H_
Packit fb9d21
Packit fb9d21
#include "imath.h"
Packit fb9d21
Packit fb9d21
#ifdef __cplusplus
Packit fb9d21
extern "C" {
Packit fb9d21
#endif
Packit fb9d21
Packit fb9d21
typedef struct mpq {
Packit fb9d21
  mpz_t   num;    /* Numerator         */
Packit fb9d21
  mpz_t   den;    /* Denominator, <> 0 */
Packit fb9d21
} mpq_t, *mp_rat;
Packit fb9d21
Packit fb9d21
#define MP_NUMER_P(Q)  (&((Q)->num)) /* Pointer to numerator   */
Packit fb9d21
#define MP_DENOM_P(Q)  (&((Q)->den)) /* Pointer to denominator */
Packit fb9d21
Packit fb9d21
/* Rounding constants */
Packit fb9d21
typedef enum {
Packit fb9d21
  MP_ROUND_DOWN,
Packit fb9d21
  MP_ROUND_HALF_UP,
Packit fb9d21
  MP_ROUND_UP,
Packit fb9d21
  MP_ROUND_HALF_DOWN
Packit fb9d21
} mp_round_mode;
Packit fb9d21
Packit fb9d21
mp_result mp_rat_init(mp_rat r);
Packit fb9d21
mp_rat    mp_rat_alloc(void);
Packit fb9d21
mp_result mp_rat_reduce(mp_rat r);
Packit fb9d21
mp_result mp_rat_init_size(mp_rat r, mp_size n_prec, mp_size d_prec);
Packit fb9d21
mp_result mp_rat_init_copy(mp_rat r, mp_rat old);
Packit fb9d21
mp_result mp_rat_set_value(mp_rat r, mp_small numer, mp_small denom);
Packit fb9d21
mp_result mp_rat_set_uvalue(mp_rat r, mp_usmall numer, mp_usmall denom);
Packit fb9d21
void      mp_rat_clear(mp_rat r);
Packit fb9d21
void      mp_rat_free(mp_rat r);
Packit fb9d21
mp_result mp_rat_numer(mp_rat r, mp_int z);             /* z = num(r)  */
Packit fb9d21
mp_int    mp_rat_numer_ref(mp_rat r);                   /* &num(r)     */
Packit fb9d21
mp_result mp_rat_denom(mp_rat r, mp_int z);             /* z = den(r)  */
Packit fb9d21
mp_int    mp_rat_denom_ref(mp_rat r);                   /* &den(r)     */
Packit fb9d21
mp_sign   mp_rat_sign(mp_rat r);
Packit fb9d21
Packit fb9d21
mp_result mp_rat_copy(mp_rat a, mp_rat c);              /* c = a       */
Packit fb9d21
void      mp_rat_zero(mp_rat r);                        /* r = 0       */
Packit fb9d21
mp_result mp_rat_abs(mp_rat a, mp_rat c);               /* c = |a|     */
Packit fb9d21
mp_result mp_rat_neg(mp_rat a, mp_rat c);               /* c = -a      */
Packit fb9d21
mp_result mp_rat_recip(mp_rat a, mp_rat c);             /* c = 1 / a   */
Packit fb9d21
mp_result mp_rat_add(mp_rat a, mp_rat b, mp_rat c);     /* c = a + b   */
Packit fb9d21
mp_result mp_rat_sub(mp_rat a, mp_rat b, mp_rat c);     /* c = a - b   */
Packit fb9d21
mp_result mp_rat_mul(mp_rat a, mp_rat b, mp_rat c);     /* c = a * b   */
Packit fb9d21
mp_result mp_rat_div(mp_rat a, mp_rat b, mp_rat c);     /* c = a / b   */
Packit fb9d21
Packit fb9d21
mp_result mp_rat_add_int(mp_rat a, mp_int b, mp_rat c); /* c = a + b   */
Packit fb9d21
mp_result mp_rat_sub_int(mp_rat a, mp_int b, mp_rat c); /* c = a - b   */
Packit fb9d21
mp_result mp_rat_mul_int(mp_rat a, mp_int b, mp_rat c); /* c = a * b   */
Packit fb9d21
mp_result mp_rat_div_int(mp_rat a, mp_int b, mp_rat c); /* c = a / b   */
Packit fb9d21
mp_result mp_rat_expt(mp_rat a, mp_small b, mp_rat c);  /* c = a ^ b   */
Packit fb9d21
Packit fb9d21
int       mp_rat_compare(mp_rat a, mp_rat b);           /* a <=> b     */
Packit fb9d21
int       mp_rat_compare_unsigned(mp_rat a, mp_rat b);  /* |a| <=> |b| */
Packit fb9d21
int       mp_rat_compare_zero(mp_rat r);                /* r <=> 0     */
Packit fb9d21
int       mp_rat_compare_value(mp_rat r, mp_small n, mp_small d); /* r <=> n/d */
Packit fb9d21
int       mp_rat_is_integer(mp_rat r);
Packit fb9d21
Packit fb9d21
/* Convert to integers, if representable (returns MP_RANGE if not). */
Packit fb9d21
mp_result mp_rat_to_ints(mp_rat r, mp_small *num, mp_small *den);
Packit fb9d21
Packit fb9d21
/* Convert to nul-terminated string with the specified radix, writing
Packit fb9d21
   at most limit characters including the nul terminator. */
Packit fb9d21
mp_result mp_rat_to_string(mp_rat r, mp_size radix, char *str, int limit);
Packit fb9d21
Packit fb9d21
/* Convert to decimal format in the specified radix and precision,
Packit fb9d21
   writing at most limit characters including a nul terminator. */
Packit fb9d21
mp_result mp_rat_to_decimal(mp_rat r, mp_size radix, mp_size prec,
Packit fb9d21
                            mp_round_mode round, char *str, int limit);
Packit fb9d21
Packit fb9d21
/* Return the number of characters required to represent r in the given
Packit fb9d21
   radix.  May over-estimate. */
Packit fb9d21
mp_result mp_rat_string_len(mp_rat r, mp_size radix);
Packit fb9d21
Packit fb9d21
/* Return the number of characters required to represent r in decimal
Packit fb9d21
   format with the given radix and precision.  May over-estimate. */
Packit fb9d21
mp_result mp_rat_decimal_len(mp_rat r, mp_size radix, mp_size prec);
Packit fb9d21
Packit fb9d21
/* Read zero-terminated string into r */
Packit fb9d21
mp_result mp_rat_read_string(mp_rat r, mp_size radix, const char *str);
Packit fb9d21
mp_result mp_rat_read_cstring(mp_rat r, mp_size radix, const char *str,
Packit fb9d21
			      char **end);
Packit fb9d21
mp_result mp_rat_read_ustring(mp_rat r, mp_size radix, const char *str,
Packit fb9d21
			      char **end);
Packit fb9d21
Packit fb9d21
/* Read zero-terminated string in decimal format into r */
Packit fb9d21
mp_result mp_rat_read_decimal(mp_rat r, mp_size radix, const char *str);
Packit fb9d21
mp_result mp_rat_read_cdecimal(mp_rat r, mp_size radix, const char *str,
Packit fb9d21
			       char **end);
Packit fb9d21
Packit fb9d21
#ifdef __cplusplus
Packit fb9d21
}
Packit fb9d21
#endif
Packit fb9d21
#endif /* IMRAT_H_ */