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);
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);
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;
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);
Coefficient rings, fields and other domains suitable for Singular polynomials.
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
@ n_Znm
only used if HAVE_RINGS is defined
@ n_Zn
only used if HAVE_RINGS is defined
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_Ring_ModN(const coeffs r)
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
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_gmp
(mpz_ptr), see rmodulon,h
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_Z(const coeffs r)
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
const ExtensionInfo & info
< [in] sqrfree poly
void WerrorS(const char *s)
void mpz_mul_si(mpz_ptr r, mpz_srcptr s, long int si)
void nlGMP(number &i, mpz_t n, const coeffs r)
void rem(unsigned long *a, unsigned long *q, unsigned long p, int °a, int degq)
The main handler for Singular numbers which are suitable for Singular polynomials.
#define omFreeSize(addr, size)
#define omFreeBin(addr, bin)
void StringSetS(const char *st)
void StringAppendS(const char *st)
void PrintS(const char *s)
static const char * nrnRead(const char *s, number *a, const coeffs r)
static number nrnMap2toM(number from, const coeffs, const coeffs dst)
static coeffs nrnQuot1(number c, const coeffs r)
static char * nrnCoeffName_buff
static const char * nlCPEatLongC(char *s, mpz_ptr i)
static number nrnInit(long i, const coeffs r)
static void nrnKillChar(coeffs r)
BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
static BOOLEAN nrnGreater(number a, number b, const coeffs)
static mpz_ptr nrnMapCoef
static BOOLEAN nrnIsZero(number a, const coeffs)
static number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
static number nrnMod(number a, number b, const coeffs r)
static number nrnMapZ(number from, const coeffs src, const coeffs dst)
static void nrnInitExp(unsigned long m, coeffs r)
static number nrnAnn(number k, const coeffs r)
static char * nrnCoeffName(const coeffs r)
static BOOLEAN nrnIsUnit(number a, const coeffs r)
static void nrnCoeffWrite(const coeffs r, BOOLEAN)
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
static number nrnMapZp(number from, const coeffs, const coeffs dst)
static number nrnInvers(number c, const coeffs r)
static void nrnSetExp(unsigned long m, coeffs r)
static int nrnDivComp(number a, number b, const coeffs r)
static number nrnIntDiv(number a, number b, const coeffs r)
static BOOLEAN nrnCoeffsEqual(const coeffs r, n_coeffType n, void *parameter)
static BOOLEAN nrnGreaterZero(number k, const coeffs)
static number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
static BOOLEAN nrnEqual(number a, number b, const coeffs)
static void nrnDelete(number *a, const coeffs)
static number nrnQuotRem(number a, number b, number *rem, const coeffs r)
static long nrnInt(number &n, const coeffs)
static number nrnMapQ(number from, const coeffs src, const coeffs dst)
static int nrnSize(number a, const coeffs)
static BOOLEAN nrnIsOne(number a, const coeffs)
static number nrnCopy(number a, const coeffs)
static number nrnSub(number a, number b, const coeffs r)
static number nrnLcm(number a, number b, const coeffs r)
static number nrnMapModN(number from, const coeffs, const coeffs dst)
static void nrnPower(number a, int i, number *result, const coeffs r)
static number nrnMult(number a, number b, const coeffs r)
static number nrnNeg(number c, const coeffs r)
static char * nrnCoeffString(const coeffs r)
static number nrnGetUnit(number k, const coeffs r)
number nrnMapGMP(number from, const coeffs, const coeffs dst)
static number nrnDiv(number a, number b, const coeffs r)
static BOOLEAN nrnIsMOne(number a, const coeffs r)
static BOOLEAN nrnDivBy(number a, number b, const coeffs r)
BOOLEAN nrnInitChar(coeffs r, void *p)
static number nrnAdd(number a, number b, const coeffs r)
static number nrnGcd(number a, number b, const coeffs r)