28 if (((
long)a<0L) || ((
long)a>(
long)r->mod2mMask))
30 Print(
"wrong mod 2^n number %ld at %s,%d\n",(
long)a,
f,
l);
41 ((((
unsigned long) a) * ((
unsigned long)
b)) & r->mod2mMask);
47 ((((
unsigned long) a) + ((
unsigned long)
b)) & r->mod2mMask);
52 return (number)((
unsigned long)a < (
unsigned long)
b ?
53 r->mod2mMask+1 - (
unsigned long)
b + (
unsigned long)a:
54 (
unsigned long)a - (
unsigned long)
b);
57#define nr2mNegM(A,r) (number)((r->mod2mMask+1 - (unsigned long)(A)) & r->mod2mMask)
58#define nr2mEqualM(A,B) ((A)==(B))
65 if (
cf->modExponent>32)
66 snprintf(n2mCoeffName_buf,21,
"ZZ/(bigint(2)^%lu)",
cf->modExponent);
68 snprintf(n2mCoeffName_buf,21,
"ZZ/(2^%lu)",
cf->modExponent);
69 return n2mCoeffName_buf;
77 unsigned long mm=r->mod2mMask;
78 if (((mm+1)>>
m)==1L)
return TRUE;
86 long ch = r->cfInt(c, r);
88 mpz_init_set(a, r->modNumber);
89 mpz_init_set_ui(
b, ch);
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;
135 if (((
unsigned long)a == 0) || ((
unsigned long)
b == 0))
149 unsigned long res = 0;
150 if ((
unsigned long)a == 0) a = (number) 1;
151 if ((
unsigned long)
b == 0)
b = (number) 1;
152 while ((
unsigned long)a % 2 == 0)
154 a = (number)((
unsigned long)a / 2);
155 if ((
unsigned long)
b % 2 == 0)
b = (number)((
unsigned long)
b / 2);
158 while ((
unsigned long)
b % 2 == 0)
160 b = (number)((
unsigned long)
b / 2);
163 return (number)(1L <<
res);
172 unsigned long res = 0;
173 if ((
unsigned long)a == 0 && (
unsigned long)
b == 0)
return (number)1;
174 while ((
unsigned long)a % 2 == 0 && (
unsigned long)
b % 2 == 0)
176 a = (number)((
unsigned long)a / 2);
177 b = (number)((
unsigned long)
b / 2);
186 return (number)((1L <<
res));
196 mpz_ptr u = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
197 mpz_init_set_ui(u, a);
198 mpz_ptr u0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
200 mpz_ptr u1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
201 mpz_init_set_ui(u1, 1);
202 mpz_ptr u2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
204 mpz_ptr
v = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
205 mpz_init_set_ui(
v, r->mod2mMask);
207 mpz_ptr v0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
209 mpz_ptr v1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
211 mpz_ptr v2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
212 mpz_init_set_ui(v2, 1);
213 mpz_ptr q = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
215 mpz_ptr rr = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
226 mpz_mul(u2, u2, q); mpz_sub(u2, u1, u2);
227 mpz_mul(v2, v2, q); mpz_sub(v2, v1, v2);
235 mpz_add_ui(u1, u1, r->mod2mMask);
236 mpz_add_ui(u1, u1, 1);
254 assume((
unsigned long)a % 2 != 0);
262 assume((
unsigned long)c % 2 != 0);
265 inv =
InvMod((
unsigned long)c,r);
271 if ((
unsigned long)c % 2 == 0)
273 WerrorS(
"division by zero divisor");
285 unsigned long res = 0;
286 if ((
unsigned long)a == 0 && (
unsigned long)
b == 0)
return (number)1;
287 while ((
unsigned long)a % 2 == 0 && (
unsigned long)
b % 2 == 0)
289 a = (number)((
unsigned long)a / 2);
290 b = (number)((
unsigned long)
b / 2);
293 if ((
unsigned long)
b % 2 == 0)
297 return (number)((1L <<
res));
303 return (number)((1L <<
res));
311 *(
unsigned long *)
result = 1;
329 if (
i == 0)
return (number)(
unsigned long)
i;
332 unsigned long j = (
unsigned long)1;
333 if (ii < 0) {
j = r->mod2mMask; ii = -ii; }
334 unsigned long k = (
unsigned long)ii;
335 k =
k & r->mod2mMask;
337 return (number)
nr2mMult((number)
j, (number)
k, r);
346 unsigned long nn = (
unsigned long)n;
347 unsigned long l = r->mod2mMask >> 1;
l++;
348 if ((
unsigned long)nn >
l)
349 return (
long)((
unsigned long)nn - r->mod2mMask - 1);
351 return (
long)((
unsigned long)nn);
370 return ((
unsigned long)a % 2 == 1);
375 if (
k ==
NULL)
return (number)1;
376 unsigned long erg = (
unsigned long)
k;
377 while (erg % 2 == 0) erg = erg / 2;
383 return 0 == (
unsigned long)a;
388 return 1 == (
unsigned long)a;
393 return ((r->mod2mMask == (
unsigned long)a) &&(1L!=(
long)a));
403 if ((
unsigned long)a == 0)
return (number)0;
404 else if ((
unsigned long)
b % 2 == 0)
406 if ((
unsigned long)
b != 0)
408 while (((
unsigned long)
b % 2 == 0) && ((
unsigned long)a % 2 == 0))
410 a = (number)((
unsigned long)a / 2);
411 b = (number)((
unsigned long)
b / 2);
419 else if ((
unsigned long)
b % 2 == 0)
421 WerrorS(
"Division not possible, even by cancelling zero divisors.");
422 WerrorS(
"Result is integer division without remainder.");
423 return (number) ((
unsigned long) a / (
unsigned long)
b);
438 unsigned long c = r->mod2mMask + 1;
440 return (c % (
unsigned long)
b) == 0;
445 c = (
unsigned long)
b;
448 if ((c % 2) != 0)
return FALSE;
469 unsigned long a = (
unsigned long)as;
470 unsigned long b = (
unsigned long)bs;
472 while (a % 2 == 0 &&
b % 2 == 0)
517 assume((
unsigned long)
b != 0);
519 unsigned long b_div = (
unsigned long)
b;
527 unsigned long rr = 0;
528 while ((g < r->mod2mMask ) && (b_div > 0) && (b_div % 2 == 0))
534 if (
g != 1) rr = (
unsigned long)a %
g;
540static number nr2mIntDiv(number a, number
b,
const coeffs r)
542 if ((
unsigned long)a == 0)
544 if ((
unsigned long)
b == 0)
546 if ((
unsigned long)
b == 1)
548 unsigned long c = r->mod2mMask + 1;
550 return (number)(c / (
unsigned long)
b);
554 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
555 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
556 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)
b);
557 unsigned long s = mpz_get_ui(cc);
559 return (number)(
unsigned long)
s;
564 if ((
unsigned long)
b == 0)
566 return (number)((
unsigned long) a / (
unsigned long)
b);
573 if ((
unsigned long)
b == 0)
575 if ((
unsigned long)
b == 1)
577 unsigned long c = r->mod2mMask + 1;
579 return (number)(c / (
unsigned long)
b);
583 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
584 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
585 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)
b);
586 unsigned long s = mpz_get_ui(cc);
588 return (number)(
unsigned long)
s;
594 if ((
unsigned long)c == 0)
return c;
602 unsigned long i = ((
unsigned long)from) % (dst->mod2mMask + 1) ;
608 unsigned long i = ((
unsigned long)from) % (dst->mod2mMask + 1);
614 unsigned long j = (
unsigned long)1;
615 long ii = (long)from;
616 if (ii < 0) {
j = dst->mod2mMask; ii = -ii; }
617 unsigned long i = (
unsigned long)ii;
618 i =
i & dst->mod2mMask;
620 return (number)
nr2mMult((number)
i, (number)
j, dst);
627 mpz_ptr
k = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
628 mpz_init_set_ui(
k, dst->mod2mMask);
630 mpz_and(erg, (mpz_ptr)from,
k);
631 number
res = (number) mpz_get_ui(erg);
642 nlMPZ(gmp, from, src);
661 && (src->mod2mMask < dst->mod2mMask))
666 && (src->mod2mMask > dst->mod2mMask))
690 if (mpz_divisible_2exp_p(src->modNumber,dst->modExponent))
708 for (
int i = 1;
i <
m;
i++) r->mod2mMask = (r->mod2mMask << 1) + 1;
722 WarnS(
"nr2mInitExp unexpectedly called with m = 1 (we continue with Z/2^2");
734 if (((*
s) >=
'0') && ((*
s) <=
'9'))
741 if ((*
i) >= (
MAX_INT_VAL / 10)) (*i) = (*i) & r->mod2mMask;
743 while (((*
s) >=
'0') && ((*
s) <=
'9'));
744 (*i) = (*i) & r->mod2mMask;
762 *a = (number)(
long)z;
764 *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;
825 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
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)