/*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;
}