Math library for mlua — RNG, distributions, special functions, and descriptive statistics.
Provides math functions that are impractical or numerically unstable to implement in pure Lua: distribution sampling with proper algorithms, independent seeded RNG instances, special functions (erf, gamma, beta), CDF/PPF, hypothesis testing, information theory, ranking metrics, and numerically stable statistics.
Independent RNG instances with seed control and reproducibility (ChaCha12 via rand)
12 distribution samplers using production-grade algorithms (rand_distr)
Special functions via statrs (erf, gamma, beta, digamma, factorial)
CDF/PPF for Normal, Beta, Gamma, Poisson distributions
16 descriptive & time-series statistics with numerical stability (Welford variance, interpolated percentiles, Wilson CI, stable softmax, moving average, EWMA, autocorrelation)
4 hypothesis tests (Welch's t, Mann-Whitney U, chi-squared, Kolmogorov-Smirnov)
5 ranking & IR metrics (Spearman, Kendall tau-b, NDCG, MRR, fractional rank)
4 information-theoretic functions (entropy, KL divergence, JS divergence, cross-entropy)
[dependencies ]
mlua-mathlib = " 0.2"
mlua = { version = " 0.11" , features = [" lua54" , " vendored" ] }
use mlua:: prelude:: * ;
let lua = Lua :: new ( ) ;
let math = mlua_mathlib:: module ( & lua) . unwrap ( ) ;
lua. globals ( ) . set ( "math" , math) . unwrap ( ) ;
lua. load ( r#"
local rng = math.rng_create(42)
print(math.normal_sample(rng, 0.0, 1.0))
print(math.mean({1, 2, 3, 4, 5}))
print(math.normal_cdf(1.96, 0, 1)) -- ≈ 0.975
"# ) . exec ( ) . unwrap ( ) ;
All sampling functions take an explicit RNG instance as the first argument. No global state.
Function
Description
rng_create(seed)
Create an independent RNG instance (ChaCha12)
rng_float(rng)
Sample uniform float in [0, 1)
rng_int(rng, min, max)
Sample uniform integer in [min, max]
shuffle(rng, table)
Fisher-Yates shuffle (returns new table)
sample_with_replacement(rng, table, n)
Draw n samples with replacement
Function
Distribution
Parameters
normal_sample(rng, mean, stddev)
Normal
mean, standard deviation
beta_sample(rng, alpha, beta)
Beta
shape parameters
gamma_sample(rng, shape, scale)
Gamma
shape, scale
exp_sample(rng, lambda)
Exponential
rate
poisson_sample(rng, lambda)
Poisson
rate (returns integer)
uniform_sample(rng, low, high)
Uniform
lower, upper bound
lognormal_sample(rng, mu, sigma)
Log-normal
log-mean, log-stddev
binomial_sample(rng, n, p)
Binomial
trials, probability (returns integer)
dirichlet_sample(rng, alphas)
Dirichlet
concentration parameters (returns table)
categorical_sample(rng, weights)
Categorical
weights (returns 1-based index)
student_t_sample(rng, df)
Student's t
degrees of freedom
chi_squared_sample(rng, df)
Chi-squared
degrees of freedom
Function
Description
erf(x)
Error function
erfc(x)
Complementary error function
lgamma(x)
Log-gamma function
beta(a, b)
Beta function
ln_beta(a, b)
Log-beta function
regularized_incomplete_beta(x, a, b)
Regularized incomplete beta (for Beta CDF)
regularized_incomplete_gamma(a, x)
Regularized lower incomplete gamma
digamma(x)
Digamma (psi) function
factorial(n)
Factorial (n <= 170)
ln_factorial(n)
Log-factorial
normal_ppf(p)
Inverse CDF of N(0,1)
logsumexp(values)
Numerically stable log-sum-exp
logit(p)
Log-odds: ln(p/(1-p))
expit(x)
Sigmoid / inverse logit (numerically stable)
CDF / PPF / Distribution utilities
Function
Description
normal_cdf(x, mu, sigma)
Normal CDF
normal_ppf_params(p, mu, sigma)
Normal inverse CDF (parameterized)
beta_cdf(x, alpha, beta)
Beta CDF
beta_ppf(p, alpha, beta)
Beta inverse CDF
gamma_cdf(x, shape, rate)
Gamma CDF
poisson_cdf(k, lambda)
Poisson CDF
beta_mean(alpha, beta)
Beta distribution mean
beta_variance(alpha, beta)
Beta distribution variance
All functions take a Lua table (array) of numbers.
Function
Description
mean(values)
Arithmetic mean
variance(values)
Sample variance (Welford's algorithm)
stddev(values)
Sample standard deviation
median(values)
Median with linear interpolation
percentile(values, p)
p-th percentile (0-100) with linear interpolation
iqr(values)
Interquartile range (Q3 - Q1)
softmax(values)
Numerically stable softmax (returns table)
covariance(xs, ys)
Sample covariance
correlation(xs, ys)
Pearson correlation coefficient
histogram(values, bins)
Histogram binning (returns {counts, edges})
wilson_ci(successes, total, confidence)
Wilson score confidence interval (returns {lower, upper, center})
log_normalize(values)
Logarithmic normalization to [0, 100]
moving_average(values, window)
Simple moving average
ewma(values, alpha)
Exponentially weighted moving average
autocorrelation(values, lag)
Autocorrelation at given lag
permutations(n)
All n! permutations of {1..n} (n ≤ 8, returns table of tables)
All tests return a table with test statistic(s) and p-value.
Function
Description
welch_t_test(xs, ys)
Welch's t-test (unequal variances). Returns {t_stat, df, p_value}
mann_whitney_u(xs, ys [, opts])
Mann-Whitney U test. Pass {tie_correction=true} as 3rd arg to adjust for ties. Returns {u_stat, z_score, p_value}
chi_squared_test(observed, expected)
Chi-squared goodness-of-fit. Returns {chi2_stat, df, p_value}
ks_test(xs, ys)
Two-sample Kolmogorov-Smirnov test. Returns {d_stat, p_value}
Function
Description
rank(values)
Fractional ranks with average tie-breaking (returns table)
spearman_correlation(xs, ys)
Spearman rank correlation coefficient
kendall_tau(xs, ys)
Kendall's tau-b (handles ties)
ndcg(relevance, k)
NDCG@k (linear gain variant: rel/log₂(i+2))
mrr(rankings)
Mean Reciprocal Rank (1-based rank positions)
Input distributions must be valid probability distributions (non-negative, sum to 1).
Function
Description
entropy(probs)
Shannon entropy H(p) = -Σ pᵢ ln(pᵢ)
kl_divergence(p, q)
KL divergence D_KL(p ‖ q)
js_divergence(p, q)
Jensen-Shannon divergence (symmetric, bounded [0, ln 2])
cross_entropy(p, q)
Cross-entropy H(p, q) = -Σ pᵢ ln(qᵢ)
Problem
Pure Lua
mlua-mathlib
Beta/Gamma sampling
Complex algorithms (Joehnk, Marsaglia-Tsang), numerical instability
rand_distr with production-tested implementations
PRNG independence
Single global math.random, no instance isolation
Multiple independent seeded RNG instances
Special functions (erf, gamma)
No standard implementation; hand-rolled approximations
statrs with validated numerical methods
CDF/PPF
Requires special functions as building blocks
Exact implementations via statrs
Variance computation
Naive sum-of-squares suffers catastrophic cancellation
Welford's online algorithm
Wilson CI
Hardcoded z=1.96; no inverse normal function
Arbitrary confidence level via normal_ppf
Hypothesis tests
Requires CDF tables or lookup; manual formula implementation
Exact p-values via statrs distributions
KL/JS divergence
Numerical instability with small probabilities
Proper log-domain computation with validation
Crate
Purpose
rand 0.9
RNG (ChaCha12)
rand_distr 0.5
Distribution sampling
statrs 0.18
Special functions, CDF/PPF
Licensed under either of Apache License, Version 2.0 or MIT license at your option.