/******************************************************************************/
/* */
/* 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>
#include <stdio.h>
void shiftn(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 subn(unsigned int *a, unsigned int *b, unsigned int n);
//
unsigned int error[6]; // error array
unsigned int P[8192],Q[8192],O[8192],T[8192];
unsigned int sv[65536]; // parity vector
unsigned int ln[13000]; // l and n values
int main () {
unsigned int i,count,p,n,index;
FILE *Outfp;
Outfp = fopen("out14uf.dat","w");
p=2048;
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<13000; 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<30000; i++) {
sv[count]=1;
count=count+1;
if (count>65535) {
error[2]=2;
goto zskip;
}
n=n+1;
copyn(P, Q, p);
addn(Q, Q, p);
addn(P, Q, p);
shiftn(Q, P, 1, p);
if (P[p-1]!=0) { // check for overflow of P array
error[2]=3;
goto zskip;
}
copyn(P, T, p);
subn(O, T, p);
if ((T[0]&0x80000000)!=0) {
sv[count]=0;
count=count+1;
if (count>65535) {
error[2]=2;
goto zskip;
}
copyn(P, Q, p);
shiftn(Q, P, 1, p); // P=0.5*P
ln[index]=(count<<16)|n;
index=index+1;
if (index>12999) {
error[2]=4;
goto zskip;
}
}
}
zskip:
error[5]=count;
for (i=0; i<6; i++)
printf("%d \n",error[i]);
if ((error[2]==0)||(error[2]==4)) {
for (i=0; i<index; i++)
fprintf(Outfp,"%#010x, \n",ln[i]);
}
fclose(Outfp);
return(0);
}