/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C C
C COMPUTE UPPER BOUND MINUS LOWER BOUND (AND ESTIMATED VALUES) C
C 06/20/14 (DKC) C
C C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
#include <stdio.h>
#include <math.h>
unsigned int euler(unsigned int a);
double mertens4(unsigned int, unsigned int *count, double *sum);
//
unsigned int out=15; // 0, sum of M([x/i]) when 4 divides phi(i)
// 1, estimated sum of M([x/i]) when 4 divides phi(i)
// 2, exceptions (when estimated signs not correct)
// 3, sum of a(x)*m(x/i)/m(x)
// 4, sum of b(x)*n(x/i)/n(x)
// 5, sum of i*a(x)*m(x/i)/m(x)
// 6, sum of i*b(x)*n(x/i)/n(x)
// 7, sum of a(x/i)
// 8, sum of b(x/i)
// 9, sum of i*a(x/i)
// 10, sum of i*b(x/i)
// 11, sum of m(x/i)
// 12, sum of n(x/i)
// 13, sum of m(x/i)-n(x/i)
// 14, sum of i*(m(x/i)-n(x/i))
// 15, 1/2 sum of i*M([x/i]) where M(1), M(3) are set to 0
// 16, Mertens function
// 17, differences in number of fractions before, after 1/4
//
double inc=0.0; // esum+increment
unsigned int base=1; // 0 or Mertens
unsigned int n=1; // decimation factor
//
void main() {
unsigned int N,MAXN; // MAXN=2560
unsigned int i,j,temp,clsave,crsave,count[2],histop[100],histopn[100];
unsigned int histon[100],histonn[100],histox,histoxn;
double sum,sum1,msum,mlsave,mrsave,lratio,rratio,tsum[2],esum,tmpsum;
double lsum,rsum,lsum2,rsum2,sum2,sum3,sum4,sum5,sum6,sum7,sum8,sum9;
double newsum,oldsum;
FILE *Outfp;
Outfp = fopen("out1ba.dat","w");
for (i=0; i<100; i++) {
histop[i]=0;
histopn[i]=0;
histon[i]=0;
histonn[i]=0;
}
histox=0;
histoxn=0;
MAXN=900;
oldsum=0.0;
for (N=2; N<=MAXN; N++) {
sum=0.0;
sum1=0.0;
sum2=0.0;
sum3=0.0;
sum4=0.0;
sum5=0.0;
sum6=0.0;
sum7=0.0;
sum8=0.0;
sum9=0.0;
for (i=1; i<=N; i++) {
msum=mertens4(N/i, count, tsum);
if ((out==16)&&(i==1))
fprintf(Outfp," %e\n",msum);
if ((out==17)&&(i==1))
fprintf(Outfp," %d\n",(int)count[0]-(int)count[1]);
if (i==1) {
mlsave=tsum[0];
mrsave=tsum[1];
clsave=count[0];
crsave=count[1];
if (base==0)
esum=msum;
else {
esum=0.0;
lsum=mlsave;
rsum=mrsave;
lsum2=mlsave;
rsum2=mrsave;
}
// printf(" %d %d %e %e \n",clsave,crsave,mlsave,mrsave);
}
//
// compute sums
//
temp=euler(i);
if ((temp/4)*4!=temp) {
sum=sum+msum*(double)i/(double)temp;
sum1=sum1+esum*(double)i/(double)temp;
}
sum2=sum2+tsum[0];
if ((N/i)==1) // solve weight problem
sum3=sum3+0.5;
else {
if ((N/i)==3)
sum3=sum3-0.5;
else
sum3=sum3+tsum[1];
}
sum4=sum4+tsum[0]*(double)i;
sum5=sum5+tsum[1]*(double)i;
sum6=sum6+(double)count[0];
sum7=sum7+(double)count[1];
sum8=sum8+(double)count[0]-(double)count[1];
sum9=sum9+(double)i*((double)count[0]-(double)count[1]);
// printf(" %d %d %d %e %e %e \n",i,count[0],N/i,sum4,sum5,2.0*(tsum[0]+tsum[1]));
// printf(" %d %d %d %e %e \n",i,count[0],N/i,sum,msum);
if (i!=1) {
if (clsave!=0)
lratio=(double)count[0]/(double)clsave;
else
lratio=1.0;
if (crsave!=0)
rratio=(double)count[1]/(double)crsave;
else
rratio=1.0;
esum=mlsave*lratio+mrsave*rratio;
esum=esum*2.0;
if ((i-1)==((i-1)/n)*n) {
lsum=lsum+mlsave*lratio;
rsum=rsum+mrsave*rratio;
}
lsum2=lsum2+(double)i*mlsave*lratio;
rsum2=rsum2+(double)i*mrsave*rratio;
// printf(" %e %e %e \n",lsum,rsum,lsum+rsum);
// fprintf(Outfp," i=%d %d %d %e %e %e %e %e %e \n",i,count[0],count[1],tsum[0],tsum[1],
// lratio,rratio,msum,esum);
//
// histogram (for msum>0)
//
if ((msum>0.0)&&(i<=(N/2))) {
j=(unsigned int)(msum+0.0001);
if ((j<100)&&(j!=0)) {
histop[j]=histop[j]+1;
if (esum+inc>0.0)
histopn[j]=histopn[j]+1;
}
printf("N=%d, i=%d, N/i=%d, msum=%e, esum=%e \n",N,i,N/i,msum,esum);
if (out==2)
fprintf(Outfp,"N=%d, i=%d, N/i=%d, msum=%e, esum=%e \n",N,i,N/i,msum,esum);
}
//
// histogram (for msum<0)
//
if (msum<0.0) {
tmpsum=-msum;
j=(unsigned int)(tmpsum+0.0001);
if ((j<100)&&(j!=0)) {
histon[j]=histon[j]+1;
if (esum-inc<0.0)
histonn[j]=histonn[j]+1;
}
}
//
// histogram (for msum==0)
//
if (msum<0.0)
tmpsum=-msum;
else
tmpsum=msum;
j=(unsigned int)(tmpsum+0.0001);
if ((j==0)&&(i<=(N/3))) {
histox=histox+1;
if (esum<0.0)
tmpsum=-esum;
else
tmpsum=esum;
j=(unsigned int)(tmpsum+0.1);
if (j==0)
histoxn=histoxn+1;
}
}
}
newsum=sum4+sum5;
if (((int)(N-6)/12)*12==(int)(N-6)) {
if (newsum<=oldsum) {
printf("error 1: N=%d, newsum=%e, oldsum=%e \n",N,newsum,oldsum);
goto zskip;
}
}
else {
if (newsum>oldsum) {
printf("error 2: N=%d, newsum=%e, oldsum=%e \n",N,newsum,oldsum);
goto zskip;
}
}
oldsum=newsum;
if (sum<0.0)
sum=-sum;
if (sum1<0.0)
sum1=-sum1;
if (out==0)
fprintf(Outfp," %e\n",sum);
else {
if (out==1)
fprintf(Outfp," %e\n",sum1);
else {
if (out==3)
fprintf(Outfp," %e\n",lsum);
if (out==4)
fprintf(Outfp," %e\n",rsum);
if (out==5)
fprintf(Outfp," %e\n",lsum2);
if (out==6)
fprintf(Outfp," %e\n",rsum2);
if (out==7)
fprintf(Outfp," %e\n",sum2);
if (out==8)
fprintf(Outfp," %e\n",sum3);
if (out==9)
fprintf(Outfp," %e\n",sum4);
if (out==10)
fprintf(Outfp," %e\n",sum5);
if (out==11)
fprintf(Outfp," %e\n",sum6);
if (out==12)
fprintf(Outfp," %e\n",sum7);
if (out==13)
fprintf(Outfp," %e\n",sum8);
if (out==14)
fprintf(Outfp," %e\n",sum9);
if (out==15)
fprintf(Outfp," %e\n",sum4+sum5);
}
}
}
if (out==2)
fprintf(Outfp,"\n");
printf(" %d, %d, %d \n",0,histox,histoxn);
if (out==2)
fprintf(Outfp," %d, %d, %d \n",0,histox,histoxn);
for (i=1; i<20; i++) {
printf(" %d, %d %d %d %d \n",i,histop[i],histopn[i],histon[i],histonn[i]);
if (out==2)
fprintf(Outfp," %d, %d %d %d %d \n",i,histop[i],histopn[i],histon[i],histonn[i]);
}
zskip:
fclose(Outfp);
return;
}