Skip to main content

FiniteFree: Finite Free Probability Library

License: MIT Code Style: Ruff Type Checked: mypy Python Version

This README and the API reference describe FiniteFree 0.2.0, distributed on PyPI from tag v0.2.0. See the migration notes and release process for compatibility changes and validation.

FiniteFree represents finite free probability operations through polynomial coefficients. Rational polynomial construction, coefficient convolutions and finite cumulants use exact FLINT arithmetic. Root extraction, matrix sampling and continuous gap probabilities have separate numerical paths.

To prevent numerical floating-point drift and avoid the computational complexity of high-order runtime differential operators, FiniteFree implements exact finite free convolutions using discrete algebraic representations, exact generating function recurrences, and arbitrary-precision integer and rational scaling.

Visual Showcase

The following pre-rendered figures illustrate selected finite-degree examples and asymptotic comparisons. They are not certificates of convergence, interlacing, numerical accuracy or sampler distributions. Regeneration scripts live in visuals/ and need Matplotlib and Pillow; some use expensive high-degree calculations and approximate discretizations.

1. Limiting Distributions of Free Convolutions

Animates the convergence of root distributions of expectation polynomials towards their theoretical free probability limits as the dimension/degree $d$ scales up to 300:

  • Wigner Semicircle Convergence: GUE expectation polynomials additive convolution $He_d \boxplus_d He_d$ roots converging to the semicircle distribution.
  • Marchenko-Pastur Convergence: Laguerre/Wishart expectation polynomials roots converging to the Marchenko-Pastur law.
  • Free Jacobi Arcsine Convergence: Jacobi/Legendre polynomials roots converging to the classical Arcsine limit.
  • Free Log-Normal Convergence: Multi-precision compound Wishart multiplicative convolutions roots converging to the free Log-normal distribution.
Wigner Semicircle Convergence ($He_{d} \boxplus_{d} He_{d}$ as $d \to 300$) Marchenko-Pastur Convergence (Laguerre as $d \to 300$)
Wigner Semicircle Convergence Marchenko-Pastur Convergence
Free Jacobi Arcsine Convergence (Legendre as $d \to 300$) Free Log-Normal Convergence (Wishart as $m=d \to 300$)
Free Jacobi Arcsine Convergence Free Log-Normal Convergence
2. Determinantal Point Processes & Spectral Universality

Showcases GUE spectral universality and eigenvalue spacing statistics:

  • CD Bulk Scaling Limit: Christoffel-Darboux kernel bulk scaling limit convergence to the infinite Sine kernel.
  • CD Edge Scaling Limit: Christoffel-Darboux kernel edge scaling limit convergence to the infinite Airy kernel.
  • Tracy-Widom Edge Convergence: Empirical max eigenvalue CDF from HKPV samples converging to the Tracy-Widom (Fredholm determinant) distribution.
  • Nearest-Neighbor Level Repulsion: GUE bulk eigenvalue spacing statistics matching the analytical Wigner Surmise.
CD Bulk Scaling Limit (Sine Kernel) CD Edge Scaling Limit (Airy Kernel)
Asymptotic Bulk Scaling Asymptotic Edge Scaling
Tracy-Widom Edge Convergence ($d=100$) Nearest-Neighbor Level Repulsion (Bulk Spacings vs Wigner Surmise)
Tracy-Widom Convergence Level Repulsion Spacing
3. Algebraic Properties

Illustrates exact algebraic properties, root interlacing constraints, and geometric distributions of FiniteFree polynomials:

  • Root Interlacing Examples: Illustrates interlacing under additive and multiplicative convolution in the displayed examples. Preservation theorems require the corresponding real-rooted and non-negative-root domains; strict interlacing is not an unconditional API guarantee.
  • Multivariate Pencil Topography: Visualizes the log-determinant topography and exact eigenvalue boundaries of random symmetric matrix pencils.
  • Unitary Eigenvalue Repulsion: Visualizes roots evolving on the complex unit circle $\mathbb{T}$ under unitary Hermite polynomial flows.
Original Roots ($p \prec q$) Additive Convolution ($p \boxplus_6 r \prec q \boxplus_6 r$) Multiplicative Convolution ($p \boxtimes_6 r \prec q \boxtimes_6 r$)
Original Roots Additive Interlacing Multiplicative Interlacing
Hyperbolic Matrix Pencil Eigencones & Topography Unitary Hermite Eigenvalue Repulsion Trajectories
Hyperbolic Cones Unitary Trajectories
4. Asymptotic Convergence of Finite Free Transforms

