/*****************************************************************************/ /* */ /* COUNT PAIRS OF CONSECUTIVE ROOTS OF THE CONGRUENCE X**((P-1)/N)=Y(MOD P) */ /* 02/02/07 (dkc) */ /* */ /*****************************************************************************/ #include <math.h> unsigned int r[]; unsigned int croots(unsigned int *input, unsigned int index, unsigned int n, unsigned int *output) { unsigned int p,p1,i,j,k; p=input[2*index]; // load prime r[0]=input[2*index+1]; // load primitive root p1=p-1; if (p1!=(p1/n)*n) // check if n divides p-1 return(0); for (i=0; i<n; i++) // clear output array output[i]=0; for (i=1; i<p1; i++) // compute powers of primitive root r[i]=r[0]*r[i-1]-((r[0]*r[i-1])/p)*p; if (r[p1-1]!=1) // return if last power is not equal to 1 return(2); for (i=0; i<n; i++) { // compute roots of x**((p-1)/n)=y(mod p) for (j=i; j<p1; j+=n) { for (k=i; k<p1; k+=n) { if ((r[j]-r[k])==1) // count consecutive roots output[i]=output[i]+1; } } } return(1); }