/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C C
C CHECK RESULTS GIVEN BY FAREY SERIES ALGORITHM C
C (compute Franel measures with full and half orders [alpha and gamma]) C
C (compute Franel measure with full order [beta]) C
C 08/11/14 (DKC) C
C C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
#include <stdio.h>
#include <math.h>
double mertens2(unsigned int N, unsigned int *count, double *sum);
double mertens3(unsigned int N, unsigned int *count, double *sum);
double merten4b(unsigned int N, unsigned int *count, double *sum,
unsigned int half);
double merten4d(unsigned int N, unsigned int *count, double *sum,
unsigned int half, unsigned int flag);
//
unsigned int outflag=1; // sum(|delta|), sqrt(A*sum(delsq^2)), sqrt(A+A*sum(delsq^2)),
// when horder=0 uses total # fractions, old measure for
// outflag=0 or 1, "beta" measure for outflag=2
unsigned int horder=0; // half-order flag, "gamma" measure
unsigned int scale=0; // scale when outflag=0 and horder=1
unsigned int scalep=0; // scale when outflag=1 and horder=0
unsigned int scaleb=0; // scale when outflag=2 and horder=0
unsigned int flag=1; // for outflag=1 and horder=0
//
void main() {
unsigned int N,count1[2],count2[3];
double sum1[4],sum2[5],suma,sumb,temp,pi;
FILE *Outfp;
Outfp = fopen("out4h.dat","w");
//
// ORDER OF FAREY SERIES
//
pi=3.141592654;
sum1[0]=0.0;
sum1[1]=0.0;
sum1[2]=0.0;
sum1[3]=0.0;
count1[0]=0;
count1[1]=0;
suma=0.0;
/***************/
/* BEGIN LOOP */
/***************/
for (N=2; N<=2500; N++) { // MAXN=5128
// suma=merten4b(N, count1, sum1, horder);
suma=0.0;
sumb=merten4d(N, count2, sum2, horder, flag);
/* if (sum1[2]!=sum2[2]) {
temp=sum1[2]-sum2[2];
if (temp<0.0)
temp=-temp;
if (temp>0.000001) {
printf("error 1: N=%d, sums=%e %e \n",N,sum1[2],sum2[2]);
if (N!=2)
break;
}
}
if (sum1[3]!=sum2[3]) {
temp=sum1[2]-sum2[2];
if (temp<0.0)
temp=-temp;
if (temp>0.000001) {
printf("error 2: N=%d, sums=%e %e \n",N,sum1[3],sum2[3]);
if (N!=2)
break;
}
} */
printf("N=%d, sums=%e %e %e %e \n",N,suma,sumb,sum2[2],sum2[3]);
if (outflag==0) {
if ((horder==1)&&(scale==1)) {
temp=2.0*sqrt(2.0*sum2[2]);
fprintf(Outfp," %e\n",temp);
}
else
fprintf(Outfp," %e\n",sum2[2]);
}
else {
if (outflag==1) {
if (scalep==0)
fprintf(Outfp," %e\n",sum2[3]);
else
fprintf(Outfp," %e\n",2*pi*sum2[3]);
if ((horder==0)&&(flag==0)) {
temp=sqrt((double)N);
temp=0.4542*temp-0.4412;
if (sum2[3]<(temp-0.50)) {
printf("error 1: N=%d, temp=%e, sum=%e \n",N,temp-0.50,sum2[3]);
break;
}
if (sum2[3]>(temp+0.50)) {
printf("error 2: N=%d, temp=%e, sum=%e \n",N,temp+0.50,sum2[3]);
// break;
}
}
}
else {
if (outflag==2) {
if (scaleb==0)
fprintf(Outfp," %e\n",sum2[4]);
else
fprintf(Outfp," %e\n",sum2[4]/sqrt(count2[2])-exp(1.0/(double)(3*N)));
}
else
fprintf(Outfp," %d\n",count2[2]);
}
}
/* if ((sum1[0]!=sum2[0])||(sum1[1]!=sum2[1])||(suma!=sumb)) {
temp=sum1[0]-sum2[0];
if (temp<0.0)
temp=-temp;
if (temp>0.000001) {
printf(" %d %e %e %e %e %e %e\n",N,suma,sumb,sum1[0],sum2[0],sum1[1],sum2[1]);
break;
}
temp=sum1[1]-sum2[1];
if (temp<0.0)
temp=-temp;
if (temp>0.000001) {
printf(" %d %e %e %e %e %e %e\n",N,suma,sumb,sum1[0],sum2[0],sum1[1],sum2[1]);
break;
}
temp=suma-sumb;
if (temp<0.0)
temp=-temp;
if (temp>0.000001) {
printf(" %d %e %e %e %e %e %e\n",N,suma,sumb,sum1[0],sum2[0],sum1[1],sum2[1]);
break;
}
}
if ((count1[0]!=count2[0])||(count1[1]!=count2[1])) {
printf(" %d %d %d %d \n",count1[0],count2[0],count1[1],count2[1]);
break;
} */
}
fclose(Outfp);
/***************/
/* END LOOP */
/***************/
return;
}