﻿ count consecutive roots
```/*****************************************************************************/
/*									     */
/*  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);
}
```