26 #if SI_INTEGER_VARIANT==2
28 # define nrnWrite nrzWrite
40 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
42 s= mpz_get_str (
s, 10, r->modBase);
54 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) + 2;
57 s= mpz_get_str (
s, 10, r->modBase);
70 return (
n==
n_Zn) && (mpz_cmp_ui(r->modNumber,(
long)parameter)==0);
75 size_t l = (size_t)mpz_sizeinbase(r->modBase, 10) +2;
77 b= mpz_get_str (
b, 10, r->modBase);
80 else sprintf(
s,
"ZZ/(bigint(%s)^%lu)",
b,r->modExponent);
87 mpz_clear(r->modNumber);
88 mpz_clear(r->modBase);
96 long ch = r->cfInt(c, r);
98 mpz_init_set(a, r->modNumber);
99 mpz_init_set_ui(
b, ch);
103 if(mpz_cmp_ui(
gcd, 1) == 0)
105 WerrorS(
"constant in q-ideal is coprime to modulus in ground ring");
106 WerrorS(
"Unable to create qring!");
109 if(r->modExponent == 1)
113 info.exp = (
unsigned long) 1;
119 info.base = r->modBase;
122 mpz_init(baseTokNew);
123 mpz_set(baseTokNew, r->modBase);
124 while(mpz_cmp(
gcd, baseTokNew) > 0)
127 mpz_mul(baseTokNew, baseTokNew, r->modBase);
131 mpz_clear(baseTokNew);
141 mpz_init_set(erg, (mpz_ptr) a);
151 mpz_init_set_si(erg,
i);
152 mpz_mod(erg, erg, r->modNumber);
158 if (*a ==
NULL)
return;
159 mpz_clear((mpz_ptr) *a);
166 if (a ==
NULL)
return 0;
167 return sizeof(mpz_t);
175 return mpz_get_si((mpz_ptr)
n);
185 mpz_mul(erg, (mpz_ptr)a, (mpz_ptr)
b);
186 mpz_mod(erg, erg, r->modNumber);
194 mpz_powm_ui(erg, (mpz_ptr)a,
i, r->modNumber);
202 mpz_add(erg, (mpz_ptr)a, (mpz_ptr)
b);
203 mpz_mod(erg, erg, r->modNumber);
211 mpz_sub(erg, (mpz_ptr)a, (mpz_ptr)
b);
212 mpz_mod(erg, erg, r->modNumber);
221 return 0 == mpz_cmpabs_ui((mpz_ptr)a, 0);
228 mpz_sub((mpz_ptr)c, r->modNumber, (mpz_ptr)c);
236 mpz_invert(erg, (mpz_ptr)c, r->modNumber);
248 mpz_init_set(erg, r->modNumber);
249 if (a !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)a);
250 if (
b !=
NULL) mpz_gcd(erg, erg, (mpz_ptr)
b);
251 if(mpz_cmp(erg,r->modNumber)==0)
268 mpz_lcm((mpz_ptr)erg, (mpz_ptr)erg, (mpz_ptr)tmp);
305 mpz_gcdext(erg, bs, bt, (mpz_ptr)a, (mpz_ptr)
b);
306 mpz_mod(bs, bs, r->modNumber);
307 mpz_mod(bt, bt, r->modNumber);
318 return 0 == mpz_cmp_si((mpz_ptr)a, 1);
323 return 0 == mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
328 if (mpz_divisible_p(r->modNumber, (mpz_ptr)
k))
return nrnInit(1,r);
330 mpz_ptr unit = (mpz_ptr)
nrnGcd(
k, 0, r);
331 mpz_tdiv_q(unit, (mpz_ptr)
k, unit);
332 mpz_ptr
gcd = (mpz_ptr)
nrnGcd((number)unit, 0, r);
337 mpz_ptr tmp = (mpz_ptr)
nrnMult((number) unit,(number) unit,r);
339 mpz_ptr gcd_new = (mpz_ptr)
nrnGcd((number) tmp, 0, r);
347 mpz_mul(tmp, tmp, unit);
348 mpz_mod(tmp, tmp, r->modNumber);
350 mpz_gcd(gcd_new, tmp, r->modNumber);
353 mpz_tdiv_q(tmp, r->modNumber, gcd_new);
354 mpz_add(unit, unit, tmp);
355 mpz_mod(unit, unit, r->modNumber);
381 nrnWrite(xx = (number)r->modNumber, r);
393 mpz_init_set(bs, (mpz_ptr) a);
394 mpz_init_set(bt, (mpz_ptr)
b);
397 mpz_gcd(erg, bs, bt);
404 mpz_gcd(erg, erg, r->modNumber);
406 mpz_div(bs, bs, erg);
407 mpz_div(bt, bt, erg);
414 mpz_gcdext(one, bu, bv, bs, bt);
432 mpz_init_set(uu, (mpz_ptr)ui);
451 mpz_mod(bs, bs, r->modNumber);
452 mpz_mod(bt, bt, r->modNumber);
453 mpz_mod(bu, bu, r->modNumber);
454 mpz_mod(bv, bv, r->modNumber);
469 mpz_t t; mpz_init_set(t, (mpz_ptr)a);
471 bool erg = (0 == mpz_cmp(t, r->modNumber));
478 return 0 < mpz_cmp((mpz_ptr)a, (mpz_ptr)
b);
488 number tmp =
nrnGcd(a, (number)r->modNumber, r);
498 mpz_gcd(tmp, (mpz_ptr)
k, r->modNumber);
499 if (mpz_cmp_si(tmp, 1)==0) {
503 mpz_divexact(tmp, r->modNumber, tmp);
510 return mpz_divisible_p(r->modNumber, (mpz_ptr)
b);
514 mpz_tdiv_q((mpz_ptr)
n, (mpz_ptr)
b, (mpz_ptr)
n);
524 if (mpz_divisible_p((mpz_ptr) a, (mpz_ptr)
b))
return -1;
525 if (mpz_divisible_p((mpz_ptr)
b, (mpz_ptr) a))
return 1;
531 if (a ==
NULL) a = (number)r->modNumber;
534 if (mpz_divisible_p((mpz_ptr)a, (mpz_ptr)
b))
536 mpz_divexact(erg, (mpz_ptr)a, (mpz_ptr)
b);
542 mpz_divexact(erg, (mpz_ptr)
b,
gcd);
545 WerrorS(
"Division not possible, even by cancelling zero divisors.");
546 WerrorS(
"Result is integer division without remainder.");
547 mpz_tdiv_q(erg, (mpz_ptr) a, (mpz_ptr)
b);
552 mpz_ptr tmp = (mpz_ptr)
nrnInvers((number) erg,r);
553 mpz_divexact(erg, (mpz_ptr)a,
gcd);
554 mpz_mul(erg, erg, tmp);
557 mpz_mod(erg, erg, r->modNumber);
586 mpz_init_set_ui(rr, 0);
587 mpz_gcd(
g, (mpz_ptr)r->modNumber, (mpz_ptr)
b);
588 if (mpz_cmp_si(
g, 1L) != 0) mpz_mod(rr, (mpz_ptr)a,
g);
598 if (a ==
NULL) a = (number)r->modNumber;
599 mpz_tdiv_q(erg, (mpz_ptr)a, (mpz_ptr)
b);
626 mpz_init_set(aa, (mpz_ptr)a);
627 mpz_init_set(bb, (mpz_ptr)
b);
629 mpz_gcd(
g, bb, r->modNumber);
635 mpz_div(
g, r->modNumber,
g);
636 mpz_invert(
g, bb,
g);
665 mpz_mul_ui(erg,
nrnMapCoef, (
unsigned long)from);
666 mpz_mod(erg, erg, dst->modNumber);
676 mpz_mod(erg, erg, dst->modNumber);
684 mpz_mod(erg, (mpz_ptr)from, dst->modNumber);
692 nlGMP(from, erg, src);
693 mpz_mod(erg, erg, dst->modNumber);
697 #if SI_INTEGER_VARIANT==3
701 if (n_Z_IS_SMALL(from))
704 mpz_init_set(erg, (mpz_ptr) from);
705 mpz_mod(erg, erg, dst->modNumber);
708 #elif SI_INTEGER_VARIANT==2
719 #elif SI_INTEGER_VARIANT==1
725 #if SI_INTEGER_VARIANT!=2
735 int l=mpz_sizeinbase((mpz_ptr) a, 10) + 2;
737 z=mpz_get_str(
s,10,(mpz_ptr) a);
764 && (mpz_cmp(src->modBase, dst->modBase) == 0)
765 && (src->modExponent == dst->modExponent))
return nrnMapGMP;
772 mpz_init_set_si(nrnMapModul, src->ch);
776 mpz_init(nrnMapModul);
777 mpz_set(nrnMapModul, src->modNumber);
786 if (mpz_divisible_p(nrnMapModul, dst->modNumber))
793 mpz_divexact(
nrnMapCoef, dst->modNumber, nrnMapModul);
794 mpz_ptr tmp = dst->modNumber;
795 dst->modNumber = nrnMapModul;
798 dst->modNumber = tmp;
803 dst->modNumber = tmp;
832 if (r->modNumber !=
NULL) mpz_clear(r->modNumber);
836 mpz_init_set (r->modNumber, r->modBase);
837 mpz_pow_ui (r->modNumber, r->modNumber,
m);
855 if ( (
mpz_sgn1((mpz_ptr) a) < 0) || (mpz_cmp((mpz_ptr) a, r->modNumber) > 0) )
857 Warn(
"mod-n: out of range at %s:%d\n",
f,
l);
869 const char * start=
s;
870 if (!(*
s >=
'0' && *
s <=
'9'))
872 mpz_init_set_ui(
i, 1);
876 while (*
s >=
'0' && *
s <=
'9')
s++;
879 mpz_set_str(
i,start,10);
885 mpz_set_str(
i,start,10);
897 mpz_mod(
z,
z, r->modNumber);
907 r->modBase= (mpz_ptr)
nrnCopy((number)
info->base, r);
915 r->ch = mpz_get_ui(r->modNumber);