/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C C
C COMPUTE MERTENS FUNCTION (cosines only, first two quadrants) C
C 05/12/14 (DKC) C
C C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
#include <stdio.h>
#include <math.h>
unsigned int haros1(unsigned int N, unsigned int M, unsigned int *R,
unsigned int H, unsigned int K, unsigned int HP,
unsigned int KP);
//
void main() {
unsigned int N,S[250000];
unsigned int H,K,HP,KP,MAXN;
unsigned int L,I,index,count1,cnt1sav,count2,cnt2sav;
double temp1,temp2,sum,sum1,sum2,sum1sav,sum2sav;
double pi,ratio1,ratio2;
FILE *Outfp;
Outfp = fopen("out1p.dat","w");
pi=3.141592654;
//
// ORDER OF FAREY SERIES
//
MAXN=900;
N=MAXN;
while (N>4) {
L=haros1(N,0,S,0,1,1,N);
index=0;
for (I=0; I<L; I++) { // find index of 1/4
H=S[I]>>16;
K=S[I]&0xffff;
if ((double)H/(double)K>=0.25)
break;
index=index+1;
}
count1=index;
count2=0;
sum1=0.0;
sum2=0.0;
for (I=index; I>0; I--) {
H=S[I-1]>>16; // towards 0/1
K=S[I-1]&0xffff;
HP=S[index+1+count2]>>16; // towards 1/2
KP=S[index+1+count2]&0xffff;
temp1=cos(2.0*pi*(double)H/(double)K);
sum1=sum1+temp1;
if (((double)HP/(double)KP)<0.5) {
temp2=cos(2.0*pi*(double)HP/(double)KP);
sum2=sum2+temp2;
count2=count2+1;
}
// printf(" %d/%d %e %d/%d %e \n",H,K,sum1,HP,KP,sum2);
}
count1=count1-1; // exclude 0/1
sum1=sum1-1.0;
I=2*index+1;
HP=S[I]>>16;
KP=S[I]&0xffff;
// printf(" %d %d \n",HP,KP);
while (((double)HP/(double)KP)<0.5) {
temp2=cos(2.0*pi*(double)HP/(double)KP);
sum2=sum2+temp2;
I=I+1;
HP=S[I]>>16;
KP=S[I]&0xffff;
// printf(" %d %d \n",HP,KP);
count2=count2+1;
}
sum=sum1+sum2;
ratio1=(sum1/sum1sav)*(double)cnt1sav/(double)count1;
ratio2=(sum2/sum2sav)*(double)cnt2sav/(double)count2;
if (N!=MAXN) {
printf("N=%d, s1=%e %e, c1=%d %d \n",N,sum1sav,sum1,cnt1sav,count1);
printf(" s2=%e %e, c2=%d %d \n",sum2sav,sum2,cnt2sav,count2);
printf(" r=%e %e, s=%e \n",ratio1,ratio2,2.0*sum);
printf("\n");
}
if (N!=(N/2)*2)
N=(N+1)/2;
else
N=N/2;
sum1sav=sum1;
sum2sav=sum2;
cnt1sav=count1;
cnt2sav=count2;
}
return;
}