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);
211 mpz_mul((mpz_ptr)a, (mpz_ptr)a, (mpz_ptr)
b);
212 mpz_mod((mpz_ptr)a, (mpz_ptr)a, r->modNumber);
219 mpz_powm_ui(erg, (mpz_ptr)a,
i, r->modNumber);
227 mpz_add(erg, (mpz_ptr)a, (mpz_ptr)
b);
228 mpz_mod(erg, erg, r->modNumber);
234 mpz_add((mpz_ptr)a, (mpz_ptr)a, (mpz_ptr)
b);
235 mpz_mod((mpz_ptr)a, (mpz_ptr)a, r->modNumber);
242 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr)
b);
243 mpz_mod(erg, erg, r->modNumber);
249 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
256 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
270 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
283 mpz_init_set(erg, r->modNumber);
284 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
285 mpz_gcd(erg, erg, (mpz_ptr)
b);
286 if(mpz_cmp(erg,r->modNumber)==0)
303 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
340 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)
b);
341 mpz_mod(bs, bs, r->modNumber);
342 mpz_mod(bt, bt, r->modNumber);
350 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
355 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
360 if (mpz_divisible_p(r->modNumber, (mpz_ptr)
k))
return nrnInit(1,r);
363 mpz_tdiv_q(unit, (mpz_ptr)
k, unit);
369 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
371 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd(
NULL, (number) tmp, r);
379 mpz_mul(tmp, tmp, unit);
380 mpz_mod(tmp, tmp, r->modNumber);
382 mpz_gcd(gcd_new, tmp, r->modNumber);
385 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
386 mpz_add(unit, unit, tmp);
387 mpz_mod(unit, unit, r->modNumber);
413 nrnWrite(xx = (number)r->modNumber, r);
425 mpz_init_set(bs, (mpz_ptr) a);
426 mpz_init_set(bt, (mpz_ptr)
b);
429 mpz_gcd(erg, bs, bt);
436 mpz_gcd(erg, erg, r->modNumber);
438 mpz_div(bs, bs, erg);
439 mpz_div(bt, bt, erg);
446 mpz_gcdext(one, bu, bv, bs, bt);
464 mpz_init_set(uu, (mpz_ptr)ui);
483 mpz_mod(bs, bs, r->modNumber);
484 mpz_mod(bt, bt, r->modNumber);
485 mpz_mod(bu, bu, r->modNumber);
486 mpz_mod(bv, bv, r->modNumber);
498 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
500 bool erg = (0 == mpz_cmp(t, r->modNumber));
507 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
514 if (mpz_cmp_ui(
cf->modBase,2)==0)
519 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
520 mpz_sub_ui(ch2,ch2,1);
521 mpz_divexact_ui(ch2,ch2,2);
522 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
533 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
534 mpz_tdiv_q_ui(ch2,ch2,2);
535 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
548 number tmp =
nrnGcd(a, (number)r->modNumber, r);
558 mpz_gcd(tmp, (mpz_ptr)
k, r->modNumber);
559 if (mpz_cmp_si(tmp, 1)==0)
564 mpz_divexact(tmp, r->modNumber, tmp);
572 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)
b, (mpz_ptr)n);
581 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr)
b))
return -1;
582 if (mpz_divisible_p((mpz_ptr)
b, (mpz_ptr) a))
return 1;
593 else if (r->is_field)
602 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)
b))
604 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)
b);
610 mpz_divexact(erg, (mpz_ptr)
b,
gcd);
613 WerrorS(
"Division not possible, even by cancelling zero divisors.");
619 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
620 mpz_divexact(erg, (mpz_ptr)a,
gcd);
621 mpz_mul(erg, erg, tmp);
624 mpz_mod(erg, erg, r->modNumber);
653 mpz_init_set_ui(rr, 0);
654 mpz_gcd(
g, (mpz_ptr)r->modNumber, (mpz_ptr)
b);
655 if (mpz_cmp_si(
g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a,
g);
684 mpz_init_set(aa, (mpz_ptr)a);
685 mpz_init_set(bb, (mpz_ptr)
b);
687 mpz_gcd(
g, bb, r->modNumber);
693 mpz_div(
g, r->modNumber,
g);
694 mpz_invert(
g, bb,
g);
723 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
724 mpz_mod(erg, erg, dst->modNumber);
734 mpz_mod(erg, erg, dst->modNumber);
742 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
749 nlMPZ(erg, from, src);
750 mpz_mod(erg, erg, dst->modNumber);
754#if SI_INTEGER_VARIANT==3
758 if (n_Z_IS_SMALL(from))
761 mpz_init_set(erg, (mpz_ptr) from);
762 mpz_mod(erg, erg, dst->modNumber);
765#elif SI_INTEGER_VARIANT==2
776#elif SI_INTEGER_VARIANT==1
791 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
793 z=mpz_get_str(
s,10,(mpz_ptr) a);
819 && (mpz_cmp(src->modBase, dst->modBase) == 0)
820 && (src->modExponent == dst->modExponent))
return ndCopyMap;
827 mpz_init_set_si(nrnMapModul, src->ch);
831 mpz_init(nrnMapModul);
832 mpz_set(nrnMapModul, src->modNumber);
841 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
846 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
848 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
849 mpz_ptr tmp = dst->modNumber;
850 dst->modNumber = nrnMapModul;
853 dst->modNumber = tmp;
858 dst->modNumber = tmp;
884 mpz_mod(erg, erg, r->modNumber);
890 mpz_init_set(
m, (mpz_ptr)n);
900 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
904 mpz_init_set (r->modNumber, r->modBase);
905 mpz_pow_ui (r->modNumber, r->modNumber,
m);
922 if ( (
mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
924 Warn(
"mod-n: out of range at %s:%d\n",
f,
l);
936 const char * start=
s;
937 if (!(*
s >=
'0' && *
s <=
'9'))
939 mpz_init_set_ui(
i, 1);
943 while (*
s >=
'0' && *
s <=
'9')
s++;
946 mpz_set_str(
i,start,10);
952 mpz_set_str(
i,start,10);
964 mpz_mod(z, z, r->modNumber);
972 *a=
nrnDiv((number)z,(number)n,r);
1000 r->modBase= (mpz_ptr)
nrnCopy((number)
info->base, r);
1008 r->ch = mpz_get_ui(r->modNumber);
1056#if SI_INTEGER_VARIANT==2
1064 if ((r->modExponent==1)&&(
mpz_size1(r->modBase)==1))
1066 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)
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)
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)
static void nrnInpAdd(number &a, number b, const coeffs r)