/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C COMPUTE MERTENS FUNCTION (sum of M(x/i)^2 where i|x, find local maxima) C C 09/29/15 (DKC) (maxima based on j(x)) 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=1000000000; // maximum N unsigned int BEGINN=2; // beginning N short k=18; // void main() { int t,*temp; short *M,t1; unsigned int N,h,i,j,count,index,ta,tb; double sum,maxt; FILE *Outfp; Outfp = fopen("out1bzs.dat","w"); temp=(int*) malloc(4004); if (temp==NULL) { printf("not enough memory \n"); return; } M=(short*) malloc(2000000002); if (M==NULL) { printf("not enough memory \n"); return; } printf("computing Mobius function \n"); index=0; ta=1; tb=1001; for (i=0; i<(MAXN/1000); i++) { t=newmob(ta,tb,temp,table); if (t!=1) { printf("error \n"); goto zskip; } ta=tb; tb=tb+1000; for (j=0; j<1000; j++) M[j+index]=(short)temp[j]; index=index+1000; } // // compute Mertens function // printf("computing Mertens function \n"); for (i=1; i<MAXN; i++) { M[i]=M[i-1]+M[i]; t1=(M[i]>>14)&3; if ((t1==1)||(t1==2)) { printf("possible overflow \n"); printf(" %d %x \n",i,M[i]); goto zskip; } } // printf("finding maxima \n"); maxt=0.0; for (N=BEGINN; N<=MAXN; N++) { t1=M[N-1]; if (t1<0) t1=-t1; if (t1!=k) continue; 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]; sum=sum+(double)t*(double)t; count=count+1; if (j!=i) { t=M[i-1]; sum=sum+(double)t*(double)t; count=count+1; } } } if (sum>maxt) { maxt=sum; printf(" %d %e %d %d \n",N,maxt,count,M[N-1]); fprintf(Outfp," %d, %d, %d, %d, \n",N,(unsigned int)maxt,count,M[N-1]); } } zskip: fclose(Outfp); return; }