30 ((((
unsigned long) a) * ((
unsigned long) b)) & ((
unsigned long)r->mod2mMask));
36 ((((
unsigned long) a) + ((
unsigned long) b)) & ((
unsigned long)r->mod2mMask));
41 return (number)((
unsigned long)a < (
unsigned long)b ?
42 r->mod2mMask - (
unsigned long)b + (
unsigned long)a + 1:
43 (
unsigned long)a - (
unsigned long)
b);
46 #define nr2mNegM(A,r) (number)((r->mod2mMask - (unsigned long)(A) + 1) & r->mod2mMask) 47 #define nr2mEqualM(A,B) ((A)==(B)) 53 static char n2mCoeffName_buf[22];
54 snprintf(n2mCoeffName_buf,21,
"ZZ/(2^%lu)",cf->modExponent);
55 return n2mCoeffName_buf;
60 PrintS(
"// coeff. ring is : ");
61 Print(
"Z/2^%lu\n", r->modExponent);
69 unsigned long mm=r->mod2mMask;
70 if (((mm+1)>>
m)==1L)
return TRUE;
79 sprintf(s,
"ZZ/(2^%lu)",r->modExponent);
86 long ch = r->cfInt(c, r);
88 mpz_init_set(a, r->modNumber);
89 mpz_init_set_ui(b, ch);
91 gcd = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
94 if(mpz_cmp_ui(gcd, 1) == 0)
96 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
97 WerrorS(
"Unable to create qring!");
100 if(mpz_cmp_ui(gcd, 2) == 0)
108 mpz_init(baseTokNew);
109 mpz_set(baseTokNew, r->modBase);
110 while(mpz_cmp(gcd, baseTokNew) > 0)
113 mpz_mul(baseTokNew, baseTokNew, r->modBase);
115 mpz_clear(baseTokNew);
124 if ((
unsigned long)k == 0)
return FALSE;
125 if ((
unsigned long)k > ((r->mod2mMask >> 1) + 1))
return FALSE;
134 if (((
unsigned long)a == 0) || ((
unsigned long)b == 0))
146 unsigned long res = 0;
147 if ((
unsigned long)a == 0) a = (number) 1;
148 if ((
unsigned long)b == 0) b = (number) 1;
149 while ((
unsigned long)a % 2 == 0)
151 a = (number)((
unsigned long)a / 2);
152 if ((
unsigned long)b % 2 == 0) b = (number)((
unsigned long)b / 2);
155 while ((
unsigned long)b % 2 == 0)
157 b = (number)((
unsigned long)b / 2);
160 return (number)(1L <<
res);
169 unsigned long res = 0;
170 if ((
unsigned long)a == 0 && (
unsigned long)b == 0)
return (number)1;
171 while ((
unsigned long)a % 2 == 0 && (
unsigned long)b % 2 == 0)
173 a = (number)((
unsigned long)a / 2);
174 b = (number)((
unsigned long)b / 2);
183 return (number)((1L <<
res));
193 mpz_ptr u = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
194 mpz_init_set_ui(u, a);
195 mpz_ptr u0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
197 mpz_ptr u1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
198 mpz_init_set_ui(u1, 1);
199 mpz_ptr u2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
201 mpz_ptr
v = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
202 mpz_init_set_ui(v, r->mod2mMask);
204 mpz_ptr v0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
206 mpz_ptr v1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
208 mpz_ptr v2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
209 mpz_init_set_ui(v2, 1);
210 mpz_ptr q = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
212 mpz_ptr rr = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
215 while (mpz_cmp_ui(v, 0) != 0)
223 mpz_mul(u2, u2, q); mpz_sub(u2, u1, u2);
224 mpz_mul(v2, v2, q); mpz_sub(v2, v1, v2);
229 while (mpz_cmp_ui(u1, 0) < 0)
232 mpz_add_ui(u1, u1, r->mod2mMask);
233 mpz_add_ui(u1, u1, 1);
251 assume((
unsigned long)a % 2 != 0);
259 assume((
unsigned long)c % 2 != 0);
262 inv =
InvMod((
unsigned long)c,r);
268 if ((
unsigned long)c % 2 == 0)
270 WerrorS(
"division by zero divisor");
282 unsigned long res = 0;
283 if ((
unsigned long)a == 0 && (
unsigned long)b == 0)
return (number)1;
284 while ((
unsigned long)a % 2 == 0 && (
unsigned long)b % 2 == 0)
286 a = (number)((
unsigned long)a / 2);
287 b = (number)((
unsigned long)b / 2);
290 if ((
unsigned long)b % 2 == 0)
294 return (number)((1L <<
res));
300 return (number)((1L <<
res));
308 *(
unsigned long *)result = 1;
326 if (i == 0)
return (number)(
unsigned long)i;
329 unsigned long j = (
unsigned long)1;
330 if (ii < 0) { j = r->mod2mMask; ii = -ii; }
331 unsigned long k = (
unsigned long)ii;
332 k = k & r->mod2mMask;
334 return (number)
nr2mMult((number)j, (number)k, r);
343 unsigned long nn = (
unsigned long)(
unsigned long)n & r->mod2mMask;
344 unsigned long l = r->mod2mMask >> 1; l++;
345 if ((
unsigned long)nn >
l)
346 return (
long)((
unsigned long)nn - r->mod2mMask - 1);
348 return (
long)((
unsigned long)nn);
363 return ((
unsigned long)a % 2 == 1);
368 if (k ==
NULL)
return (number)1;
369 unsigned long erg = (
unsigned long)k;
370 while (erg % 2 == 0) erg = erg / 2;
376 return 0 == (
unsigned long)a;
381 return 1 == (
unsigned long)a;
386 return ((r->mod2mMask == (
unsigned long)a) &&(1L!=(
long)a));
396 if ((
unsigned long)a == 0)
return (number)0;
397 else if ((
unsigned long)b % 2 == 0)
399 if ((
unsigned long)b != 0)
401 while (((
unsigned long)b % 2 == 0) && ((
unsigned long)a % 2 == 0))
403 a = (number)((
unsigned long)a / 2);
404 b = (number)((
unsigned long)b / 2);
407 if ((
unsigned long)b % 2 == 0)
409 WerrorS(
"Division not possible, even by cancelling zero divisors.");
410 WerrorS(
"Result is integer division without remainder.");
411 return (number) ((
unsigned long) a / (
unsigned long)
b);
424 unsigned long c = r->mod2mMask + 1;
426 return (c % (
unsigned long)b) == 0;
431 c = (
unsigned long)b;
434 if ((c % 2) != 0)
return FALSE;
455 unsigned long a = (
unsigned long)as;
456 unsigned long b = (
unsigned long)bs;
458 while (a % 2 == 0 && b % 2 == 0)
503 assume((
unsigned long) b != 0);
505 unsigned long b_div = (
unsigned long) b;
513 unsigned long rr = 0;
514 while ((g < r->mod2mMask ) && (b_div > 0) && (b_div % 2 == 0))
520 if (g != 1) rr = (
unsigned long)a % g;
526 static number nr2mIntDiv(number
a, number
b,
const coeffs r)
528 if ((
unsigned long)
a == 0)
530 if ((
unsigned long)
b == 0)
532 if ((
unsigned long)
b == 1)
534 unsigned long c = r->mod2mMask + 1;
536 return (number)(c / (
unsigned long)
b);
540 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
541 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
542 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)b);
543 unsigned long s = mpz_get_ui(cc);
545 return (number)(
unsigned long)s;
550 if ((
unsigned long)
b == 0)
552 return (number)((
unsigned long)
a / (
unsigned long)
b);
559 if ((
unsigned long)b == 0)
561 if ((
unsigned long)b == 1)
563 unsigned long c = r->mod2mMask + 1;
565 return (number)(c / (
unsigned long)b);
569 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
570 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
571 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)b);
572 unsigned long s = mpz_get_ui(cc);
574 return (number)(
unsigned long)s;
580 if ((
unsigned long)c == 0)
return c;
586 unsigned long i = ((
unsigned long)from) % dst->mod2mMask ;
592 unsigned long i = ((
unsigned long)from) % (dst->mod2mMask + 1);
598 unsigned long j = (
unsigned long)1;
599 long ii = (long)from;
600 if (ii < 0) { j = dst->mod2mMask; ii = -ii; }
601 unsigned long i = (
unsigned long)ii;
602 i = i & dst->mod2mMask;
604 return (number)
nr2mMult((number)i, (number)j, dst);
611 mpz_ptr
k = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
612 mpz_init_set_ui(k, dst->mod2mMask);
614 mpz_and(erg, (mpz_ptr)from, k);
615 number
res = (number) mpz_get_ui(erg);
627 nlGMP(from, (number)gmp, src);
646 && (src->mod2mMask == dst->mod2mMask))
651 && (src->mod2mMask < dst->mod2mMask))
656 && (src->mod2mMask > dst->mod2mMask))
680 if (mpz_divisible_2exp_p(src->modNumber,dst->modExponent))
698 for (
int i = 1;
i <
m;
i++) r->mod2mMask = (r->mod2mMask << 1) + 1;
712 WarnS(
"nr2mInitExp unexpectedly called with m = 1 (we continue with Z/2^2");
719 if (((
unsigned long)a & r->mod2mMask) != (
unsigned long)a)
return FALSE;
733 if (((*s) >=
'0') && ((*s) <=
'9'))
740 if ((*i) >= (
MAX_INT_VAL / 10)) (*i) = (*i) & r->mod2mMask;
742 while (((*s) >=
'0') && ((*s) <=
'9'));
743 (*i) = (*i) & r->mod2mMask;
761 *a = (number)(
long)
z;
763 *a =
nr2mDiv((number)(
long)z,(number)(
long)n,r);
782 mpz_init_set_si (r->modBase, 2L);
784 mpz_init (r->modNumber);
785 mpz_pow_ui (r->modNumber, r->modBase, r->modExponent);
788 r->ch = (int)r->mod2mMask + 1;
826 r->has_simple_Alloc=
TRUE;
static number nr2mMultM(number a, number b, const coeffs r)
static void nr2mSetExp(int m, coeffs r)
const CanonicalForm int s
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
static BOOLEAN nr2mGreater(number a, number b, const coeffs r)
static char * nr2mCoeffName(const coeffs cf)
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
static number nr2mLcm(number a, number b, const coeffs)
static number nr2mAnn(number b, const coeffs r)
static BOOLEAN nr2mDivBy(number a, number b, const coeffs r)
static void nr2mWrite(number a, const coeffs r)
only used if HAVE_RINGS is defined
number ndCopyMap(number a, const coeffs aRing, const coeffs r)
static unsigned long InvMod(unsigned long a, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
static number nr2mMapGMP(number from, const coeffs, const coeffs dst)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
(), see rinteger.h, new impl.
static long nr2mInt(number &n, const coeffs r)
static number nr2mDiv(number a, number b, const coeffs r)
static number nr2mGetUnit(number k, const coeffs)
static BOOLEAN nr2mIsZero(number a, const coeffs)
number nr2mMapZp(number from, const coeffs, const coeffs dst)
static number nr2mMapMachineInt(number from, const coeffs, const coeffs dst)
void WerrorS(const char *s)
BOOLEAN nr2mInitChar(coeffs r, void *p)
void nlGMP(number &i, number n, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Q(const coeffs r)
static BOOLEAN nr2mCoeffIsEqual(const coeffs r, n_coeffType n, void *p)
static number nr2mNeg(number c, const coeffs r)
static BOOLEAN nr2mIsOne(number a, const coeffs)
static number nr2mMapProject(number from, const coeffs, const coeffs dst)
Coefficient rings, fields and other domains suitable for Singular polynomials.
static const char * nr2mRead(const char *s, number *a, const coeffs r)
The main handler for Singular numbers which are suitable for Singular polynomials.
static number nr2mInversM(number c, const coeffs r)
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
static coeffs nr2mQuot1(number c, const coeffs r)
static char * nr2mCoeffString(const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
static int nr2mDivComp(number as, number bs, const coeffs)
void PrintS(const char *s)
static void nr2mInitExp(int m, coeffs r)
static BOOLEAN nr2mGreaterZero(number k, const coeffs r)
(mpz_ptr), see rmodulon,h
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
static const char * nr2mEati(const char *s, int *i, const coeffs r)
static number nr2mMult(number a, number b, const coeffs r)
static BOOLEAN nr2mDBTest(number a, const char *, const int, const coeffs r)
static number nr2mExtGcd(number a, number b, number *s, number *t, const coeffs r)
const Variable & v
< [in] a sqrfree bivariate poly
static BOOLEAN nr2mIsMOne(number a, const coeffs r)
static BOOLEAN nr2mEqual(number a, number b, const coeffs)
static number nr2mInvers(number c, const coeffs r)
static number nr2mAddM(number a, number b, const coeffs r)
static number nr2mSub(number a, number b, const coeffs r)
static BOOLEAN nr2mIsUnit(number a, const coeffs)
static void nr2mCoeffWrite(const coeffs r, BOOLEAN)
static number nr2mMapQ(number from, const coeffs src, const coeffs dst)
static number nr2mSubM(number a, number b, const coeffs r)
static number nr2mInit(long i, const coeffs r)
static number nr2mGcd(number a, number b, const coeffs)
static number nr2mAdd(number a, number b, const coeffs r)
static number nr2mMapZ(number from, const coeffs src, const coeffs dst)
static void nr2mPower(number a, int i, number *result, const coeffs r)
static nMapFunc nr2mSetMap(const coeffs src, const coeffs dst)
static number nr2mMod(number a, number b, const coeffs r)
static void specialXGCD(unsigned long &s, unsigned long a, const coeffs r)
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL