37 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
39 s= mpz_get_str (
s, 10, r->modBase);
59 const char start[]=
"ZZ/bigint(";
60 const int start_len=strlen(start);
61 if (strncmp(
s,start,start_len)==0)
70 while ((*
s!=
'\0') && (*
s!=
')'))
s++;
72 if (*
s==
'\0') { mpz_clear(z);
return NULL; }
73 if (((*
s)==
')') && (*(
s+1)==
'^'))
89 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
93 s= mpz_get_str (
s, 10, r->modBase);
108 return (n==r->type) && (r->modExponent==
info->exp)
109 && (mpz_cmp(r->modBase,
info->base)==0);
114 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) +2;
116 b= mpz_get_str (
b, 10, r->modBase);
119 else sprintf(
s,
"ZZ/(bigint(%s)^%lu)",
b,r->modExponent);
126 mpz_clear(r->modNumber);
127 mpz_clear(r->modBase);
135 long ch = r->cfInt(c, r);
137 mpz_init_set(a, r->modNumber);
138 mpz_init_set_ui(
b, ch);
142 if(mpz_cmp_ui(
gcd, 1) == 0)
144 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
145 WerrorS(
"Unable to create qring!");
148 if(r->modExponent == 1)
152 info.exp = (
unsigned long) 1;
158 info.base = r->modBase;
161 mpz_init(baseTokNew);
162 mpz_set(baseTokNew, r->modBase);
163 while(mpz_cmp(
gcd, baseTokNew) > 0)
166 mpz_mul(baseTokNew, baseTokNew, r->modBase);
170 mpz_clear(baseTokNew);
180 mpz_init_set(erg, (mpz_ptr) a);
190 mpz_init_set_si(erg,
i);
191 mpz_mod(erg, erg, r->modNumber);
200 return mpz_get_si((mpz_ptr) n);
203 #if SI_INTEGER_VARIANT==2
204 #define nrnDelete nrzDelete
205 #define nrnSize nrzSize
211 mpz_clear((mpz_ptr) *a);
218 mpz_ptr
p=(mpz_ptr)a;
220 if (
s==1)
s=(mpz_cmp_ui(
p,0)!=0);
231 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr)
b);
232 mpz_mod(erg, erg, r->modNumber);
240 mpz_powm_ui(erg, (mpz_ptr)a,
i, r->modNumber);
248 mpz_add(erg, (mpz_ptr)a, (mpz_ptr)
b);
249 mpz_mod(erg, erg, r->modNumber);
257 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr)
b);
258 mpz_mod(erg, erg, r->modNumber);
264 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
271 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
279 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
291 mpz_init_set(erg, r->modNumber);
292 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
293 mpz_gcd(erg, erg, (mpz_ptr)
b);
294 if(mpz_cmp(erg,r->modNumber)==0)
311 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
348 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)
b);
349 mpz_mod(bs, bs, r->modNumber);
350 mpz_mod(bt, bt, r->modNumber);
358 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
363 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
368 if (mpz_divisible_p(r->modNumber, (mpz_ptr)
k))
return nrnInit(1,r);
371 mpz_tdiv_q(unit, (mpz_ptr)
k, unit);
377 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
379 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd(
NULL, (number) tmp, r);
387 mpz_mul(tmp, tmp, unit);
388 mpz_mod(tmp, tmp, r->modNumber);
390 mpz_gcd(gcd_new, tmp, r->modNumber);
393 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
394 mpz_add(unit, unit, tmp);
395 mpz_mod(unit, unit, r->modNumber);
421 nrnWrite(xx = (number)r->modNumber, r);
433 mpz_init_set(bs, (mpz_ptr) a);
434 mpz_init_set(bt, (mpz_ptr)
b);
437 mpz_gcd(erg, bs, bt);
444 mpz_gcd(erg, erg, r->modNumber);
446 mpz_div(bs, bs, erg);
447 mpz_div(bt, bt, erg);
454 mpz_gcdext(one, bu, bv, bs, bt);
472 mpz_init_set(uu, (mpz_ptr)ui);
491 mpz_mod(bs, bs, r->modNumber);
492 mpz_mod(bt, bt, r->modNumber);
493 mpz_mod(bu, bu, r->modNumber);
494 mpz_mod(bv, bv, r->modNumber);
506 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
508 bool erg = (0 == mpz_cmp(t, r->modNumber));
515 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
522 if (mpz_cmp_ui(
cf->modBase,2)==0)
526 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
527 mpz_sub_ui(ch2,ch2,1);
528 mpz_divexact_ui(ch2,ch2,2);
529 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
538 number tmp =
nrnGcd(a, (number)r->modNumber, r);
548 mpz_gcd(tmp, (mpz_ptr)
k, r->modNumber);
549 if (mpz_cmp_si(tmp, 1)==0)
554 mpz_divexact(tmp, r->modNumber, tmp);
562 mpz_tdiv_q((mpz_ptr)n, (mpz_ptr)
b, (mpz_ptr)n);
571 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr)
b))
return -1;
572 if (mpz_divisible_p((mpz_ptr)
b, (mpz_ptr) a))
return 1;
587 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)
b))
589 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)
b);
595 mpz_divexact(erg, (mpz_ptr)
b,
gcd);
598 WerrorS(
"Division not possible, even by cancelling zero divisors.");
604 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
605 mpz_divexact(erg, (mpz_ptr)a,
gcd);
606 mpz_mul(erg, erg, tmp);
609 mpz_mod(erg, erg, r->modNumber);
638 mpz_init_set_ui(rr, 0);
639 mpz_gcd(
g, (mpz_ptr)r->modNumber, (mpz_ptr)
b);
640 if (mpz_cmp_si(
g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a,
g);
650 mpz_tdiv_q(erg, (mpz_ptr)a, (mpz_ptr)
b);
677 mpz_init_set(aa, (mpz_ptr)a);
678 mpz_init_set(bb, (mpz_ptr)
b);
680 mpz_gcd(
g, bb, r->modNumber);
686 mpz_div(
g, r->modNumber,
g);
687 mpz_invert(
g, bb,
g);
716 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
717 mpz_mod(erg, erg, dst->modNumber);
727 mpz_mod(erg, erg, dst->modNumber);
735 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
743 nlGMP(from, erg, src);
744 mpz_mod(erg, erg, dst->modNumber);
748 #if SI_INTEGER_VARIANT==3
752 if (n_Z_IS_SMALL(from))
755 mpz_init_set(erg, (mpz_ptr) from);
756 mpz_mod(erg, erg, dst->modNumber);
759 #elif SI_INTEGER_VARIANT==2
770 #elif SI_INTEGER_VARIANT==1
785 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
789 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
790 mpz_sub_ui(ch2,ch2,1);
791 mpz_divexact_ui(ch2,ch2,2);
792 if ((mpz_cmp_ui(
cf->modBase,2)!=0) && (mpz_cmp(ch2,(mpz_ptr)a)<0))
794 mpz_sub(ch2,(mpz_ptr)a,
cf->modBase);
795 z=mpz_get_str(
s,10,ch2);
800 z=mpz_get_str(
s,10,(mpz_ptr) a);
807 z=mpz_get_str(
s,10,(mpz_ptr) a);
834 && (mpz_cmp(src->modBase, dst->modBase) == 0)
835 && (src->modExponent == dst->modExponent))
return ndCopyMap;
842 mpz_init_set_si(nrnMapModul, src->ch);
846 mpz_init(nrnMapModul);
847 mpz_set(nrnMapModul, src->modNumber);
856 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
861 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
863 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
864 mpz_ptr tmp = dst->modNumber;
865 dst->modNumber = nrnMapModul;
868 dst->modNumber = tmp;
873 dst->modNumber = tmp;
902 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
906 mpz_init_set (r->modNumber, r->modBase);
907 mpz_pow_ui (r->modNumber, r->modNumber,
m);
924 if ( (
mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
926 Warn(
"mod-n: out of range at %s:%d\n",
f,
l);
938 const char * start=
s;
939 if (!(*
s >=
'0' && *
s <=
'9'))
941 mpz_init_set_ui(
i, 1);
945 while (*
s >=
'0' && *
s <=
'9')
s++;
948 mpz_set_str(
i,start,10);
954 mpz_set_str(
i,start,10);
966 mpz_mod(z, z, r->modNumber);
974 *a=
nrnDiv((number)z,(number)n,r);
1002 r->modBase= (mpz_ptr)
nrnCopy((number)
info->base, r);
1010 r->ch = mpz_get_ui(r->modNumber);
1058 #if SI_INTEGER_VARIANT==2
1066 if ((r->modExponent==1)&&(
mpz_size1(r->modBase)==1))
1068 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)
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 nlGMP(number &i, mpz_t 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.
number ndCopyMap(number a, const coeffs aRing, const coeffs r)
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
#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 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)
static number nrnMapZ(number from, const coeffs src, const coeffs dst)
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)
static void nrnCoeffWrite(const coeffs r, BOOLEAN)
coeffs nrnInitCfByName(char *s, n_coeffType n)
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 nrnIntDiv(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 char * nrnCoeffString(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)