26 #if SI_INTEGER_VARIANT==2 28 # define nrnWrite nrzWrite 40 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
42 s= mpz_get_str (s, 10, r->modBase);
54 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
57 s= mpz_get_str (s, 10, r->modBase);
70 return (n==
n_Zn) && (mpz_cmp_ui(r->modNumber,(
long)parameter)==0);
75 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) +2;
77 b= mpz_get_str (b, 10, r->modBase);
80 else sprintf(s,
"ZZ/(bigint(%s)^%lu)",b,r->modExponent);
87 mpz_clear(r->modNumber);
88 mpz_clear(r->modBase);
96 long ch = r->cfInt(c, r);
98 mpz_init_set(a, r->modNumber);
99 mpz_init_set_ui(b, ch);
103 if(mpz_cmp_ui(gcd, 1) == 0)
105 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
106 WerrorS(
"Unable to create qring!");
109 if(r->modExponent == 1)
113 info.
exp = (
unsigned long) 1;
119 info.
base = r->modBase;
122 mpz_init(baseTokNew);
123 mpz_set(baseTokNew, r->modBase);
124 while(mpz_cmp(gcd, baseTokNew) > 0)
127 mpz_mul(baseTokNew, baseTokNew, r->modBase);
131 mpz_clear(baseTokNew);
141 mpz_init_set(erg, (mpz_ptr) a);
151 mpz_init_set_si(erg, i);
152 mpz_mod(erg, erg, r->modNumber);
158 if (*a ==
NULL)
return;
159 mpz_clear((mpz_ptr) *a);
166 if (a ==
NULL)
return 0;
167 return sizeof(mpz_t);
175 return mpz_get_si((mpz_ptr) n);
185 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr) b);
186 mpz_mod(erg, erg, r->modNumber);
194 mpz_powm_ui(erg, (mpz_ptr)a, i, r->modNumber);
195 *result = (number) erg;
202 mpz_add(erg, (mpz_ptr)a, (mpz_ptr) b);
203 mpz_mod(erg, erg, r->modNumber);
211 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr) b);
212 mpz_mod(erg, erg, r->modNumber);
221 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
228 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
236 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
248 mpz_init_set(erg, r->modNumber);
249 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
250 if (b !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)b);
251 if(mpz_cmp(erg,r->modNumber)==0)
268 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
305 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)b);
306 mpz_mod(bs, bs, r->modNumber);
307 mpz_mod(bt, bt, r->modNumber);
318 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
323 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
328 if (mpz_divisible_p(r->modNumber, (mpz_ptr)k))
return nrnInit(1,r);
330 mpz_ptr unit = (mpz_ptr)
nrnGcd(k, 0, r);
331 mpz_tdiv_q(unit, (mpz_ptr)k, unit);
332 mpz_ptr
gcd = (mpz_ptr)
nrnGcd((number)unit, 0, r);
337 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
339 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd((number) tmp, 0, r);
340 while (!
nrnEqual((number) gcd_new,(number) gcd,r))
347 mpz_mul(tmp, tmp, unit);
348 mpz_mod(tmp, tmp, r->modNumber);
350 mpz_gcd(gcd_new, tmp, r->modNumber);
353 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
354 mpz_add(unit, unit, tmp);
355 mpz_mod(unit, unit, r->modNumber);
381 nrnWrite(xx = (number)r->modNumber, r);
393 mpz_init_set(bs, (mpz_ptr) a);
394 mpz_init_set(bt, (mpz_ptr) b);
397 mpz_gcd(erg, bs, bt);
404 mpz_gcd(erg, erg, r->modNumber);
406 mpz_div(bs, bs, erg);
407 mpz_div(bt, bt, erg);
414 mpz_gcdext(one, bu, bv, bs, bt);
432 mpz_init_set(uu, (mpz_ptr)ui);
451 mpz_mod(bs, bs, r->modNumber);
452 mpz_mod(bt, bt, r->modNumber);
453 mpz_mod(bu, bu, r->modNumber);
454 mpz_mod(bv, bv, r->modNumber);
469 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
471 bool erg = (0 == mpz_cmp(t, r->modNumber));
478 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
488 number tmp =
nrnGcd(a, (number)r->modNumber, r);
498 mpz_gcd(tmp, (mpz_ptr) k, r->modNumber);
499 if (mpz_cmp_si(tmp, 1)==0) {
503 mpz_divexact(tmp, r->modNumber, tmp);
510 return mpz_divisible_p(r->modNumber, (mpz_ptr)b);
514 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)b, (mpz_ptr)n);
524 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr) b))
return -1;
525 if (mpz_divisible_p((mpz_ptr) b, (mpz_ptr) a))
return 1;
531 if (a ==
NULL) a = (number)r->modNumber;
534 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)b))
536 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)b);
542 mpz_divexact(erg, (mpz_ptr)b, gcd);
545 WerrorS(
"Division not possible, even by cancelling zero divisors.");
546 WerrorS(
"Result is integer division without remainder.");
547 mpz_tdiv_q(erg, (mpz_ptr) a, (mpz_ptr) b);
552 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
553 mpz_divexact(erg, (mpz_ptr)a, gcd);
554 mpz_mul(erg, erg, tmp);
557 mpz_mod(erg, erg, r->modNumber);
586 mpz_init_set_ui(rr, 0);
587 mpz_gcd(g, (mpz_ptr)r->modNumber, (mpz_ptr)b);
588 if (mpz_cmp_si(g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a, g);
598 if (a ==
NULL) a = (number)r->modNumber;
599 mpz_tdiv_q(erg, (mpz_ptr)a, (mpz_ptr)b);
626 mpz_init_set(aa, (mpz_ptr)a);
627 mpz_init_set(bb, (mpz_ptr)b);
629 mpz_gcd(g, bb, r->modNumber);
635 mpz_div(g, r->modNumber, g);
636 mpz_invert(g, bb, g);
665 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
666 mpz_mod(erg, erg, dst->modNumber);
676 mpz_mod(erg, erg, dst->modNumber);
684 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
692 nlGMP(from, erg, src);
693 mpz_mod(erg, erg, dst->modNumber);
697 #if SI_INTEGER_VARIANT==3 701 if (n_Z_IS_SMALL(from))
704 mpz_init_set(erg, (mpz_ptr) from);
705 mpz_mod(erg, erg, dst->modNumber);
708 #elif SI_INTEGER_VARIANT==2 719 #elif SI_INTEGER_VARIANT==1 725 #if SI_INTEGER_VARIANT!=2 735 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
737 z=mpz_get_str(s,10,(mpz_ptr) a);
764 && (mpz_cmp(src->modBase, dst->modBase) == 0)
765 && (src->modExponent == dst->modExponent))
return nrnMapGMP;
772 mpz_init_set_si(nrnMapModul, src->ch);
776 mpz_init(nrnMapModul);
777 mpz_set(nrnMapModul, src->modNumber);
786 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
793 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
794 mpz_ptr tmp = dst->modNumber;
795 dst->modNumber = nrnMapModul;
798 dst->modNumber = tmp;
803 dst->modNumber = tmp;
804 mpz_mul(nrnMapCoef, nrnMapCoef, inv);
805 mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
832 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
836 mpz_init_set (r->modNumber, r->modBase);
837 mpz_pow_ui (r->modNumber, r->modNumber, m);
855 if ( (
mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
857 Warn(
"mod-n: out of range at %s:%d\n",f,l);
869 const char * start=
s;
870 if (!(*s >=
'0' && *s <=
'9'))
872 mpz_init_set_ui(i, 1);
876 while (*s >=
'0' && *s <=
'9') s++;
879 mpz_set_str(i,start,10);
885 mpz_set_str(i,start,10);
897 mpz_mod(z, z, r->modNumber);
907 r->modBase= (mpz_ptr)
nrnCopy((number)info->
base, r);
915 r->ch = mpz_get_ui(r->modNumber);
static number nrnAdd(number a, number b, const coeffs r)
const CanonicalForm int s
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_ModN(const coeffs r)
static number nrnMapZp(number from, const coeffs, const coeffs dst)
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)
static BOOLEAN nrnDivBy(number a, number b, const coeffs r)
only used if HAVE_RINGS is defined
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
static number nrnGetUnit(number k, const coeffs r)
static number nrnInvers(number c, const coeffs r)
static void nrnInitExp(unsigned long m, coeffs r)
static void nrnPower(number a, int i, number *result, const coeffs r)
static const char * nlCPEatLongC(char *s, mpz_ptr i)
static char * nrnCoeffName_buff
static number nrnMod(number a, number b, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
#define omFreeSize(addr, size)
static BOOLEAN nrnEqual(number a, number b, const coeffs)
static number nrnGcd(number a, number b, const coeffs r)
static BOOLEAN nrnIsOne(number a, const coeffs)
static number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
(), see rinteger.h, new impl.
static BOOLEAN nrnIsZero(number a, const coeffs)
static BOOLEAN nrnGreaterZero(number k, const coeffs)
static const char * nrnRead(const char *s, number *a, const coeffs r)
static mpz_ptr nrnMapCoef
static number nrnMap2toM(number from, const coeffs, const coeffs dst)
void WerrorS(const char *s)
static BOOLEAN nrnCoeffsEqual(const coeffs r, n_coeffType n, void *parameter)
static number nrnQuotRem(number a, number b, number *rem, const coeffs r)
static number nrnSub(number a, number b, const coeffs r)
static number nrnAnn(number k, const coeffs r)
static BOOLEAN nrnIsUnit(number a, const coeffs r)
static number nrnMapQ(number from, const coeffs src, const coeffs dst)
static number nrnIntDiv(number a, number b, const coeffs r)
static char * nrnCoeffString(const coeffs r)
Coefficient rings, fields and other domains suitable for Singular polynomials.
only used if HAVE_RINGS is defined
BOOLEAN nrnInitChar(coeffs r, void *p)
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 number nrnLcm(number a, number b, const coeffs r)
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)
static number nrnDiv(number a, number b, const coeffs r)
static long nrnInt(number &n, const coeffs)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
number nrnMapGMP(number from, const coeffs, const coeffs dst)
static void nrnDelete(number *a, const coeffs)
void PrintS(const char *s)
static number nrnMapZ(number from, const coeffs src, const coeffs dst)
(mpz_ptr), see rmodulon,h
void nlGMP(number &i, mpz_t n, const coeffs r)
static number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
static BOOLEAN nrnGreater(number a, number b, const coeffs)
const Variable & v
< [in] a sqrfree bivariate poly
static BOOLEAN nrnIsMOne(number a, const coeffs r)
static void nrnKillChar(coeffs r)
static number nrnMapModN(number from, const coeffs, const coeffs dst)
static void nrnSetExp(unsigned long m, coeffs r)
static coeffs nrnQuot1(number c, const coeffs r)
static char * nrnCoeffName(const coeffs r)
static number nrnCopy(number a, const coeffs)
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
static number nrnInit(long i, const coeffs r)
#define omFreeBin(addr, bin)
static void nrnCoeffWrite(const coeffs r, BOOLEAN)
static number nrnNeg(number c, const coeffs r)
static number nrnMult(number a, number b, const coeffs r)
static int nrnDivComp(number a, number b, const coeffs r)
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL
static int nrnSize(number a, const coeffs)