/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C COMPUTE SUM OF EULER'S PHI FUNCTION C C 12/23/14 (DKC) C C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/ #include <stdio.h> #include <math.h> unsigned int euclid(unsigned int d, unsigned int e); // unsigned int order=50000; unsigned int out=2; // losum, hisum, hisum-losum, sqrt((hisum-losum)), sqrt(A(x)) unsigned int flag=0; // for out=4, sqrt(A(x)), A(x)/sqrt(x(x+1)(2x+1)/6), // or g(x)/sqrt(x(x+1)(2x+1)/6) unsigned int flag4=0; // scale for out=4 (zero, plus, or minus) unsigned int sflag=1; // square root flag (for out=4, normally set to 0) unsigned int flag2=1; // for out=2, if set compute 1.5x/log(x)-(hisum-losum) // void main() { unsigned int g,h,j,k,l,r; unsigned int sum,losum,hisum,count; double misum,esum,edelt; FILE *Outfp; Outfp = fopen("out1r1.dat","w"); losum=0; hisum=1; // changed from 0 on 08/19/14 misum=1.0; count=0; for (g=2; g<=order; g++) { if (out==4) { k=g/6; r=g-k*6; if (k==0) { if (r==1) esum=1.0; if (r==2) esum=2.0; if (r==3) esum=4.0; if (r==4) esum=6.0; if (r==5) esum=11.0; } else { esum=12.0*k+23.0*((double)k*(k-1))/2; edelt=0.0; if (r==1) edelt=7.0+6.0*(k-1); if (r==2) edelt=11.0+9.0*(k-1); if (r==3) edelt=17.0+13.0*(k-1); if (r==4) edelt=22.0+16.0*(k-1); if (r==5) edelt=33.0+22.0*(k-1); esum=esum+edelt; } } sum=1; for (j=2; j<g; j++) { k=euclid(g,j); if (k==1) sum=sum+1; } misum=misum+(double)sum; l=sum/4; h=l; if (sum!=l*4) h=h+1; else count=count+1; losum=losum+l; hisum=hisum+h; printf(" %d %d %d %d %e %d \n",g,sum,losum,hisum,misum,(int)(hisum-losum)); if (out==0) fprintf(Outfp," %d\n",losum); else { if (out==1) fprintf(Outfp," %d\n",hisum); else { if (out==2) { if (flag2==0) fprintf(Outfp," %d\n",hisum-losum); else fprintf(Outfp," %e\n",1.5*(double)g/log((double)g)-(hisum-losum)); } else { if (out==3) fprintf(Outfp," %e\n",sqrt((double)(hisum-losum))); else { if (flag==0) { if (flag4==0) { if (sflag!=0) fprintf(Outfp," %e\n",sqrt(misum)); else fprintf(Outfp," %e\n",misum); } if (flag4==1) fprintf(Outfp," %e\n",0.5513*(double)g+0.2767+0.5); if (flag4==2) fprintf(Outfp," %e\n",0.5513*(double)g+0.2767-0.5); } else { if (flag==1) fprintf(Outfp," %e\n",misum/sqrt((double)g*(double)(g+1)*(double)(2*g+1)/6.0)); else fprintf(Outfp," %e\n",esum/sqrt((double)g*(double)(g+1)*(double)(2*g+1)/6.0)); } } } } } } printf("count=%d, ratio=%e \n",count,(double)count/(double)order); fclose(Outfp); return; }