/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C C
C GENERATE FAREY SERIES AND COMPUTE MEASURES (Franel and Landau) C
C 04/20/14 (DKC) C
C C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
#include <stdio.h>
#include <math.h>
unsigned int divn_32(unsigned int *a, unsigned int *b, unsigned int d,
unsigned int m);
unsigned int lagrange(unsigned int N, unsigned int *R);
void setn(unsigned int *a, unsigned int b, unsigned int m);
void addn(unsigned int *a, unsigned int *b, unsigned int m);
void subn(unsigned int *a, unsigned int *b, unsigned int m);
//
unsigned int nocheck=1; // set to 0 to use multiple-word arithmetic
unsigned int outflag=2; // set to 0 to output all results, 1 to output
// |delta|, or 2 to output (A*sum(delta^2)^(1/2)
//
void main() {
unsigned int N,R[250000],MAXN;
unsigned int L,I,m;
double temp,temp1,delsq;
unsigned int A[32],B[32],C[32],T[32],U[32],Z[32];
FILE *Outfp;
Outfp = fopen("out1b.dat","w");
m=4;
setn(Z,0,m);
//
// ORDER OF FAREY SERIES
//
MAXN=600;
for (N=2; N<=MAXN; N++) {
//
// GENERATE FAREY SERIES (USING HAROS' THEOREM AND LAGRANGE'S ALGORITHM)
//
L=lagrange(N,R); // generate Farey series
temp=0.0; // |delta| measure
setn(C,0,m); // |delta| measure
delsq=0.0; // delta^2 measure
for (I=0; I<L; I++) {
if (I!=0) {
temp1=(double)I/(double)(L-1)-(double)R[2*I]/(double)R[2*I+1];
if (nocheck==0) {
setn(A, 0, m);
A[0]=R[2*I];
divn_32(A, B, R[2*I+1], m);
setn(T, 0, m);
T[0]=I;
divn_32(T, U, L-1, m);
subn(U, B, m);
}
}
else {
temp1=0.0;
setn(B, 0, m);
}
delsq=delsq+temp1*temp1;
if (temp1<0.0)
temp1=-temp1;
temp=temp+temp1;
if (nocheck==0) {
if ((B[0]&0x80000000)!=0)
subn(Z,B,m);
addn(B, C, m);
}
}
delsq=delsq*(double)(L-1);
delsq=sqrt(delsq); // (A*sum(delta^2)^(1/2), pg. 267 of H. M. Edwards
// "Riemann's Zeta Function"
printf("%d, %d, s=%e %e %e \n",N,L,temp,delsq,(double)C[0]+
(double)C[1]/65536.0/65536.0+(double)C[2]/65536.0/65536.0/65536.0/65536.0);
if (outflag==0) {
fprintf(Outfp,"%d, %d, s=%e %e %e \n",N,L,temp,delsq,(double)C[0]+
(double)C[1]/65536.0/65536.0+(double)C[2]/65536.0/65536.0/65536.0/65536.0);
}
else {
if (outflag==1)
fprintf(Outfp," %e\n",temp);
else
fprintf(Outfp," %e\n",delsq);
}
}
fclose(Outfp);
return;
}