59 numbits = numbits + 1;
71 for (i=1; i < numbits; i++){
114 y8 = (y8*dt[i]) % m8;
149 #define GCAND_SIZE 46
152 2, 3, 5, 6, 7, 10, 11, 12, 13, 14,
153 15, 17, 18, 19, 20, 21, 22, 23, 24, 26,
154 28, 29, 30, 31, 33, 34, 35, 37, 38, 39,
155 41, 43, 44, 46, 47, 51, 52, 53, 55, 57,
156 58, 59, 60, 62, 69, 73 };
173 for(j=0; j<t_p1; j++) {
185 plasma_error(__func__,
"failed to find a primitive root");
242 pr_p1[t].
pe = pe / t;
320 int *Nif,
int *Kif,
int *dif) {
328 factor(pr_q[i].p-1, pr_pi1[i], &(t_pi1[i]));
334 for (i=0; i<*t; i++) {
336 Nif[tmp] = pr_q[i].
p - 1;
338 for(f=1; f < pr_q[i].
e; f++)
339 Nif[tmp+f] = pr_q[i].p * Nif[tmp+f-1];
342 if( pr_q[0].p == 2 ) {
343 for(f=1; f < pr_q[0].
e; f++)
347 for(f=1; f < pr_q[0].
e; f++)
354 for(i=0; i <*t; i++) {
355 if( pr_q[i].p != 2 ) {
359 Kif[tmp+pr_q[i].
e-1] =
GKK_multorder(n, pr_q[i].p, pr_q[i].e, pr_q[i].pe, pr_pi1[i], t_pi1[i]);
362 for(f = pr_q[i].e-2; f>-1; f--) {
363 if( Kif[tmp+f+1] >= pr_q[i].p )
364 Kif[tmp+
f] = Kif[tmp+f+1] / pr_q[i].p;
366 Kif[tmp+
f] = Kif[tmp+f+1];
370 for(f=0; f<pr_q[i].e; f++)
371 dif[tmp+f] = Nif[tmp+f] / Kif[tmp+f];
374 if( dif[tmp+pr_q[i].e-1] == 1 )
376 gi[i] = n % pr_q[i].pe;
379 gi[i] =
GKK_primroot(pr_q[i].p, pr_q[i].e, pr_pi1[i], t_pi1[i]);
386 if( pr_q[0].p == 2 ) {
392 for (f=0; f<pr_q[0].
e; f++) {
394 dif[
f] =
gcd( ( (n%p1f)-1)/4, Nif[f] );
396 dif[
f] =
gcd( (p1f-(n%p1f)-1)/4, Nif[f] );
401 for (f=0; f<pr_q[0].
e; f++)
402 Kif[f] = Nif[f] / dif[f];
407 for (f=1; f<pr_q[0].
e; f++) {
414 for (f=0; f<pr_q[0].
e; f++)
415 dif[tmp+f] = Nif[tmp+f] / Kif[tmp+f];
463 int *Li,
int *diLi,
int *cl,
int *nl) {
468 for (i=0; i<t; i++) {
478 if( pr_q[0].p == 2 ) {
485 Li[t] =
gcd( tmp, lcl);
486 lcl = (lcl * tmp) / Li[t];
493 for (i=0; i<t; i++) {
501 if( pr_q[0].p == 2 ) {
512 printf(
"nl : %d\n", lnl);
513 printf(
"cl : %d\n", lcl);
516 printf(
" %d", Li[i]);
520 printf(
" %d", diLi[i]);
564 int *diLi,
int *rp,
int *Mg,
int nMg) {
565 int i, j, nMg_needed, ht;
571 nMg_needed = diLi[0];
573 nMg_needed += diLi[i];
575 if( nMg_needed > nMg ) {
576 plasma_error(__func__,
"the size of Mg is not large enough");
582 if( pr_q[i].p != 2 ) {
583 Mg[rp[i]] = q / pr_q[i].
pe;
585 for(j=1; j<diLi[i]; j++)
586 Mg[rp[i]+j] = (Mg[rp[i]+j-1]*gi[i]) % q;
588 rp[i+1] = rp[i] + diLi[i];
590 if( pr_q[0].p == 2 ) {
591 Mg[rp[0]] = q / pr_q[0].
pe;
592 for(j=1; j<diLi[0]; j++)
593 Mg[rp[0]+j] = (Mg[rp[0]+j-1]*5) % q;
597 printf(
"t : %d\n", t);
598 printf(
"ht : %d\n", ht);
601 printf(
" %d", rp[i]);
605 printf(
" %d", Mg[i]);
644 sumTi = (double)
sum(thrdnbr, Tp);
645 maxTi = (double)
maxval(thrdnbr, Tp);
650 for (i=0; i<nleaders; i+=3) {
653 if( (nel >= thrdnbr) &&
656 n1 = (nel + thrdnbr - 1) / thrdnbr;
657 Tp[j] = Tp[j] - nel *
L;
659 for (j=0; j<thrdnbr; j++)
660 Tp[j] = Tp[j] +
min(n1, nel - n1*(j-1));
662 maxTi = (double)
maxval(thrdnbr, Tp);
708 int *gi,
int *Nif,
int *Kif,
int *dif) {
711 fprintf(stdout,
"Information from the GKK algorithm\n");
712 fprintf(stdout,
"==================================\n");
713 fprintf(stdout,
"m = %4d\n", m);
714 fprintf(stdout,
"n = %4d\n", n);
715 fprintf(stdout,
"q = %4d\n", q);
716 for (i=0; i<t; i++) {
717 fprintf(stdout,
"==================================\n");
718 fprintf(stdout,
" i = %4d\n", i+1 );
719 fprintf(stdout,
" p = %4d\n", pr_q[i].p);
720 fprintf(stdout,
" e = %4d\n", pr_q[i].e);
721 fprintf(stdout,
" p^e = %4d\n", pr_q[i].pe);
723 fprintf(stdout,
" g = %4d\n", gi[i]);
725 fprintf(stdout,
"mod(n,4) = %4d\n", n%4);
727 fprintf(stdout,
"\n");
728 fprintf(stdout,
" f | ");
729 for (f=0; f<pr_q[i].
e; f++)
730 fprintf(stdout,
"%4d ", f+1);
731 fprintf(stdout,
"\n");
732 fprintf(stdout,
"----------------------------------\n");
734 fprintf(stdout,
"Ni(f) | ");
735 for (f=0; f<pr_q[i].
e; f++)
737 fprintf(stdout,
"\n");
739 fprintf(stdout,
"Ki(f) | ");
740 for (f=0; f<pr_q[i].
e; f++)
742 fprintf(stdout,
"\n");
744 fprintf(stdout,
"di(f) | ");
745 for (f=0; f<pr_q[i].
e; f++)
747 fprintf(stdout,
"\n");
748 fprintf(stdout,
"\n");
773 int q, t = 0, ndiv, ht, div;
782 Li = rp + PRIME_MAXSIZE+1;
783 si = Li + PRIME_MAXSIZE+1;
784 diLi = si + PRIME_MAXSIZE+1;
785 Kif = diLi + PRIME_MAXSIZE+1;
798 GKK_prepare(q, ne, pr_q, &t, pr_pi1, t_pi1, gi, Nif, Kif, dif);
810 pifi[i] = pr_q[i].
pe;
811 ndiv = ndiv * (pr_q[i].
e + 1);
819 for (div=0; div<ndiv-1; div++) {
820 GKK_L(t, pr_q, fi, Kif, dif, Li, diLi, &cl, &nl);
828 pifi[i] = pr_q[i].
pe;
832 pifi[i] = pifi[i] / pr_q[i].
p;
844 (*leaders) = (
int*) malloc (nlead*3*
sizeof(
int));
849 pifi[i] = pr_q[i].
pe;
854 for (div=0; div<ndiv-1; div++) {
855 GKK_L(t, pr_q, fi, Kif, dif, Li, diLi, &cl, &nl);
859 memcpy(vMg, Mg, SIZE_MG*
sizeof(
int));
863 if( pifi[i] != pr_q[i].pe ) {
864 for(j = rp[i]; j<rp[i]+diLi[i]; j++) {
865 vMg[j] = ((pr_q[i].
pe / pifi[i])*Mg[j]) % q;
869 memcpy(&(vMg[rp[i]]), &(Mg[rp[i]]), diLi[i]*
sizeof(
int));
879 for (i=0; i<t; i++) {
882 s = (s + vMg[rp[i] + si[i]]) % q;
886 (*leaders)[nlead ] = s;
887 (*leaders)[nlead+1] = cl;
896 for(i=0; i<ht; i++) {
897 if( diLi[i] == 0 )
continue;
899 if( si[i] < diLi[i] ) {
900 if( (i == (ht-1)) && (ht != t) ) {
902 for(j=0; j<diLi[0]; j++) {
903 vMg[rp[0]+j] = (q-vMg[rp[0]+j]) % q;
917 pifi[i] = pr_q[i].
pe;
921 pifi[i] = pifi[i] / pr_q[i].
p;
928 printf(
"nleaders : %d\n", *nleaders);
929 printf(
"leaders : ");
930 for(i=0; i<*nleaders; i++)
932 printf(
" %d", (*leaders)[i*3]);
933 printf(
" %d", (*leaders)[i*3+1]);
934 printf(
" %d", (*leaders)[i*3+2]);