/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C C
C GENERATE FAREY SERIES C
C (compute variants of Franel's measures) C
C 04/20/14 (DKC) C
C C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
#include <stdio.h>
#include <math.h>
unsigned int haros5(unsigned int N, unsigned int M, unsigned int *R,
unsigned int H, unsigned int K, unsigned int HP,
unsigned int KP, unsigned int D);
//
unsigned int half=1; // half-order
unsigned int out=0; // |delta| or sqrt(A*delta^2)
unsigned int old=0; // old measure
unsigned int flag=0; // scaling flag (for half=1, out=0, old=0)
//
void main() {
unsigned int N,R[250000],MAXN;
unsigned int L,I,total;
double temp,temp1,sum,sum1,sum2,sum3,temp2;
double pi=3.141592654;
FILE *Outfp;
Outfp = fopen("out1b3a.dat","w");
//
// ORDER OF FAREY SERIES
//
if ((half!=0)&&(old!=0)) {
printf("parameter error \n");
goto zskip;
}
MAXN=900; // MAXN=900
for (N=2; N<=MAXN; N++) {
//
// GENERATE FAREY SERIES
//
L=haros5(N,0,R,0,1,1,N,1);
total=L-1;
if (half!=0)
total=total/2;
sum=0.0; // |delta| measure
sum1=0.0; // delta^2 measure
sum2=0.0; // check sum of cosines
sum3=0.0; // check sum of sines
for (I=1; I<=total; I++) {
temp2=(double)I/(double)total;
if (temp2>=1.0)
temp2=temp2-1.0;
temp1=temp2-(double)(R[I]>>16)/(double)(R[I]&0xffff);
// printf(" %d %d %e %e \n",R[I]>>16,R[I]&0xffff,cos(2*pi*temp2),sin(2*pi*temp2));
sum2=sum2+cos(2*pi*temp2);
sum3=sum3+sin(2*pi*temp2);
temp=temp1;
if (temp<0.0)
temp=-temp;
if ((I!=total)||(old==0)) {
sum=sum+temp;
sum1=sum1+temp1*temp1;
}
// printf(" %d %d %e %e \n",R[I]>>16,R[I]&0xffff,sum,sum1);
}
if ((old!=0)&&(1.0<=(sqrt((double)N)*sum1))) {
printf("error: N=%d, sum1=%e \n",N,sum1);
goto zskip;
}
sum1=sum1*(double)total;
sum1=sqrt(sum1);
if (out==0) {
if (flag==0)
fprintf(Outfp," %e\n",sum);
else
fprintf(Outfp," %e\n",2.0*sqrt(2.0*sum));
}
else
fprintf(Outfp," %e\n",sum1);
printf(" %d %e %e %e %e \n",total,sum,sum1,sum2,sum3);
}
zskip:
fclose(Outfp);
return;
}