/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C COMPUTE MERTENS FUNCTION (sum of |M(x/i)| where i|x) C C 09/08/15 (DKC) C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/ #include <stdio.h> #include <math.h> #include "table2.h" extern char *malloc(); int newmob(unsigned int a, unsigned int b, int *out, unsigned int *table); unsigned int MAXN=400000000; // maximum N unsigned int BEGINN=2; // beginning N // void main() { int t,*M; unsigned int N,h,i,j,count; double sum,maxt; FILE *Outfp; Outfp = fopen("out1bzf.dat","w"); // // compute Mertens function // M=(int*) malloc(1600000004); if (M==NULL) return; t=newmob(1,MAXN+1,M,table); if (t==-1) { printf("too big \n"); goto zskip; } for (i=1; i<MAXN; i++) M[i]=M[i-1]+M[i]; M[0]=1; // maxt=0.0; for (N=BEGINN; N<=MAXN; N++) { sum=0.0; count=0; h=(unsigned int)sqrt((double)(N+1)); for (i=1; i<=h; i++) { j=N/i; if (N==(j*i)) { t=M[j-1]; if (t<0) t=-t; sum=sum+(double)t; count=count+1; if (j!=i) { t=M[i-1]; if (t<0) t=-t; sum=sum+(double)t; count=count+1; } } } if (sum>maxt) { maxt=sum; printf(" %d %e %d \n",N,maxt,count); fprintf(Outfp," %d, %d, %d, \n",N,(unsigned int)maxt,count); } } zskip: fclose(Outfp); return; }