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)
506 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
507 mpz_sub_ui(ch2,ch2,1);
508 mpz_divexact_ui(ch2,ch2,2);
509 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
518 number tmp =
nrnGcd(a, (number)r->modNumber, r);
528 mpz_gcd(tmp, (mpz_ptr)
k, r->modNumber);
529 if (mpz_cmp_si(tmp, 1)==0)
534 mpz_divexact(tmp, r->modNumber, tmp);
542 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)
b, (mpz_ptr)n);
551 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr)
b))
return -1;
552 if (mpz_divisible_p((mpz_ptr)
b, (mpz_ptr) a))
return 1;
563 else if (r->is_field)
572 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)
b))
574 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)
b);
580 mpz_divexact(erg, (mpz_ptr)
b,
gcd);
583 WerrorS(
"Division not possible, even by cancelling zero divisors.");
589 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
590 mpz_divexact(erg, (mpz_ptr)a,
gcd);
591 mpz_mul(erg, erg, tmp);
594 mpz_mod(erg, erg, r->modNumber);
623 mpz_init_set_ui(rr, 0);
624 mpz_gcd(
g, (mpz_ptr)r->modNumber, (mpz_ptr)
b);
625 if (mpz_cmp_si(
g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a,
g);
654 mpz_init_set(aa, (mpz_ptr)a);
655 mpz_init_set(bb, (mpz_ptr)
b);
657 mpz_gcd(
g, bb, r->modNumber);
663 mpz_div(
g, r->modNumber,
g);
664 mpz_invert(
g, bb,
g);
693 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
694 mpz_mod(erg, erg, dst->modNumber);
704 mpz_mod(erg, erg, dst->modNumber);
712 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
719 nlMPZ(erg, from, src);
720 mpz_mod(erg, erg, dst->modNumber);
724 #if SI_INTEGER_VARIANT==3
728 if (n_Z_IS_SMALL(from))
731 mpz_init_set(erg, (mpz_ptr) from);
732 mpz_mod(erg, erg, dst->modNumber);
735 #elif SI_INTEGER_VARIANT==2
746 #elif SI_INTEGER_VARIANT==1
761 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
765 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
766 mpz_sub_ui(ch2,ch2,1);
767 mpz_divexact_ui(ch2,ch2,2);
768 if ((mpz_cmp_ui(
cf->modBase,2)!=0) && (mpz_cmp(ch2,(mpz_ptr)a)<0))
770 mpz_sub(ch2,(mpz_ptr)a,
cf->modBase);
771 z=mpz_get_str(
s,10,ch2);
776 z=mpz_get_str(
s,10,(mpz_ptr) a);
783 z=mpz_get_str(
s,10,(mpz_ptr) a);
810 && (mpz_cmp(src->modBase, dst->modBase) == 0)
811 && (src->modExponent == dst->modExponent))
return ndCopyMap;
818 mpz_init_set_si(nrnMapModul, src->ch);
822 mpz_init(nrnMapModul);
823 mpz_set(nrnMapModul, src->modNumber);
832 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
837 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
839 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
840 mpz_ptr tmp = dst->modNumber;
841 dst->modNumber = nrnMapModul;
844 dst->modNumber = tmp;
849 dst->modNumber = tmp;
875 mpz_mod(erg, erg, r->modNumber);
881 mpz_init_set(
m, (mpz_ptr)n);
891 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
895 mpz_init_set (r->modNumber, r->modBase);
896 mpz_pow_ui (r->modNumber, r->modNumber,
m);
913 if ( (
mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
915 Warn(
"mod-n: out of range at %s:%d\n",
f,
l);
927 const char * start=
s;
928 if (!(*
s >=
'0' && *
s <=
'9'))
930 mpz_init_set_ui(
i, 1);
934 while (*
s >=
'0' && *
s <=
'9')
s++;
937 mpz_set_str(
i,start,10);
943 mpz_set_str(
i,start,10);
955 mpz_mod(z, z, r->modNumber);
963 *a=
nrnDiv((number)z,(number)n,r);
991 r->modBase= (mpz_ptr)
nrnCopy((number)
info->base, r);
999 r->ch = mpz_get_ui(r->modNumber);
1045 #if SI_INTEGER_VARIANT==2
1053 if ((r->modExponent==1)&&(
mpz_size1(r->modBase)==1))
1055 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 * nEatLong(char *s, mpz_ptr i)
extracts a long integer from s, returns the rest
char * nEati(char *s, int *i, int m)
divide by the first (leading) number and return it, i.e. make monic
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 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 const char * nlCPEatLongC(char *s, mpz_ptr i)
static number nrnInit(long i, const coeffs r)
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 char * nrnCoeffName(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 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 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)