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 Print(
"Z/2^%lu", r->modExponent);
68 unsigned long mm=r->mod2mMask;
69 if (((mm+1)>>
m)==1L)
return TRUE;
78 sprintf(s,
"ZZ/(2^%lu)",r->modExponent);
85 long ch = r->cfInt(c, r);
87 mpz_init_set(a, r->modNumber);
88 mpz_init_set_ui(b, ch);
90 gcd = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
93 if(mpz_cmp_ui(gcd, 1) == 0)
95 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
96 WerrorS(
"Unable to create qring!");
99 if(mpz_cmp_ui(gcd, 2) == 0)
107 mpz_init(baseTokNew);
108 mpz_set(baseTokNew, r->modBase);
109 while(mpz_cmp(gcd, baseTokNew) > 0)
112 mpz_mul(baseTokNew, baseTokNew, r->modBase);
114 mpz_clear(baseTokNew);
123 if ((
unsigned long)k == 0)
return FALSE;
124 if ((
unsigned long)k > ((r->mod2mMask >> 1) + 1))
return FALSE;
133 if (((
unsigned long)a == 0) || ((
unsigned long)b == 0))
145 unsigned long res = 0;
146 if ((
unsigned long)a == 0) a = (number) 1;
147 if ((
unsigned long)b == 0) b = (number) 1;
148 while ((
unsigned long)a % 2 == 0)
150 a = (number)((
unsigned long)a / 2);
151 if ((
unsigned long)b % 2 == 0) b = (number)((
unsigned long)b / 2);
154 while ((
unsigned long)b % 2 == 0)
156 b = (number)((
unsigned long)b / 2);
159 return (number)(1L <<
res);
168 unsigned long res = 0;
169 if ((
unsigned long)a == 0 && (
unsigned long)b == 0)
return (number)1;
170 while ((
unsigned long)a % 2 == 0 && (
unsigned long)b % 2 == 0)
172 a = (number)((
unsigned long)a / 2);
173 b = (number)((
unsigned long)b / 2);
182 return (number)((1L <<
res));
192 mpz_ptr u = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
193 mpz_init_set_ui(u, a);
194 mpz_ptr u0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
196 mpz_ptr u1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
197 mpz_init_set_ui(u1, 1);
198 mpz_ptr u2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
200 mpz_ptr
v = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
201 mpz_init_set_ui(v, r->mod2mMask);
203 mpz_ptr v0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
205 mpz_ptr v1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
207 mpz_ptr v2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
208 mpz_init_set_ui(v2, 1);
209 mpz_ptr q = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
211 mpz_ptr rr = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
214 while (mpz_cmp_ui(v, 0) != 0)
222 mpz_mul(u2, u2, q); mpz_sub(u2, u1, u2);
223 mpz_mul(v2, v2, q); mpz_sub(v2, v1, v2);
228 while (mpz_cmp_ui(u1, 0) < 0)
231 mpz_add_ui(u1, u1, r->mod2mMask);
232 mpz_add_ui(u1, u1, 1);
250 assume((
unsigned long)a % 2 != 0);
258 assume((
unsigned long)c % 2 != 0);
261 inv =
InvMod((
unsigned long)c,r);
267 if ((
unsigned long)c % 2 == 0)
269 WerrorS(
"division by zero divisor");
281 unsigned long res = 0;
282 if ((
unsigned long)a == 0 && (
unsigned long)b == 0)
return (number)1;
283 while ((
unsigned long)a % 2 == 0 && (
unsigned long)b % 2 == 0)
285 a = (number)((
unsigned long)a / 2);
286 b = (number)((
unsigned long)b / 2);
289 if ((
unsigned long)b % 2 == 0)
293 return (number)((1L <<
res));
299 return (number)((1L <<
res));
307 *(
unsigned long *)result = 1;
325 if (i == 0)
return (number)(
unsigned long)i;
328 unsigned long j = (
unsigned long)1;
329 if (ii < 0) { j = r->mod2mMask; ii = -ii; }
330 unsigned long k = (
unsigned long)ii;
331 k = k & r->mod2mMask;
333 return (number)
nr2mMult((number)j, (number)k, r);
342 unsigned long nn = (
unsigned long)(
unsigned long)n & r->mod2mMask;
343 unsigned long l = r->mod2mMask >> 1; l++;
344 if ((
unsigned long)nn >
l)
345 return (
long)((
unsigned long)nn - r->mod2mMask - 1);
347 return (
long)((
unsigned long)nn);
362 return ((
unsigned long)a % 2 == 1);
367 if (k ==
NULL)
return (number)1;
368 unsigned long erg = (
unsigned long)k;
369 while (erg % 2 == 0) erg = erg / 2;
375 return 0 == (
unsigned long)a;
380 return 1 == (
unsigned long)a;
385 return ((r->mod2mMask == (
unsigned long)a) &&(1L!=(
long)a));
395 if ((
unsigned long)a == 0)
return (number)0;
396 else if ((
unsigned long)b % 2 == 0)
398 if ((
unsigned long)b != 0)
400 while (((
unsigned long)b % 2 == 0) && ((
unsigned long)a % 2 == 0))
402 a = (number)((
unsigned long)a / 2);
403 b = (number)((
unsigned long)b / 2);
406 if ((
unsigned long)b % 2 == 0)
408 WerrorS(
"Division not possible, even by cancelling zero divisors.");
409 WerrorS(
"Result is integer division without remainder.");
410 return (number) ((
unsigned long) a / (
unsigned long)
b);
423 unsigned long c = r->mod2mMask + 1;
425 return (c % (
unsigned long)b) == 0;
430 c = (
unsigned long)b;
433 if ((c % 2) != 0)
return FALSE;
454 unsigned long a = (
unsigned long)as;
455 unsigned long b = (
unsigned long)bs;
457 while (a % 2 == 0 && b % 2 == 0)
502 assume((
unsigned long) b != 0);
504 unsigned long b_div = (
unsigned long) b;
512 unsigned long rr = 0;
513 while ((g < r->mod2mMask ) && (b_div > 0) && (b_div % 2 == 0))
519 if (g != 1) rr = (
unsigned long)a % g;
525 static number nr2mIntDiv(number
a, number
b,
const coeffs r)
527 if ((
unsigned long)
a == 0)
529 if ((
unsigned long)
b == 0)
531 if ((
unsigned long)
b == 1)
533 unsigned long c = r->mod2mMask + 1;
535 return (number)(c / (
unsigned long)
b);
539 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
540 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
541 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)b);
542 unsigned long s = mpz_get_ui(cc);
544 return (number)(
unsigned long)s;
549 if ((
unsigned long)
b == 0)
551 return (number)((
unsigned long)
a / (
unsigned long)
b);
558 if ((
unsigned long)b == 0)
560 if ((
unsigned long)b == 1)
562 unsigned long c = r->mod2mMask + 1;
564 return (number)(c / (
unsigned long)b);
568 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
569 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
570 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)b);
571 unsigned long s = mpz_get_ui(cc);
573 return (number)(
unsigned long)s;
579 if ((
unsigned long)c == 0)
return c;
585 unsigned long i = ((
unsigned long)from) % dst->mod2mMask ;
591 unsigned long i = ((
unsigned long)from) % (dst->mod2mMask + 1);
597 unsigned long j = (
unsigned long)1;
598 long ii = (long)from;
599 if (ii < 0) { j = dst->mod2mMask; ii = -ii; }
600 unsigned long i = (
unsigned long)ii;
601 i = i & dst->mod2mMask;
603 return (number)
nr2mMult((number)i, (number)j, dst);
610 mpz_ptr
k = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
611 mpz_init_set_ui(k, dst->mod2mMask);
613 mpz_and(erg, (mpz_ptr)from, k);
614 number
res = (number) mpz_get_ui(erg);
626 nlGMP(from, (number)gmp, src);
645 && (src->mod2mMask == dst->mod2mMask))
650 && (src->mod2mMask < dst->mod2mMask))
655 && (src->mod2mMask > dst->mod2mMask))
679 if (mpz_divisible_2exp_p(src->modNumber,dst->modExponent))
697 for (
int i = 1;
i <
m;
i++) r->mod2mMask = (r->mod2mMask << 1) + 1;
711 WarnS(
"nr2mInitExp unexpectedly called with m = 1 (we continue with Z/2^2");
718 if (((
unsigned long)a & r->mod2mMask) != (
unsigned long)a)
return FALSE;
732 if (((*s) >=
'0') && ((*s) <=
'9'))
739 if ((*i) >= (
MAX_INT_VAL / 10)) (*i) = (*i) & r->mod2mMask;
741 while (((*s) >=
'0') && ((*s) <=
'9'));
742 (*i) = (*i) & r->mod2mMask;
760 *a = (number)(
long)
z;
762 *a =
nr2mDiv((number)(
long)z,(number)(
long)n,r);
781 mpz_init_set_si (r->modBase, 2L);
783 mpz_init (r->modNumber);
784 mpz_pow_ui (r->modNumber, r->modBase, r->modExponent);
787 r->ch = (int)r->mod2mMask + 1;
825 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)
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