/*  COMPUTE NATURAL LOGARITHM OF 2					     */
/*  03/09/13 (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 addn(unsigned int *a, unsigned int *b, unsigned int n);
void subn(unsigned int *c, unsigned int *d, unsigned int n);
void setn(unsigned int *a, unsigned int b, unsigned int n);
void copyn(unsigned int *a, unsigned int *b, unsigned int n);
void lshiftn(unsigned int *a, unsigned int *b, unsigned int shift, unsigned int n);
void shiftn(unsigned int *a, unsigned int *b, unsigned int shift, unsigned int n);
unsigned int orn(unsigned int *a, unsigned int n);
void div512_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 a8,
	       unsigned int a9, unsigned int a10, unsigned int a11,
	       unsigned int a12, unsigned int a13, unsigned int a14,
	       unsigned int a15, unsigned int *quotient,
	       unsigned int d7);
int main ()
{
unsigned int i,temp,n;
unsigned int A[16],B[16],C[16],O[16],T[16],U[16];
FILE *Outfp;
Outfp = fopen("output.dat","w");
n=16;
setn(A, 0, n);
setn(C, 0, n);
setn(O, 1, n);
A[0]=0x20000000;
for (i=1; i<1000000; i++) {
   div512_32(A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7],A[8],A[9],A[10],A[11],A[12],
	     A[13],A[14],A[15],B,i);
   shiftn(B, T, i, n);
   temp=orn(T, n);
   if (temp==0) {
      printf("iterations=%d \n",i);
      break;
      }
   addn(T, C, n);
   if (i!=1) {
      shiftn(B, T, i-1, n);
      if ((T[n-1]&1)==1)
	 addn(O, C, n);
      }
   }
for (i=0; i<n; i++) {
   printf(" %#010x \n",C[i]);
   fprintf(Outfp," %#010x \n",C[i]);
   }
printf("\n");
printf("compare results to OEIS (to about four words) \n");
// log(2)=0.693147 180559 945309 417232 121458 176568 075500
setn(A,075500,n);
//
// next word
//
setn(B,176568,n);
lshiftn(B,T,19,n);
addn(T,A,n);
lshiftn(B,T,18,n);
addn(T,A,n);
lshiftn(B,T,17,n);
addn(T,A,n);
lshiftn(B,T,16,n);
addn(T,A,n);
lshiftn(B,T,14,n);
addn(T,A,n);
lshiftn(B,T,9,n);
addn(T,A,n);
lshiftn(B,T,6,n);
addn(T,A,n);
//
// next word
//
setn(C,0,n);
setn(B,121458,n);
lshiftn(B,T,19,n);
addn(T,C,n);
lshiftn(B,T,18,n);
addn(T,C,n);
lshiftn(B,T,17,n);
addn(T,C,n);
lshiftn(B,T,16,n);
addn(T,C,n);
lshiftn(B,T,14,n);
addn(T,C,n);
lshiftn(B,T,9,n);
addn(T,C,n);
lshiftn(B,T,6,n);
addn(T,C,n);
//
lshiftn(C,T,19,n);
addn(T,A,n);
lshiftn(C,T,18,n);
addn(T,A,n);
lshiftn(C,T,17,n);
addn(T,A,n);
lshiftn(C,T,16,n);
addn(T,A,n);
lshiftn(C,T,14,n);
addn(T,A,n);
lshiftn(C,T,9,n);
addn(T,A,n);
lshiftn(C,T,6,n);
addn(T,A,n);
//
// next word
//
setn(C,0,n);
setn(B,417232,n);
lshiftn(B,T,19,n);
addn(T,C,n);
lshiftn(B,T,18,n);
addn(T,C,n);
lshiftn(B,T,17,n);
addn(T,C,n);
lshiftn(B,T,16,n);
addn(T,C,n);
lshiftn(B,T,14,n);
addn(T,C,n);
lshiftn(B,T,9,n);
addn(T,C,n);
lshiftn(B,T,6,n);
addn(T,C,n);
//
setn(U,0,n);
lshiftn(C,T,19,n);
addn(T,U,n);
lshiftn(C,T,18,n);
addn(T,U,n);
lshiftn(C,T,17,n);
addn(T,U,n);
lshiftn(C,T,16,n);
addn(T,U,n);
lshiftn(C,T,14,n);
addn(T,U,n);
lshiftn(C,T,9,n);
addn(T,U,n);
lshiftn(C,T,6,n);
addn(T,U,n);
//
lshiftn(U,T,19,n);
addn(T,A,n);
lshiftn(U,T,18,n);
addn(T,A,n);
lshiftn(U,T,17,n);
addn(T,A,n);
lshiftn(U,T,16,n);
addn(T,A,n);
lshiftn(U,T,14,n);
addn(T,A,n);
lshiftn(U,T,9,n);
addn(T,A,n);
lshiftn(U,T,6,n);
addn(T,A,n);
//
// next word
//
setn(C,0,n);
setn(B,945309,n);
lshiftn(B,T,19,n);
addn(T,C,n);
lshiftn(B,T,18,n);
addn(T,C,n);
lshiftn(B,T,17,n);
addn(T,C,n);
lshiftn(B,T,16,n);
addn(T,C,n);
lshiftn(B,T,14,n);
addn(T,C,n);
lshiftn(B,T,9,n);
addn(T,C,n);
lshiftn(B,T,6,n);
addn(T,C,n);
//
setn(U,0,n);
lshiftn(C,T,19,n);
addn(T,U,n);
lshiftn(C,T,18,n);
addn(T,U,n);
lshiftn(C,T,17,n);
addn(T,U,n);
lshiftn(C,T,16,n);
addn(T,U,n);
lshiftn(C,T,14,n);
addn(T,U,n);
lshiftn(C,T,9,n);
addn(T,U,n);
lshiftn(C,T,6,n);
addn(T,U,n);
//
setn(C,0,n);
lshiftn(U,T,19,n);
addn(T,C,n);
lshiftn(U,T,18,n);
addn(T,C,n);
lshiftn(U,T,17,n);
addn(T,C,n);
lshiftn(U,T,16,n);
addn(T,C,n);
lshiftn(U,T,14,n);
addn(T,C,n);
lshiftn(U,T,9,n);
addn(T,C,n);
lshiftn(U,T,6,n);
addn(T,C,n);
//
lshiftn(C,T,19,n);
addn(T,A,n);
lshiftn(C,T,18,n);
addn(T,A,n);
lshiftn(C,T,17,n);
addn(T,A,n);
lshiftn(C,T,16,n);
addn(T,A,n);
lshiftn(C,T,14,n);
addn(T,A,n);
lshiftn(C,T,9,n);
addn(T,A,n);
lshiftn(C,T,6,n);
addn(T,A,n);
//
// next word
//
setn(C,0,n);
setn(B,180559,n);
lshiftn(B,T,19,n);
addn(T,C,n);
lshiftn(B,T,18,n);
addn(T,C,n);
lshiftn(B,T,17,n);
addn(T,C,n);
lshiftn(B,T,16,n);
addn(T,C,n);
lshiftn(B,T,14,n);
addn(T,C,n);
lshiftn(B,T,9,n);
addn(T,C,n);
lshiftn(B,T,6,n);
addn(T,C,n);
//
setn(U,0,n);
lshiftn(C,T,19,n);
addn(T,U,n);
lshiftn(C,T,18,n);
addn(T,U,n);
lshiftn(C,T,17,n);
addn(T,U,n);
lshiftn(C,T,16,n);
addn(T,U,n);
lshiftn(C,T,14,n);
addn(T,U,n);
lshiftn(C,T,9,n);
addn(T,U,n);
lshiftn(C,T,6,n);
addn(T,U,n);
//
setn(C,0,n);
lshiftn(U,T,19,n);
addn(T,C,n);
lshiftn(U,T,18,n);
addn(T,C,n);
lshiftn(U,T,17,n);
addn(T,C,n);
lshiftn(U,T,16,n);
addn(T,C,n);
lshiftn(U,T,14,n);
addn(T,C,n);
lshiftn(U,T,9,n);
addn(T,C,n);
lshiftn(U,T,6,n);
addn(T,C,n);
//
setn(U,0,n);
lshiftn(C,T,19,n);
addn(T,U,n);
lshiftn(C,T,18,n);
addn(T,U,n);
lshiftn(C,T,17,n);
addn(T,U,n);
lshiftn(C,T,16,n);
addn(T,U,n);
lshiftn(C,T,14,n);
addn(T,U,n);
lshiftn(C,T,9,n);
addn(T,U,n);
lshiftn(C,T,6,n);
addn(T,U,n);
//
lshiftn(U,T,19,n);
addn(T,A,n);
lshiftn(U,T,18,n);
addn(T,A,n);
lshiftn(U,T,17,n);
addn(T,A,n);
lshiftn(U,T,16,n);
addn(T,A,n);
lshiftn(U,T,14,n);
addn(T,A,n);
lshiftn(U,T,9,n);
addn(T,A,n);
lshiftn(U,T,6,n);
addn(T,A,n);
//
// next word
//
setn(C,0,n);
setn(B,693147,n);
lshiftn(B,T,19,n);
addn(T,C,n);
lshiftn(B,T,18,n);
addn(T,C,n);
lshiftn(B,T,17,n);
addn(T,C,n);
lshiftn(B,T,16,n);
addn(T,C,n);
lshiftn(B,T,14,n);
addn(T,C,n);
lshiftn(B,T,9,n);
addn(T,C,n);
lshiftn(B,T,6,n);
addn(T,C,n);
//
setn(U,0,n);
lshiftn(C,T,19,n);
addn(T,U,n);
lshiftn(C,T,18,n);
addn(T,U,n);
lshiftn(C,T,17,n);
addn(T,U,n);
lshiftn(C,T,16,n);
addn(T,U,n);
lshiftn(C,T,14,n);
addn(T,U,n);
lshiftn(C,T,9,n);
addn(T,U,n);
lshiftn(C,T,6,n);
addn(T,U,n);
//
setn(C,0,n);
lshiftn(U,T,19,n);
addn(T,C,n);
lshiftn(U,T,18,n);
addn(T,C,n);
lshiftn(U,T,17,n);
addn(T,C,n);
lshiftn(U,T,16,n);
addn(T,C,n);
lshiftn(U,T,14,n);
addn(T,C,n);
lshiftn(U,T,9,n);
addn(T,C,n);
lshiftn(U,T,6,n);
addn(T,C,n);
//
setn(U,0,n);
lshiftn(C,T,19,n);
addn(T,U,n);
lshiftn(C,T,18,n);
addn(T,U,n);
lshiftn(C,T,17,n);
addn(T,U,n);
lshiftn(C,T,16,n);
addn(T,U,n);
lshiftn(C,T,14,n);
addn(T,U,n);
lshiftn(C,T,9,n);
addn(T,U,n);
lshiftn(C,T,6,n);
addn(T,U,n);
//
setn(C,0,n);
lshiftn(U,T,19,n);
addn(T,C,n);
lshiftn(U,T,18,n);
addn(T,C,n);
lshiftn(U,T,17,n);
addn(T,C,n);
lshiftn(U,T,16,n);
addn(T,C,n);
lshiftn(U,T,14,n);
addn(T,C,n);
lshiftn(U,T,9,n);
addn(T,C,n);
lshiftn(U,T,6,n);
addn(T,C,n);
//
lshiftn(C,T,19,n);
addn(T,A,n);
lshiftn(C,T,18,n);
addn(T,A,n);
lshiftn(C,T,17,n);
addn(T,A,n);
lshiftn(C,T,16,n);
addn(T,A,n);
lshiftn(C,T,14,n);
addn(T,A,n);
lshiftn(C,T,9,n);
addn(T,A,n);
lshiftn(C,T,6,n);
addn(T,A,n);
//
lshiftn(A,C,25+320,n);
for (i=0; i<7; i++) {
   div512_32(C[0],C[1],C[2],C[3],C[4],C[5],C[6],C[7],C[8],C[9],C[10],C[11],C[12],
	     C[13],C[14],C[15],A,1000000);
   copyn(A,C,n);
   }
lshiftn(C,A,164,n);
for (i=0; i<n; i++)
   printf(" %#010x \n",A[i]);
fclose(Outfp);
return(0);
}