home *** CD-ROM | disk | FTP | other *** search
- #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);
- }
-