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);
975 *a=
nrnDiv((number)z,(number)n,r);
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);
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 char * nrnCoeffName_buff
static const char * nlCPEatLongC(char *s, mpz_ptr i)
static number nrnInit(long i, const coeffs r)
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 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)
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)