Visualizes the convergence of exact finite free transforms to their continuous free probability limits as the dimension $d$ scales up to 300:

  • T-Transform Step Convergence: Fujie-Ueda Finite T-Transform step function convergence to the continuous free Marchenko-Pastur (MP) limit $T(t)=1+t$.
  • Asymptotic Decay of Cumulants: Linearizing additive convolution, showing exact high-order finite free cumulants $\kappa_k(d)$ decaying to zero, leaving only $\kappa_2 \to 1$ (the Wigner semicircle limit).
  • S-Transform Multiplicativity: S-transforms of Wishart expectation polynomials, demonstrating exact multiplicativity $S_{p \boxtimes_d q}^{(d)} = S_p^{(d)} S_q^{(d)}$ at all discrete nodes and convergence to the free S-transform limit.
  • Cauchy Transform Convergence: Domain coloring of the Finite Cauchy Transform $G_d(z) = \frac{1}{d} \frac{p'_d(z)}{p_d(z)}$, showing the roots (poles) and derivative roots (zeros) coalescing into a continuous branch cut $[-2, 2]$ of the semicircle law.
Fujie-Ueda T-Transform Convergence Asymptotic Decay of Cumulants
T-Transform Convergence Cumulant Decay
S-Transform Convergence Cauchy Transform Convergence
S-Transform Convergence Cauchy Transform Convergence

Features

Core Polynomial Operations & Domain Verification
  • Certified Real-Rooted Polynomial Validation: Verified lazily with exact rational Sturm sequences for small squarefree factors and certified Arb isolation for larger factors. Exact Sturm remains a fallback through degree 30 when Arb cannot obtain a certificate.
  • Unitary Circle Geometries ($\mathbb{T}$): UnitaryPolynomial bypasses real-line verification and returns numerical complex roots ordered by angle. The constructor trusts the intended unit-circle domain; it does not certify it. unitary_hermite_polynomial stores its exponential coefficients symbolically.
  • Lazy Geometric Domain Properties: After certifying real-rootedness, has_non_negative_roots and has_strictly_positive_roots use an $O(d)$ coefficient sign check to enforce operator domains. Sign alternation alone cannot certify real-rootedness.
  • Basic Polynomial Transformations: Supports exact algebraic transformations including variable dilation (dilation), variable shift (shift), positive integer root powers (power), root-reciprocal reversing (reversed_polynomial), derivative (derivative), projection (projection), fractional additive convolution power (additive_power), and the Fujie-Ueda limiting polynomial $\Phi_d$ (phi_d). Noninteger root powers use numerical root isolation and reconstruction.
  • Direct Projections: projection(j) computes the monic derivative of order d-j from the leading j+1 coefficients, avoiding intermediate derivative objects. Known Hermite inputs retain their variance, center and numerical root recurrence. Projection to the original degree returns the same object. See the API reference for normalization and benchmark scope.
  • High-Degree Scaling & Root Reconstruction:
    • Divide-and-Conquer Polynomial Synthesis: RealRootedPolynomial.from_roots(roots) multiplies rational linear factors using a balanced product tree. Arithmetic costs depend on FLINT multiplication and coefficient bit sizes.
  • Working Precision: PrecisionContext(degree, prec=None) sets FLINT's process-wide precision to prec, or max(53, int(2.5*degree)) bits, and restores the previous value on exit. It does not manage memory pools or provide independent thread-local precision.
Orthogonal Polynomial Families
  • Jacobi Polynomials (jacobi_polynomial): Exact $O(n^2)$ recurrence construction of $P_n^{(\alpha, \beta)}(x)$ using flint.fmpq_poly in exact rational arithmetic.
  • Hahn Polynomials (hahn_polynomial): Exact $O(n)$ recurrence construction of $Q_n(x; \alpha, \beta, N)$ using sequential running products to prevent redundant Pochhammer factorial operations.
  • Jack Polynomials (jack_polynomial): High-performance variables recursion computing symmetric Jack polynomials $J_\lambda^{(\alpha)}(x_1, \dots, x_m)$ strictly over sparse monomial exponent dictionaries, completely bypassing SymPy's slow symbolic expansion engine.
  • Chebyshev & Legendre Polynomials (chebyshev_t_polynomial, chebyshev_u_polynomial, legendre_polynomial): Exact recurrence constructions of $T_n(x)$, $U_n(x)$, and $P_n(x)$ over $\mathbb{Q}$ via flint.fmpq_poly.
Finite Free Convolutions
  • Symmetric Additive ($\boxplus_d$): Exact analytical evaluation mapping polynomial convolutions against the symmetric finite combinatorial variance.
  • Asymmetric Additive ($\uplus_d$): Exact factorial-weighted coefficient convolution. Optional weights=[a,b] dilates the input roots by a and b; it does not change their degrees or rank.
  • Multiplicative ($\boxtimes_d$): Exact discrete multiplicative root transformations via scaled Hadamard projections.
Analytical Finite Transforms
  • Finite Cauchy Transform ($G_p^{(d)}$)
  • Finite S-Transform ($S_p^{(d)}$): Discrete normalized evaluations bypassing non-linear mapping.
  • Finite R-Transform ($R_p^{(d)}$): Computes finite free cumulants ($\kappa_n^{(d)}$) via an exact $O(n^2)$ recursive generating function sequence map over $\mathbb{Q}$, bypassing exponential partition lattice enumeration while verifying exact additivity $\kappa_n^{(d)}(p \boxplus_d q) = \kappa_n^{(d)}(p) + \kappa_n^{(d)}(q)$.
  • Finite T-Transform ($T_p^{(d)}$): Step function mapping the right-continuous inverse to the Fujie-Ueda limit $\Phi_d$, evaluated in $O(d)$ algebraically using coefficient sign-alternation validation.
  • Symmetric Finite S-Transform: SymmetricFiniteSTransform(p, convention="standard") returns the positive-imaginary square root defined for symmetric real-rooted inputs. The default convention="ratio" preserves the existing ratio of consecutive normalized even coefficients. See the API convention.
Multivariate Hyperbolic Geometry & Matrix Pencils
  • MultivariatePolynomial: Sparse rational polynomials with exact evaluation, rational algebra, explicit variable reordering, simultaneous scalar/polynomial substitution, exact gradient/Hessian polynomials and line restriction. Target symbols and their order are explicit; operations do not certify stability or hyperbolicity. Homogeneous multinomial normalization requires a homogeneous input. See multivariate workflows.
  • Sparse Evaluation and Ownership: evaluate uses exact rational coordinates; evaluate_float64, gradient_float64 and hessian_float64 evaluate real batches with explicit float64 rounding/range limits. Numerical derivatives work at zero coordinates and singular determinant points. Numerical work uses bounded point blocks; Hessian output still requires batch size times variable count squared storage. Native inputs, context changes and exports own their data. Costs depend on monomial count, degree, variable count, batch size and coefficient sizes.
  • Jacobi SLP & Reverse AD: Generic straight-line programs support reverse-mode gradients. Determinant pencils instead use matrix determinant/inverse and trace identities for gradients and Hessians; exact derivatives require a nonsingular evaluated matrix.
  • Product-Grid Modular Interpolation (CRT): Evaluates exact determinant polynomials and pencil characteristic polynomials (bypassing symbolic expansion bottlenecks via exact rational interpolation over $\mathbb{Q}[t]$) using C-level nmod_mat solvers and the Chinese Remainder Theorem.
  • Zippel Sparse Interpolation: Uses randomized finite-field discovery followed by deterministic coefficient/support verification for sparse determinant evaluations (from_symmetric_matrix_pencil_sparse). An exact balanced-base fallback repairs incomplete discovery. A configurable integer-size limit bounds verification feasibility. See the construction limits.
  • Multiplicative Pencils & Diagonal Specialization: Extends exact matrix pencil geometries to generalized asymmetric forms (MultiplicativeMatrixPencil) and computes univariate characteristic projections via optimized 1D Chinese Remainder Theorem loops.
  • LMI Cone Verification: Positive definiteness checks ($A(e) \succ 0$) to verify hyperbolic cones.
Stable Numerical Root Evaluation
  • to_numpy_poly1d(): Direct coefficient export to NumPy, with a warning above degree 20. It does not rescale coefficients or guarantee finite values; prefer evaluate_roots_float64() for root extraction.
  • evaluate_roots_float64(exact=False): Uses scaled symmetric tridiagonal eigenvalues for Hermite, Laguerre, Jacobi, Legendre and Chebyshev polynomials in their orthogonality domains, including GUE/Wishart expectations, affine transforms and proven Hermite additive convolutions. It avoids forming an ill-conditioned monomial companion matrix for these families.
  • evaluate_roots_float64(exact=True): Requests the Arb isolation path by default. A high-precision request after a numerical call bypasses the approximate cache. Results are returned as float64; if isolation fails, the general numerical fallbacks can still be used. See the API reference for dispatch, precision and conditioning limits.
Random Matrix Ensembles (`finitefree.ensembles`)
  • Matrix Samplers: Dense random matrices for GOE (orthogonal invariance, $\beta=1$), GUE (unitary invariance, $\beta=2$), and GSE (symplectic invariance, $\beta=4$). Here $O(d)$ denotes the orthogonal group, not a runtime bound.
  • Empirical Validations: Computes theoretical expected characteristic polynomials $\mathbb{E}[\det(xI - M)]$ matching explicit orthogonal sequences.
  • EmpiricalComparison: Compares all sampled characteristic coefficients, including deterministic ones, with Bonferroni-adjusted two-sided Student-t bands. alpha controls the nominal family significance level; coefficient scaling prevents variance overflow/underflow. Samples must be finite Hermitian matrices of the matching size, with verified eigenvalue pairs for doubled-size representations. See the API reference for sample assumptions and numerical tolerances.
Determinantal Point Processes (`finitefree.dpp`)
  • Kernels: Construct exact discrete DPP kernels and orthogonal polynomial kernels (e.g., Hermite/Laguerre) via the Christoffel-Darboux formula. Exact arguments retain their distinct values. Nearby distinct floating points use the finite basis sum to avoid a cancelled quotient; diagonal calls retain the derivative formula. An empty orthogonal basis gives the zero kernel. See the API reference for conditioning and timing scope.
  • Gap Probabilities & Observables: Evaluate exact discrete gap probabilities and approximate continuous Fredholm determinants via Nyström discretization, plus exact $k$-point correlation functions.
  • HKPV Sampler: Sample real symmetric DPP correlation kernels using floating-point spectral decomposition and Gram-Schmidt projections. Nonprojection kernels use Bernoulli eigenvector selection. Matrix shape, finiteness, symmetry and spectrum in $[0,1]$ are validated with $10^{-10}$ absolute roundoff tolerance.

Installation

Install this release with python -m pip install finitefree==0.2.0. The package and the API contracts described here require Python 3.10 or later.

Source installations use hatchling and hatch-cython to compile modular_fast.pyx through the PEP 517 build backend. A compatible prebuilt wheel does not require a local C compiler.

Requirements

  • Python: >=3.10; CI targets CPython 3.10–3.13 on Linux, macOS and Windows, with a separate Python 3.10 minimum-dependency job. Release checks cover the tagged commit.
  • Source builds: a working C compiler (gcc, clang, or the matching Windows MSVC toolchain). python-flint source builds additionally need FLINT/GMP/MPFR and their headers; prefer its compatible wheels when available.
  • Runtime dependencies: numpy>=1.24, sympy>=1.12, python-flint>=0.9.0, scipy>=1.10. FLINT 0.9 supplies the rational multivariate API; the former Python 3.9 / FLINT 0.6 minimum lacks that API. See the compatibility change.

Setup Instructions

  1. Clone the development repository and initialize a virtual environment:
    git clone https://github.com/jontb/FiniteFree.git
    cd FiniteFree
    python -m venv .venv
    source .venv/bin/activate
    
    On Windows PowerShell, activate with .venv\Scripts\Activate.ps1.
  2. Install the package locally:
    • Standard Install:
      python -m pip install .
      
    • Development / Testing Install (dev tools include pytest, Ruff and mypy):
      python -m pip install -e ".[dev]"
      

See development instructions for the in-place Cython build, compiled/fallback tests, installed-wheel checks and documentation dependencies. Optional Matplotlib/Pillow enable plotting and visual generation. CuPy is only attempted by the parallel generic root path and UnitaryPolynomial(...).evaluate_roots_float64(gpu=True); these paths can fall back to CPU and do not promise GPU acceleration for recurrence-based roots.

Note on Arbitrary-Precision Dependency: While python-flint >= 0.9.0 acts as the primary computational engine for strict real and complex root isolation, the user API does not require passing flint.fmpq_poly or specialized objects directly. Standard Python lists and NumPy arrays are automatically cast internally to arbitrary-precision environments where necessary.

Usage Guide

1. Polynomial Representation & Transformations

You can construct polynomials exactly from sequences of rational coefficients and evaluate their roots using numerical eigensolvers or Arb isolation.

from finitefree.core import RealRootedPolynomial
import sympy as sp

# Initialize exactly via rational/integer coefficients: (x - 1)(x - 2) = x^2 - 3x + 2
p = RealRootedPolynomial([1, -3, 2])

# Dilate, shift, and take positive integer root powers exactly
p_dilated = p.dilation(2)             # x^2 - 6x + 8 (roots scaled by 2)
p_shifted = p.shift(1)                # (x - 2)(x - 3) = x^2 - 5x + 6 (roots + 1)
p_powered = p.power(2)                # (x - 1)(x - 4) = x^2 - 5x + 4 (roots squared)
p_reversed = p.reversed_polynomial()  # x^2 - 1.5x + 0.5 (reciprocal roots)

# Domain properties use coefficient signs after real-rootedness verification
print(p.has_non_negative_roots)       # True
print(p.has_strictly_positive_roots)  # True

# Perform certified complex interval root isolation (Arb)
roots = p.evaluate_roots_float64(exact=True)
print(roots)  # [1.0, 2.0]

# Use stable numerical roots for asymptotic comparisons of known families
from finitefree import gue_expected_poly
gue_roots = gue_expected_poly(100).evaluate_roots_float64(exact=False)
assert len(gue_roots) == 100
2. Finite Free Convolutions

Convolutions combine polynomial coefficients exactly. Additive convolution preserves real-rootedness; multiplicative convolution does so when one real-rooted input has non-negative roots. Formal coefficient formulas can also produce polynomials with complex roots, so reconstructed outputs are verified lazily.

from finitefree.core import RealRootedPolynomial
from finitefree.convolutions import symmetric_additive, asymmetric_additive, multiplicative
import sympy as sp

# Instantiate two real-rooted polynomials of degree d=2
p = RealRootedPolynomial([1, -3, 2])  # roots: 1, 2
q = RealRootedPolynomial([1, 0, -4])  # roots: -2, 2

# Symmetric Additive Convolution (p [+]_d q)
res_add = symmetric_additive(p, q, d=2)
print(res_add.coeffs)  # [1, -3, -2]

# Asymmetric Additive Convolution (p [u]_d q), after dilating each input by 1/2
res_asym = asymmetric_additive(p, q, weights=[sp.Rational(1, 2), sp.Rational(1, 2)], d=2)
print(res_asym.coeffs)

# Multiplicative Convolution (p [*]_d q)
res_mult = multiplicative(p, q, d=2)
print(res_mult.coeffs)  # Hadamard-like projection
3. Finite Transforms & Free Cumulants

Finite free probability transforms compute expected spectral properties and algebraic limits without combinatorial partition search.

from finitefree import FiniteRTransform, FiniteTTransform, SymmetricFiniteSTransform
from finitefree.orthogonal import laguerre_polynomial

# Initialize a polynomial (must be non-negative rooted for T-transform)
poly = laguerre_polynomial(n=3, alpha=1)

# Compute Finite Free Cumulants exactly via generating function recurrences (O(d^2))
# Additivity holds: kappa(p [+] q) = kappa(p) + kappa(q)
r_transform = FiniteRTransform(poly)
cumulant_3 = r_transform[2]
print(f"3rd Finite Free Cumulant: {cumulant_3}")

# Map inverse limit points using the Fujie-Ueda Finite T-Transform
t_transform = FiniteTTransform(poly)
print(t_transform(0.5))

Finite free cumulants use the normalization in Definition 2.14 of Arizmendi et al., $\kappa_n^{(d)}=(-d)^{n-1}c_n/(n-1)!$, where $c_n$ is the classical cumulant of the normalized coefficient sequence. additive_power uses the matching inverse. Orders above the ambient dimension return zero as an API convention; they are outside the finite cumulant definition.

normalized_coeffs(d) divides out the leading coefficient before applying the binomial normalization, so e_0=1 even when a polynomial was stored with monic=False. Finite cumulants and coefficient convolutions therefore depend on the roots rather than a scalar multiple of the polynomial. The stored coefficients and polynomial evaluations retain that scalar; reconstructed/convolved results are monic. Larger ambient dimensions pad roots with zeros.

FiniteRTransform(..., numerical=True, prec=256) centers the requested coefficient prefix in rational arithmetic, computes the recurrence with Arb, and restores the first cumulant (the mean). This avoids cancellation from large translations without shifting the entire polynomial or computing all cumulants exactly. Working arithmetic uses the requested precision, but outputs are Python floats rather than arbitrary-precision values or error bounds. High orders can require more precision, and float range/rounding still apply.

FiniteTTransform requires positive degree and non-negative roots, and evaluates a right-continuous step function for finite real inputs in $(0,1)$. Rational inputs retain their exact position, including values arbitrarily close to an endpoint. Floats select intervals using their stored binary values; use sympy.Rational(k, d) when an exact grid boundary is intended.

Reconstruction from normalized coefficients produces a formal polynomial with lazy real-rootedness validation. Root extraction and positive-root domain checks reject complex-rooted inputs; formal coefficient convolutions remain available.

Jacobi and Laguerre polynomials constructed outside their orthogonality domains are also validated lazily. Formal construction remains available, but a root request rejects a complex-rooted result such as laguerre_polynomial(2, -3).

4. Orthogonal Families & Ensembles

FiniteFree builds classical and symmetric orthogonal systems exactly via optimized recursive relations.

from finitefree.orthogonal import (
    jacobi_polynomial,
    hahn_polynomial,
    jack_polynomial,
    hermite_polynomial,
)
from finitefree.ensembles import sample_gue, gue_expected_poly

# Construct Jacobi, Hahn, and Hermite recurrence relations exactly over Q
h_prob = hermite_polynomial(n=4, physicist=False)  # Probabilist Hermite He_4
jacobi = jacobi_polynomial(n=3, alpha=1, beta=1)     # Jacobi P_3^(1, 1)
hahn   = hahn_polynomial(n=2, alpha=1, beta=1, N=5)  # Hahn Q_2

# High-performance multivariate Jack polynomials using sparse exponent dicts
jack = jack_polynomial(m=3, partition=[2, 1], alpha=2)
print(jack.expr)

# Compare random matrix characteristic polynomials with theoretical sequences
M = sample_gue(d=4)
expected_poly = gue_expected_poly(d=4)
print(expected_poly.coeffs)
5. Multivariate Matrix Pencils

Evaluate homogeneous determinants $\det(x_1 A_1 + \dots + x_m A_m)$ exactly via modular matrix interpolation. General rational polynomials also support explicit context changes and batched numerical derivatives:

import numpy as np
import sympy as sp
from finitefree.multivariate import MultivariatePolynomial

x, y, u, v = sp.symbols("x y u v")
p = MultivariatePolynomial(x**2 + 3*x*y + y**2, [x, y])
assert p.reorder_variables([y, x]).evaluate([2, 1]) == p.evaluate([1, 2])
q = p.substitute({x: u+v, y: u-v}, variables=[u, v])
assert q.expr == 5*u**2 - v**2
np.testing.assert_array_equal(q.gradient_float64([[2, 1], [0, 0]]), [[20, -2], [0, 0]])
np.testing.assert_array_equal(q.hessian_float64([0, 0]), [[10, 0], [0, -2]])

Matrix-pencil constructors copy integer/rational entries before preparing a separate float64 numerical view. Characteristic polynomials, rational SLP derivatives and multivariate determinants use the copied values, including integers above $2^{53}$. Float inputs preserve their supplied binary values; precision lost before construction cannot be recovered. Matrices must be square, share one shape, contain finite real rational values that fit the finite numerical view, and be symmetric on the supplied values for SymmetricMatrixPencil. Construct a new pencil to change its entries.

from finitefree.hyperbolic import SymmetricMatrixPencil
from finitefree.multivariate import MultivariatePolynomial
import numpy as np

# Define a matrix pencil
A1 = np.eye(3)
A2 = np.array([[0, 1, 0], [1, 0, 1], [0, 1, 0]])
pencil = SymmetricMatrixPencil([A1, A2])

# Construct the multivariate polynomial exactly using modular determinants and CRT
poly_crt = MultivariatePolynomial.from_symmetric_matrix_pencil_interpolated(pencil)
print(poly_crt.expr)

# Or use sparse discovery with deterministic verification and exact fallback
poly_sparse = MultivariatePolynomial.from_symmetric_matrix_pencil_sparse(pencil)
print(poly_sparse.expr)
6. Determinantal Point Processes (DPPs)

Construct correlation kernels, evaluate k-point joint intensities exactly, compute Fredholm determinant gap probabilities, and sample point configurations numerically.

from finitefree import (
    DiscreteFiniteKernel,
    OrthogonalPolynomialKernel,
    hermite_polynomial,
    gap_probability_discrete,
    gap_probability_continuous,
    sample_discrete,
)
import numpy as np
import math
import sympy as sp

# --- 1. Discrete DPP Kernel & Exact Gap Probability ---
# 3x3 nonprojection correlation kernel with eigenvalues 1, 1, 1/3
K_mat = [
    [sp.Rational(2, 3), sp.Rational(1, 3), 0],
    [sp.Rational(1, 3), sp.Rational(2, 3), 0],
    [0, 0, 1],
]
discrete_kernel = DiscreteFiniteKernel(K_mat)

# Exact gap probability on states {0, 1}: det(I - K_{[0,1]})
prob_discrete = gap_probability_discrete(discrete_kernel, [0, 1])
print(f"Exact Gap Probability on {{0,1}}: {prob_discrete}")  # 0

# --- 2. Orthogonal Polynomial Kernel & CD Formula ---
# Probabilist's Hermite polynomials for GUE / Wigner ensemble DPP
norms = [1, 1, 2] # h_0, h_1, h_2
polys = [
    hermite_polynomial(0, physicist=False),
    hermite_polynomial(1, physicist=False),
    hermite_polynomial(2, physicist=False),
    hermite_polynomial(3, physicist=False),
]
hermite_kernel = OrthogonalPolynomialKernel(polys, norms)

# Evaluate kernel off-diagonal and diagonal (CD derivatives)
print(f"CD Kernel K(0.5, 1.2): {hermite_kernel(0.5, 1.2)}")
print(f"CD Kernel Diagonal K(0.5, 0.5): {hermite_kernel(0.5, 0.5)}")

# --- 3. Continuous Fredholm Determinant ---
# Hermite orthogonal polynomial weight function
def weight_func(x):
    return math.exp(-x**2 / 2.0) / math.sqrt(2.0 * math.pi)

gap_prob = gap_probability_continuous(hermite_kernel, -1.0, 1.0, n_points=20, weight_func=weight_func)
print(f"Continuous Gap Probability over [-1.0, 1.0]: {gap_prob}")

# --- 4. HKPV Discrete Sampling ---
sampled_states = sample_discrete(discrete_kernel, state_space=[0, 1, 2])
print(f"HKPV Sampled point configuration: {sampled_states}")

Testing Protocol

Polynomial construction copies caller inputs, and coeffs returns an independent editable array. Normalized coefficient arrays and cached real/unitary roots are read-only; call .copy() before editing them. This preserves verification and cached results when caller data changes. See the ownership contract.

Linear root verification and extraction use the coefficient ratio, including numeric symbolic roots such as sqrt(2). Nonreal roots are rejected, unknown symbolic realness/signs remain uncertified, and nonnumeric or out-of-range numerical root requests fail explicitly. See real-rootedness.

Run the regression suites from the checkout:

PYTHONPATH=. python -m pytest --import-mode=importlib tests/ scripts/tests/

The development guide gives the complete lint, typing, compiled/fallback, wheel and strict docs commands. Edit README rather than its generated docs/index.md. The synchronizer expects single-level <details> blocks with opening, summary and closing tags on separate lines; malformed input aborts before changing the index. Documented Python blocks run independently through scripts/check_readme_examples.py. The worked tutorial uses current public APIs.

  • test_core.py: Real-rootedness verification, divide-and-conquer root synthesis, and sequence extractions.
  • test_transformations.py: Exact algebraic variable scaling (dilation), shifts, powers, and reciprocal-root polynomial transformations.
  • test_convolutions.py: Additive and multiplicative explicit formulas and hyperbolic geometry preservation.
  • test_transforms.py: Exact recursive generating functions and high-order finite free cumulant strict additivity ($\kappa_n^{(d)}$).
  • test_empirical.py: Expected characteristic polynomial identities for GOE ($\beta=1$), GUE ($\beta=2$), and GSE ($\beta=4$) random matrix ensembles using the ensembles module.
  • test_hyperbolic.py: Multivariate homogeneous polynomials, CRT grid interpolations, sparse FLINT arrays, and Jacobi SLP evaluations.
  • test_orthogonal.py: Exact hypergeometric and multivariate orthogonal polynomial families (Jacobi, Hahn, Jack).
  • test_numerical_roots.py: Independent 192-bit Arb comparisons, tiny positive hard-edge roots, affine scales, solver fallback and cache behavior.
  • test_transform_stability.py: Shifted Hermite/Wishart cumulants, tiny spreads beneath large translations, ambient dimensions, exact T-transform interval boundaries and the Marchenko–Pastur diagonal limit.
  • test_dpp.py: Correlation-kernel validation, state-space ordering and seeded projection/nonprojection sampling laws.

The benchmark commands compare numerical roots against independently isolated Arb roots and coefficients against analytic family identities. Scaled root error means $\max_i|\hat\lambda_i-\lambda_i|/\max(1,\max_i|\lambda_i|)$. Construction, first extraction and cached latency have separate timing scopes. Timings are case-specific measurements, not CI thresholds or accuracy guarantees.

Computational Complexity & Architecture

FiniteFree is architected to bypass the combinatorial bottlenecks inherent in high-order differential operators, combinatorial partition counts, and eager root validation. It achieves this by executing convolutions, algebraic transforms, and matrix interpolations directly on polynomial coefficient sequences in C, leveraging python-flint's arbitrary-precision integer/rational arithmetic.

Complexity Matrix of Key Operations

Operation Mathematical Method Time Complexity Arithmetic Space
Polynomial Multiplication FLINT backend chosen for degrees and coefficient sizes $M(d)$ backend-dependent arithmetic work Exact $\mathbb{Q}$
Root Reconstruction (from_roots) Balanced product tree Typically $O(M(d)\log d)$ arithmetic work Exact $\mathbb{Q}$
Symmetric Additive Convolution ($\boxplus_d$) EGF coefficient multiplication One multiplication plus $O(d)$ coefficient updates Exact $\mathbb{Q}$
Asymmetric Additive Convolution ($\uplus_d$) Cauchy product of scaled sequences One multiplication plus $O(d)$ coefficient updates Exact $\mathbb{Q}$
Multiplicative Convolution ($\boxtimes_d$) Pointwise multiplication of normalized coefficients $O(d)$ Exact $\mathbb{Q}$
Sturm Real-Rootedness Verification Square-free factorization and remainder sequences Factor degree, coefficient size and backend dependent Exact $\mathbb{Q}$
High-Precision Root Isolation (Arb) Adaptive complex ball arithmetic Degree, conditioning and precision dependent Interval $\mathbb{C}$
Orthogonal-Family Root Approximation Symmetric tridiagonal eigenvalues, $O(d)$ matrix storage $O(d^2)$ Float $\mathbb{R}$
General Root Approximation Dense balanced companion matrix eigenvalues $O(d^3)$ Float $\mathbb{C}$
Finite R-Transform (Cumulants) Generating function recurrence relation $O(d^2)$ Exact $\mathbb{Q}$

These count arithmetic operations rather than bit complexity. Exact arithmetic becomes more expensive as numerator/denominator sizes grow. An order-$n$ R-transform uses $O(n^2)$ updates, including rational centering in the numerical path.

Low-order R-transform requests extract only the needed normalized-coefficient prefix. A polynomial retains its largest native-dimension prefix separately from complete coefficient caches; other ambient dimensions use their exact binomial normalization without adding persistent cache entries.

Architectural Design Principles

1. Exact-to-Approximate Hybrid Pipeline

Rational coefficient operations use GMP/FLINT (fmpq_poly). Supplied Python/NumPy floats preserve their own stored binary ratios, including extended precision when available. Symbolic coefficients use a separate SymPy path with more limited geometric certification. Noninteger root powers reconstruct from numerical roots, while evaluation at floating arguments, root solvers, matrix samplers and continuous Fredholm determinants use floating arithmetic. Exact storage does not make those numerical results exact.

For asymptotic root comparisons, known orthogonal families carry their three-term recurrence alongside the exact polynomial. The numerical path computes parameter differences before float conversion and scales the Jacobi matrix without centering, preserving tiny positive hard-edge roots. Affine shifts are applied after solving. This follows the Jacobi-matrix characterization of zeros and classical recurrences using SciPy's tridiagonal eigenvalue solver. Arbitrary convolutions, including compound-Wishart lognormal examples, do not inherit unproven recurrence metadata and retain the general solver/reference path. Nonfinite or underflowed recurrences fall back; extreme affine shifts can still lose differences that float64 cannot represent.

When domain validation uses Arb, it retains the isolated roots for subsequent evaluation. Generic root calls can therefore return the validation result directly. An exact=True request at a higher working precision refreshes the root cache; exact=False can reuse any available root result. Small-degree generic calls still use exact Sturm validation and may be dominated by coefficient growth. scripts/benchmark_compound_roots.py measures first public root calls, including validation, against independent higher-precision Arb roots, with construction and repeat-cache latency reported separately.

Numerical root extraction rejects nonfinite final results before caching. Exact construction and real-rootedness certification can still work beyond the float64 range. Tiny roots can underflow to zero and distinct roots can round to the same float. Generic companion/Aberth inputs divide out nonmonic leading coefficients exactly before conversion; ordinary evaluations preserve the original scalar and can still overflow.

2. Algebraic Domain Verification (Sturm PRS)

The library verifies real-rootedness lazily. For total degrees through 30, square-free factors below degree 15 use exact Sturm sequences; if any factor has degree at least 15, certified Arb isolation is tried first. Exact Sturm/subresultant PRS remains a fallback if Arb cannot obtain a certificate. Total degrees above 30 use Arb directly. An imaginary ball merely containing zero is not a certificate; complex roots raise ValueError, and inability to certify raises RuntimeError. An explicit assume_real_rooted=True trusts the caller and bypasses verification.

3. Partition-Free Cumulant Recurrences

Rather than explicitly constructing combinatorial structures (such as enumerating non-crossing partitions to calculate free cumulants), FiniteFree solves the finite $R$-transform and $S$-transform relationships using direct generating function recurrences. By rewriting the underlying algebraic equations into coefficient-level recurrence relations, the combinatorial explosion is reduced to a deterministic $O(d^2)$ exact rational arithmetic sweep.

4. High-Performance Multivariate Matrix Pencil Interpolation

To evaluate multivariate pencils of the form $\det(x_1 A_1 + \dots + x_m A_m)$ and compute exact characteristic polynomials without symbolic expansion blowups, the library avoids symbolic determinant bottlenecks via the following complementary strategies:

  • Straight-Line Programs: Generic SLP gradients use a reverse pass through scalar operations. Determinant-pencil gradients and Hessians use Jacobi's matrix identities. Exact derivatives reject singular evaluated matrices; numerical inverse/pseudoinverse formulas remain conditioning-dependent.
  • Exact Rational Interpolation: Computes characteristic polynomials of matrix pencils via exact rational interpolation over $\mathbb{Q}[t]$.
  • Cython-Accelerated Modular Determinants: Matrix evaluations are mapped to machine-precision finite fields $\mathbb{F}_p$ for fast C-level Gaussian elimination.
  • Chinese Remainder Theorem (CRT) Reconstruction: Coefficients computed over multiple distinct prime fields are reconstructed back to exact large integers/rationals over $\mathbb{Q}$.
  • Zippel's Sparse Polynomial Interpolation: Randomized discovery can reduce modular evaluation costs for sparse pencils. A bounded exact Kronecker encoding independently verifies complete support and repairs failed discovery; its integer size can still grow exponentially with the variable count.

References

The theoretical architecture and exact computational operators implemented in FiniteFree are grounded in the following foundational literature across finite free probability, classical asymptotic free probability, and random matrix theory.

Finite Free Probability

  • Arizmendi, O., Fujie, K., Perales, D., & Ueda, Y. (2026). S-transform in finite free probability. Advances in Mathematics, 489, 110803.
  • Marcus, A., Spielman, D. A., & Srivastava, N. (2015). Interlacing families I: Bipartite Ramanujan graphs of all degrees. Annals of Mathematics, 182(1), 307–325.
  • Marcus, A., Spielman, D. A., & Srivastava, N. (2022). Finite free convolutions of polynomials. Probability Theory and Related Fields, 182(3–4), 807–848.

Classical Free Probability & Asymptotic Limits

  • Nica, A., & Speicher, R. (2006). Lectures on the Combinatorics of Free Probability. Cambridge University Press.
  • Tucci, G. H. (2010). Limit laws for geometric means of free random variables. Indiana University Mathematics Journal, 59(1), 1–13.
  • Voiculescu, D. V., Dykema, K. J., & Nica, A. (1992). Free Random Variables. American Mathematical Society.

Orthogonal Polynomials & Random Matrix Ensembles

  • Anderson, G. W., Guionnet, A., & Zeitouni, O. (2010). An Introduction to Random Matrices. Cambridge University Press.
  • Dumitriu, I., & Edelman, A. (2002). Matrix models for beta ensembles. Journal of Mathematical Physics, 43(11), 5830–5847.
  • Forrester, P. J. (2010). Log-Gases and Random Matrices (LMS-34). Princeton University Press.
  • Macdonald, I. G. (1995). Symmetric Functions and Hall Polynomials (2nd ed.). Oxford University Press.
  • Mehta, M. L. (2004). Random Matrices (3rd ed.). Elsevier.
  • Szegő, G. (1975). Orthogonal Polynomials (4th ed., Vol. 23). American Mathematical Society, Colloquium Publications.

Metadata

Release files for finitefree 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for finitefree 0.2.0
File Size Uploaded
finitefree-0.2.0.tar.gz 12.8 MB Details

Built distributions (wheels)

Table of built distributions (wheels) for finitefree 0.2.0
File
finitefree-0.2.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
finitefree-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl CPython 3.13 CPython 3.13 Linux musl 1.2+ x86-64 Details
finitefree-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.17+ x86-64 Details
finitefree-0.2.0-cp313-cp313-macosx_11_0_arm64.whl CPython 3.13 CPython 3.13 macOS 11.0+ ARM64 Details
finitefree-0.2.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
finitefree-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl CPython 3.12 CPython 3.12 Linux musl 1.2+ x86-64 Details
finitefree-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.17+ x86-64 Details
finitefree-0.2.0-cp312-cp312-macosx_11_0_arm64.whl CPython 3.12 CPython 3.12 macOS 11.0+ ARM64 Details
finitefree-0.2.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
finitefree-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl CPython 3.11 CPython 3.11 Linux musl 1.2+ x86-64 Details
finitefree-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.17+ x86-64 Details
finitefree-0.2.0-cp311-cp311-macosx_11_0_arm64.whl CPython 3.11 CPython 3.11 macOS 11.0+ ARM64 Details
finitefree-0.2.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
finitefree-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl CPython 3.10 CPython 3.10 Linux musl 1.2+ x86-64 Details
finitefree-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 CPython 3.10 Linux glibc 2.17+ x86-64 Details
finitefree-0.2.0-cp310-cp310-macosx_11_0_arm64.whl CPython 3.10 CPython 3.10 macOS 11.0+ ARM64 Details

Total release size: 18.7 MB

Release files / finitefree-0.2.0.tar.gz

Download URL finitefree-0.2.0.tar.gz
Size 12.8 MB
Tags Source
SHA-256 checksum
How to use checksums
42c14fbb2293da0ce0dc524956060d33ba2a85548fad083af778d4273af4633c
BLAKE2b-256 checksum
How to use checksums
ddc23c6e2b2480fe6e5bd1aab4cafcdf255e42cdfe62827ad250ae58426c0fa5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp313-cp313-win_amd64.whl

Download URL finitefree-0.2.0-cp313-cp313-win_amd64.whl
Size 156.6 kB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
740d01abb5d8650731ff00d4ac3df6bff114a605de552658e378e093f6032b4f
BLAKE2b-256 checksum
How to use checksums
9de86c9bfcbd465713673a976ec5da0f25a80dc626c8fe3633b8ba19ce6f6148
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl

Download URL finitefree-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl
Size 583.9 kB
Tags CPython 3.13 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
e8f79886f6e505c7df055cc5ebea912dc8c37a6e5a54d42f80b145e929d1feef
BLAKE2b-256 checksum
How to use checksums
c087bb995c766927242ea54fa28bb3d256fbdb09af90a54b9dc4cec13abd4e2e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL finitefree-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 598.4 kB
Tags CPython 3.13 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
9a271e8e92d52dbf76519c121b1d1ff0a811be0680921dd732f27c2681acb1d1
BLAKE2b-256 checksum
How to use checksums
239e32102a10fbebeba1e734c3b0994cb91265b1ae75d90a6283d132d4e18b22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp313-cp313-macosx_11_0_arm64.whl

Download URL finitefree-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Size 168.9 kB
Tags CPython 3.13 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
1539c956cdc0f2dda84a04607320a90381dddf2c6157fff0517d9854622d9455
BLAKE2b-256 checksum
How to use checksums
b30fa8a98cc6c1d4789e2e5c3966aa56d608718c9de12ae8789413418274945c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp312-cp312-win_amd64.whl

Download URL finitefree-0.2.0-cp312-cp312-win_amd64.whl
Size 156.9 kB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
8ce50c8a62a6350e77e0cd28e345ab5a4264d5d7e94a1f0f335d0627c719f7ef
BLAKE2b-256 checksum
How to use checksums
5cbca60c508de49a1c2ba5b6350e0c6eb8cbfb7440ce4b340e12cea4c3a4e785
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl

Download URL finitefree-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl
Size 591.3 kB
Tags CPython 3.12 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
7382fa2ead39736c29372dc47b29a06ccaefa4f68fba3bd72c11fa368e85e7bd
BLAKE2b-256 checksum
How to use checksums
c775b84b54226f8edeadc1dc9e55c5e2e5de52aa8f596a604a8697cd082ac6bd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL finitefree-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 603.3 kB
Tags CPython 3.12 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
0efd33f57b59970fb593f50c06de362cc95fd2a58f807852fa2505b1270dbf8d
BLAKE2b-256 checksum
How to use checksums
9de6cbf92611e818fa8a9d61f6ac0bf1bcfc05bc0e617fd8029ba039c393acd4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp312-cp312-macosx_11_0_arm64.whl

Download URL finitefree-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Size 168.8 kB
Tags CPython 3.12 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
3de39587275e4b889424b3261360091736b77af646c47239f26402e7477f9396
BLAKE2b-256 checksum
How to use checksums
cc64fed2782ae977328ede39df52bec7e6e18833bc622a95f5498f175204c097
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp311-cp311-win_amd64.whl

Download URL finitefree-0.2.0-cp311-cp311-win_amd64.whl
Size 157.4 kB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
c031f8b62b7b379bc5d971450500ab3370a8a789dad078c9759e87786fe17f93
BLAKE2b-256 checksum
How to use checksums
1b40bd4da9bf6b97b885d084278c7fbe12ad4c5014f4d72d81e0f93f0921bc4b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl

Download URL finitefree-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
Size 563.3 kB
Tags CPython 3.11 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
61093d4d657a05dc5f35e8a240faf48fd90357866ec10509f913cb1aaac86fe2
BLAKE2b-256 checksum
How to use checksums
d16e8684efc9311f929e89c4e4b97e5d16deb1e68e40d94544a7a89a99a73ff4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL finitefree-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 571.6 kB
Tags CPython 3.11 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
ab93aa09a2f300b2b570e20a95433e63828054c36677d7a1ba333c4f7da5ea78
BLAKE2b-256 checksum
How to use checksums
493f1a1a764abd6184064807f2592cc459b697c5681ca058047623624edc0c50
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp311-cp311-macosx_11_0_arm64.whl

Download URL finitefree-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Size 168.2 kB
Tags CPython 3.11 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
875dbab37de4c630ebf86881e728fff13536c617410e2c9e8a20f99c37d5c4b8
BLAKE2b-256 checksum
How to use checksums
9bed0b770c6cfd8eb5b3bc3bce95326050b547ae7bd580033f01af748d308b95
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp310-cp310-win_amd64.whl

Download URL finitefree-0.2.0-cp310-cp310-win_amd64.whl
Size 157.9 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
b784e2bf633e930eab8c560805537abf03fd921c023712b481bda3f2f3f58b0f
BLAKE2b-256 checksum
How to use checksums
62ffdcf8bda8ee426f659b57d92608b0a17ec6be8c8131959ebcc488965b8343
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl

Download URL finitefree-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl
Size 542.9 kB
Tags CPython 3.10 Linux musl 1.2+ x86-64
SHA-256 checksum
How to use checksums
88dfc23b5b524e595d2c252c07632ac0bca513478e2571b722d8f9b51bac4742
BLAKE2b-256 checksum
How to use checksums
fba6392e7add1ba5efa9baf256987a8105fefa9e3c7b8c249e9a386d3c9acaf7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL finitefree-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 548.0 kB
Tags CPython 3.10 Linux glibc 2.17+ x86-64
SHA-256 checksum
How to use checksums
976d40820a8782ccbc1f5f61853db38d6c59351db987b94b80a3e903f2f42bdf
BLAKE2b-256 checksum
How to use checksums
36c7a49539727098dc88f52ef300861badc553e4781c9648c901cb3268f698f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release files / finitefree-0.2.0-cp310-cp310-macosx_11_0_arm64.whl

Download URL finitefree-0.2.0-cp310-cp310-macosx_11_0_arm64.whl
Size 169.2 kB
Tags CPython 3.10 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ed2d51c506681b0724c0ceb2a1d4afacbbe7f3bd5201cc22201f3e222ac146da
BLAKE2b-256 checksum
How to use checksums
2d7232a10e9819357471e29b024f7a462d2dea26cd88d09834a4892fdfa3b4cf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

17 release files

0.1.0

21 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page