10#ifndef ISL_INT_SIOIMATH_H
11#define ISL_INT_SIOIMATH_H
21#define ARRAY_SIZE(array) (sizeof(array)/sizeof(*array))
27#if defined(_MSC_VER) && (_MSC_VER < 1900)
28#define inline __inline
72#if UINT64_MAX > UINTPTR_MAX
89#define ISL_SIOIMATH_SMALL_MIN (-INT32_MAX)
92#define ISL_SIOIMATH_SMALL_MAX INT32_MAX
104 return val & 0x00000001;
204#define ISL_SIOIMATH_TO_DIGITS(num, digits, used) \
209 ((num) >> (sizeof(mp_digit) * CHAR_BIT * i)); \
211 if (i >= (sizeof(num) + sizeof(mp_digit) - 1) / \
214 if (((num) >> (sizeof(mp_digit) * CHAR_BIT * i)) == 0) \
269 return &scratch->
big;
286 num = (
arg == LONG_MIN) ? ((
unsigned long) LONG_MAX) + 1 : -
arg;
290 return &scratch->
big;
307 num = (
arg == INT64_MIN) ? ((uint64_t) INT64_MAX) + 1 : -
arg;
311 return &scratch->
big;
324 return &scratch->
big;
520 for (i = 0; i < big->
used; ++i)
635 int32_t smalllhs, smallrhs;
640 dst, (int64_t) smalllhs + (int64_t) smallrhs);
656 int32_t smalllhs, smallrhs;
661 dst, (int64_t) smalllhs - (int64_t) smallrhs);
677 int32_t smalllhs, smallrhs;
682 dst, (int64_t) smalllhs * (int64_t) smallrhs);
719 (labs(
rhs) <= UINT32_MAX)) {
859 int32_t lhssmall, rhssmall;
906 int32_t lhssmall, rhssmall;
912 if ((lhssmall >= 0) && (rhssmall >= 0))
913 q = ((int64_t) lhssmall + (int64_t) rhssmall - 1) /
915 else if ((lhssmall < 0) && (rhssmall < 0))
916 q = ((int64_t) lhssmall + (int64_t) rhssmall + 1) /
919 q = lhssmall / rhssmall;
941 q = ((int64_t) lhssmall + ((int64_t)
rhs - 1)) /
944 q = lhssmall / (int32_t)
rhs;
961 int32_t lhssmall, rhssmall;
966 if ((lhssmall < 0) && (rhssmall >= 0))
967 q = ((int64_t) lhssmall - ((int64_t) rhssmall - 1)) /
969 else if ((lhssmall >= 0) && (rhssmall < 0))
970 q = ((int64_t) lhssmall - ((int64_t) rhssmall + 1)) /
973 q = lhssmall / rhssmall;
995 q = (uint32_t) lhssmall /
rhs;
997 q = ((int64_t) lhssmall - ((int64_t)
rhs - 1)) /
1016 int64_t lhssmall, rhssmall;
1022 r = (rhssmall + lhssmall % rhssmall) % rhssmall;
1045 return (small > 0) - (small < 0);
1058 int32_t lhssmall, rhssmall;
1062 return (lhssmall > rhssmall) - (lhssmall < rhssmall);
1083 return (lhssmall >
rhs) - (lhssmall <
rhs);
1096 int32_t lhssmall, rhssmall;
1100 lhssmall = labs(lhssmall);
1101 rhssmall = labs(rhssmall);
1102 return (lhssmall > rhssmall) - (lhssmall < rhssmall);
1118 int32_t lhssmall, rhssmall;
1127 return lhssmall % rhssmall == 0;
1153 const unsigned char *digitdata = (
const unsigned char *) &digits;
1161 for (i = 0; i < used *
sizeof(
mp_digit); i += 1)
1181 return sizeof(int32_t) * CHAR_BIT - 1;
1190#define isl_int_init(i) isl_sioimath_init((i))
1191#define isl_int_clear(i) isl_sioimath_clear((i))
1193#define isl_int_set(r, i) isl_sioimath_set((r), *(i))
1194#define isl_int_set_si(r, i) isl_sioimath_set_si((r), i)
1195#define isl_int_set_ui(r, i) isl_sioimath_set_ui((r), i)
1196#define isl_int_fits_slong(r) isl_sioimath_fits_slong(*(r))
1197#define isl_int_get_si(r) isl_sioimath_get_si(*(r))
1198#define isl_int_fits_ulong(r) isl_sioimath_fits_ulong(*(r))
1199#define isl_int_get_ui(r) isl_sioimath_get_ui(*(r))
1200#define isl_int_get_d(r) isl_sioimath_get_d(*(r))
1201#define isl_int_get_str(r) isl_sioimath_get_str(*(r))
1202#define isl_int_abs(r, i) isl_sioimath_abs((r), *(i))
1203#define isl_int_neg(r, i) isl_sioimath_neg((r), *(i))
1204#define isl_int_swap(i, j) isl_sioimath_swap((i), (j))
1205#define isl_int_swap_or_set(i, j) isl_sioimath_swap((i), (j))
1206#define isl_int_add_ui(r, i, j) isl_sioimath_add_ui((r), *(i), j)
1207#define isl_int_sub_ui(r, i, j) isl_sioimath_sub_ui((r), *(i), j)
1209#define isl_int_add(r, i, j) isl_sioimath_add((r), *(i), *(j))
1210#define isl_int_sub(r, i, j) isl_sioimath_sub((r), *(i), *(j))
1211#define isl_int_mul(r, i, j) isl_sioimath_mul((r), *(i), *(j))
1212#define isl_int_mul_2exp(r, i, j) isl_sioimath_mul_2exp((r), *(i), j)
1213#define isl_int_mul_si(r, i, j) isl_sioimath_mul_si((r), *(i), j)
1214#define isl_int_mul_ui(r, i, j) isl_sioimath_mul_ui((r), *(i), j)
1215#define isl_int_pow_ui(r, i, j) isl_sioimath_pow_ui((r), *(i), j)
1216#define isl_int_addmul(r, i, j) isl_sioimath_addmul((r), *(i), *(j))
1217#define isl_int_addmul_ui(r, i, j) isl_sioimath_addmul_ui((r), *(i), j)
1218#define isl_int_submul(r, i, j) isl_sioimath_submul((r), *(i), *(j))
1219#define isl_int_submul_ui(r, i, j) isl_sioimath_submul_ui((r), *(i), j)
1221#define isl_int_gcd(r, i, j) isl_sioimath_gcd((r), *(i), *(j))
1222#define isl_int_lcm(r, i, j) isl_sioimath_lcm((r), *(i), *(j))
1223#define isl_int_divexact(r, i, j) isl_sioimath_tdiv_q((r), *(i), *(j))
1224#define isl_int_divexact_ui(r, i, j) isl_sioimath_tdiv_q_ui((r), *(i), j)
1225#define isl_int_tdiv_q(r, i, j) isl_sioimath_tdiv_q((r), *(i), *(j))
1226#define isl_int_cdiv_q(r, i, j) isl_sioimath_cdiv_q((r), *(i), *(j))
1227#define isl_int_cdiv_q_ui(r, i, j) isl_sioimath_cdiv_q_ui((r), *(i), j)
1228#define isl_int_fdiv_q(r, i, j) isl_sioimath_fdiv_q((r), *(i), *(j))
1229#define isl_int_fdiv_r(r, i, j) isl_sioimath_fdiv_r((r), *(i), *(j))
1230#define isl_int_fdiv_q_ui(r, i, j) isl_sioimath_fdiv_q_ui((r), *(i), j)
1232#define isl_int_read(r, s) isl_sioimath_read((r), s)
1233#define isl_int_sgn(i) isl_sioimath_sgn(*(i))
1234#define isl_int_cmp(i, j) isl_sioimath_cmp(*(i), *(j))
1235#define isl_int_cmp_si(i, si) isl_sioimath_cmp_si(*(i), si)
1236#define isl_int_eq(i, j) (isl_sioimath_cmp(*(i), *(j)) == 0)
1237#define isl_int_ne(i, j) (isl_sioimath_cmp(*(i), *(j)) != 0)
1238#define isl_int_lt(i, j) (isl_sioimath_cmp(*(i), *(j)) < 0)
1239#define isl_int_le(i, j) (isl_sioimath_cmp(*(i), *(j)) <= 0)
1240#define isl_int_gt(i, j) (isl_sioimath_cmp(*(i), *(j)) > 0)
1241#define isl_int_ge(i, j) (isl_sioimath_cmp(*(i), *(j)) >= 0)
1242#define isl_int_abs_cmp(i, j) isl_sioimath_abs_cmp(*(i), *(j))
1243#define isl_int_abs_eq(i, j) (isl_sioimath_abs_cmp(*(i), *(j)) == 0)
1244#define isl_int_abs_ne(i, j) (isl_sioimath_abs_cmp(*(i), *(j)) != 0)
1245#define isl_int_abs_lt(i, j) (isl_sioimath_abs_cmp(*(i), *(j)) < 0)
1246#define isl_int_abs_gt(i, j) (isl_sioimath_abs_cmp(*(i), *(j)) > 0)
1247#define isl_int_abs_ge(i, j) (isl_sioimath_abs_cmp(*(i), *(j)) >= 0)
1248#define isl_int_is_divisible_by(i, j) isl_sioimath_is_divisible_by(*(i), *(j))
1250#define isl_int_hash(v, h) isl_sioimath_hash(*(v), h)
1251#define isl_int_free_str(s) free(s)
1252#define isl_int_print(out, i, width) isl_sioimath_print(out, *(i), width)
polly print import Polly Print Scop import result
#define isl_hash_byte(h, b)
__isl_export __isl_give ISL_HMAP __isl_take ISL_KEY __isl_take ISL_VAL * val
int GMPQAPI() cmp(mp_rat op1, mp_rat op2)
uint32_t isl_imath_hash(mp_int v, uint32_t hash)
void isl_sioimath_print(FILE *out, isl_sioimath_src i, int width)
long isl_sioimath_get_si(isl_sioimath_src val)
void isl_sioimath_set(isl_sioimath_ptr dst, isl_sioimath_src val)
char * isl_sioimath_get_str(isl_sioimath_src val)
int isl_sioimath_cmp_si(isl_sioimath_src lhs, signed long rhs)
void isl_sioimath_submul(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
void isl_sioimath_add(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
int isl_sioimath_cmp(isl_sioimath_src lhs, isl_sioimath_src rhs)
#define ISL_SIOIMATH_SMALL_MAX
void isl_sioimath_cdiv_q(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
void isl_siomath_uint64_to_digits(uint64_t num, mp_digit *digits, mp_size *used)
void isl_sioimath_neg(isl_sioimath_ptr dst, isl_sioimath_src arg)
void isl_siomath_uint32_to_digits(uint32_t num, mp_digit *digits, mp_size *used)
int isl_sioimath_is_big(isl_sioimath val)
void isl_sioimath_gcd(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
void isl_sioimath_fdiv_q_ui(isl_sioimath_ptr dst, isl_sioimath_src lhs, unsigned long rhs)
size_t isl_sioimath_sizeinbase(isl_sioimath_src arg, int base)
void isl_sioimath_clear(isl_sioimath_ptr dst)
#define ISL_SIOIMATH_SMALL_MIN
void isl_sioimath_sub(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
int isl_sioimath_abs_cmp(isl_sioimath_src lhs, isl_sioimath_src rhs)
mp_int isl_sioimath_reinit_big(isl_sioimath_ptr ptr)
int isl_sioimath_fits_slong(isl_sioimath_src val)
unsigned long isl_sioimath_get_ui(isl_sioimath_src val)
int isl_sioimath_sgn(isl_sioimath_src arg)
void isl_sioimath_dump(isl_sioimath_src arg)
void isl_sioimath_pow_ui(isl_sioimath_ptr dst, isl_sioimath_src lhs, unsigned long rhs)
void isl_sioimath_tdiv_q_ui(isl_sioimath_ptr dst, isl_sioimath_src lhs, unsigned long rhs)
void isl_sioimath_set_ui(isl_sioimath_ptr dst, unsigned long val)
void isl_sioimath_try_demote(isl_sioimath_ptr dst)
int isl_sioimath_fits_ulong(isl_sioimath_src val)
int32_t isl_sioimath_get_small(isl_sioimath val)
isl_sioimath * isl_sioimath_ptr
#define ARRAY_SIZE(array)
int isl_sioimath_is_small(isl_sioimath val)
void isl_sioimath_fdiv_r(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
void isl_sioimath_add_ui(isl_sioimath_ptr dst, isl_sioimath lhs, unsigned long rhs)
int isl_sioimath_decode_big(isl_sioimath val, mp_int *big)
void isl_sioimath_addmul(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
mp_int isl_sioimath_si64arg_src(int64_t arg, isl_sioimath_scratchspace_t *scratch)
void isl_sioimath_set_int64(isl_sioimath_ptr ptr, int64_t val)
void isl_sioimath_mul_ui(isl_sioimath_ptr dst, isl_sioimath lhs, unsigned long rhs)
void isl_sioimath_set_small(isl_sioimath_ptr ptr, int32_t val)
isl_sioimath isl_sioimath_encode_big(mp_int val)
void isl_sioimath_mul_si(isl_sioimath_ptr dst, isl_sioimath lhs, signed long rhs)
void isl_sioimath_abs(isl_sioimath_ptr dst, isl_sioimath_src arg)
void isl_sioimath_read(isl_sioimath_ptr dst, const char *str)
void isl_sioimath_set_si(isl_sioimath_ptr dst, long val)
uint32_t isl_sioimath_hash(isl_sioimath_src arg, uint32_t hash)
void isl_sioimath_promote(isl_sioimath_ptr dst)
void isl_sioimath_fdiv_q(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
void isl_siomath_ulong_to_digits(unsigned long num, mp_digit *digits, mp_size *used)
isl_sioimath isl_sioimath_encode_small(int32_t val)
void isl_sioimath_set_int32(isl_sioimath_ptr ptr, int32_t val)
void isl_sioimath_mul(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
mp_int isl_sioimath_uiarg_src(unsigned long arg, isl_sioimath_scratchspace_t *scratch)
void isl_sioimath_swap(isl_sioimath_ptr lhs, isl_sioimath_ptr rhs)
void isl_sioimath_submul_ui(isl_sioimath_ptr dst, isl_sioimath_src lhs, unsigned long rhs)
mp_int isl_sioimath_get_big(isl_sioimath val)
void isl_sioimath_sub_ui(isl_sioimath_ptr dst, isl_sioimath lhs, unsigned long rhs)
isl_sioimath isl_sioimath_src
void isl_sioimath_cdiv_q_ui(isl_sioimath_ptr dst, isl_sioimath_src lhs, unsigned long rhs)
int isl_sioimath_decode_small(isl_sioimath val, int32_t *small)
void isl_sioimath_addmul_ui(isl_sioimath_ptr dst, isl_sioimath_src lhs, unsigned long rhs)
mp_int isl_sioimath_siarg_src(signed long arg, isl_sioimath_scratchspace_t *scratch)
void isl_sioimath_tdiv_q(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
double isl_sioimath_get_d(isl_sioimath_src val)
mp_int isl_sioimath_bigarg_src(isl_sioimath arg, isl_sioimath_scratchspace_t *scratch)
int isl_sioimath_is_divisible_by(isl_sioimath_src lhs, isl_sioimath_src rhs)
void isl_sioimath_init(isl_sioimath_ptr dst)
#define ISL_SIOIMATH_TO_DIGITS(num, digits, used)
void isl_sioimath_mul_2exp(isl_sioimath_ptr dst, isl_sioimath lhs, unsigned long rhs)
void isl_sioimath_lcm(isl_sioimath_ptr dst, isl_sioimath_src lhs, isl_sioimath_src rhs)
mp_digit digits[(sizeof(uintmax_t)+sizeof(mp_digit) - 1)/sizeof(mp_digit)]
#define mp_int_divisible_value
#define mp_int_compare_zero
#define mp_int_compare_unsigned
#define mp_int_init_value
#define mp_int_expt_value
#define mp_int_set_uvalue
#define mp_int_compare_value