67 #ifdef OSL_GMP_IS_HERE 96 #ifdef OSL_GMP_IS_HERE 116 fprintf(file,
"32 bits");
119 fprintf(file,
"64 bits");
121 #ifdef OSL_GMP_IS_HERE 123 fprintf(file,
"GMP");
127 fprintf(file,
"unknown precision %d", precision);
147 #ifdef OSL_GMP_IS_HERE 149 OSL_malloc(variable->mp,
void*,
sizeof(mpz_t));
150 mpz_init(*variable->mp);
183 variable->sp = value.sp;
187 variable->dp = value.dp;
190 #ifdef OSL_GMP_IS_HERE 192 mpz_set(*variable->mp, *value.mp);
211 variable->sp = (
long int)i;
215 variable->dp = (
long long int)i;
218 #ifdef OSL_GMP_IS_HERE 220 mpz_set_si(*variable->mp, i);
240 if (value.sp > (
long int)(INT_MAX))
242 if (value.sp < (
long int)(INT_MIN))
245 return (
int)value.sp;
249 if (value.dp > (
long long int)(INT_MAX))
251 if (value.dp < (
long long int)(INT_MIN))
254 return (
int)value.dp;
256 #ifdef OSL_GMP_IS_HERE 259 if (mpz_fits_sint_p(*value.mp) == 0)
262 return mpz_get_si(*value.mp);
285 #ifdef OSL_GMP_IS_HERE 287 return mpz_get_d(*i.mp);
317 variable->sp = (
long int)i;
321 variable->dp = (
long long int)i;
324 #ifdef OSL_GMP_IS_HERE 326 OSL_malloc(variable->mp,
void*,
sizeof(mpz_t));
327 mpz_init_set_si(*variable->mp, i);
346 long int temp = var1->sp;
353 long long int temp = var1->dp;
359 #ifdef OSL_GMP_IS_HERE 363 mpz_set(temp, *var1->mp);
364 mpz_set(*var1->mp, *var2->mp);
365 mpz_set(*var2->mp, temp);
392 #ifdef OSL_GMP_IS_HERE 394 mpz_clear(*variable->mp);
427 fprintf(file,
"%s",
string);
449 #ifdef OSL_GMP_IS_HERE 452 str = mpz_get_str(0, 10, *value.mp);
481 #ifdef OSL_GMP_IS_HERE 484 str = mpz_get_str(0, 10, *value.mp);
516 #ifdef OSL_GMP_IS_HERE 518 nb_read = gmp_sscanf(
string,
"%lZd", i->mp);
527 if (nb_read == 0) {
OSL_error(
"failed to read an integer"); }
587 if (LONG_MAX - val1.sp < val2.sp)
591 if (val1.sp - LONG_MIN < -val2.sp)
595 variable->sp = val1.sp + val2.sp;
601 if (LLONG_MAX - val1.dp < val2.dp)
605 if (val1.dp - LLONG_MIN < -val2.dp)
609 variable->dp = val1.dp + val2.dp;
612 #ifdef OSL_GMP_IS_HERE 614 mpz_add(*variable->mp, *val1.mp, *val2.mp);
637 if (LONG_MAX - value.sp < i)
641 if (value.sp - LONG_MIN < -i)
645 variable->sp = value.sp + (
long int)i;
651 if (LLONG_MAX - value.dp < i)
655 if (value.dp - LLONG_MIN < -i)
659 variable->dp = value.dp + (
long long int)i;
662 #ifdef OSL_GMP_IS_HERE 665 mpz_init_set_si(si, i);
666 mpz_add(*variable->mp, *value.mp, si);
687 #ifdef OSL_GMP_IS_HERE 689 mpz_sub(*variable->mp, *val1.mp, *val2.mp);
712 variable->sp = val1.sp * val2.sp;
715 if (variable->sp / val2.sp != val1.sp) {
723 variable->dp = val1.dp * val2.dp;
726 if (variable->dp / val2.dp != val1.dp) {
733 #ifdef OSL_GMP_IS_HERE 735 mpz_mul(*variable->mp, *val1.mp, *val2.mp);
756 variable->sp = value.sp * (
long int)i;
759 if (variable->sp / (
long int)i != value.sp) {
767 variable->dp = value.dp * (
long long int)i;
770 if (variable->dp / (
long long int)i != value.dp) {
777 #ifdef OSL_GMP_IS_HERE 779 mpz_mul_si(*variable->mp, *value.mp, i);
805 #ifdef OSL_GMP_IS_HERE 827 if (q->sp < 0) {
if (a.sp % b.sp != 0) --q->sp; }
828 else if (q->sp == 0) {
838 if (q->dp < 0) {
if (a.dp % b.dp != 0) --q->dp; }
839 else if (q->dp == 0) {
847 #ifdef OSL_GMP_IS_HERE 869 r->sp = a.sp - r->sp * b.sp;
874 r->dp = a.dp - r->dp * b.dp;
877 #ifdef OSL_GMP_IS_HERE 900 r->sp = a.sp - q->sp * b.sp;
905 r->dp = a.dp - q->dp * b.dp;
908 #ifdef OSL_GMP_IS_HERE 929 mod->sp = a.sp % b.sp;
930 if (mod->sp < 0) mod->sp += labs(b.sp);
934 mod->dp = a.dp % b.dp;
935 if (mod->dp < 0) mod->dp += llabs(b.dp);
938 #ifdef OSL_GMP_IS_HERE 948 static long long int llgcd(
long long int const a,
long long int const b) {
949 return (b ?
llgcd(b, a % b) : a);
966 #ifdef OSL_GMP_IS_HERE 1016 switch (precision) {
1018 variable->sp = -value.sp;
1022 variable->dp = -value.dp;
1025 #ifdef OSL_GMP_IS_HERE 1027 mpz_neg(*variable->mp, *value.mp);
1045 switch (precision) {
1047 variable->sp = (value.sp > 0) ? value.sp : -value.sp;
1051 variable->dp = (value.dp > 0) ? value.dp : -value.dp;
1054 #ifdef OSL_GMP_IS_HERE 1056 mpz_abs(*variable->mp, *value.mp);
1072 while (x) { x >>= 1; ++n; }
1074 return ((n == 0) ? 1 : n);
1085 switch (precision) {
1090 #ifdef OSL_GMP_IS_HERE 1094 default:
OSL_error(
"unknown precision");
1105 while (x) { x /= 10; ++n; }
1119 switch (precision) {
1124 #ifdef OSL_GMP_IS_HERE 1128 default:
OSL_error(
"unknown precision");
1146 switch (precision) {
1148 return (val1.sp == val2.sp);
1151 return (val1.dp == val2.dp);
1153 #ifdef OSL_GMP_IS_HERE 1155 return (mpz_cmp(*val1.mp, *val2.mp) == 0);
1183 switch (precision) {
1186 return (val1.sp < val2.sp);
1188 #ifdef OSL_GMP_IS_HERE 1190 return (mpz_cmp(*val1.mp, *val2.mp) < 0);
1206 switch (precision) {
1209 return (val1.sp <= val2.sp);
1211 #ifdef OSL_GMP_IS_HERE 1213 return (mpz_cmp(*val1.mp, *val2.mp) <= 0);
1229 switch (precision) {
1232 return (val1.sp > val2.sp);
1234 #ifdef OSL_GMP_IS_HERE 1236 return (mpz_cmp(*val1.mp, *val2.mp) > 0);
1252 switch (precision) {
1255 return (val1.sp >= val2.sp);
1257 #ifdef OSL_GMP_IS_HERE 1259 return (mpz_cmp(*val1.mp, *val2.mp) >= 0);
1274 switch (precision) {
1276 return (value.sp > 0);
1279 return (value.dp > 0);
1281 #ifdef OSL_GMP_IS_HERE 1283 return (mpz_sgn(*value.mp) > 0);
1299 switch (precision) {
1301 return (value.sp < 0);
1304 return (value.dp < 0);
1306 #ifdef OSL_GMP_IS_HERE 1308 return (mpz_sgn(*value.mp) < 0);
1324 switch (precision) {
1326 return (value.sp == 0);
1329 return (value.dp == 0);
1331 #ifdef OSL_GMP_IS_HERE 1333 return (mpz_sgn(*value.mp) == 0);
1349 switch (precision) {
1351 return (value.sp == (
long int)1);
1354 return (value.dp == (
long long int)1);
1356 #ifdef OSL_GMP_IS_HERE 1358 return (mpz_cmp_si(*value.mp, 1) == 0);
1374 switch (precision) {
1376 return (value.sp == (
long int)-1);
1379 return (value.dp == (
long long int)-1);
1381 #ifdef OSL_GMP_IS_HERE 1383 return (mpz_cmp_si(*value.mp, -1) == 0);
1401 switch (precision) {
1403 return ((val1.sp % val2.sp) == 0);
1406 return ((val1.dp % val2.dp) == 0);
1408 #ifdef OSL_GMP_IS_HERE 1410 return mpz_divisible_p(*val1.mp, *val2.mp);
1432 if (i != NULL && precision != new_precision) {
int osl_int_divisible(int precision, osl_const_int_t val1, osl_const_int_t val2)
(val1 % val2) == 0
void osl_int_print(FILE *file, int precision, osl_const_int_t value)
void osl_int_free(int precision, osl_int_const_p variable)
Free thr osl int.
void osl_int_abs(int precision, osl_int_const_p variable, osl_const_int_t value)
variable = | value |
void osl_int_dump_precision(FILE *file, int precision)
int osl_int_ge(int precision, osl_const_int_t val1, osl_const_int_t val2)
val1 >= val2
int osl_int_get_si(int precision, osl_const_int_t value)
Get the value in a int.
void osl_int_swap(int precision, osl_int_const_p var1, osl_int_const_p var2)
Swap the osl ints.
void osl_int_lcm(int const precision, osl_int_p lcm, osl_const_int_t a, osl_const_int_t b)
Compute the least common multiple (lcm) of two numbers a and b. For negative numbers, gives the least positive common multiple.
void osl_int_set_si(int precision, osl_int_const_p variable, int i)
variable = i
int osl_int_one(int precision, osl_const_int_t value)
value == 1
static size_t lllog2(long long int x)
void osl_int_div_exact(int const precision, osl_int_const_p q, osl_const_int_t a, osl_const_int_t b)
q = a / b
void osl_int_floor_div_q_r(int const precision, osl_int_const_p q, osl_int_const_p r, osl_const_int_t a, osl_const_int_t b)
Compute (q, r) such that a = b * q + r.
#define OSL_overflow(msg)
void osl_int_add(int precision, osl_int_const_p variable, osl_const_int_t val1, osl_const_int_t val2)
variable = val1 + val2
union osl_int *const osl_int_const_p
static long long int llgcd(long long int const a, long long int const b)
int osl_int_gt(int precision, osl_const_int_t val1, osl_const_int_t val2)
val1 > val2
void osl_int_sprint(char *string, int precision, osl_const_int_t value)
void osl_int_mul_si(int precision, osl_int_const_p variable, osl_const_int_t value, int i)
variable = val1 * i
void osl_int_add_si(int precision, osl_int_const_p variable, osl_const_int_t value, int i)
variable = val1 + i
void osl_int_set_precision(int const precision, int const new_precision, osl_int_p i)
Change the precision of the osl_int.
int osl_int_ne(int precision, osl_const_int_t val1, osl_const_int_t val2)
val1 != val2
void osl_int_decrement(int precision, osl_int_const_p variable, osl_const_int_t value)
variable = value - 1
size_t osl_int_size_in_base_10(int const precision, osl_const_int_t const value)
Get the size in base 10.
void osl_int_init_set(int precision, osl_int_const_p variable, osl_const_int_t i)
variable = i // including initialization for GMP
int osl_int_le(int precision, osl_const_int_t val1, osl_const_int_t val2)
val1 <= val2
void osl_int_sprint_txt(char *string, int precision, osl_const_int_t value)
void osl_int_oppose(int precision, osl_int_const_p variable, osl_const_int_t value)
variable = - value
void osl_int_init_set_si(int precision, osl_int_const_p variable, int i)
variable = i // including initialization for GMP
int osl_int_eq(int precision, osl_const_int_t val1, osl_const_int_t val2)
val1 == val2
void osl_int_init(int precision, osl_int_const_p variable)
Initialize the osl int.
void osl_int_floor_div_q(int const precision, osl_int_const_p q, osl_const_int_t a, osl_const_int_t b)
q = floor(a / b)
void osl_int_gcd(int const precision, osl_int_const_p gcd, osl_const_int_t a, osl_const_int_t b)
Compute the gcd (greatest common divisor) of a and b.
int osl_int_mone(int precision, osl_const_int_t value)
value == -1
union osl_int const osl_const_int_t
void osl_int_sread(char **string, int precision, osl_int_const_p i)
sread for osl int
int osl_int_is_precision_supported(int precision)
osl_int_p osl_int_malloc(int precision)
Initialize the osl int.
int osl_int_neg(int precision, osl_const_int_t value)
value < 0
int osl_int_pos(int precision, osl_const_int_t value)
value > 0
void osl_int_sub(int precision, osl_int_const_p variable, osl_const_int_t val1, osl_const_int_t val2)
variable = val1 - val2
size_t osl_int_size_in_base_2(int const precision, osl_const_int_t const value)
Get the size in base 2.
void osl_int_mod(int const precision, osl_int_const_p mod, osl_const_int_t a, osl_const_int_t b)
mod = a % b
int osl_int_sscanf(char *string, int precision, osl_int_const_p i)
sscanf for osl int
void osl_int_increment(int precision, osl_int_const_p variable, osl_const_int_t value)
variable = value + 1
void osl_int_mul(int precision, osl_int_const_p variable, osl_const_int_t val1, osl_const_int_t val2)
variable = val1 * val2
int osl_int_lt(int precision, osl_const_int_t val1, osl_const_int_t val2)
val1 < val2
void osl_int_clear(int precision, osl_int_const_p variable)
variable = 0 // including cleaning for GMP
void osl_int_assign(int precision, osl_int_const_p variable, osl_const_int_t value)
variable = value
double osl_int_get_d(int precision, osl_const_int_t i)
Get the value in a double.
static size_t lllog10(long long int x)
int osl_int_zero(int precision, osl_const_int_t value)
value == 0
void osl_int_floor_div_r(int const precision, osl_int_const_p r, osl_const_int_t a, osl_const_int_t b)
r = a - b * (a / b)
#define OSL_malloc(ptr, type, size)