#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <proto/BigNum.h>
#include <proto/exec.h>

#include "clock.h"

unsigned long jmax=0;

#define SIZE 1000000

struct Library *BigNumBase;

void Test(int i)
{
 unsigned int j=0;
 PtrBigNum z,Un;

 z=BigNumInit();
 Un=BigNumInit();
 BigNumIntToBigNum(Un,1);
 BigNumIntToBigNum(z,i);
 while(BigNumFastCompare(z,Un))
 {
  if(BigNumIsEven(z))
   BigNumRightShift(z,1);
  else
  {
   BigNumDigitMul(z,3);
   BigNumDigitAdd(z,1);
  }
  j++;
  if(j>jmax)
  {
   jmax=j;
   printf("%d\t%d *\n",i,j);
   break;
  }
 }
 BigNumFree(2);
}

main(char argc,char **argv)
{
 unsigned int i,j,k,mm,*buf,zz;

 if(!(buf=calloc(SIZE,4)))
  exit(0);
 if(!(BigNumBase=OpenLibrary("BigNum.library",37)))
 {
  free(buf);
  exit(0);
 }
 mm=-1;
 mm/=3;
 timer(t1);
 if(argc==2)
  zz=atoi(argv[1]);
 else
  zz=100000;
 for(k=3;k<zz;k+=2)
 {
  i=0;
  j=k;
  while(j!=1)
  {
   if((j<SIZE)&&(buf[j]))
   {
    i+=buf[j];
    break;
   }
   if(j&1)
   {
    if(j>=mm)
    {
     Test(k);;
     break;
    }
    j=j+j+j+1;
   }
   else
    j>>=1;
   i++;
  }
  if(i>jmax)
  {
   printf("%u\t%u\n",k,i);
   jmax=i;
  }
  if(k<SIZE)
   buf[k]=i;
 }
 timer(t2);
 diff(t1,t2);
 CloseLibrary((struct Library *)BigNumBase);
 free(buf);
}
