00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00041 #ifndef __NUSMV_CORE_UTILS_BIGNUMBERS_NUMBERS_INT_H__
00042
00048 #define __NUSMV_CORE_UTILS_BIGNUMBERS_NUMBERS_INT_H__
00049
00050 #include <gmp.h>
00051 #include <stdio.h>
00052 #include <stdlib.h>
00053 #include <limits.h>
00054 #include <math.h>
00055 #include <string.h>
00056
00057 #include "nusmv/core/utils/defs.h"
00058
00059
00060
00061
00062
00068 #define QNumber_NUM_BITS_NORMAL (sizeof(long) * 8)
00069
00075 #define manual_set_buf_size 100
00076
00077
00078
00079
00080
00087 typedef struct {
00088 mpz_t num;
00089 mpz_t den;
00090 } Gmp;
00091
00092
00101 typedef struct {
00102
00103
00104
00105
00106
00107 union {
00108 long num;
00109 Gmp *gmp;
00110 } data;
00111 long den;
00112 } QNumber;
00113
00114
00115
00116
00117
00118
00119
00120
00121
00124
00125
00126
00127
00128 long QNumber_gcd_nocache(long a, long b);
00129
00130 Gmp* Gmp_alloc(void);
00131
00132 void Gmp_free(Gmp* p);
00133
00134 void QNumber_clean_gmp(QNumber* p);
00135
00136 QNumber QNumber_from_long(long n);
00137
00138 QNumber QNumber_from_two_longs(long n, long d);
00139
00140 QNumber QNumber_from_mpq(mpq_t* n);
00141
00142 QNumber QNumber_from_two_mpzs(mpz_t *n, mpz_t *d);
00143
00144 QNumber QNumber_from_other(const QNumber *other);
00145
00146 QNumber QNumber_from_nothing(void);
00147
00152 QNumber* QNumber_copy_to_heap(QNumber* self);
00153
00154 boolean QNumber_big(const QNumber *self);
00155
00156 QNumber QNumber_assign(mpz_t n, mpz_t d, int b);
00157
00158 boolean QNumber_fix_int_min(QNumber *self);
00159
00160 boolean QNumber_is_int_big(const QNumber *self);
00161
00162 boolean QNumber_is_int_normal(const QNumber *self);
00163
00164 void QNumber_make_big(QNumber *self);
00165
00166 QNumber QNumber_operator_unaray_minus(const QNumber *r);
00167
00168 QNumber
00169 QNumber_make_number_from_unsigned_long_long(unsigned long long n);
00170
00175 void QNumber_operator_self_plus_big(QNumber* self, const QNumber *r);
00176
00181 void QNumber_operator_self_plus(QNumber* self, const QNumber *r);
00182
00187 void QNumber_operator_self_minus_big(QNumber* self, const QNumber *r);
00188
00193 void QNumber_operator_self_minus(QNumber* self, const QNumber *r);
00194
00199 void QNumber_operator_self_mul_big(QNumber* self, const QNumber *r);
00200
00205 void QNumber_operator_self_mul(QNumber* self, const QNumber *r);
00206
00211 void QNumber_operator_self_div(QNumber* self, const QNumber * r);
00212
00213 boolean QNumber_operator_less_than_both_small(const QNumber *n,
00214 const QNumber *r);
00215
00216 boolean QNumber_operator_less_than_r_small(const QNumber *n, const QNumber *r);
00217
00218 boolean QNumber_operator_less_than_n_small(const QNumber *n, const QNumber *r);
00219
00220 boolean QNumber_operator_less_than_both_big(const QNumber *n,
00221 const QNumber *r);
00222
00223 boolean QNumber_operator_less_than(const QNumber *n, const QNumber *r);
00224
00225 boolean QNumber_operator_equals(const QNumber *n, const QNumber *r);
00226
00227 QNumber QNumber_inv(const QNumber *self);
00228
00229 void QNumber_self_neg(QNumber *self);
00230
00231 QNumber QNumber_neg(const QNumber *self);
00232
00233 QNumber QNumber_operator_plus(const QNumber *a, const QNumber *b);
00234
00235 QNumber QNumber_operator_minus(const QNumber *a, const QNumber *b);
00236
00237 QNumber QNumber_operator_mul(const QNumber *a, const QNumber *b);
00238
00239 QNumber QNumber_operator_div(const QNumber *a, const QNumber *b);
00240
00241 boolean QNumber_operator_more_than(const QNumber *a, const QNumber *b);
00242
00243 boolean QNumber_operator_equals(const QNumber *a, const QNumber *b);
00244
00245 boolean QNumber_operator_less_than_or_equals(const QNumber *a,
00246 const QNumber *b);
00247
00248 boolean QNumber_operator_more_than_or_equals(const QNumber *a,
00249 const QNumber *b);
00250
00251 boolean QNumber_operator_not_equal(const QNumber *a, const QNumber *b);
00252
00253 QNumber QNumber_abs(const QNumber *n);
00254
00255 int QNumber_sgn(const QNumber *n);
00256
00257 int QNumber_cmp(const QNumber *a, const QNumber *b);
00258
00259 QNumber QNumber_gcd(const QNumber *a, const QNumber *b);
00260
00261 long QNumber_gcd_long(long a, long b);
00262
00263 void QNumber_self_addmul(QNumber *self,
00264 const QNumber *a,
00265 const QNumber *b);
00266
00267 boolean QNumber_self_to_int(const QNumber *self,
00268 int* out_value);
00269
00270 QNumber QNumber_floor(const QNumber *self);
00271
00272 QNumber QNumber_get_num(const QNumber *self);
00273
00274 QNumber QNumber_get_den(const QNumber *self);
00275
00276 boolean QNumber_divides(const QNumber *self, const QNumber *other);
00277
00278 boolean QNumber_is_integer(const QNumber * self);
00279
00280 void QNumber_divmod(const QNumber *self,
00281 const QNumber *other,
00282 QNumber *q,
00283 QNumber *r);
00284
00285 void QNumber_self_decompose(const QNumber *self);
00286
00287 boolean QNumber_decompose(const QNumber *self, QNumber *z, QNumber *q);
00288
00289 void QNumber_normalize(QNumber *self);
00290
00291 boolean QNumber_add_overflow(long* res, long lhs, long rhs);
00292
00293 boolean QNumber_sub_overflow(long* res, long lhs, long rhs);
00294
00295 boolean QNumber_mul_overflow(long *res, long lhs, long rhs);
00296
00297 boolean QNumber_div_overflow(long* res, long lhs, long rhs);
00298
00299 int QNumber_integer_from_string(char* str,
00300 char* error,
00301 int base,
00302 QNumber* target);
00303
00304 char* QNumber_print_integer(const QNumber* n, int base);
00305
00306 void init_mpz_pool(mpz_t* mpz_pool, size_t nr_to_init);
00307
00308 void clean_mpz_pool(mpz_t* mpz_pool, size_t nr_to_clean);
00309
00310 #endif
00311