
// PlotPrimes.java
// Andrew Davison, ad@coe.psu.ac.th, April 2023

/*  Plot the prime-counting function π(x) against x/log x
    for all x values from 0 to n

   https://en.wikipedia.org/wiki/Prime-counting_function

   Usage:
     > compile PlotPrimes.java
     > run PlotPrimes <n>
   e.g.
     > run PlotPrimes 100
     > run PlotPrimes 10000
*/

import java.awt.Color;

import com.github.plot.Plot;
import com.github.plot.Plot.*;


public class PlotPrimes
{

  public static void main(String[] args)
  {
    if (args.length != 1) {
      System.out.println("Usage: run PlotPrimes <n>");
      return;
    }
    int n = Math.abs(Nut.parseInt(args[0]));
    
    int[] primes = Nut.loadPrimes("primes1M.txt");
    int[] countPrimes = Nut.countsOfPrimes(n, primes); 
    
    Plot.Data plotData = Plot.data();
    for (int i=0; i < countPrimes.length; i++)
      plotData.xy(i, countPrimes[i]);

    // x/log x line
    Plot.Data gaussData = Plot.data();
    for (int i = 2; i < n+1; i++)
      gaussData.xy(i, ((double)i) / Math.log(i));


    // plot configuration
    Plot plot = Plot.plot( Plot.plotOpts().
                      title("Primes Count vs. n/log n").
                      legend(Plot.LegendFormat.RIGHT));
    plot.xAxis("n", Plot.axisOpts().
                      format(Plot.AxisFormat.NUMBER_INT));
    plot.yAxis("count", Plot.axisOpts().
                      format(Plot.AxisFormat.NUMBER_INT));

    // add data and draw
    plot.series("primes <= n", plotData, Plot.seriesOpts().
                                 marker(Plot.Marker.NONE));

    plot.series("n/log n", gaussData, Plot.seriesOpts().
                                 marker(Plot.Marker.NONE).
                                 color(Color.GREEN));
    PlotUtils.viewPlot("Primes Count", plot);

  } /* main */


}  // end of PlotPrimes class
