69 ((((
unsigned long) a) * ((
unsigned long) b)) & ((
unsigned long)r->mod2mMask));
75 ((((
unsigned long) a) + ((
unsigned long) b)) & ((
unsigned long)r->mod2mMask));
80 return (number)((
unsigned long)a < (
unsigned long)b ?
81 r->mod2mMask - (
unsigned long)b + (
unsigned long)a + 1:
82 (
unsigned long)a - (
unsigned long)
b);
85 #define nr2mNegM(A,r) (number)((r->mod2mMask - (unsigned long)(A) + 1) & r->mod2mMask) 86 #define nr2mEqualM(A,B) ((A)==(B)) 92 PrintS(
"// coeff. ring is : ");
93 Print(
"Z/2^%lu\n", r->modExponent);
100 int m=(int)(
long)(
p);
101 unsigned long mm=r->mod2mMask;
102 if (((mm+1)>>
m)==1L)
return TRUE;
112 sprintf(s,
"ZZ/(2^%lu)",r->modExponent);
114 sprintf(s,
"integer,2,%lu",r->modExponent);
122 long ch = r->cfInt(c, r);
124 mpz_init_set(a, r->modNumber);
125 mpz_init_set_ui(b, ch);
127 gcd = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
130 if(mpz_cmp_ui(gcd, 1) == 0)
132 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
133 WerrorS(
"Unable to create qring!");
136 if(mpz_cmp_ui(gcd, 2) == 0)
143 info.
base = r->modBase;
146 mpz_init(baseTokNew);
147 mpz_set(baseTokNew, r->modBase);
148 while(mpz_cmp(gcd, baseTokNew) > 0)
151 mpz_mul(baseTokNew, baseTokNew, r->modBase);
154 mpz_clear(baseTokNew);
176 mpz_init_set_si (r->modBase, 2L);
178 mpz_init (r->modNumber);
179 mpz_pow_ui (r->modNumber, r->modBase, r->modExponent);
182 r->ch = (int)r->mod2mMask + 1;
219 r->has_simple_Alloc=
TRUE;
228 if (((
unsigned long)a == 0) || ((
unsigned long)b == 0))
239 unsigned long res = 0;
240 if ((
unsigned long)a == 0) a = (number) 1;
241 if ((
unsigned long)b == 0) b = (number) 1;
242 while ((
unsigned long)a % 2 == 0)
244 a = (number)((
unsigned long)a / 2);
245 if ((
unsigned long)b % 2 == 0) b = (number)((
unsigned long)b / 2);
248 while ((
unsigned long)b % 2 == 0)
250 b = (number)((
unsigned long)b / 2);
253 return (number)(1L <<
res);
262 unsigned long res = 0;
263 if ((
unsigned long)a == 0 && (
unsigned long)b == 0)
return (number)1;
264 while ((
unsigned long)a % 2 == 0 && (
unsigned long)b % 2 == 0)
266 a = (number)((
unsigned long)a / 2);
267 b = (number)((
unsigned long)b / 2);
276 return (number)((1L <<
res));
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)(
unsigned long)n & r->mod2mMask;
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);
367 return ((
unsigned long)a % 2 == 1);
372 if (k ==
NULL)
return (number)1;
373 unsigned long erg = (
unsigned long)k;
374 while (erg % 2 == 0) erg = erg / 2;
380 return 0 == (
unsigned long)a;
385 return 1 == (
unsigned long)a;
390 return ((r->mod2mMask == (
unsigned long)a) &&(1L!=(
long)a));
410 unsigned long c = r->mod2mMask + 1;
412 return (c % (
unsigned long)b) == 0;
417 c = (
unsigned long)b;
420 if ((c % 2) != 0)
return FALSE;
436 unsigned long a = (
unsigned long)as;
437 unsigned long b = (
unsigned long)bs;
439 while (a % 2 == 0 && b % 2 == 0)
464 if ((
unsigned long)k == 0)
return FALSE;
465 if ((
unsigned long)k > ((r->mod2mMask >> 1) + 1))
return FALSE;
475 mpz_ptr u = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
476 mpz_init_set_ui(u, a);
477 mpz_ptr u0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
479 mpz_ptr u1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
480 mpz_init_set_ui(u1, 1);
481 mpz_ptr u2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
483 mpz_ptr
v = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
484 mpz_init_set_ui(v, r->mod2mMask);
486 mpz_ptr v0 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
488 mpz_ptr v1 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
490 mpz_ptr v2 = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
491 mpz_init_set_ui(v2, 1);
492 mpz_ptr q = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
494 mpz_ptr rr = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
497 while (mpz_cmp_ui(v, 0) != 0)
505 mpz_mul(u2, u2, q); mpz_sub(u2, u1, u2);
506 mpz_mul(v2, v2, q); mpz_sub(v2, v1, v2);
511 while (mpz_cmp_ui(u1, 0) < 0)
514 mpz_add_ui(u1, u1, r->mod2mMask);
515 mpz_add_ui(u1, u1, 1);
533 assume((
unsigned long)a % 2 != 0);
542 assume((
unsigned long)c % 2 != 0);
545 inv =
InvMod((
unsigned long)c,r);
551 if ((
unsigned long)a == 0)
return (number)0;
552 else if ((
unsigned long)b % 2 == 0)
554 if ((
unsigned long)b != 0)
556 while (((
unsigned long)b % 2 == 0) && ((
unsigned long)a % 2 == 0))
558 a = (number)((
unsigned long)a / 2);
559 b = (number)((
unsigned long)b / 2);
562 if ((
unsigned long)b % 2 == 0)
564 WerrorS(
"Division not possible, even by cancelling zero divisors.");
565 WerrorS(
"Result is integer division without remainder.");
566 return (number) ((
unsigned long) a / (
unsigned long)
b);
595 assume((
unsigned long) b != 0);
597 unsigned long b_div = (
unsigned long) b;
605 unsigned long rr = 0;
606 while ((g < r->mod2mMask ) && (b_div > 0) && (b_div % 2 == 0))
612 if (g != 1) rr = (
unsigned long)a % g;
618 if ((
unsigned long)a == 0)
620 if ((
unsigned long)b == 0)
622 if ((
unsigned long)b == 1)
624 unsigned long c = r->mod2mMask + 1;
626 return (number)(c / (
unsigned long)b);
630 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
631 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
632 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)b);
633 unsigned long s = mpz_get_ui(cc);
635 return (number)(
unsigned long)s;
640 if ((
unsigned long)b == 0)
642 return (number)((
unsigned long) a / (
unsigned long)
b);
648 if ((
unsigned long)b == 0)
650 if ((
unsigned long)b == 1)
652 unsigned long c = r->mod2mMask + 1;
654 return (number)(c / (
unsigned long)b);
658 mpz_ptr cc = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
659 mpz_init_set_ui(cc, r->mod2mMask); mpz_add_ui(cc, cc, 1);
660 mpz_div_ui(cc, cc, (
unsigned long)(
unsigned long)b);
661 unsigned long s = mpz_get_ui(cc);
663 return (number)(
unsigned long)s;
669 if ((
unsigned long)c % 2 == 0)
671 WerrorS(
"division by zero divisor");
679 if ((
unsigned long)c == 0)
return c;
685 unsigned long i = ((
unsigned long)from) % dst->mod2mMask ;
691 unsigned long i = ((
unsigned long)from) % (dst->mod2mMask + 1);
697 unsigned long j = (
unsigned long)1;
698 long ii = (long)from;
699 if (ii < 0) { j = dst->mod2mMask; ii = -ii; }
700 unsigned long i = (
unsigned long)ii;
701 i = i & dst->mod2mMask;
703 return (number)
nr2mMult((number)i, (number)j, dst);
710 mpz_ptr
k = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
711 mpz_init_set_ui(k, dst->mod2mMask);
713 mpz_and(erg, (mpz_ptr)from, k);
714 number
res = (number) mpz_get_ui(erg);
726 nlGMP(from, (number)gmp, src);
745 && (src->mod2mMask == dst->mod2mMask))
750 && (src->mod2mMask < dst->mod2mMask))
755 && (src->mod2mMask > dst->mod2mMask))
779 if (mpz_divisible_2exp_p(src->modNumber,dst->modExponent))
797 for (
int i = 1;
i <
m;
i++) r->mod2mMask = (r->mod2mMask << 1) + 1;
811 WarnS(
"nr2mInitExp unexpectedly called with m = 1 (we continue with Z/2^2");
818 if (((
unsigned long)a & r->mod2mMask) != (
unsigned long)a)
return FALSE;
832 if (((*s) >=
'0') && ((*s) <=
'9'))
839 if ((*i) >= (
MAX_INT_VAL / 10)) (*i) = (*i) & r->mod2mMask;
841 while (((*s) >=
'0') && ((*s) <=
'9'));
842 (*i) = (*i) & r->mod2mMask;
860 *a = (number)(
long)
z;
862 *a =
nr2mDiv((number)(
long)z,(number)(
long)n,r);
void nr2mInitExp(int c, const coeffs r)
number nr2mGcd(number a, number b, const coeffs r)
long nr2mInt(number &n, const coeffs r)
number nr2mCopy(number a, const coeffs r)
number nr2mLcm(number a, number b, const coeffs r)
static number nr2mMultM(number a, number b, const coeffs r)
const CanonicalForm int s
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
nMapFunc nr2mSetMap(const coeffs src, const coeffs dst)
number nr2mMapZ(number from, const coeffs src, const coeffs dst)
number nr2mInit(long i, const coeffs r)
number nr2mAdd(number a, number b, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
number nr2mSub(number a, number b, const coeffs r)
static number nr2mAnn(number b, const coeffs r)
number nr2mMult(number a, number b, const coeffs r)
const char * nr2mRead(const char *s, number *a, const coeffs r)
only used if HAVE_RINGS is defined
number ndCopyMap(number a, const coeffs aRing, const coeffs r)
BOOLEAN nr2mGreaterZero(number k, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
(), see rinteger.h, new impl.
number nr2mGetUnit(number a, const coeffs r)
number nr2mMod(number a, number b, const coeffs r)
number nr2mMapZp(number from, const coeffs, const coeffs dst)
void WerrorS(const char *s)
BOOLEAN nr2mIsMOne(number a, const coeffs r)
BOOLEAN nr2mInitChar(coeffs r, void *p)
number nr2mDiv(number a, number b, const coeffs r)
void nlGMP(number &i, number n, const coeffs r)
BOOLEAN nr2mGreater(number a, number b, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Q(const coeffs r)
number nr2mMapMachineInt(number from, const coeffs, const coeffs dst)
void nr2mWrite(number a, const coeffs r)
coeffs nr2mQuot1(number c, const coeffs r)
number nr2mInvers(number c, const coeffs r)
number nr2mNeg(number c, const coeffs r)
number nr2mIntDiv(number a, number b, const coeffs r)
Coefficient rings, fields and other domains suitable for Singular polynomials.
int nr2mDivComp(number a, number b, const coeffs r)
The main handler for Singular numbers which are suitable for Singular polynomials.
BOOLEAN nr2mDBTest(number a, const char *f, const int l, const coeffs r)
const ExtensionInfo & info
< [in] sqrfree poly
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
static char * nr2mCoeffString(const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
void PrintS(const char *s)
number nr2mMapProject(number from, const coeffs, const coeffs dst)
(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)
char * nr2mName(number n, const coeffs r)
void nr2mSetExp(int c, const coeffs r)
const Variable & v
< [in] a sqrfree bivariate poly
number nr2mInversM(number c, const coeffs r)
BOOLEAN nr2mDivBy(number a, number b, const coeffs r)
unsigned long InvMod(unsigned long a, const coeffs r)
BOOLEAN nr2mIsUnit(number a, const coeffs r)
BOOLEAN nr2mIsZero(number a, const coeffs r)
static number nr2mAddM(number a, number b, const coeffs r)
number nr2mExtGcd(number a, number b, number *s, number *t, const coeffs r)
number nr2mMapGMP(number from, const coeffs, const coeffs dst)
number nr2mMapQ(number from, const coeffs src, const coeffs dst)
static number nr2mSubM(number a, number b, const coeffs r)
void nr2mCoeffWrite(const coeffs r, BOOLEAN details)
void specialXGCD(unsigned long &s, unsigned long a, const coeffs r)
BOOLEAN nr2mEqual(number a, number b, const coeffs r)
BOOLEAN nr2mIsOne(number a, const coeffs r)
void nr2mPower(number a, int i, number *result, const coeffs r)
BOOLEAN nr2mCoeffIsEqual(const coeffs r, n_coeffType n, void *p)
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL