#include <iostream>
#include <iomanip>
#include <random>
#include <cmath>
using namespace std;
/* ===========================
MONTE CARLO
=========================== */
long double monteCarlo(unsigned long long n) {
mt19937_64 gen(123456); // stałe ziarno dla powtarzalności
uniform_real_distribution<long double> dist(-1.0L, 1.0L);
unsigned long long inside = 0;
for (unsigned 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;
}
/* ===========================
METODA PROSTOKĄTÓW
π = 4 * ∫₀¹ 1/(1+x²) dx
=========================== */
long double rectangles(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 * h;
sum += 1.0L / (1.0L + x * x);
}
return 4.0L * h * sum;
}
/* ===========================
METODA TRAPEZÓW
=========================== */
long double trapezoids(unsigned long long n) {
long double h = 1.0L / n;
long double sum = 0.5L * (1.0L / (1.0L + 0.0L) +
1.0L / (1.0L + 1.0L));
for (unsigned long long i = 1; i < n; ++i) {
long double x = i * h;
sum += 1.0L / (1.0L + x * x);
}
return 4.0L * h * sum;
}
/* ===========================
MAIN
=========================== */
int main() {
const unsigned long long n = 10000000ULL; // <<< TUTAJ ustawiasz dokładność
long double pi_mc = monteCarlo(n);
long double pi_rect = rectangles(n);
long double pi_trap = trapezoids(n);
cout << fixed << setprecision(20);
cout << "Monte Carlo: " << pi_mc << endl;
cout << "Prostokaty: " << pi_rect << endl;
cout << "Trapezy: " << pi_trap << endl;
return 0;
}