[4f8867] | 1 | #ifndef RMODULO2M_H |
---|
| 2 | #define RMODULO2M_H |
---|
[35b1d7] | 3 | /**************************************** |
---|
| 4 | * Computer Algebra System SINGULAR * |
---|
| 5 | ****************************************/ |
---|
| 6 | /* |
---|
[e90dfd6] | 7 | * ABSTRACT: numbers modulo 2^m such that 2^m - 1 |
---|
| 8 | * fits in an unsigned long |
---|
[35b1d7] | 9 | */ |
---|
[c90b43] | 10 | #ifdef HAVE_RINGS |
---|
[2d805a] | 11 | #include <coeffs/coeffs.h> |
---|
| 12 | #include <coeffs/rintegers.h> |
---|
[f1c465f] | 13 | |
---|
| 14 | #ifndef NATNUMBER |
---|
| 15 | #define NATNUMBER unsigned long |
---|
| 16 | #endif |
---|
| 17 | |
---|
[1cce47] | 18 | BOOLEAN nr2mInitChar (coeffs r, void*); |
---|
[35b1d7] | 19 | |
---|
[f1c465f] | 20 | number nr2mCopy (number a, const coeffs r); |
---|
[8d0331d] | 21 | BOOLEAN nr2mGreaterZero (number k, const coeffs r); |
---|
| 22 | number nr2mMult (number a, number b, const coeffs r); |
---|
[2f3764] | 23 | number nr2mInit (long i, const coeffs r); |
---|
[8d0331d] | 24 | int nr2mInt (number &n, const coeffs r); |
---|
| 25 | number nr2mAdd (number a, number b, const coeffs r); |
---|
| 26 | number nr2mSub (number a, number b, const coeffs r); |
---|
| 27 | void nr2mPower (number a, int i, number * result, const coeffs r); |
---|
| 28 | BOOLEAN nr2mIsZero (number a, const coeffs r); |
---|
| 29 | BOOLEAN nr2mIsOne (number a, const coeffs r); |
---|
| 30 | BOOLEAN nr2mIsMOne (number a, const coeffs r); |
---|
| 31 | BOOLEAN nr2mIsUnit (number a, const coeffs r); |
---|
| 32 | number nr2mGetUnit (number a, const coeffs r); |
---|
| 33 | number nr2mDiv (number a, number b, const coeffs r); |
---|
| 34 | number nr2mIntDiv (number a,number b, const coeffs r); |
---|
| 35 | number nr2mMod (number a,number b, const coeffs r); |
---|
| 36 | number nr2mNeg (number c, const coeffs r); |
---|
| 37 | number nr2mInvers (number c, const coeffs r); |
---|
| 38 | BOOLEAN nr2mGreater (number a, number b, const coeffs r); |
---|
| 39 | BOOLEAN nr2mDivBy (number a, number b, const coeffs r); |
---|
| 40 | int nr2mDivComp (number a, number b, const coeffs r); |
---|
| 41 | BOOLEAN nr2mEqual (number a, number b, const coeffs r); |
---|
| 42 | number nr2mLcm (number a, number b, const coeffs r); |
---|
| 43 | number nr2mGcd (number a, number b, const coeffs r); |
---|
| 44 | number nr2mExtGcd (number a, number b, number *s, number *t, const coeffs r); |
---|
[4cd3ee] | 45 | nMapFunc nr2mSetMap (const coeffs src, const coeffs dst); |
---|
[8d0331d] | 46 | void nr2mWrite (number &a, const coeffs r); |
---|
| 47 | const char * nr2mRead (const char *s, number *a, const coeffs r); |
---|
| 48 | char * nr2mName (number n, const coeffs r); |
---|
[03f7b5] | 49 | void nr2mCoeffWrite (const coeffs r, BOOLEAN details); |
---|
[35b1d7] | 50 | #ifdef LDEBUG |
---|
[8d0331d] | 51 | BOOLEAN nr2mDBTest (number a, const char *f, const int l, const coeffs r); |
---|
[35b1d7] | 52 | #endif |
---|
[8d0331d] | 53 | void nr2mSetExp(int c, const coeffs r); |
---|
| 54 | void nr2mInitExp(int c, const coeffs r); |
---|
[35b1d7] | 55 | |
---|
[8c6bd4d] | 56 | number nr2mMapQ(number from, const coeffs src, const coeffs dst); |
---|
[35b1d7] | 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 | |
---|
[8c6bd4d] | 80 | |
---|
[4f8867] | 81 | #endif |
---|
| 82 | #endif |
---|