/*****************************************************************************/
/* */
/* COUNT PAIRS OF CONSECUTIVE ROOTS OF x**((p-1)/n)=y(mod p), y**n=1(mod p) */
/* 06/01/07 (dkc) */
/* */
/*****************************************************************************/
#include <stdio.h>
#include <math.h>
#include "input.h" // primes and primitive roots
int main () {
unsigned int n=2; // n value
unsigned int maxprime=5000; // maximum allowable prime (less than 100000)
unsigned int j[100000],i[32];
unsigned int h,k,k1,l,l1,l2;
FILE *Outfp;
Outfp = fopen("output.dat","w");
for (h=0; h<insize; h++) {
k=input[2*h]; // load prime
if (k>maxprime) // reduce execution time
break;
j[0]=input[2*h+1]; // load primitive root
k1=k-1;
if (k1!=(k1/n)*n) // continue if n does not divide prime minus 1
continue;
for (l=0; l<n; l++) // clear count array
i[l]=0;
for (l=1; l<k1; l++) // compute powers of primitive root
j[l]=j[0]*j[l-1]-((j[0]*j[l-1])/k)*k;
if (j[k1-1]!=1) // return if last power is not equal to 1
printf(" error \n");
for (l=0; l<n; l++) { // compute roots of x**((p-1)/n)=y(mod p)
for (l1=l; l1<k1; l1+=n) {
for (l2=l; l2<k1; l2+=n) {
if ((j[l1]-j[l2])==1)
i[l]=i[l]+1;
}
}
}
fprintf(Outfp," p=%d",k); // prime
printf(" p=%d",k);
for (l=0; l<n; l++) { // numbers of pairs of consecutive roots
fprintf(Outfp," %d",i[l]);
printf(" %d",i[l]);
}
fprintf(Outfp,"\n");
printf("\n");
}
fclose(Outfp);
return(0);
}