/*****************************************************************************/
/*									     */
/*  COMPUTE NATURAL LOGARITHM OF 2					     */
/*  10/04/10 (dkc)							     */
/*									     */
/*****************************************************************************/
#include <stdio.h>
#include <math.h>
unsigned int carry(unsigned int a, unsigned int b, unsigned int sum);
unsigned int lmbd(unsigned int mode, unsigned int a);
void div256_32(unsigned int a0, unsigned int a1, unsigned int a2,
	       unsigned int a3, unsigned int a4, unsigned int a5,
	       unsigned int a6, unsigned int a7, unsigned int *quotient,
	       unsigned int d7);
void add256(unsigned int *a, unsigned int *b);
void shift256(unsigned int A[8], unsigned int B[8], unsigned int shift);
int main ()
{
unsigned int i,temp;
unsigned int A[8],B[8],C[8],O[8],T[8];
FILE *Outfp;
Outfp = fopen("output.dat","w");
for (i=0; i<8; i++) {
   A[i]=0;
   C[i]=0;
   O[i]=0;
   }
A[0]=0x20000000;
O[7]=1;
for (i=1; i<1000000; i++) {
   div256_32(A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],B,i);
   shift256(B, T, i);
   temp=T[0]|T[1]|T[2]|T[3]|T[4]|T[5]|T[6]|T[7];
   if (temp==0) {
      printf("iterations=%d \n",i);
      break;
      }
   add256(T, C);
   if (i!=1) {
      shift256(B, B, i-1);
      if ((B[7]&1)==1)
	 add256(O, C);
      }
   }
for (i=0; i<8; i++) {
   printf(" %#010x \n",C[i]);
   fprintf(Outfp," %#010x \n",C[i]);
   }
fclose(Outfp);
return(0);
}