/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C C
C INTERPOLATE FRACTIONS AND COMPUTE FUNCTIONS C
C 05/17/15 (DKC) C
C C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
#include <stdio.h>
#include <math.h>
double numdiv(unsigned int a, unsigned int flag);
double interp(int N, int D, int N1, int D1, unsigned int I, double init,
double *out);
unsigned int MAXN=76; // maximum x
unsigned int delta=0; // if set, add offset (slope for out=0)
unsigned int I=4; // n value
unsigned int out=0; // 0 for sum of delta(x/i)
// 1 for sum of delta(x/i)*log(i)
// 2 for sum of delta(x/i)*sigma0(i)
// 3 for sum of delta(x/i)*sigma1(i)
// 4 for sum of delta(x/i)*sigma2(i)
// 5 for sum of delta(x/i)^2
// 6 for sum of delta(x/i)*M(i)
//
int frac[40]={0,1,1,2,1,4,1,3,1,6,2,5,2,15,31,105,29,140,19,42,41,420,
76,385,201,1540,751,1430,1109,4004,803,2718,857,13411,3577,11807,
721,17163,738,2897};
double slope[8]={.1653,.1544,.1399,.1278,.1176,.1093,.1022,.09607};
void main() {
double output[10000],init,sum11,temp;
unsigned int N,h,i,J;
short M[60001];
int t,sum;
FILE *Outfp;
Outfp = fopen("out5.dat","w");
if ((19*I)>10000) {
printf(" array not big enough \n");
goto zskip;
}
if (MAXN>10000) {
printf(" MAXN too big \n");
goto zskip;
}
if (MAXN>(19*I)) {
printf(" MAXN too big \n");
goto zskip;
}
//
// compute Mertens function
//
if (out==6) {
if (MAXN>60000) {
printf("not enough memory allocated");
goto zskip;
}
M[0]=1;
for (N=2; N<=(MAXN+1); N++) {
sum=0;
for (i=2; i<=(N/3); i++)
sum=sum+M[N/i-1];
sum=sum+(N+1)/2;
t=1-sum;
M[N-1]=(short)t;
// printf(" %d \n",M[N-1]);
}
}
for (i=0; i<10000; i++)
output[i]=0.0;
J=(I+1)/2;
init=0.0;
for (i=0; i<19; i++)
init=interp(frac[2*i],frac[2*i+1],frac[2*i+2],frac[2*i+3],I,init,
&output[i*I]);
//for (i=0; i<19*I; i++) {
//printf(" %e \n",output[i]);
// fprintf(Outfp," %e \n",output[i]);
// }
if (I<9)
temp=slope[I-1];
else
temp=0.0;
for (h=2; h<=MAXN; h++) {
sum11=0.0;
for (i=1; i<=h; i++) {
if (out==0)
sum11=sum11+output[h/i-1];
if (out==1) {
if (delta==0)
sum11=sum11+output[h/i-1]*log((double)i);
else
sum11=sum11+(output[h/i-1]-temp)*log((double)i);
}
if (out==2) {
if (delta==0)
sum11=sum11+output[h/i-1]*2.0*numdiv(i,1);
else
sum11=sum11+(output[h/i-1]-temp)*2.0*numdiv(i,1);
}
if (out==3)
sum11=sum11+output[h/i-1]*numdiv(i,4);
if (out==4)
sum11=sum11+output[h/i-1]*numdiv(i,5);
if (out==5) {
if (delta==0)
sum11=sum11+output[h/i-1]*output[h/i-1];
else
sum11=sum11+(output[h/i-1]-temp)*(output[h/i-1]-temp);
}
if (out==6) {
if (delta==0)
sum11=sum11+output[h/i-1]*(double)M[i-1];
else
sum11=sum11+(output[h/i-1]-temp)*(double)M[i-1];
}
}
printf(" %d %e \n",h,sum11);
fprintf(Outfp," %e\n",sum11);
}
zskip:
fclose(Outfp);
return;
}