1#include <isl_int.h> 2 3uint32_t isl_imath_hash(mp_int v, uint32_t hash) 4{ 5 unsigned const char *data = (unsigned char *)v->digits; 6 unsigned const char *end = data + v->used * sizeof(v->digits[0]); 7 8 if (v->sign == 1) 9 isl_hash_byte(hash, 0xFF); 10 for (; data < end; ++data) 11 isl_hash_byte(hash, *data); 12 return hash; 13} 14 15/* Try a standard conversion that fits into a long. 16 */ 17int isl_imath_fits_slong_p(mp_int op) 18{ 19 long out; 20 mp_result res = mp_int_to_int(op, &out); 21 return res == MP_OK; 22} 23 24/* Try a standard conversion that fits into an unsigned long. 25 */ 26int isl_imath_fits_ulong_p(mp_int op) 27{ 28 unsigned long out; 29 mp_result res = mp_int_to_uint(op, &out); 30 return res == MP_OK; 31} 32 33void isl_imath_addmul_ui(mp_int rop, mp_int op1, unsigned long op2) 34{ 35 mpz_t temp; 36 mp_int_init(&temp); 37 38 mp_int_set_uvalue(&temp, op2); 39 mp_int_mul(op1, &temp, &temp); 40 mp_int_add(rop, &temp, rop); 41 42 mp_int_clear(&temp); 43} 44 45void isl_imath_submul_ui(mp_int rop, mp_int op1, unsigned long op2) 46{ 47 mpz_t temp; 48 mp_int_init(&temp); 49 50 mp_int_set_uvalue(&temp, op2); 51 mp_int_mul(op1, &temp, &temp); 52 mp_int_sub(rop, &temp, rop); 53 54 mp_int_clear(&temp); 55} 56 57/* Compute the division of lhs by a rhs of type unsigned long, rounding towards 58 * positive infinity (Ceil). 59 */ 60void isl_imath_cdiv_q_ui(mp_int rop, mp_int lhs, unsigned long rhs) 61{ 62 mpz_t temp; 63 mp_int_init(&temp); 64 65 mp_int_set_uvalue(&temp, rhs); 66 impz_cdiv_q(rop, lhs, &temp); 67 68 mp_int_clear(&temp); 69} 70 71/* Compute the division of lhs by a rhs of type unsigned long, rounding towards 72 * negative infinity (Floor). 73 */ 74void isl_imath_fdiv_q_ui(mp_int rop, mp_int lhs, unsigned long rhs) 75{ 76 mpz_t temp; 77 mp_int_init(&temp); 78 79 mp_int_set_uvalue(&temp, rhs); 80 impz_fdiv_q(rop, lhs, &temp); 81 82 mp_int_clear(&temp); 83} 84