#include <iostream>
#include <iomanip>
#include <random>
#include <cmath>
using namespace std;
// ===================== MONTE CARLO =====================
long double monteCarlo(unsigned long long samples) {
mt19937_64 gen(42); // stałe ziarno dla powtarzalności
uniform_real_distribution<long double> dist(0.0L, 1.0L);
unsigned long long inside = 0;
for (unsigned long long i = 0; i < samples; i++) {
long double x = dist(gen);
long double y = dist(gen);
if (x * x + y * y <= 1.0L)
inside++;
}
return 4.0L * inside / samples;
}
// ===================== METODA PROSTOKĄTÓW =====================
long double rectangleMethod(unsigned long long n) {
long double h = 1.0L / n;
long double sum = 0.0L;
for (unsigned long long i = 0; i < n; i++) {
long double x = (i + 0.5L) * h; // środek przedziału
sum += 4.0L / (1.0L + x * x);
}
return sum * h;
}
// ===================== METODA TRAPEZÓW =====================
long double trapezoidalMethod(unsigned long long n) {
long double h = 1.0L / n;
long double sum = 0.5L * (4.0L / (1.0L + 0.0L) +
4.0L / (1.0L + 1.0L));
for (unsigned long long i = 1; i < n; i++) {
long double x = i * h;
sum += 4.0L / (1.0L + x * x);
}
return sum * h;
}
// ===================== MAIN =====================
int main() {
cout << fixed << setprecision(20);
// Liczby iteracji (można zwiększyć dla większej dokładności)
unsigned long long monteSamples = 100000000; // 1e8
unsigned long long integrationSteps = 10000000; // 1e7
long double piMonte = monteCarlo(monteSamples);
long double piRect = rectangleMethod(integrationSteps);
long double piTrap = trapezoidalMethod(integrationSteps);
cout << "Monte Carlo: " << piMonte << endl;
cout << "Metoda prostokatow: " << piRect << endl;
cout << "Metoda trapezow: " << piTrap << endl;
return 0;
}