00001
00002
00003
00004
00005
00006
00007
00008
00010
00011 #ifndef _MONOMIAL_H_
00012 #define _MONOMIAL_H_
00013
00021 #include <inttypes.h>
00022
00032
00033
00035
00042 #define _N_ 2
00043
00045
00047
00059 typedef uint64_t monomial_t;
00060
00066 #if _N_ < 3
00067 typedef uint32_t exponent_t;
00068 #elif _N_ < 7
00069 typedef uint16_t exponent_t;
00070 #else
00071 typedef uint8_t exponent_t;
00072 #endif
00073
00075
00077
00083 #define MON_BITS_PER_EXP (64/(_N_+1))
00084
00091 #define MON_BITMASK_BLOCK ((monomial_t) ((((monomial_t)1) << MON_BITS_PER_EXP) - ((monomial_t)1)))
00092
00100 #define MON_BITMASK_ALL (64 % (_N_ + 1) ? ((monomial_t) ((((monomial_t)1) << ((_N_ + 1) * MON_BITS_PER_EXP)) - ((monomial_t)1))) : 0xFFFFFFFFFFFFFFFFULL)
00101
00108 #if _N_ == 1
00109 #define MON_VARS "XY"
00110 #elif _N_ == 2
00111 #define MON_VARS "XYZ"
00112 #elif _N_ == 3
00113 #define MON_VARS "WXYZ"
00114 #elif _N_ == 4
00115 #define MON_VARS "VWXYZ"
00116 #elif _N_ == 5
00117 #define MON_VARS "UVWYXZ"
00118 #elif _N_ == 6
00119 #define MON_VARS "TUVWXYZ"
00120 #else
00121 #define MON_VARS "STUVWXYZ"
00122 #endif
00123
00125
00127
00129
00130
00143 #define MON_INIT(x) ((x) = 0)
00144
00150 #define MON_CLEAR(x)
00151
00159 #define MON_SET(x, y) ((x) = (y))
00160
00168 #define MON_SWAP(x, y) { monomial_t _t_ = (x); (x) = (y); (y) = _t_; }
00169
00177 #define MON_ONE(x) ((x) = 0)
00178
00183
00184
00185
00199 #define MON_GET_EXP(x, i) ((exponent_t) (((x) >> ((i) * MON_BITS_PER_EXP)) & MON_BITMASK_BLOCK))
00200
00208 #define MON_SET_EXP(x, i, e) ((x) = (((x) & (MON_BITMASK_ALL - (MON_BITMASK_BLOCK << ((i) * MON_BITS_PER_EXP)))) | (((monomial_t)(e)) << ((i) * MON_BITS_PER_EXP))))
00209
00218 #define MON_INC_EXP(x, i, e) ((x) = ((x) + (((monomial_t)(e)) << ((i) * MON_BITS_PER_EXP))))
00219
00228 #define MON_DEC_EXP(x, i, e) ((x) = ((x) - (((monomial_t)(e)) << ((i) * MON_BITS_PER_EXP))))
00229
00234
00235
00236
00249 #define MON_CMP_INVLEX(x, y) (((x) < (y)) ? -1 : ((x) > (y) ? 1 : 0))
00250
00258 #define MON_IS_ONE(x) ((x) == 0)
00259
00264
00265
00266
00279 #define MON_MUL(x, y, z) ((x) = (y) + (z))
00280
00288 #define MON_DIV(x, y, z) ((x) = (y) - (z))
00289
00294
00295
00297
00303 uint32_t mon_degree(monomial_t op);
00304
00314 int32_t mon_divides(monomial_t x, monomial_t y);
00315
00330 char * mon_to_string(monomial_t x, const uint8_t n);
00331 char * mon_to_string_pretty(monomial_t x, const uint8_t n, const char * vars);
00332 monomial_t mon_from_string(char * str);
00333
00343 monomial_t * mon_generate_by_degree(uint32_t * len, const uint8_t n, const uint32_t d);
00344
00349 #endif
00350