57 #if SI_INTEGER_VARIANT==2 59 # define nrnWrite nrzWrite 79 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
81 s= mpz_get_str (s, 10, r->modBase);
92 return (n==
n_Zn) && (mpz_cmp_ui(r->modNumber,(
long)parameter)==0);
97 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) +2;
99 b= mpz_get_str (b, 10, r->modBase);
103 else sprintf(s,
"ZZ/(bigint(%s)^%lu)",b,r->modExponent);
105 char* s = (
char*)
omAlloc(7+2+10+l);
107 else sprintf(s,
"integer,%s^%lu",b,r->modExponent);
115 mpz_clear(r->modNumber);
116 mpz_clear(r->modBase);
124 long ch = r->cfInt(c, r);
126 mpz_init_set(a, r->modNumber);
127 mpz_init_set_ui(b, ch);
129 gcd = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
132 if(mpz_cmp_ui(gcd, 1) == 0)
134 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
135 WerrorS(
"Unable to create qring!");
138 if(r->modExponent == 1)
142 info.
exp = (
unsigned long) 1;
148 info.
base = r->modBase;
151 mpz_init(baseTokNew);
152 mpz_set(baseTokNew, r->modBase);
153 while(mpz_cmp(gcd, baseTokNew) > 0)
156 mpz_mul(baseTokNew, baseTokNew, r->modBase);
160 mpz_clear(baseTokNew);
179 r->ch = mpz_get_ui(r->modNumber);
238 mpz_init_set_si(erg, i);
239 mpz_mod(erg, erg, r->modNumber);
245 if (*a ==
NULL)
return;
246 mpz_clear((mpz_ptr) *a);
254 mpz_init_set(erg, (mpz_ptr) a);
260 if (a ==
NULL)
return 0;
261 return sizeof(mpz_t);
269 return mpz_get_si((mpz_ptr) n);
279 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr) b);
280 mpz_mod(erg, erg, r->modNumber);
288 mpz_powm_ui(erg, (mpz_ptr)a, i, r->modNumber);
289 *result = (number) erg;
296 mpz_add(erg, (mpz_ptr)a, (mpz_ptr) b);
297 mpz_mod(erg, erg, r->modNumber);
305 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr) b);
306 mpz_mod(erg, erg, r->modNumber);
314 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
322 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
334 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
347 mpz_init_set(erg, r->modNumber);
348 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
349 if (b !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)b);
385 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)b);
386 mpz_mod(bs, bs, r->modNumber);
387 mpz_mod(bt, bt, r->modNumber);
410 nrnWrite(xx = (number)r->modNumber, r);
422 mpz_init_set(bs, (mpz_ptr) a);
423 mpz_init_set(bt, (mpz_ptr) b);
426 mpz_gcd(erg, bs, bt);
433 mpz_gcd(erg, erg, r->modNumber);
435 mpz_div(bs, bs, erg);
436 mpz_div(bt, bt, erg);
443 mpz_gcdext(one, bu, bv, bs, bt);
461 mpz_init_set(uu, (mpz_ptr)ui);
480 mpz_mod(bs, bs, r->modNumber);
481 mpz_mod(bt, bt, r->modNumber);
482 mpz_mod(bu, bu, r->modNumber);
483 mpz_mod(bv, bv, r->modNumber);
498 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
506 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
515 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
517 bool erg = (0 == mpz_cmp(t, r->modNumber));
524 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
529 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
534 return 0 < mpz_cmp_si((mpz_ptr)k, 0);
539 number tmp =
nrnGcd(a, (number)r->modNumber, r);
547 if (mpz_divisible_p(r->modNumber, (mpz_ptr)k))
return nrnInit(1,r);
549 mpz_ptr unit = (mpz_ptr)
nrnGcd(k, 0, r);
550 mpz_tdiv_q(unit, (mpz_ptr)k, unit);
551 mpz_ptr
gcd = (mpz_ptr)
nrnGcd((number)unit, 0,
r);
556 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
558 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd((number) tmp, 0,
r);
559 while (!
nrnEqual((number) gcd_new,(number) gcd,r))
566 mpz_mul(tmp, tmp, unit);
567 mpz_mod(tmp, tmp, r->modNumber);
569 mpz_gcd(gcd_new, tmp, r->modNumber);
572 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
573 mpz_add(unit, unit, tmp);
574 mpz_mod(unit, unit, r->modNumber);
586 mpz_gcd(tmp, (mpz_ptr) k, r->modNumber);
587 if (mpz_cmp_si(tmp, 1)==0) {
591 mpz_divexact(tmp, r->modNumber, tmp);
598 return mpz_divisible_p(r->modNumber, (mpz_ptr)b);
602 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)b, (mpz_ptr)n);
612 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr) b))
return -1;
613 if (mpz_divisible_p((mpz_ptr) b, (mpz_ptr) a))
return 1;
619 if (a ==
NULL) a = (number)r->modNumber;
622 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)b))
624 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)b);
630 mpz_divexact(erg, (mpz_ptr)b, gcd);
633 WerrorS(
"Division not possible, even by cancelling zero divisors.");
634 WerrorS(
"Result is integer division without remainder.");
635 mpz_tdiv_q(erg, (mpz_ptr) a, (mpz_ptr) b);
640 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,
r);
641 mpz_divexact(erg, (mpz_ptr)a, gcd);
642 mpz_mul(erg, erg, tmp);
645 mpz_mod(erg, erg, r->modNumber);
674 mpz_init_set_si(rr, 0);
675 mpz_gcd(g, (mpz_ptr)r->modNumber, (mpz_ptr)b);
676 if (mpz_cmp_si(g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a, g);
686 if (a ==
NULL) a = (number)r->modNumber;
687 mpz_tdiv_q(erg, (mpz_ptr)
a, (mpz_ptr)b);
714 mpz_init_set(aa, (mpz_ptr)a);
715 mpz_init_set(bb, (mpz_ptr)b);
717 mpz_gcd(g, bb, r->modNumber);
723 mpz_div(g, r->modNumber, g);
724 mpz_invert(g, bb, g);
753 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
754 mpz_mod(erg, erg, dst->modNumber);
764 mpz_mod(erg, erg, dst->modNumber);
772 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
776 #if SI_INTEGER_VARIANT==3 780 if (n_Z_IS_SMALL(from))
783 mpz_init_set(erg, (mpz_ptr) from);
784 mpz_mod(erg, erg, dst->modNumber);
787 #elif SI_INTEGER_VARIANT==2 798 #elif SI_INTEGER_VARIANT==1 804 #if SI_INTEGER_VARIANT!=2 814 int l=mpz_sizeinbase((mpz_ptr)
a, 10) + 2;
816 z=mpz_get_str(s,10,(mpz_ptr) a);
827 nlGMP(from, (number)erg, src);
828 mpz_mod(erg, erg, dst->modNumber);
852 && (mpz_cmp(src->modBase, dst->modBase) == 0)
853 && (src->modExponent == dst->modExponent))
return nrnMapGMP;
860 mpz_init_set_si(nrnMapModul, src->ch);
864 mpz_init(nrnMapModul);
865 mpz_set(nrnMapModul, src->modNumber);
874 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
881 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
882 mpz_ptr tmp = dst->modNumber;
883 dst->modNumber = nrnMapModul;
886 dst->modNumber = tmp;
891 dst->modNumber = tmp;
892 mpz_mul(nrnMapCoef, nrnMapCoef, inv);
893 mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
920 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
924 mpz_init_set (r->modNumber, r->modBase);
925 mpz_pow_ui (r->modNumber, r->modNumber, m);
943 if ( (mpz_cmp_si((mpz_ptr) a, 0) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
956 const char * start=
s;
957 if (!(*s >=
'0' && *s <=
'9'))
959 mpz_init_set_si(i, 1);
963 while (*s >=
'0' && *s <=
'9') s++;
966 mpz_set_str(i,start,10);
972 mpz_set_str(i,start,10);
984 mpz_mod(z, z, r->modNumber);
void nrnSetExp(unsigned long c, const coeffs r)
const CanonicalForm int s
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
void mpz_mul_si(mpz_ptr r, mpz_srcptr s, long int si)
void rem(unsigned long *a, unsigned long *q, unsigned long p, int °a, int degq)
only used if HAVE_RINGS is defined
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
number nrnMult(number a, number b, const coeffs r)
number nrnQuotRem(number a, number b, number *s, const coeffs r)
static const char * nlCPEatLongC(char *s, mpz_ptr i)
number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
#define omFreeSize(addr, size)
number nrnLcm(number a, number b, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
(), see rinteger.h, new impl.
BOOLEAN nrnIsMOne(number a, const coeffs r)
BOOLEAN nrnDivBy(number a, number b, const coeffs r)
void WerrorS(const char *s)
void nlGMP(number &i, number n, const coeffs r)
static BOOLEAN nrnCoeffsEqual(const coeffs r, n_coeffType n, void *parameter)
number nrnMod(number a, number b, const coeffs r)
number nrnMapZ(number from, const coeffs src, const coeffs dst)
BOOLEAN nrnGreaterZero(number k, const coeffs r)
void nrnInitExp(unsigned long c, const coeffs r)
number nrnDiv(number a, number b, const coeffs r)
void nrnDelete(number *a, const coeffs r)
number nrnAnn(number a, const coeffs r)
static char * nrnCoeffString(const coeffs r)
Coefficient rings, fields and other domains suitable for Singular polynomials.
number nrnMap2toM(number from, const coeffs, const coeffs dst)
BOOLEAN nrnIsUnit(number a, const coeffs r)
only used if HAVE_RINGS is defined
BOOLEAN nrnInitChar(coeffs r, void *p)
const char * nrnRead(const char *s, number *a, const coeffs r)
number nrnMapQ(number from, const coeffs src, const coeffs dst)
The main handler for Singular numbers which are suitable for Singular polynomials.
void StringSetS(const char *st)
void StringAppendS(const char *st)
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 FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
int nrnSize(number a, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
number nrnMapGMP(number from, const coeffs, const coeffs dst)
void PrintS(const char *s)
(mpz_ptr), see rmodulon,h
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
void nrnPower(number a, int i, number *result, const coeffs r)
number nrnAdd(number a, number b, const coeffs r)
const Variable & v
< [in] a sqrfree bivariate poly
BOOLEAN nrnGreater(number a, number b, const coeffs r)
static void nrnKillChar(coeffs r)
number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
number nrnCopy(number a, const coeffs r)
number nrnGetUnit(number a, const coeffs r)
number nrnMapZp(number from, const coeffs, const coeffs dst)
number nrnSub(number a, number b, const coeffs r)
BOOLEAN nrnIsOne(number a, const coeffs r)
BOOLEAN nrnIsZero(number a, const coeffs r)
int nrnDivComp(number a, number b, const coeffs r)
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
BOOLEAN nrnEqual(number a, number b, const coeffs r)
number nrnInit(long i, const coeffs r)
#define omFreeBin(addr, bin)
number nrnInvers(number c, const coeffs r)
void nrnCoeffWrite(const coeffs r, BOOLEAN details)
long nrnInt(number &n, const coeffs r)
number nrnIntDiv(number a, number b, const coeffs r)
number nrnNeg(number c, const coeffs r)
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
number nrnGcd(number a, number b, const coeffs r)
coeffs nrnQuot1(number c, const coeffs r)
number nrnMapModN(number from, const coeffs, const coeffs dst)