00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00031 #if !defined(_TIFA_MACROS_H_)
00032
00036 #define _TIFA_MACROS_H_
00037
00038 #ifdef __cplusplus
00039 extern "C" {
00040 #endif
00041
00042 #if defined(__GMP_IMPL_H__)
00043
00044
00045
00046
00047 #undef MPN_NORMALIZE
00048 #undef SIZ
00049 #undef ABSIZ
00050 #undef PTR
00051 #undef ALLOC
00052 #undef MAX
00053 #undef MIN
00054 #undef ABS
00055 #endif
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00079 #define MPN_NORMALIZE(dest, nlimbs) \
00080 do { \
00081 while (((nlimbs) > 0) && ((dest)[(nlimbs) - 1] == 0)) { \
00082 (nlimbs)--; \
00083 } \
00084 } while (0)
00085
00099 #if !defined(SIZ)
00100 #define SIZ(x) ((x)->_mp_size)
00101 #endif
00102
00114 #if !defined(ABSIZ)
00115 #define ABSIZ(x) (ABS(SIZ(x)))
00116 #endif
00117
00122 #if !defined(MPZ_TO_ABS)
00123 #define MPZ_TO_ABS(x) (SIZ(x) = ABSIZ(x))
00124 #endif
00125
00138 #if !defined(PTR)
00139 #define PTR(x) ((x)->_mp_d)
00140 #endif
00141
00153 #if !defined(ALLOC)
00154 #define ALLOC(x) ((x)->_mp_alloc)
00155 #endif
00156
00162 #define MPZ_LIMB_VALUE(x, i) ( PTR(x)[(i)] & GMP_NUMB_MASK )
00163
00169 #define MPZ_LAST_LIMB_VALUE(x) ( PTR(x)[SIZ(x) - 1] & GMP_NUMB_MASK )
00170
00179 #if !defined(MAX)
00180 #define MAX(a,b) ( ((a) > (b)) ? (a) : (b) )
00181 #endif
00182
00191 #if !defined(MIN)
00192 #define MIN(a,b) ( ((a) < (b)) ? (a) : (b) )
00193 #endif
00194
00203 #if !defined(ABS)
00204 #define ABS(a) ( ((a) < 0) ? (-(a)) : (a) )
00205 #endif
00206
00216 #define IS_POWER_OF_2_UI(ui) ( ((ui) & ((ui) - 1)) == 0 )
00217
00223 #define IS_EVEN(ui) (((ui) & 1) == 0)
00224
00230 #define IS_ODD(ui) (((ui) & 1) != 0)
00231
00237 #define ARE_EVEN(uia, uib) ((((uia) | (uib)) & 1) == 0)
00238
00244 #define ARE_ODD(uia, uib) ((((uia) | (uib)) & 1) != 0)
00245
00251 #define BIT(N, i) ( ((N) & (1<<(i))) ? 1 : 0 )
00252
00277 #define DUFF_DEVICE(COUNT, STATEMENT, ...) \
00278 do { \
00279 long int __count__ = (COUNT); \
00280 long int __niter__ = (__count__ + 7) >> 3; \
00281 switch (__count__ & 7) { \
00282 case 0: do { STATEMENT; __VA_ARGS__; \
00283 case 7: STATEMENT; __VA_ARGS__; \
00284 case 6: STATEMENT; __VA_ARGS__; \
00285 case 5: STATEMENT; __VA_ARGS__; \
00286 case 4: STATEMENT; __VA_ARGS__; \
00287 case 3: STATEMENT; __VA_ARGS__; \
00288 case 2: STATEMENT; __VA_ARGS__; \
00289 case 1: STATEMENT; __VA_ARGS__; \
00290 __niter__--; \
00291 } while (__niter__ > 0); \
00292 } \
00293 } while (0)
00294
00303 #define MPZ_IS_SQUARE(X) (0 != mpz_perfect_square_p(X))
00304
00310 #define NMILLER_RABIN 32
00311
00320 #define MPZ_IS_PRIME(X) (0 != mpz_probab_prime_p((X), NMILLER_RABIN))
00321
00339 #define MPN_ADD(A, B, C) \
00340 do { \
00341 if (mpn_add(PTR(A), PTR(B), SIZ(B), PTR(C), SIZ(C))) { \
00342 SIZ(A) = SIZ(B); \
00343 MPN_NORMALIZE(PTR(A), SIZ(A)); \
00344 PTR(A)[SIZ(A)] = 1; \
00345 SIZ(A)++; \
00346 } else { \
00347 SIZ(A) = SIZ(B); \
00348 MPN_NORMALIZE(PTR(A), SIZ(A)); \
00349 } \
00350 } while (0)
00351
00371 #define MPN_ADD_CS(A, B, C) \
00372 do { \
00373 if (SIZ(B) > SIZ(C)) { \
00374 MPN_ADD(A, B, C); \
00375 } else { \
00376 MPN_ADD(A, C, B); \
00377 } \
00378 } while (0)
00379
00396 #define MPN_SUB(A, B, C) \
00397 do { \
00398 mpn_sub(PTR(A), PTR(B), SIZ(B), PTR(C), SIZ(C)); \
00399 SIZ(A) = SIZ(B); \
00400 MPN_NORMALIZE(PTR(A), SIZ(A)); \
00401 } while (0)
00402
00419 #define MPN_SUB_N(A, B, C) \
00420 do { \
00421 mpn_sub_n(PTR(A), PTR(B), PTR(C), SIZ(B)); \
00422 SIZ(A) = SIZ(B); \
00423 MPN_NORMALIZE(PTR(A), SIZ(A)); \
00424 } while (0)
00425
00440 #define MPN_TDIV_QR(Q, R, N, D) \
00441 do { \
00442 if (SIZ(N) >= SIZ(D)) { \
00443 mpn_tdiv_qr(PTR(Q), PTR(R), 0, PTR(N), SIZ(N), PTR(D), SIZ(D)); \
00444 SIZ(Q) = SIZ(N) - SIZ(D) + 1; \
00445 MPN_NORMALIZE(PTR(Q), SIZ(Q)); \
00446 SIZ(R) = SIZ(D); \
00447 MPN_NORMALIZE(PTR(R), SIZ(R)); \
00448 } \
00449 } while (0)
00450
00466 #define MPN_MUL(A, B, C) \
00467 do { \
00468 mpn_mul(PTR(A), PTR(B), SIZ(B), PTR(C), SIZ(C)); \
00469 SIZ(A) = SIZ(B) + SIZ(C); \
00470 MPN_NORMALIZE(PTR(A), SIZ(A)); \
00471 } while (0)
00472
00488 #define MPN_MUL_N(A, B, C) \
00489 do { \
00490 mpn_mul_n(PTR(A), PTR(B), PTR(C), SIZ(B)); \
00491 SIZ(A) = SIZ(B) << 1; \
00492 MPN_NORMALIZE(PTR(A), SIZ(A)); \
00493 } while (0)
00494
00511 #define MPN_MUL_CS(A, B, C) \
00512 do { \
00513 if (SIZ(B) > SIZ(C)) { \
00514 mpn_mul(PTR(A), PTR(B), SIZ(B), PTR(C), SIZ(C)); \
00515 } else { \
00516 mpn_mul(PTR(A), PTR(C), SIZ(C), PTR(B), SIZ(B)); \
00517 } \
00518 SIZ(A) = SIZ(B) + SIZ(C); \
00519 MPN_NORMALIZE(PTR(A), SIZ(A)); \
00520 } while (0)
00521
00537 #define MPN_MUL_CS_S(A, B, C) \
00538 do { \
00539 if (ABSIZ(B) > ABSIZ(C)) { \
00540 mpn_mul(PTR(A), PTR(B), ABSIZ(B), PTR(C), ABSIZ(C)); \
00541 } else { \
00542 mpn_mul(PTR(A), PTR(C), ABSIZ(C), PTR(B), ABSIZ(B)); \
00543 } \
00544 SIZ(A) = ABSIZ(B) + ABSIZ(C); \
00545 MPN_NORMALIZE(PTR(A), SIZ(A)); \
00546 if ((SIZ(B) ^ SIZ(C)) < 0) { \
00547 SIZ(A) = -SIZ(A); \
00548 } \
00549 } while (0)
00550
00562 #define DECLARE_MPZ_SWAP_VARS \
00563 mp_ptr __TMPPTR__MACROS_H__a9b3c01__; \
00564 mp_size_t __TMPSIZ__MACROS_H__a9b3c01__;
00565
00575 #define MPZ_SWAP(A, B) \
00576 do { \
00577 __TMPPTR__MACROS_H__a9b3c01__ = PTR(A); \
00578 __TMPSIZ__MACROS_H__a9b3c01__ = SIZ(A); \
00579 PTR(A) = PTR(B); \
00580 SIZ(A) = SIZ(B); \
00581 PTR(B) = __TMPPTR__MACROS_H__a9b3c01__; \
00582 SIZ(B) = __TMPSIZ__MACROS_H__a9b3c01__; \
00583 } while (0)
00584
00594 #if (defined(ENABLE_TIFA_DEBUG_MSG) && (ENABLE_TIFA_DEBUG_MSG != 0))
00595 #define TIFA_DEBUG_MSG(...) \
00596 do { \
00597 printf("\nDEBUG (%s:%i) ", __FILE__, __LINE__); \
00598 printf(__VA_ARGS__);fflush(stdout); \
00599 } while (0)
00600 #else
00601 #define TIFA_DEBUG_MSG(...)
00602 #endif
00603
00604 #ifdef __cplusplus
00605 }
00606 #endif
00607
00608 #endif