#pragma once

namespace fn::ds {

// Distribucion Beta(a, b) y helpers numericos relacionados. Pure.
//
// log-Gamma via aproximacion de Lanczos (precision ~1e-15).
double lgamma_lanczos(double x);

// log B(a, b) = lgamma(a) + lgamma(b) - lgamma(a+b).
double log_beta(double a, double b);

// Beta PDF en x, parametros a, b. Soporta a > 0, b > 0; fuera del soporte
// devuelve 0. Computado en log-space para estabilidad en a/b extremos.
double beta_pdf(double x, double a, double b);

// Beta CDF (regularized incomplete beta function I_x(a, b)). Continued
// fraction algorithm, precision ~1e-12.
double beta_cdf(double x, double a, double b);

// Beta quantile (inverse CDF) por busqueda Newton + bisection fallback.
// p en [0, 1]. Tolerancia 1e-6 sobre x.
double beta_quantile(double p, double a, double b);

// Mean = a / (a + b).
double beta_mean(double a, double b);

// Variance = (a*b) / ((a+b)^2 * (a+b+1)).
double beta_variance(double a, double b);

double beta_std(double a, double b);

} // namespace fn::ds
