#include <stdio.h>
#include <math.h>
#include "mpi.h"

int main(int argc, char *argv[]) {
	int n, rank, numprocs, i;
	double PI25DT = 3.141592653589793238462643;
	double pi, sum, x;
	n = atoi(argv[1]);
	MPI_Init(&argc, &argv);
	MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
	sum = 0.0;
	for (i = rank; i < n; i += numprocs) {
		x = (double)i;
		sum += (4/(8*x+1) - 2/(8*x+4) - 1/(8*x+5) - 1/(8*x+6))*pow(.0625,i);
	}
	MPI_Reduce(&sum, &pi, 1, MPI_DOUBLE, MPI_SUM, 0,
					MPI_COMM_WORLD);
	if (rank == 0) {
		printf("pi is approximately %.16f, ", pi);
		printf("Error is %.16f\n", fabs(pi - PI25DT));
	}
	MPI_Finalize();
	return 0;
}

