#include <iostream>
#include <iomanip>
#include <random>
#include <cmath>
using namespace std;
// Funkcja do obliczania pi metodą Monte Carlo
long double monteCarloPi(long long n) {
random_device rd;
mt19937_64 gen(rd());
uniform_real_distribution<long double> dist(-1.0L, 1.0L);
long long inside = 0;
for (long long i = 0; i < n; ++i) {
long double x = dist(gen);
long double y = dist(gen);
if (x * x + y * y <= 1.0L)
inside++;
}
return 4.0L * inside / n;
}
// Funkcja f(x) = sqrt(1 - x^2)
long double f(long double x) {
return sqrtl(1.0L - x * x);
}
// Metoda prostokątów
long double rectangleMethod(long long n) {
long double a = 0.0L;
long double b = 1.0L;
long double h = (b - a) / n;
long double sum = 0.0L;
for (long long i = 0; i < n; ++i) {
long double x = a + i * h;
sum += f(x);
}
return 4.0L * h * sum;
}
// Metoda trapezów
long double trapezoidalMethod(long long n) {
long double a = 0.0L;
long double b = 1.0L;
long double h = (b - a) / n;
long double sum = (f(a) + f(b)) / 2.0L;
for (long long i = 1; i < n; ++i) {
long double x = a + i * h;
sum += f(x);
}
return 4.0L * h * sum;
}
int main() {
const long long monteCarloPoints = 1000000; // zgodnie ze specyfikacją
const long long n = 1000000; // liczba podziałów dla całkowania
cout << fixed << setprecision(20);
long double piMonteCarlo = monteCarloPi(monteCarloPoints);
long double piRectangle = rectangleMethod(n);
long double piTrapezoid = trapezoidalMethod(n);
cout << "Metoda Monte Carlo (" << monteCarloPoints << " punktow):\n";
cout << "pi = " << piMonteCarlo << endl << endl;
cout << "Metoda prostokatow:\n";
cout << "pi = " << piRectangle << endl << endl;
cout << "Metoda trapezow:\n";
cout << "pi = " << piTrapezoid << endl;
return 0;
}