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);
341 static number
nrnExtGcd(number a, number
b, number *
s, number *t,
const coeffs r)
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);
413 static number
nrnXExtGcd(number a, number
b, number *
s, number *t, number *u, number *
v,
const coeffs r)
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);
961 static const char *
nrnRead (
const char *
s, number *a,
const coeffs r)
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);