37 const char start[]=
"ZZ/bigint(";
38 const int start_len=strlen(start);
39 if (strncmp(
s,start,start_len)==0)
48 while ((*
s!=
'\0') && (*
s!=
')'))
s++;
50 if (*
s==
'\0') { mpz_clear(z);
return NULL; }
51 if (((*
s)==
')') && (*(
s+1)==
'^'))
56 info.exp=(
unsigned long)
i;
69 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
73 s= mpz_get_str (
s, 10, r->modBase);
93 return (n==r->type) && (r->modExponent==
info->exp)
94 && (mpz_cmp(r->modBase,
info->base)==0);
99 mpz_clear(r->modNumber);
100 mpz_clear(r->modBase);
108 long ch = r->cfInt(c, r);
110 mpz_init_set(a, r->modNumber);
111 mpz_init_set_ui(
b, ch);
115 if(mpz_cmp_ui(
gcd, 1) == 0)
117 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
118 WerrorS(
"Unable to create qring!");
121 if(r->modExponent == 1)
125 info.exp = (
unsigned long) 1;
131 info.base = r->modBase;
134 mpz_init(baseTokNew);
135 mpz_set(baseTokNew, r->modBase);
136 while(mpz_cmp(
gcd, baseTokNew) > 0)
139 mpz_mul(baseTokNew, baseTokNew, r->modBase);
143 mpz_clear(baseTokNew);
153 mpz_init_set(erg, (mpz_ptr) a);
163 mpz_init_set_si(erg,
i);
164 mpz_mod(erg, erg, r->modNumber);
173 return mpz_get_si((mpz_ptr) n);
176#if SI_INTEGER_VARIANT==2
177#define nrnDelete nrzDelete
178#define nrnSize nrzSize
184 mpz_clear((mpz_ptr) *a);
191 mpz_ptr
p=(mpz_ptr)a;
193 if (
s==1)
s=(mpz_cmp_ui(
p,0)!=0);
204 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr)
b);
205 mpz_mod(erg, erg, r->modNumber);
213 mpz_powm_ui(erg, (mpz_ptr)a,
i, r->modNumber);
221 mpz_add(erg, (mpz_ptr)a, (mpz_ptr)
b);
222 mpz_mod(erg, erg, r->modNumber);
230 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr)
b);
231 mpz_mod(erg, erg, r->modNumber);
237 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
244 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
258 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
271 mpz_init_set(erg, r->modNumber);
272 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
273 mpz_gcd(erg, erg, (mpz_ptr)
b);
274 if(mpz_cmp(erg,r->modNumber)==0)
291 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
328 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)
b);
329 mpz_mod(bs, bs, r->modNumber);
330 mpz_mod(bt, bt, r->modNumber);
338 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
343 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
348 if (mpz_divisible_p(r->modNumber, (mpz_ptr)
k))
return nrnInit(1,r);
351 mpz_tdiv_q(unit, (mpz_ptr)
k, unit);
357 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
359 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd(
NULL, (number) tmp, r);
367 mpz_mul(tmp, tmp, unit);
368 mpz_mod(tmp, tmp, r->modNumber);
370 mpz_gcd(gcd_new, tmp, r->modNumber);
373 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
374 mpz_add(unit, unit, tmp);
375 mpz_mod(unit, unit, r->modNumber);
401 nrnWrite(xx = (number)r->modNumber, r);
413 mpz_init_set(bs, (mpz_ptr) a);
414 mpz_init_set(bt, (mpz_ptr)
b);
417 mpz_gcd(erg, bs, bt);
424 mpz_gcd(erg, erg, r->modNumber);
426 mpz_div(bs, bs, erg);
427 mpz_div(bt, bt, erg);
434 mpz_gcdext(one, bu, bv, bs, bt);
452 mpz_init_set(uu, (mpz_ptr)ui);
471 mpz_mod(bs, bs, r->modNumber);
472 mpz_mod(bt, bt, r->modNumber);
473 mpz_mod(bu, bu, r->modNumber);
474 mpz_mod(bv, bv, r->modNumber);
486 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
488 bool erg = (0 == mpz_cmp(t, r->modNumber));
495 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
502 if (mpz_cmp_ui(
cf->modBase,2)==0)
507 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
508 mpz_sub_ui(ch2,ch2,1);
509 mpz_divexact_ui(ch2,ch2,2);
510 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
521 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
522 mpz_tdiv_q_ui(ch2,ch2,2);
523 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
536 number tmp =
nrnGcd(a, (number)r->modNumber, r);
546 mpz_gcd(tmp, (mpz_ptr)
k, r->modNumber);
547 if (mpz_cmp_si(tmp, 1)==0)
552 mpz_divexact(tmp, r->modNumber, tmp);
560 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)
b, (mpz_ptr)n);
569 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr)
b))
return -1;
570 if (mpz_divisible_p((mpz_ptr)
b, (mpz_ptr) a))
return 1;
581 else if (r->is_field)
590 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)
b))
592 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)
b);
598 mpz_divexact(erg, (mpz_ptr)
b,
gcd);
601 WerrorS(
"Division not possible, even by cancelling zero divisors.");
607 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
608 mpz_divexact(erg, (mpz_ptr)a,
gcd);
609 mpz_mul(erg, erg, tmp);
612 mpz_mod(erg, erg, r->modNumber);
641 mpz_init_set_ui(rr, 0);
642 mpz_gcd(
g, (mpz_ptr)r->modNumber, (mpz_ptr)
b);
643 if (mpz_cmp_si(
g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a,
g);
672 mpz_init_set(aa, (mpz_ptr)a);
673 mpz_init_set(bb, (mpz_ptr)
b);
675 mpz_gcd(
g, bb, r->modNumber);
681 mpz_div(
g, r->modNumber,
g);
682 mpz_invert(
g, bb,
g);
711 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
712 mpz_mod(erg, erg, dst->modNumber);
722 mpz_mod(erg, erg, dst->modNumber);
730 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
737 nlMPZ(erg, from, src);
738 mpz_mod(erg, erg, dst->modNumber);
742#if SI_INTEGER_VARIANT==3
746 if (n_Z_IS_SMALL(from))
749 mpz_init_set(erg, (mpz_ptr) from);
750 mpz_mod(erg, erg, dst->modNumber);
753#elif SI_INTEGER_VARIANT==2
764#elif SI_INTEGER_VARIANT==1
779 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
781 z=mpz_get_str(
s,10,(mpz_ptr) a);
807 && (mpz_cmp(src->modBase, dst->modBase) == 0)
808 && (src->modExponent == dst->modExponent))
return ndCopyMap;
815 mpz_init_set_si(nrnMapModul, src->ch);
819 mpz_init(nrnMapModul);
820 mpz_set(nrnMapModul, src->modNumber);
829 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
834 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
836 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
837 mpz_ptr tmp = dst->modNumber;
838 dst->modNumber = nrnMapModul;
841 dst->modNumber = tmp;
846 dst->modNumber = tmp;
872 mpz_mod(erg, erg, r->modNumber);
878 mpz_init_set(
m, (mpz_ptr)n);
888 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
892 mpz_init_set (r->modNumber, r->modBase);
893 mpz_pow_ui (r->modNumber, r->modNumber,
m);
910 if ( (
mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
912 Warn(
"mod-n: out of range at %s:%d\n",
f,
l);
924 const char * start=
s;
925 if (!(*
s >=
'0' && *
s <=
'9'))
927 mpz_init_set_ui(
i, 1);
931 while (*
s >=
'0' && *
s <=
'9')
s++;
934 mpz_set_str(
i,start,10);
940 mpz_set_str(
i,start,10);
952 mpz_mod(z, z, r->modNumber);
960 *a=
nrnDiv((number)z,(number)n,r);
988 r->modBase= (mpz_ptr)
nrnCopy((number)
info->base, r);
996 r->ch = mpz_get_ui(r->modNumber);
1042#if SI_INTEGER_VARIANT==2
1050 if ((r->modExponent==1)&&(
mpz_size1(r->modBase)==1))
1052 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
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 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 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_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)
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)
EXTERN_VAR omBin gmp_nrz_bin
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)