28 if ((((
long)a<0L) || ((
long)a>(
long)r->mod2mMask))
29 && (r->mod2mMask!= ~0UL))
31 Print(
"wrong mod 2^n number %ld (m:%ld) at %s,%d\n",(
long)a,(
long)r->mod2mMask,
f,
l);
42 ((((
unsigned long) a) * ((
unsigned long)
b)) & r->mod2mMask);
48 ((((
unsigned long) a) + ((
unsigned long)
b)) & r->mod2mMask);
53 return (number)((
unsigned long)a < (
unsigned long)
b ?
54 r->mod2mMask+1 - (
unsigned long)
b + (
unsigned long)a:
55 (
unsigned long)a - (
unsigned long)
b);
58#define nr2mNegM(A,r) (number)((r->mod2mMask+1 - (unsigned long)(A)) & r->mod2mMask)
59#define nr2mEqualM(A,B) ((A)==(B))
66 if (
cf->modExponent>32)
67 snprintf(n2mCoeffName_buf,21,
"ZZ/(bigint(2)^%lu)",
cf->modExponent);
69 snprintf(n2mCoeffName_buf,21,
"ZZ/(2^%lu)",
cf->modExponent);
70 return n2mCoeffName_buf;
78 unsigned long mm=r->mod2mMask;
79 if (((mm+1)>>
m)==1L)
return TRUE;
87 long ch = r->cfInt(c, r);
89 mpz_init_set(a, r->modNumber);
90 mpz_init_set_ui(
b, ch);
95 if(mpz_cmp_ui(
gcd, 1) == 0)
97 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
98 WerrorS(
"Unable to create qring!");
101 if(mpz_cmp_ui(
gcd, 2) == 0)
109 mpz_init(baseTokNew);
110 mpz_set(baseTokNew, r->modBase);
111 while(mpz_cmp(
gcd, baseTokNew) > 0)
114 mpz_mul(baseTokNew, baseTokNew, r->modBase);
116 mpz_clear(baseTokNew);
125 if ((
unsigned long)
k == 0)
return FALSE;
126 if ((
unsigned long)
k > ((r->mod2mMask >> 1) + 1))
return FALSE;
136 if (((
unsigned long)a == 0) || ((
unsigned long)
b == 0))
150 unsigned long res = 0;
151 if ((
unsigned long)a == 0) a = (number) 1;
152 if ((
unsigned long)
b == 0)
b = (number) 1;
153 while ((
unsigned long)a % 2 == 0)
155 a = (number)((
unsigned long)a / 2);
156 if ((
unsigned long)
b % 2 == 0)
b = (number)((
unsigned long)
b / 2);
159 while ((
unsigned long)
b % 2 == 0)
161 b = (number)((
unsigned long)
b / 2);
164 return (number)(1L <<
res);
173 unsigned long res = 0;
174 if ((
unsigned long)a == 0 && (
unsigned long)
b == 0)
return (number)1;
175 while ((
unsigned long)a % 2 == 0 && (
unsigned long)
b % 2 == 0)
177 a = (number)((
unsigned long)a / 2);
178 b = (number)((
unsigned long)
b / 2);
187 return (number)((1L <<
res));
197 mpz_ptr u = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
198 mpz_init_set_ui(u, a);
199 mpz_ptr u0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
201 mpz_ptr u1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
202 mpz_init_set_ui(u1, 1);
203 mpz_ptr u2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
205 mpz_ptr
v = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
206 mpz_init_set_ui(
v, r->mod2mMask);
208 mpz_ptr v0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
210 mpz_ptr v1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
212 mpz_ptr v2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
213 mpz_init_set_ui(v2, 1);
214 mpz_ptr q = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
216 mpz_ptr rr = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
227 mpz_mul(u2, u2, q); mpz_sub(u2, u1, u2);
228 mpz_mul(v2, v2, q); mpz_sub(v2, v1, v2);
236 mpz_add_ui(u1, u1, r->mod2mMask);
237 mpz_add_ui(u1, u1, 1);
255 assume((
unsigned long)a % 2 != 0);
263 assume((
unsigned long)c % 2 != 0);
266 inv =
InvMod((
unsigned long)c,r);
272 if ((
unsigned long)c % 2 == 0)
274 WerrorS(
"division by zero divisor");
286 unsigned long res = 0;
287 if ((
unsigned long)a == 0 && (
unsigned long)
b == 0)
return (number)1;
288 while ((
unsigned long)a % 2 == 0 && (
unsigned long)
b % 2 == 0)
290 a = (number)((
unsigned long)a / 2);
291 b = (number)((
unsigned long)
b / 2);
294 if ((
unsigned long)
b % 2 == 0)
298 return (number)((1L <<
res));
304 return (number)((1L <<
res));
312 *(
unsigned long *)
result = 1;
330 if (
i == 0)
return (number)(
unsigned long)
i;
333 unsigned long j = (
unsigned long)1;
334 if (ii < 0) {
j = r->mod2mMask; ii = -ii; }
335 unsigned long k = (
unsigned long)ii;
336 k =
k & r->mod2mMask;
338 return (number)
nr2mMult((number)
j, (number)
k, r);
347 unsigned long nn = (
unsigned long)n;
348 unsigned long l = r->mod2mMask >> 1;
l++;
349 if ((
unsigned long)nn >
l)
350 return (
long)((
unsigned long)nn - r->mod2mMask - 1);
352 return (
long)((
unsigned long)nn);
371 return ((
unsigned long)a % 2 == 1);
376 if (
k ==
NULL)
return (number)1;
377 unsigned long erg = (
unsigned long)
k;
378 while (erg % 2 == 0) erg = erg / 2;
384 return 0 == (
unsigned long)a;
389 return 1 == (
unsigned long)a;
394 return ((r->mod2mMask == (
unsigned long)a) &&(1L!=(
long)a));
404 if ((
unsigned long)a == 0)
return (number)0;
405 else if ((
unsigned long)
b % 2 == 0)
407 if ((
unsigned long)
b != 0)
409 while (((
unsigned long)
b % 2 == 0) && ((
unsigned long)a % 2 == 0))
411 a = (number)((
unsigned long)a / 2);
412 b = (number)((
unsigned long)
b / 2);
420 else if ((
unsigned long)
b % 2 == 0)
422 WerrorS(
"Division not possible, even by cancelling zero divisors.");
423 WerrorS(
"Result is integer division without remainder.");
424 return (number) ((
unsigned long) a / (
unsigned long)
b);
439 unsigned long c = r->mod2mMask + 1;
441 return (c % (
unsigned long)
b) == 0;
446 c = (
unsigned long)
b;
449 if ((c % 2) != 0)
return FALSE;
470 unsigned long a = (
unsigned long)as;
471 unsigned long b = (
unsigned long)bs;
473 while (a % 2 == 0 &&
b % 2 == 0)
518 assume((
unsigned long)
b != 0);
520 unsigned long b_div = (
unsigned long)
b;
528 unsigned long rr = 0;
529 while ((g < r->mod2mMask ) && (b_div > 0) && (b_div % 2 == 0))
535 if (
g != 1) rr = (
unsigned long)a %
g;
541static number nr2mIntDiv(number a, number
b,
const coeffs r)
543 if ((
unsigned long)a == 0)
545 if ((
unsigned long)
b == 0)
547 if ((
unsigned long)
b == 1)
549 unsigned long c = r->mod2mMask + 1;
551 return (number)(c / (
unsigned long)
b);
555 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
556 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
557 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)
b);
558 unsigned long s = mpz_get_ui(cc);
560 return (number)(
unsigned long)
s;
565 if ((
unsigned long)
b == 0)
567 return (number)((
unsigned long) a / (
unsigned long)
b);
574 if ((
unsigned long)
b == 0)
576 if ((
unsigned long)
b == 1)
578 unsigned long c = r->mod2mMask + 1;
580 return (number)(c / (
unsigned long)
b);
584 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
585 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
586 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)
b);
587 unsigned long s = mpz_get_ui(cc);
589 return (number)(
unsigned long)
s;
595 if ((
unsigned long)c == 0)
return c;
603 unsigned long i = ((
unsigned long)from) % (dst->mod2mMask + 1) ;
609 unsigned long i = ((
unsigned long)from) % (dst->mod2mMask + 1);
615 unsigned long j = (
unsigned long)1;
616 long ii = (long)from;
617 if (ii < 0) {
j = dst->mod2mMask; ii = -ii; }
618 unsigned long i = (
unsigned long)ii;
619 i =
i & dst->mod2mMask;
621 return (number)
nr2mMult((number)
i, (number)
j, dst);
628 mpz_ptr
k = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
629 mpz_init_set_ui(
k, dst->mod2mMask);
631 mpz_and(erg, (mpz_ptr)from,
k);
632 number
res = (number) mpz_get_ui(erg);
643 nlMPZ(gmp, from, src);
662 && (src->mod2mMask < dst->mod2mMask))
667 && (src->mod2mMask > dst->mod2mMask))
691 if (mpz_divisible_2exp_p(src->modNumber,dst->modExponent))
709 for (
int i = 1;
i <
m;
i++) r->mod2mMask = (r->mod2mMask << 1) + 1;
723 WarnS(
"nr2mInitExp unexpectedly called with m = 1 (we continue with Z/2^2");
735 if (((*
s) >=
'0') && ((*
s) <=
'9'))
742 if ((*
i) >= (
MAX_INT_VAL / 10)) (*i) = (*i) & r->mod2mMask;
744 while (((*
s) >=
'0') && ((*
s) <=
'9'));
745 (*i) = (*i) & r->mod2mMask;
763 *a = (number)(
long)z;
765 *a =
nr2mDiv((number)(
long)z,(number)(
long)n,r);
783 mpz_init_set_si (r->modBase, 2L);
785 mpz_init (r->modNumber);
786 mpz_pow_ui (r->modNumber, r->modBase, r->modExponent);
789 r->ch = (int)r->mod2mMask + 1;
826 r->has_simple_Alloc=
TRUE;
Coefficient rings, fields and other domains suitable for Singular polynomials.
static FORCE_INLINE BOOLEAN nCoeff_is_Z(const coeffs r)
#define n_Test(a, r)
BOOLEAN n_Test(number a, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
@ n_Z2m
only used if HAVE_RINGS is defined
static FORCE_INLINE BOOLEAN nCoeff_is_Q(const coeffs r)
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
static FORCE_INLINE BOOLEAN nCoeff_is_Zn(const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
@ n_rep_gap_rat
(number), see longrat.h
@ n_rep_gap_gmp
(), see rinteger.h, new impl.
@ n_rep_int
(int), see modulop.h
@ n_rep_gmp
(mpz_ptr), see rmodulon,h
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
const CanonicalForm int s
const Variable & v
< [in] a sqrfree bivariate poly
void WerrorS(const char *s)
void nlMPZ(mpz_t m, number &n, const coeffs r)
The main handler for Singular numbers which are suitable for Singular polynomials.
const char *const nDivBy0
#define omFreeBinAddr(addr)
static number nr2mInversM(number c, const coeffs r)
static number nr2mGcd(number a, number b, const coeffs)
static nMapFunc nr2mSetMap(const coeffs src, const coeffs dst)
static unsigned long InvMod(unsigned long a, const coeffs r)
static const char * nr2mEati(const char *s, int *i, const coeffs r)
static void nr2mWrite(number a, const coeffs r)
static void nr2mSetExp(int m, coeffs r)
static void specialXGCD(unsigned long &s, unsigned long a, const coeffs r)
static number nr2mMapProject(number from, const coeffs, const coeffs dst)
static BOOLEAN nr2mIsUnit(number a, const coeffs)
static number nr2mMapQ(number from, const coeffs src, const coeffs dst)
static number nr2mSub(number a, number b, const coeffs r)
static number nr2mLcm(number a, number b, const coeffs)
static BOOLEAN nr2mIsOne(number a, const coeffs)
BOOLEAN nr2mInitChar(coeffs r, void *p)
static number nr2mAnn(number b, const coeffs r)
static number nr2mInit(long i, const coeffs r)
static number nr2mExtGcd(number a, number b, number *s, number *t, const coeffs r)
static number nr2mGetUnit(number k, const coeffs)
static void nr2mInitExp(int m, coeffs r)
static void nr2mPower(number a, int i, number *result, const coeffs r)
static number nr2mInvers(number c, const coeffs r)
static number nr2mMultM(number a, number b, const coeffs r)
static number nr2mMapGMP(number from, const coeffs, const coeffs dst)
number nr2mMapZp(number from, const coeffs, const coeffs dst)
static int nr2mDivComp(number as, number bs, const coeffs)
BOOLEAN nr2mDBTest(number a, const char *f, const int l, const coeffs r)
static number nr2mMult(number a, number b, const coeffs r)
static long nr2mInt(number &n, const coeffs r)
static BOOLEAN nr2mDivBy(number a, number b, const coeffs r)
static BOOLEAN nr2mGreaterZero(number k, const coeffs r)
static number nr2mMapMachineInt(number from, const coeffs, const coeffs dst)
static number nr2mNeg(number c, const coeffs r)
EXTERN_VAR omBin gmp_nrz_bin
static number nr2mMod(number a, number b, const coeffs r)
static BOOLEAN nr2mCoeffIsEqual(const coeffs r, n_coeffType n, void *p)
static number nr2mAdd(number a, number b, const coeffs r)
static char * nr2mCoeffName(const coeffs cf)
static number nr2mMapZ(number from, const coeffs src, const coeffs dst)
static BOOLEAN nr2mEqual(number a, number b, const coeffs)
static BOOLEAN nr2mGreater(number a, number b, const coeffs r)
static BOOLEAN nr2mIsZero(number a, const coeffs)
static number nr2mAddM(number a, number b, const coeffs r)
static const char * nr2mRead(const char *s, number *a, const coeffs r)
static BOOLEAN nr2mIsMOne(number a, const coeffs r)
static number nr2mSubM(number a, number b, const coeffs r)
static number nr2mDiv(number a, number b, const coeffs r)
static coeffs nr2mQuot1(number c, const coeffs r)