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);
88 return (n==r->type) && (r->modExponent==
info->exp)
89 && (mpz_cmp(r->modBase,
info->base)==0);
94 mpz_clear(r->modNumber);
95 mpz_clear(r->modBase);
103 long ch = r->cfInt(c, r);
105 mpz_init_set(a, r->modNumber);
106 mpz_init_set_ui(
b, ch);
110 if(mpz_cmp_ui(
gcd, 1) == 0)
112 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
113 WerrorS(
"Unable to create qring!");
116 if(r->modExponent == 1)
120 info.exp = (
unsigned long) 1;
126 info.base = r->modBase;
129 mpz_init(baseTokNew);
130 mpz_set(baseTokNew, r->modBase);
131 while(mpz_cmp(
gcd, baseTokNew) > 0)
134 mpz_mul(baseTokNew, baseTokNew, r->modBase);
138 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);
282 mpz_init_set(erg, r->modNumber);
283 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
284 mpz_gcd(erg, erg, (mpz_ptr)
b);
285 if(mpz_cmp(erg,r->modNumber)==0)
302 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
339 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)
b);
340 mpz_mod(bs, bs, r->modNumber);
341 mpz_mod(bt, bt, r->modNumber);
349 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
354 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
359 if (mpz_divisible_p(r->modNumber, (mpz_ptr)
k))
return nrnInit(1,r);
362 mpz_tdiv_q(unit, (mpz_ptr)
k, unit);
368 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
370 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd(
NULL, (number) tmp, r);
378 mpz_mul(tmp, tmp, unit);
379 mpz_mod(tmp, tmp, r->modNumber);
381 mpz_gcd(gcd_new, tmp, r->modNumber);
384 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
385 mpz_add(unit, unit, tmp);
386 mpz_mod(unit, unit, r->modNumber);
412 nrnWrite(xx = (number)r->modNumber, r);
424 mpz_init_set(bs, (mpz_ptr) a);
425 mpz_init_set(bt, (mpz_ptr)
b);
428 mpz_gcd(erg, bs, bt);
435 mpz_gcd(erg, erg, r->modNumber);
437 mpz_div(bs, bs, erg);
438 mpz_div(bt, bt, erg);
445 mpz_gcdext(one, bu, bv, bs, bt);
463 mpz_init_set(uu, (mpz_ptr)ui);
482 mpz_mod(bs, bs, r->modNumber);
483 mpz_mod(bt, bt, r->modNumber);
484 mpz_mod(bu, bu, r->modNumber);
485 mpz_mod(bv, bv, r->modNumber);
497 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
499 bool erg = (0 == mpz_cmp(t, r->modNumber));
506 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
513 if (mpz_cmp_ui(
cf->modBase,2)==0)
518 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
519 mpz_sub_ui(ch2,ch2,1);
520 mpz_divexact_ui(ch2,ch2,2);
521 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
532 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
533 mpz_tdiv_q_ui(ch2,ch2,2);
534 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
547 number tmp =
nrnGcd(a, (number)r->modNumber, r);
557 mpz_gcd(tmp, (mpz_ptr)
k, r->modNumber);
558 if (mpz_cmp_si(tmp, 1)==0)
563 mpz_divexact(tmp, r->modNumber, tmp);
575 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)
b, (mpz_ptr)n);
584 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr)
b))
return -1;
585 if (mpz_divisible_p((mpz_ptr)
b, (mpz_ptr) a))
return 1;
596 else if (r->is_field)
605 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)
b))
607 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)
b);
613 mpz_divexact(erg, (mpz_ptr)
b,
gcd);
616 WerrorS(
"Division not possible, even by cancelling zero divisors.");
622 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
623 mpz_divexact(erg, (mpz_ptr)a,
gcd);
624 mpz_mul(erg, erg, tmp);
627 mpz_mod(erg, erg, r->modNumber);
656 mpz_init_set_ui(rr, 0);
657 mpz_gcd(
g, (mpz_ptr)r->modNumber, (mpz_ptr)
b);
658 if (mpz_cmp_si(
g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a,
g);
687 mpz_init_set(aa, (mpz_ptr)a);
688 mpz_init_set(bb, (mpz_ptr)
b);
690 mpz_gcd(
g, bb, r->modNumber);
696 mpz_div(
g, r->modNumber,
g);
697 mpz_invert(
g, bb,
g);
726 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
727 mpz_mod(erg, erg, dst->modNumber);
737 mpz_mod(erg, erg, dst->modNumber);
745 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
752 nlMPZ(erg, from, src);
753 mpz_mod(erg, erg, dst->modNumber);
757#if SI_INTEGER_VARIANT==3
761 if (n_Z_IS_SMALL(from))
764 mpz_init_set(erg, (mpz_ptr) from);
765 mpz_mod(erg, erg, dst->modNumber);
768#elif SI_INTEGER_VARIANT==2
779#elif SI_INTEGER_VARIANT==1
794 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
796 z=mpz_get_str(
s,10,(mpz_ptr) a);
822 && (mpz_cmp(src->modBase, dst->modBase) == 0)
823 && (src->modExponent == dst->modExponent))
return ndCopyMap;
830 mpz_init_set_si(nrnMapModul, src->ch);
834 mpz_init(nrnMapModul);
835 mpz_set(nrnMapModul, src->modNumber);
844 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
849 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
851 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
852 mpz_ptr tmp = dst->modNumber;
853 dst->modNumber = nrnMapModul;
856 dst->modNumber = tmp;
861 dst->modNumber = tmp;
887 mpz_mod(erg, erg, r->modNumber);
893 mpz_init_set(
m, (mpz_ptr)n);
903 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
907 mpz_init_set (r->modNumber, r->modBase);
908 mpz_pow_ui (r->modNumber, r->modNumber,
m);
925 if ( (
mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
927 Warn(
"mod-n: out of range at %s:%d\n",
f,
l);
939 const char * start=
s;
940 if (!(*
s >=
'0' && *
s <=
'9'))
942 mpz_init_set_ui(
i, 1);
946 while (*
s >=
'0' && *
s <=
'9')
s++;
949 mpz_set_str(
i,start,10);
955 mpz_set_str(
i,start,10);
967 mpz_mod(z, z, r->modNumber);
975 *a=
nrnDiv((number)z,(number)n,r);
1003 r->modBase= (mpz_ptr)
nrnCopy((number)
info->base, r);
1013 r->ch = mpz_get_ui(r->modNumber);
1017 if(r->modExponent==1)
1019 if (mpz_probab_prime_p(r->modNumber,15)>0)
1069#if SI_INTEGER_VARIANT==2
1079 if ((r->modExponent==1)&&(
mpz_size1(r->modBase)==1))
1081 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
static FORCE_INLINE BOOLEAN nCoeff_is_Zp_long(const coeffs r)
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)
get numerator as mpz_t
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_S(number n, const coeffs)
number nrzReadFd_S(char **s, 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)