/*****************************************************************************/
/* */
/* REGENERATE LOOPS */
/* 12/28/08 (dkc) */
/* */
/* This C program regenerates a loop in the 3n+c sequence given an entry */
/* point. */
/* */
/*****************************************************************************/
#include <stdio.h>
#include <math.h>
int main () {
int c=163;
int s=88; // entry point, must be even
unsigned int size=10; // minimum of 9
int k,max,order,temp;
unsigned int j,n,count,first;
FILE *Outfp;
Outfp = fopen("out0b.dat","w");
//
// compute order (of loop)
//
k=s;
max=k;
if (max<0)
max=-max;
while (k==(k/2)*2)
k=k/2;
for (j=1; j<10000; j++) {
k=3*k+c;
temp=k;
if (temp<0)
temp=-temp;
if (temp>max)
max=temp;
while (k==(k/2)*2) {
if (k==s)
goto bskip;
k=k/2;
}
}
printf("error \n");
goto zskip;
bskip:
order=3;
while (order<max)
order=order*2;
printf("max=%d, order=%d \n",max,order);
//
// find odd natural number divisible by 3
//
k=s;
max=k;
if (max<0)
max=-max;
while (k!=(k/3)*3) {
if (k==(k/2)*2) {
if ((k-c)==((k-c)/3)*3)
k=(k-c)/3;
else {
k=k*2;
temp=k;
if (temp<0)
temp=-temp;
if (temp>max)
max=temp;
}
}
else {
k=k*2;
temp=k;
if (temp<0)
temp=-temp;
if (temp>max)
max=temp;
}
}
printf("odd divisible by three=%d \n",k);
//
// include even natural numbers to the left of the odd natural number divisible
// by 3
//
temp=k;
if (temp<0)
temp=-temp;
while (temp<(order/2)) {
temp=temp*2;
k=k*2;
}
//
n=1;
count=1;
fprintf(Outfp," %d",k);
first=1;
while (k==(k/2)*2) {
k=k/2;
fprintf(Outfp," %d",k);
n=n+1;
count=count+1;
if (n>size) {
fprintf(Outfp,"\n");
n=0;
}
}
for (j=1; j<10000; j++) {
k=3*k+c;
fprintf(Outfp," %d",k);
n=n+1;
count=count+1;
if (n>size) {
fprintf(Outfp,"\n");
n=0;
}
while (k==(k/2)*2) {
if (k==s) {
if (first==1)
first=0;
else
goto askip;
}
k=k/2;
fprintf(Outfp," %d",k);
n=n+1;
count=count+1;
if (n>size) {
fprintf(Outfp,"\n");
n=0;
}
}
}
fprintf(Outfp,"error \n");
askip:
fprintf(Outfp,"\n");
fprintf(Outfp,"order=%d, count=%d \n",order,count-1);
printf("count=%d \n",count-1);
printf("\n");
if (max>order)
printf("warning: order=%d, maximum=%d \n",order,max);
zskip:
fclose(Outfp);
return(0);
}