
class Fig02_12
{
    public static int gcd( int m, int n )
    {
        if( m < n )
            return gcd( n, m );
        if( n == 0 )
            return m;
        return gcd( n, m % n );
    }
    
    public static double probRelPrime( int n )
    {
        int rel = 0, tot = 0;
        
        for( int i = 1; i <= n; i++ )
            for( int j = i + 1; j <= n; j++ )
            {
                tot++;
                
                if( gcd( i, j ) == 1 )
                    rel++;
            }
        
        return (double) rel / tot;
    }
    
    public static void main( String [ ] args )
    {
        for( int n = 500; n <= 64000; n *= 2 )
        {
            
            long start = System.currentTimeMillis( );
            double prob = probRelPrime( n );
            long end = System.currentTimeMillis( );
            
            if( n == 500 )
                continue;
            
            long elapsed = ( end - start );
            
            System.out.print( String.format( "%4d", n ) );

            System.out.print( String.format( "\t%d", elapsed ) );
            
            System.out.print( String.format( "\t%.9f", elapsed / (double) n / n ) );
            System.out.print( String.format( "\t%.12f", elapsed / (double) n / n / n ) );
            System.out.print( String.format( "\t%.9f", elapsed / (double) n / n / ( Math.log10( n ) / Math.log10( 2 ) ) ) );
          
            System.out.println( );
            
           // if( n >= 10000 )
           //     n += 4000;
        }
    }
    
}
