61 #if SI_INTEGER_VARIANT==2 63 # define nrnWrite nrzWrite 83 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
85 s= mpz_get_str (s, 10, r->modBase);
94 return (n==
n_Zn) && (mpz_cmp_ui(r->modNumber,(
long)parameter)==0);
99 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) +2;
101 b= mpz_get_str (b, 10, r->modBase);
102 char*
s = (
char*)
omAlloc(7+2+10+l);
104 else sprintf(s,
"integer,%s^%lu",b,r->modExponent);
111 mpz_clear(r->modNumber);
112 mpz_clear(r->modBase);
120 long ch = r->cfInt(c, r);
122 mpz_init_set(a, r->modNumber);
123 mpz_init_set_ui(b, ch);
125 gcd = (mpz_ptr)
omAlloc(
sizeof(mpz_t));
128 if(mpz_cmp_ui(gcd, 1) == 0)
130 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
131 WerrorS(
"Unable to create qring!");
134 if(r->modExponent == 1)
138 info.
exp = (
unsigned long) 1;
144 info.
base = r->modBase;
147 mpz_init(baseTokNew);
148 mpz_set(baseTokNew, r->modBase);
149 while(mpz_cmp(gcd, baseTokNew) > 0)
152 mpz_mul(baseTokNew, baseTokNew, r->modBase);
156 mpz_clear(baseTokNew);
175 r->ch = mpz_get_ui(r->modNumber);
234 mpz_init_set_si(erg, i);
235 mpz_mod(erg, erg, r->modNumber);
241 if (*a ==
NULL)
return;
242 mpz_clear((mpz_ptr) *a);
250 mpz_init_set(erg, (mpz_ptr) a);
256 if (a ==
NULL)
return 0;
257 return sizeof(mpz_t);
265 return mpz_get_si((mpz_ptr) n);
275 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr) b);
276 mpz_mod(erg, erg, r->modNumber);
284 mpz_powm_ui(erg, (mpz_ptr)a, i, r->modNumber);
285 *result = (number) erg;
292 mpz_add(erg, (mpz_ptr)a, (mpz_ptr) b);
293 mpz_mod(erg, erg, r->modNumber);
301 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr) b);
302 mpz_mod(erg, erg, r->modNumber);
310 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
318 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
330 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
343 mpz_init_set(erg, r->modNumber);
344 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
345 if (b !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)b);
381 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)b);
382 mpz_mod(bs, bs, r->modNumber);
383 mpz_mod(bt, bt, r->modNumber);
406 nrnWrite(xx = (number)r->modNumber, r);
418 mpz_init_set(bs, (mpz_ptr) a);
419 mpz_init_set(bt, (mpz_ptr) b);
422 mpz_gcd(erg, bs, bt);
429 mpz_gcd(erg, erg, r->modNumber);
431 mpz_div(bs, bs, erg);
432 mpz_div(bt, bt, erg);
439 mpz_gcdext(one, bu, bv, bs, bt);
456 mpz_init_set(uu, (mpz_ptr)ui);
475 mpz_mod(bs, bs, r->modNumber);
476 mpz_mod(bt, bt, r->modNumber);
477 mpz_mod(bu, bu, r->modNumber);
478 mpz_mod(bv, bv, r->modNumber);
493 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
501 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)
static const n_coeffType ID2
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
BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
static FORCE_INLINE void n_Write(number &n, const coeffs r, const BOOLEAN bShortOut=TRUE)
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)
(mpz_ptr), see rmodulon,h
static const n_coeffType ID
Our Type!
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)