38 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
40 s= mpz_get_str (
s, 10, r->modBase);
60 const char start[]=
"ZZ/bigint(";
61 const int start_len=strlen(start);
62 if (strncmp(
s,start,start_len)==0)
71 while ((*
s!=
'\0') && (*
s!=
')'))
s++;
73 if (*
s==
'\0') { mpz_clear(
z);
return NULL; }
74 if (((*
s)==
')') && (*(
s+1)==
'^'))
90 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
94 s= mpz_get_str (
s, 10, r->modBase);
109 return (
n==r->type) && (r->modExponent==
info->exp)
110 && (mpz_cmp(r->modBase,
info->base)==0);
115 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) +2;
117 b= mpz_get_str (
b, 10, r->modBase);
120 else sprintf(
s,
"ZZ/(bigint(%s)^%lu)",
b,r->modExponent);
127 mpz_clear(r->modNumber);
128 mpz_clear(r->modBase);
136 long ch = r->cfInt(c, r);
138 mpz_init_set(a, r->modNumber);
139 mpz_init_set_ui(
b, ch);
143 if(mpz_cmp_ui(
gcd, 1) == 0)
145 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
146 WerrorS(
"Unable to create qring!");
149 if(r->modExponent == 1)
153 info.exp = (
unsigned long) 1;
159 info.base = r->modBase;
162 mpz_init(baseTokNew);
163 mpz_set(baseTokNew, r->modBase);
164 while(mpz_cmp(
gcd, baseTokNew) > 0)
167 mpz_mul(baseTokNew, baseTokNew, r->modBase);
171 mpz_clear(baseTokNew);
181 mpz_init_set(erg, (mpz_ptr) a);
191 mpz_init_set_si(erg,
i);
192 mpz_mod(erg, erg, r->modNumber);
201 return mpz_get_si((mpz_ptr)
n);
204 #if SI_INTEGER_VARIANT==2 205 #define nrnDelete nrzDelete 206 #define nrnSize nrzSize 212 mpz_clear((mpz_ptr) *a);
219 mpz_ptr
p=(mpz_ptr)a;
221 if (
s==1)
s=(mpz_cmp_ui(
p,0)!=0);
232 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr)
b);
233 mpz_mod(erg, erg, r->modNumber);
241 mpz_powm_ui(erg, (mpz_ptr)a,
i, r->modNumber);
249 mpz_add(erg, (mpz_ptr)a, (mpz_ptr)
b);
250 mpz_mod(erg, erg, r->modNumber);
258 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr)
b);
259 mpz_mod(erg, erg, r->modNumber);
265 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
272 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
280 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
292 mpz_init_set(erg, r->modNumber);
293 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
294 mpz_gcd(erg, erg, (mpz_ptr)
b);
295 if(mpz_cmp(erg,r->modNumber)==0)
312 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
349 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)
b);
350 mpz_mod(bs, bs, r->modNumber);
351 mpz_mod(bt, bt, r->modNumber);
359 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
364 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
369 if (mpz_divisible_p(r->modNumber, (mpz_ptr)
k))
return nrnInit(1,r);
372 mpz_tdiv_q(unit, (mpz_ptr)
k, unit);
378 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
380 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd(
NULL, (number) tmp, r);
388 mpz_mul(tmp, tmp, unit);
389 mpz_mod(tmp, tmp, r->modNumber);
391 mpz_gcd(gcd_new, tmp, r->modNumber);
394 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
395 mpz_add(unit, unit, tmp);
396 mpz_mod(unit, unit, r->modNumber);
422 nrnWrite(xx = (number)r->modNumber, r);
434 mpz_init_set(bs, (mpz_ptr) a);
435 mpz_init_set(bt, (mpz_ptr)
b);
438 mpz_gcd(erg, bs, bt);
445 mpz_gcd(erg, erg, r->modNumber);
447 mpz_div(bs, bs, erg);
448 mpz_div(bt, bt, erg);
455 mpz_gcdext(one, bu, bv, bs, bt);
473 mpz_init_set(uu, (mpz_ptr)ui);
492 mpz_mod(bs, bs, r->modNumber);
493 mpz_mod(bt, bt, r->modNumber);
494 mpz_mod(bu, bu, r->modNumber);
495 mpz_mod(bv, bv, r->modNumber);
507 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
509 bool erg = (0 == mpz_cmp(t, r->modNumber));
516 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
523 if (mpz_cmp_ui(
cf->modBase,2)==0)
527 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
528 mpz_sub_ui(ch2,ch2,1);
529 mpz_divexact_ui(ch2,ch2,2);
530 if (mpz_cmp(ch2,(mpz_ptr)
k)<0)
539 number tmp =
nrnGcd(a, (number)r->modNumber, r);
549 mpz_gcd(tmp, (mpz_ptr)
k, r->modNumber);
550 if (mpz_cmp_si(tmp, 1)==0)
555 mpz_divexact(tmp, r->modNumber, tmp);
563 mpz_tdiv_q((mpz_ptr)
n, (mpz_ptr)
b, (mpz_ptr)
n);
572 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr)
b))
return -1;
573 if (mpz_divisible_p((mpz_ptr)
b, (mpz_ptr) a))
return 1;
588 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)
b))
590 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)
b);
596 mpz_divexact(erg, (mpz_ptr)
b,
gcd);
599 WerrorS(
"Division not possible, even by cancelling zero divisors.");
605 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
606 mpz_divexact(erg, (mpz_ptr)a,
gcd);
607 mpz_mul(erg, erg, tmp);
610 mpz_mod(erg, erg, r->modNumber);
639 mpz_init_set_ui(rr, 0);
640 mpz_gcd(
g, (mpz_ptr)r->modNumber, (mpz_ptr)
b);
641 if (mpz_cmp_si(
g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a,
g);
651 mpz_tdiv_q(erg, (mpz_ptr)a, (mpz_ptr)
b);
678 mpz_init_set(aa, (mpz_ptr)a);
679 mpz_init_set(bb, (mpz_ptr)
b);
681 mpz_gcd(
g, bb, r->modNumber);
687 mpz_div(
g, r->modNumber,
g);
688 mpz_invert(
g, bb,
g);
717 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
718 mpz_mod(erg, erg, dst->modNumber);
728 mpz_mod(erg, erg, dst->modNumber);
736 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
744 nlGMP(from, erg, src);
745 mpz_mod(erg, erg, dst->modNumber);
749 #if SI_INTEGER_VARIANT==3 753 if (n_Z_IS_SMALL(from))
756 mpz_init_set(erg, (mpz_ptr) from);
757 mpz_mod(erg, erg, dst->modNumber);
760 #elif SI_INTEGER_VARIANT==2 771 #elif SI_INTEGER_VARIANT==1 786 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
790 mpz_t ch2; mpz_init_set(ch2,
cf->modBase);
791 mpz_sub_ui(ch2,ch2,1);
792 mpz_divexact_ui(ch2,ch2,2);
793 if ((mpz_cmp_ui(
cf->modBase,2)!=0) && (mpz_cmp(ch2,(mpz_ptr)a)<0))
795 mpz_sub(ch2,(mpz_ptr)a,
cf->modBase);
796 z=mpz_get_str(
s,10,ch2);
801 z=mpz_get_str(
s,10,(mpz_ptr) a);
808 z=mpz_get_str(
s,10,(mpz_ptr) a);
835 && (mpz_cmp(src->modBase, dst->modBase) == 0)
836 && (src->modExponent == dst->modExponent))
return ndCopyMap;
843 mpz_init_set_si(nrnMapModul, src->ch);
847 mpz_init(nrnMapModul);
848 mpz_set(nrnMapModul, src->modNumber);
857 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
862 if (mpz_divisible_p(dst->modNumber,nrnMapModul))
864 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
865 mpz_ptr tmp = dst->modNumber;
866 dst->modNumber = nrnMapModul;
869 dst->modNumber = tmp;
874 dst->modNumber = tmp;
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);
1003 r->modBase= (mpz_ptr)
nrnCopy((number)
info->base, r);
1011 r->ch = mpz_get_ui(r->modNumber);
1059 #if SI_INTEGER_VARIANT==2 1067 if ((r->modExponent==1)&&(
mpz_size1(r->modBase)==1))
1069 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)
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.
number nrzReadFd(const ssiInfo *d, const coeffs)
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)
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)
void nrzWriteFd(number n, const ssiInfo *d, const coeffs)
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