/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C CHECK MULTIPLE-WORD ARITHMETIC, COMPUTE LENGTHS, FRACTIONAL PARTS C C 06/11/07 (DKC) C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/ #include <stdio.h> #include <math.h> void divn_32(unsigned int *a, unsigned int *b, unsigned int d, unsigned int n); unsigned int sqrtn(unsigned int a, unsigned int *b, unsigned int n); void addn(unsigned int *a, unsigned int *b, unsigned int n); unsigned int lagrange(unsigned int N, unsigned int *R); // unsigned int outflg=0; // 0 for average lengths, 1 for average fractional parts // void main() { unsigned int N,S[90000],MAXN; unsigned int L,I,J,o; unsigned int P[64],Q[32],T[32],U[32]; double temp,temp1,len; unsigned int m=8; // number of words FILE *Outfp; Outfp = fopen("out1a.dat","w"); // // ORDER OF FAREY SERIES // MAXN=100; /***************/ /* BEGIN LOOP */ /***************/ for (N=2; N<=MAXN; N++) { // // GENERATE FAREY SERIES // L=lagrange(N,S); len=0.0; temp=0.0; for (I=0; I<m; I++) { T[I]=0; U[I]=0; } for (I=0; I<(L-1); I++) { temp1=((double)S[2*I]-(double)S[2*I+2])*((double)S[2*I]-(double)S[2*I+2]); temp1=temp1+((double)S[2*I+1]-(double)S[2*I+3])*((double)S[2*I+1]-(double)S[2*I+3]); len=len+sqrt(temp1); o=sqrtn((unsigned int)temp1,P, m*2); if (o==0) { printf("error \n"); goto L400; } for (J=m; J<2*m; J++) Q[J-m]=P[J]; addn(Q,T,m); // // fractional part // temp1=sqrt(temp1); temp=temp+(temp1-(unsigned int)temp1); Q[0]=0; addn(Q,U,m); } len=(len+1.0)/(double)L; for (I=0; I<m; I++) Q[I]=0; Q[0]=1; addn(Q,T,m); divn_32(T,Q,L,m); temp=temp/(double)L; divn_32(U,U,L,m); temp1=(double)U[0]+(double)U[1]/65536.0/65536.0; printf("n=%d %d l=%e %e %e %e \n",N,L,len,(double)Q[0]+(double)Q[1]/65536.0/65536.0,temp,temp1); if (outflg==0) fprintf(Outfp," %e\n",(double)Q[0]+(double)Q[1]/65536.0/65536.0); else fprintf(Outfp," %e\n",temp1); } /***************/ /* END LOOP */ /***************/ L400: fclose(Outfp); return; }