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);
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);
340 static number
nrnExtGcd(number a, number
b, number *
s, number *t,
const coeffs r)
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);
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);
412 static number
nrnXExtGcd(number a, number
b, number *
s, number *t, number *u, number *
v,
const coeffs r)
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;
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);
960 static const char *
nrnRead (
const char *
s, number *a,
const coeffs r)
966 mpz_mod(
z,
z, r->modNumber);
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);