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);
102 else sprintf(s,
"ZZ/(bigint(%s)^%lu)",b,r->modExponent);
109 mpz_clear(r->modNumber);
110 mpz_clear(r->modBase);
118 long ch = r->cfInt(c, r);
120 mpz_init_set(a, r->modNumber);
121 mpz_init_set_ui(b, ch);
123 gcd = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
126 if(mpz_cmp_ui(gcd, 1) == 0)
128 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
129 WerrorS(
"Unable to create qring!");
132 if(r->modExponent == 1)
136 info.
exp = (
unsigned long) 1;
142 info.
base = r->modBase;
145 mpz_init(baseTokNew);
146 mpz_set(baseTokNew, r->modBase);
147 while(mpz_cmp(gcd, baseTokNew) > 0)
150 mpz_mul(baseTokNew, baseTokNew, r->modBase);
154 mpz_clear(baseTokNew);
173 r->ch = mpz_get_ui(r->modNumber);
232 mpz_init_set_si(erg, i);
233 mpz_mod(erg, erg, r->modNumber);
239 if (*a ==
NULL)
return;
240 mpz_clear((mpz_ptr) *a);
248 mpz_init_set(erg, (mpz_ptr) a);
254 if (a ==
NULL)
return 0;
255 return sizeof(mpz_t);
263 return mpz_get_si((mpz_ptr) n);
273 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr) b);
274 mpz_mod(erg, erg, r->modNumber);
282 mpz_powm_ui(erg, (mpz_ptr)a, i, r->modNumber);
283 *result = (number) erg;
290 mpz_add(erg, (mpz_ptr)a, (mpz_ptr) b);
291 mpz_mod(erg, erg, r->modNumber);
299 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr) b);
300 mpz_mod(erg, erg, r->modNumber);
308 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
316 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
328 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
341 mpz_init_set(erg, r->modNumber);
342 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
343 if (b !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)b);
379 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)b);
380 mpz_mod(bs, bs, r->modNumber);
381 mpz_mod(bt, bt, r->modNumber);
404 nrnWrite(xx = (number)r->modNumber, r);
416 mpz_init_set(bs, (mpz_ptr) a);
417 mpz_init_set(bt, (mpz_ptr) b);
420 mpz_gcd(erg, bs, bt);
427 mpz_gcd(erg, erg, r->modNumber);
429 mpz_div(bs, bs, erg);
430 mpz_div(bt, bt, erg);
437 mpz_gcdext(one, bu, bv, bs, bt);
455 mpz_init_set(uu, (mpz_ptr)ui);
474 mpz_mod(bs, bs, r->modNumber);
475 mpz_mod(bt, bt, r->modNumber);
476 mpz_mod(bu, bu, r->modNumber);
477 mpz_mod(bv, bv, r->modNumber);
492 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
500 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
509 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
511 bool erg = (0 == mpz_cmp(t, r->modNumber));
518 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
523 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)b);
528 return 0 < mpz_cmp_si((mpz_ptr)k, 0);
533 number tmp =
nrnGcd(a, (number)r->modNumber, r);
541 if (mpz_divisible_p(r->modNumber, (mpz_ptr)k))
return nrnInit(1,r);
543 mpz_ptr unit = (mpz_ptr)
nrnGcd(k, 0, r);
544 mpz_tdiv_q(unit, (mpz_ptr)k, unit);
545 mpz_ptr
gcd = (mpz_ptr)
nrnGcd((number)unit, 0,
r);
550 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
552 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd((number) tmp, 0,
r);
553 while (!
nrnEqual((number) gcd_new,(number) gcd,r))
560 mpz_mul(tmp, tmp, unit);
561 mpz_mod(tmp, tmp, r->modNumber);
563 mpz_gcd(gcd_new, tmp, r->modNumber);
566 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
567 mpz_add(unit, unit, tmp);
568 mpz_mod(unit, unit, r->modNumber);
580 mpz_gcd(tmp, (mpz_ptr) k, r->modNumber);
581 if (mpz_cmp_si(tmp, 1)==0) {
585 mpz_divexact(tmp, r->modNumber, tmp);
592 return mpz_divisible_p(r->modNumber, (mpz_ptr)b);
596 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)b, (mpz_ptr)n);
606 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr) b))
return -1;
607 if (mpz_divisible_p((mpz_ptr) b, (mpz_ptr) a))
return 1;
613 if (a ==
NULL) a = (number)r->modNumber;
616 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)b))
618 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)b);
624 mpz_divexact(erg, (mpz_ptr)b, gcd);
627 WerrorS(
"Division not possible, even by cancelling zero divisors.");
628 WerrorS(
"Result is integer division without remainder.");
629 mpz_tdiv_q(erg, (mpz_ptr) a, (mpz_ptr) b);
634 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,
r);
635 mpz_divexact(erg, (mpz_ptr)a, gcd);
636 mpz_mul(erg, erg, tmp);
639 mpz_mod(erg, erg, r->modNumber);
668 mpz_init_set_si(rr, 0);
669 mpz_gcd(g, (mpz_ptr)r->modNumber, (mpz_ptr)b);
670 if (mpz_cmp_si(g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a, g);
680 if (a ==
NULL) a = (number)r->modNumber;
681 mpz_tdiv_q(erg, (mpz_ptr)
a, (mpz_ptr)b);
708 mpz_init_set(aa, (mpz_ptr)a);
709 mpz_init_set(bb, (mpz_ptr)b);
711 mpz_gcd(g, bb, r->modNumber);
717 mpz_div(g, r->modNumber, g);
718 mpz_invert(g, bb, g);
747 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
748 mpz_mod(erg, erg, dst->modNumber);
758 mpz_mod(erg, erg, dst->modNumber);
766 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
770 #if SI_INTEGER_VARIANT==3 774 if (n_Z_IS_SMALL(from))
777 mpz_init_set(erg, (mpz_ptr) from);
778 mpz_mod(erg, erg, dst->modNumber);
781 #elif SI_INTEGER_VARIANT==2 792 #elif SI_INTEGER_VARIANT==1 798 #if SI_INTEGER_VARIANT!=2 808 int l=mpz_sizeinbase((mpz_ptr)
a, 10) + 2;
810 z=mpz_get_str(s,10,(mpz_ptr) a);
821 nlGMP(from, (number)erg, src);
822 mpz_mod(erg, erg, dst->modNumber);
846 && (mpz_cmp(src->modBase, dst->modBase) == 0)
847 && (src->modExponent == dst->modExponent))
return nrnMapGMP;
854 mpz_init_set_si(nrnMapModul, src->ch);
858 mpz_init(nrnMapModul);
859 mpz_set(nrnMapModul, src->modNumber);
868 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
875 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
876 mpz_ptr tmp = dst->modNumber;
877 dst->modNumber = nrnMapModul;
880 dst->modNumber = tmp;
885 dst->modNumber = tmp;
886 mpz_mul(nrnMapCoef, nrnMapCoef, inv);
887 mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
914 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
918 mpz_init_set (r->modNumber, r->modBase);
919 mpz_pow_ui (r->modNumber, r->modNumber, m);
937 if ( (mpz_cmp_si((mpz_ptr) a, 0) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
950 const char * start=
s;
951 if (!(*s >=
'0' && *s <=
'9'))
953 mpz_init_set_si(i, 1);
957 while (*s >=
'0' && *s <=
'9') s++;
960 mpz_set_str(i,start,10);
966 mpz_set_str(i,start,10);
978 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)