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);
241 *result = (number) erg;
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);
380 while (!
nrnEqual((number) gcd_new,(number) gcd,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;
874 mpz_mul(nrnMapCoef, nrnMapCoef, inv);
875 mpz_mod(nrnMapCoef, nrnMapCoef, dst->modNumber);
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);
static number nrnAdd(number a, number b, const coeffs r)
const CanonicalForm int s
static number nrnMapZp(number from, const coeffs, const coeffs dst)
void mpz_mul_si(mpz_ptr r, mpz_srcptr s, long int si)
void rem(unsigned long *a, unsigned long *q, unsigned long p, int °a, int degq)
static BOOLEAN nrnDivBy(number a, number b, const coeffs r)
only used if HAVE_RINGS is defined
static FORCE_INLINE BOOLEAN nCoeff_is_Zp(const coeffs r)
void nrzWriteFd(number n, const ssiInfo *d, const coeffs)
static number nrnGetUnit(number k, const coeffs r)
static number nrnInvers(number c, const coeffs r)
static void nrnInitExp(unsigned long m, coeffs r)
number ndCopyMap(number a, const coeffs aRing, const coeffs r)
static void nrnPower(number a, int i, number *result, const coeffs r)
void nrnWrite(number a, const coeffs)
static const char * nlCPEatLongC(char *s, mpz_ptr i)
static char * nrnCoeffName_buff
static number nrnMod(number a, number b, const coeffs r)
#define omFreeSize(addr, size)
static BOOLEAN nrnEqual(number a, number b, const coeffs)
static number nrnGcd(number a, number b, const coeffs r)
char * nEati(char *s, int *i, int m)
divide by the first (leading) number and return it, i.e. make monic
static BOOLEAN nrnIsOne(number a, const coeffs)
static number nrnXExtGcd(number a, number b, number *s, number *t, number *u, number *v, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_2toM(const coeffs r)
(), see rinteger.h, new impl.
static number nrnConvFactoryNSingN(const CanonicalForm n, const coeffs r)
static BOOLEAN nrnIsZero(number a, const coeffs)
coeffs nrnInitCfByName(char *s, n_coeffType n)
static const char * nrnRead(const char *s, number *a, const coeffs r)
static mpz_ptr nrnMapCoef
static number nrnMap2toM(number from, const coeffs, const coeffs dst)
static CanonicalForm nrnConvSingNFactoryN(number n, BOOLEAN setChar, const coeffs r)
void WerrorS(const char *s)
static number nrnQuotRem(number a, number b, number *rem, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Z(const coeffs r)
static number nrnSub(number a, number b, const coeffs r)
static number nrnAnn(number k, const coeffs r)
static BOOLEAN nrnIsUnit(number a, const coeffs r)
#define FACTORY_MAX_PRIME
static number nrnMapQ(number from, const coeffs src, const coeffs dst)
static number nrnIntDiv(number a, number b, const coeffs r)
static char * nrnCoeffString(const coeffs r)
Coefficient rings, fields and other domains suitable for Singular polynomials.
only used if HAVE_RINGS is defined
BOOLEAN nrnInitChar(coeffs r, void *p)
The main handler for Singular numbers which are suitable for Singular polynomials.
void StringSetS(const char *st)
void StringAppendS(const char *st)
const ExtensionInfo & info
< [in] sqrfree poly
number(* nMapFunc)(number a, const coeffs src, const coeffs dst)
maps "a", which lives in src, into dst
static number nrnLcm(number a, number b, const coeffs r)
static FORCE_INLINE void n_Write(number n, const coeffs r, const BOOLEAN bShortOut=TRUE)
BOOLEAN nrnDBTest(number a, const char *f, const int l, const coeffs r)
static number nrnDiv(number a, number b, const coeffs r)
static long nrnInt(number &n, const coeffs)
static FORCE_INLINE BOOLEAN nCoeff_is_Ring_PtoM(const coeffs r)
number nrnMapGMP(number from, const coeffs, const coeffs dst)
void PrintS(const char *s)
static number nrnMapZ(number from, const coeffs src, const coeffs dst)
(mpz_ptr), see rmodulon,h
void nlGMP(number &i, mpz_t n, const coeffs r)
static number nrnExtGcd(number a, number b, number *s, number *t, const coeffs r)
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
static BOOLEAN nrnGreater(number a, number b, const coeffs)
const Variable & v
< [in] a sqrfree bivariate poly
static BOOLEAN nrnIsMOne(number a, const coeffs r)
static void nrnKillChar(coeffs r)
static number nrnMapModN(number from, const coeffs, const coeffs dst)
static void nrnSetExp(unsigned long m, coeffs r)
number nrzReadFd(const ssiInfo *d, const coeffs)
static BOOLEAN nrnCoeffIsEqual(const coeffs r, n_coeffType n, void *parameter)
static BOOLEAN nrnGreaterZero(number k, const coeffs cf)
static coeffs nrnQuot1(number c, const coeffs r)
static char * nrnCoeffName(const coeffs r)
static number nrnCopy(number a, const coeffs)
nMapFunc nrnSetMap(const coeffs src, const coeffs dst)
static number nrnInit(long i, const coeffs r)
#define omFreeBin(addr, bin)
static void nrnCoeffWrite(const coeffs r, BOOLEAN)
char * nEatLong(char *s, mpz_ptr i)
extracts a long integer from s, returns the rest
static number nrnNeg(number c, const coeffs r)
static FORCE_INLINE BOOLEAN nCoeff_is_Zn(const coeffs r)
static number nrnMult(number a, number b, const coeffs r)
static int nrnDivComp(number a, number b, const coeffs r)
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL