35 const char start[]=
"ZZ/bigint(";
36 const int start_len=strlen(start);
37 if (strncmp(
s,start,start_len)==0)
46 while ((*
s!=
'\0') && (*
s!=
')'))
s++;
48 if (*
s==
'\0') { mpz_clear(z);
return NULL; }
49 if (((*
s)==
')') && (*(
s+1)==
'^'))
54 info.exp=(
unsigned long)
i;
67 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
71 s= mpz_get_str (
s, 10, r->modBase);
91 return (n==r->type) && (r->modExponent==
info->exp)
92 && (mpz_cmp(r->modBase,
info->base)==0);
97 mpz_clear(r->modNumber);
98 mpz_clear(r->modBase);
106 long ch = r->cfInt(c, r);
108 mpz_init_set(a, r->modNumber);
109 mpz_init_set_ui(
b, ch);
113 if(mpz_cmp_ui(
gcd, 1) == 0)
115 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
116 WerrorS(
"Unable to create qring!");
119 if(r->modExponent == 1)
123 info.exp = (
unsigned long) 1;
129 info.base = r->modBase;
132 mpz_init(baseTokNew);
133 mpz_set(baseTokNew, r->modBase);
134 while(mpz_cmp(
gcd, baseTokNew) > 0)
137 mpz_mul(baseTokNew, baseTokNew, r->modBase);
141 mpz_clear(baseTokNew);
151 mpz_init_set(erg, (mpz_ptr) a);
161 mpz_init_set_si(erg,
i);
162 mpz_mod(erg, erg, r->modNumber);
171 return mpz_get_si((mpz_ptr) n);
174#if SI_INTEGER_VARIANT==2
175#define nrnDelete nrzDelete
176#define nrnSize nrzSize
182 mpz_clear((mpz_ptr) *a);
199 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr)
b);
200 mpz_mod(erg, erg, r->modNumber);
206 mpz_mul((mpz_ptr)a, (mpz_ptr)a, (mpz_ptr)
b);
207 mpz_mod((mpz_ptr)a, (mpz_ptr)a, r->modNumber);
214 mpz_powm_ui(erg, (mpz_ptr)a,
i, r->modNumber);
222 mpz_add(erg, (mpz_ptr)a, (mpz_ptr)
b);
223 mpz_mod(erg, erg, r->modNumber);
229 mpz_add((mpz_ptr)a, (mpz_ptr)a, (mpz_ptr)
b);
230 mpz_mod((mpz_ptr)a, (mpz_ptr)a, r->modNumber);
237 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr)
b);
238 mpz_mod(erg, erg, r->modNumber);
251 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
265 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
278 mpz_init_set(erg, r->modNumber);
279 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
280 mpz_gcd(erg, erg, (mpz_ptr)
b);
281 if(mpz_cmp(erg,r->modNumber)==0)
298 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
335 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)
b);
336 mpz_mod(bs, bs, r->modNumber);
337 mpz_mod(bt, bt, r->modNumber);
345 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
350 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
355 if (mpz_divisible_p(r->modNumber, (mpz_ptr)
k))
return nrnInit(1,r);
358 mpz_tdiv_q(unit, (mpz_ptr)
k, unit);
364 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
366 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd(
NULL, (number) tmp, r);
374 mpz_mul(tmp, tmp, unit);
375 mpz_mod(tmp, tmp, r->modNumber);
377 mpz_gcd(gcd_new, tmp, r->modNumber);
380 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
381 mpz_add(unit, unit, tmp);
382 mpz_mod(unit, unit, r->modNumber);
408 nrnWrite(xx = (number)r->modNumber, r);
420 mpz_init_set(bs, (mpz_ptr) a);
421 mpz_init_set(bt, (mpz_ptr)
b);
424 mpz_gcd(erg, bs, bt);
431 mpz_gcd(erg, erg, r->modNumber);
433 mpz_div(bs, bs, erg);
434 mpz_div(bt, bt, erg);
441 mpz_gcdext(one, bu, bv, bs, bt);
459 mpz_init_set(uu, (mpz_ptr)ui);
478 mpz_mod(bs, bs, r->modNumber);
479 mpz_mod(bt, bt, r->modNumber);
480 mpz_mod(bu, bu, r->modNumber);
481 mpz_mod(bv, bv, r->modNumber);
493 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
495 bool erg = (0 == mpz_cmp(t, r->modNumber));
502 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
509 if (mpz_cmp_ui(
cf->modBase,2)==0)
514 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
515 mpz_sub_ui(ch2,ch2,1);
516 mpz_divexact_ui(ch2,ch2,2);
517 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
528 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
529 mpz_tdiv_q_ui(ch2,ch2,2);
530 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
543 number tmp =
nrnGcd(a, (number)r->modNumber, r);
553 mpz_gcd(tmp, (mpz_ptr)
k, r->modNumber);
554 if (mpz_cmp_si(tmp, 1)==0)
559 mpz_divexact(tmp, r->modNumber, tmp);
567 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)
b, (mpz_ptr)n);
576 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr)
b))
return -1;
577 if (mpz_divisible_p((mpz_ptr)
b, (mpz_ptr) a))
return 1;
588 else if (r->is_field)
597 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)
b))
599 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)
b);
605 mpz_divexact(erg, (mpz_ptr)
b,
gcd);
608 WerrorS(
"Division not possible, even by cancelling zero divisors.");
614 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
615 mpz_divexact(erg, (mpz_ptr)a,
gcd);
616 mpz_mul(erg, erg, tmp);
619 mpz_mod(erg, erg, r->modNumber);
648 mpz_init_set_ui(rr, 0);
649 mpz_gcd(
g, (mpz_ptr)r->modNumber, (mpz_ptr)
b);
650 if (mpz_cmp_si(
g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a,
g);
679 mpz_init_set(aa, (mpz_ptr)a);
680 mpz_init_set(bb, (mpz_ptr)
b);
682 mpz_gcd(
g, bb, r->modNumber);
688 mpz_div(
g, r->modNumber,
g);
689 mpz_invert(
g, bb,
g);
718 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
719 mpz_mod(erg, erg, dst->modNumber);
729 mpz_mod(erg, erg, dst->modNumber);
737 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
744 nlMPZ(erg, from, src);
745 mpz_mod(erg, erg, dst->modNumber);
749#if SI_INTEGER_VARIANT==3
753 if (n_Z_IS_SMALL(from))
756 mpz_init_set(erg, (mpz_ptr) from);
757 mpz_mod(erg, erg, dst->modNumber);
760#elif SI_INTEGER_VARIANT==2
771#elif SI_INTEGER_VARIANT==1
786 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
788 z=mpz_get_str(
s,10,(mpz_ptr) a);
814 && (mpz_cmp(src->modBase, dst->modBase) == 0)
815 && (src->modExponent == dst->modExponent))
return ndCopyMap;
822 mpz_init_set_si(nrnMapModul, src->ch);
826 mpz_init(nrnMapModul);
827 mpz_set(nrnMapModul, src->modNumber);
836 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
841 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
843 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
844 mpz_ptr tmp = dst->modNumber;
845 dst->modNumber = nrnMapModul;
848 dst->modNumber = tmp;
853 dst->modNumber = tmp;
879 mpz_mod(erg, erg, r->modNumber);
885 mpz_init_set(
m, (mpz_ptr)n);
895 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
899 mpz_init_set (r->modNumber, r->modBase);
900 mpz_pow_ui (r->modNumber, r->modNumber,
m);
917 if ( (
mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
919 Warn(
"mod-n: out of range at %s:%d\n",
f,
l);
931 const char * start=
s;
932 if (!(*
s >=
'0' && *
s <=
'9'))
934 mpz_init_set_ui(
i, 1);
938 while (*
s >=
'0' && *
s <=
'9')
s++;
941 mpz_set_str(
i,start,10);
947 mpz_set_str(
i,start,10);
959 mpz_mod(z, z, r->modNumber);
967 *a=
nrnDiv((number)z,(number)n,r);
995 r->modBase= (mpz_ptr)
nrnCopy((number)
info->base, r);
1003 r->ch = mpz_get_ui(r->modNumber);
1051#if SI_INTEGER_VARIANT==2
1059 if ((r->modExponent==1)&&(
mpz_size1(r->modBase)==1))
1061 long p=mpz_get_si(r->modBase);
Coefficient rings, fields and other domains suitable for Singular polynomials.
static FORCE_INLINE BOOLEAN nCoeff_is_Z(const coeffs r)
number ndCopyMap(number a, const coeffs src, const coeffs dst)
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_Zn(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
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
void WerrorS(const char *s)
void mpz_mul_si(mpz_ptr r, mpz_srcptr s, long int si)
void nlMPZ(mpz_t m, number &n, const coeffs r)
void rem(unsigned long *a, unsigned long *q, unsigned long p, int °a, int degq)
#define FACTORY_MAX_PRIME
The main handler for Singular numbers which are suitable for Singular polynomials.
char * nEati(char *s, int *i, int m)
divide by the first (leading) number and return it, i.e. make monic
char * nEatLong(char *s, mpz_ptr i)
extracts a long integer from s, returns the rest
const char *const nDivBy0
#define omFreeSize(addr, size)
#define omFreeBin(addr, bin)
void StringSetS(const char *st)
void StringAppendS(const char *st)
void PrintS(const char *s)
number nrzReadFd(const ssiInfo *d, const coeffs)
void nrzWriteFd(number n, const ssiInfo *d, const coeffs)
static number nrnMap2toM(number from, const coeffs, const coeffs dst)
static coeffs nrnQuot1(number c, const coeffs r)
static number nrnInit(long i, const coeffs r)
static const char * nlCPEatLongC(char *s, mpz_ptr i)
STATIC_VAR char * nrnCoeffName_buff
static BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
static void nrnKillChar(coeffs r)
static BOOLEAN nrnGreater(number a, number b, const coeffs)
STATIC_VAR mpz_ptr nrnMapCoef
static BOOLEAN nrnIsZero(number a, const coeffs)
static CanonicalForm nrnConvSingNFactoryN(number n, BOOLEAN setChar, const coeffs r)
static number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
static void nrnMPZ(mpz_t m, number &n, const coeffs)
static BOOLEAN nrnCoeffIsEqual(const coeffs r, n_coeffType n, void *parameter)
static void nrnInpMult(number &a, number b, const coeffs r)
void nrnWrite(number a, const coeffs)
static number nrnMod(number a, number b, const coeffs r)
coeffs nrnInitCfByName(char *s, n_coeffType)
static number nrnMapZ(number from, const coeffs src, const coeffs dst)
static number nrnInitMPZ(mpz_t m, const coeffs r)
static void nrnInitExp(unsigned long m, coeffs r)
static number nrnAnn(number k, const coeffs r)
static BOOLEAN nrnIsUnit(number a, const coeffs r)
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 number nrnConvFactoryNSingN(const CanonicalForm n, const coeffs r)
static void nrnSetExp(unsigned long m, coeffs r)
static int nrnDivComp(number a, number b, const coeffs r)
static const char * nrnRead(const char *s, number *a, const coeffs r)
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 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 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 number nrnGetUnit(number k, const coeffs r)
number nrnMapGMP(number from, const coeffs, const coeffs dst)
static char * nrnCoeffName(const coeffs r)
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)
static BOOLEAN nrnGreaterZero(number k, const coeffs cf)
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)
static void nrnInpAdd(number &a, number b, const coeffs r)