[4f8867] | 1 | #ifndef RMODULO2M_H |
---|
| 2 | #define RMODULO2M_H |
---|
[35b1d7] | 3 | /**************************************** |
---|
| 4 | * Computer Algebra System SINGULAR * |
---|
| 5 | ****************************************/ |
---|
[341696] | 6 | /* $Id$ */ |
---|
[35b1d7] | 7 | /* |
---|
[e90dfd6] | 8 | * ABSTRACT: numbers modulo 2^m such that 2^m - 1 |
---|
| 9 | * fits in an unsigned long |
---|
[35b1d7] | 10 | */ |
---|
[c90b43] | 11 | #ifdef HAVE_RINGS |
---|
[2d805a] | 12 | #include <coeffs/coeffs.h> |
---|
| 13 | #include <coeffs/rintegers.h> |
---|
[f1c465f] | 14 | |
---|
| 15 | #ifndef NATNUMBER |
---|
| 16 | #define NATNUMBER unsigned long |
---|
| 17 | #endif |
---|
| 18 | |
---|
[1cce47] | 19 | BOOLEAN nr2mInitChar (coeffs r, void*); |
---|
[35b1d7] | 20 | |
---|
[f1c465f] | 21 | number nr2mCopy (number a, const coeffs r); |
---|
[8d0331d] | 22 | BOOLEAN nr2mGreaterZero (number k, const coeffs r); |
---|
| 23 | number nr2mMult (number a, number b, const coeffs r); |
---|
| 24 | number nr2mInit (int i, const coeffs r); |
---|
| 25 | int nr2mInt (number &n, const coeffs r); |
---|
| 26 | number nr2mAdd (number a, number b, const coeffs r); |
---|
| 27 | number nr2mSub (number a, number b, const coeffs r); |
---|
| 28 | void nr2mPower (number a, int i, number * result, const coeffs r); |
---|
| 29 | BOOLEAN nr2mIsZero (number a, const coeffs r); |
---|
| 30 | BOOLEAN nr2mIsOne (number a, const coeffs r); |
---|
| 31 | BOOLEAN nr2mIsMOne (number a, const coeffs r); |
---|
| 32 | BOOLEAN nr2mIsUnit (number a, const coeffs r); |
---|
| 33 | number nr2mGetUnit (number a, const coeffs r); |
---|
| 34 | number nr2mDiv (number a, number b, const coeffs r); |
---|
| 35 | number nr2mIntDiv (number a,number b, const coeffs r); |
---|
| 36 | number nr2mMod (number a,number b, const coeffs r); |
---|
| 37 | number nr2mNeg (number c, const coeffs r); |
---|
| 38 | number nr2mInvers (number c, const coeffs r); |
---|
| 39 | BOOLEAN nr2mGreater (number a, number b, const coeffs r); |
---|
| 40 | BOOLEAN nr2mDivBy (number a, number b, const coeffs r); |
---|
| 41 | int nr2mDivComp (number a, number b, const coeffs r); |
---|
| 42 | BOOLEAN nr2mEqual (number a, number b, const coeffs r); |
---|
| 43 | number nr2mLcm (number a, number b, const coeffs r); |
---|
| 44 | number nr2mGcd (number a, number b, const coeffs r); |
---|
| 45 | number nr2mExtGcd (number a, number b, number *s, number *t, const coeffs r); |
---|
[4cd3ee] | 46 | nMapFunc nr2mSetMap (const coeffs src, const coeffs dst); |
---|
[8d0331d] | 47 | void nr2mWrite (number &a, const coeffs r); |
---|
| 48 | const char * nr2mRead (const char *s, number *a, const coeffs r); |
---|
| 49 | char * nr2mName (number n, const coeffs r); |
---|
[7a8011] | 50 | void nr2mCoeffWrite (const coeffs r); |
---|
[35b1d7] | 51 | #ifdef LDEBUG |
---|
[8d0331d] | 52 | BOOLEAN nr2mDBTest (number a, const char *f, const int l, const coeffs r); |
---|
[35b1d7] | 53 | #endif |
---|
[8d0331d] | 54 | void nr2mSetExp(int c, const coeffs r); |
---|
| 55 | void nr2mInitExp(int c, const coeffs r); |
---|
[35b1d7] | 56 | |
---|
| 57 | |
---|
[8d0331d] | 58 | static inline number nr2mMultM(number a, number b, const coeffs r) |
---|
[35b1d7] | 59 | { |
---|
[76e501] | 60 | return (number) |
---|
[e90dfd6] | 61 | ((((NATNUMBER) a) * ((NATNUMBER) b)) & ((NATNUMBER)r->mod2mMask)); |
---|
[35b1d7] | 62 | } |
---|
| 63 | |
---|
[8d0331d] | 64 | static inline number nr2mAddM(number a, number b, const coeffs r) |
---|
[35b1d7] | 65 | { |
---|
[76e501] | 66 | return (number) |
---|
[e90dfd6] | 67 | ((((NATNUMBER) a) + ((NATNUMBER) b)) & ((NATNUMBER)r->mod2mMask)); |
---|
[35b1d7] | 68 | } |
---|
| 69 | |
---|
[8d0331d] | 70 | static inline number nr2mSubM(number a, number b, const coeffs r) |
---|
[35b1d7] | 71 | { |
---|
[e90dfd6] | 72 | return (number)((NATNUMBER)a < (NATNUMBER)b ? |
---|
| 73 | r->mod2mMask - (NATNUMBER)b + (NATNUMBER)a + 1: |
---|
| 74 | (NATNUMBER)a - (NATNUMBER)b); |
---|
[35b1d7] | 75 | } |
---|
| 76 | |
---|
[e90dfd6] | 77 | #define nr2mNegM(A,r) (number)((r->mod2mMask - (NATNUMBER)(A) + 1) & r->mod2mMask) |
---|
[35b1d7] | 78 | #define nr2mEqualM(A,B) ((A)==(B)) |
---|
[4f8867] | 79 | |
---|
| 80 | #endif |
---|
| 81 | #endif |
---|