/******************************************************************************/
/*									      */
/*  FIND PARITY VECTOR							      */
/*  11/26/10 (dkc)							      */
/*									      */
/*  This C program finds the parity vector required when twice the minimum    */
/*  element in a 3n+c cycle is larger than the maximum odd element (and the   */
/*  cycle has large elements).						      */
/*									      */
/******************************************************************************/
#include <math.h>
void mul3shft(unsigned int *c, unsigned int b, unsigned int n);
void rshiftn(unsigned int *a, unsigned int *b, unsigned int shift, unsigned int n);
void addn(unsigned int *a, unsigned int *b, unsigned int n);
void copyn(unsigned int *a, unsigned int *b, unsigned int n);
void setn(unsigned int *a, unsigned int b, unsigned int n);
void negn(unsigned int *a, unsigned int n);
//
far unsigned int error[6];	  // error array
far unsigned int P[8192],O[8192],T[8192];
far unsigned int sv[65536];	 // parity vector
far unsigned int ln[1000];	 // l and n values

int main () {
unsigned int i,count,p,n,index;
p=256;
for (i=0; i<65536; i++)
   sv[i]=0;
setn(P, 0, 8192);		// clear P array
error[0]=0;			// clear error array
error[1]=0;
error[2]=0;
error[3]=0;
error[4]=0;
error[5]=0;
for (i=0; i<1000; i++)		// clear output array
   ln[i]=0;
index=0;
n=1;
sv[0]=1;
count=1;		   // set index
setn(O, 0, p);		   // load 1
O[0]=0x20000000;
setn(P, 0, p);
P[0]=0x20000000;	   // set P
for (i=0; i<2000; i++) {
   sv[count]=1;
   count=count+1;
   n=n+1;
   mul3shft(P, 1, p);	   // P=1.5*P
   if (P[p-1]!=0) {	   // check for overflow of P array
      error[2]=3;
      goto zskip;
      }
   copyn(P, T, p);
   negn(T, p);
   addn(O, T, p);
   if ((T[0]&0x80000000)!=0) {
      sv[count]=0;
      count=count+1;
      rshiftn(P, P, 1, p); // P=0.5*P
      ln[index]=(count<<16)|n;
      index=index+1;
      if (index>999) {
	 error[2]=3;
	 goto zskip;
	 }
      }
   }
zskip:
return(0);
}