Expand description
§Ellip - Elliptic integrals for Rust
Ellip is a pure-Rust implementation of elliptic integrals.
This means there is no dependence on C++ libraries. Ellip also provides less common
functions like Bulirsch’s cel and el. Some applications of elliptic integrals include
computing the lengths of plane curves, magnetic field from
magnets of various shapes (e.g., cylindrical),
astrophysics, and string theory.
Use Ellip-Rayon to parallelize and improve performance for large inputs. Ellip is also available for Python via EllipPy.
§Example
Calculating the perimeter of an ellipse.
use ellip::*;
fn ellipse_perimeter(a: f64, b: f64) -> Result<f64, StrErr> {
Ok(8.0 * elliprg(0.0, a * a, b * b)?)
}
// Example: ellipse with semi-major axis 5, semi-minor axis 3
println!("{}", ellipse_perimeter(5.0, 3.0).unwrap()); // 25.526998863398124§Features
§Legendre’s complete integrals
- ellipk: Complete elliptic integral of the first kind (K).
- ellipe: Complete elliptic integral of the second kind (E).
- ellippi: Complete elliptic integral of the third kind (Π).
- ellipd: Complete elliptic integral of Legendre’s type (D).
§Legendre’s incomplete integrals
- ellipf: Incomplete elliptic integral of the first kind (F).
- ellipeinc: Incomplete elliptic integral of the second kind (E).
- ellippiinc: Incomplete elliptic integral of the third kind (Π).
- ellippiinc_bulirsch: Faster implementation of ellippiinc.
- ellipdinc: Incomplete elliptic integral of Legendre’s type (D).
§Bulirsch’s integrals
- cel: General complete elliptic integral in Bulirsch’s form.
- cel1: Complete elliptic integral of the first kind in Bulirsch’s form.
- cel2: Complete elliptic integral of the second kind in Bulirsch’s form.
- el1: Incomplete elliptic integral of the first kind in Bulirsch’s form.
- el2: Incomplete elliptic integral of the second kind in Bulirsch’s form.
- el3: Incomplete elliptic integral of the third kind in Bulirsch’s form.
§Carlson’s symmetric integrals
- elliprf: Symmetric elliptic integral of the first kind (RF).
- elliprg: Symmetric elliptic integral of the second kind (RG).
- elliprj: Symmetric elliptic integral of the third kind (RJ).
- elliprc: Degenerate elliptic integral of RF (RC).
- elliprd: Degenerate elliptic integral of the third kind (RD).
§Miscellaneous functions
- jacobi_zeta: Jacobi Zeta function (Z).
- heuman_lambda: Heuman Lambda function (Λ0).
§Feature Flags
unstable: Enable unstable or untested features that might be changed without notice in the future.test_force_fail: Used for testing only. Force tests to reach code unreachable under normal circumstances.
§Testing
The function results are compared with Boost Math test data and Wolfram Engine test data. The accuracy report and the test data along with the test generation scripts can be found here.
§Acknowledgment
Ellip is derived from multiple mathematic libraries. We thank the opensource contributors for making mathematic libraries free for all. Following are the main original works used in the development of Ellip. Detailed credits are available in the source code.
References for original implementations are:
- NIST Digital Library, Chapter 19: Elliptic Integrals (Carlson, 2025).
- Numerical calculation of elliptic integrals and elliptic functions I (Bulirsch, 1965), II (Bulirsch, 1965), and III (Bulirsch, 1969).
- NIST Digital Library, Chapter 22 Jacobian Elliptic Functions (Reinhardt and Walker, 2025).
Unicode-style mathematical notation are created using Diagon.
§Citation
The paper describing Ellip is published in the Journal of Open Source Software. If Ellip is helpful to your work, please consider citing it:
Pornsiriprasert, S., (2026). Ellip: An Elliptic Integral Library for Rust. Journal of Open Source Software, 11(118), 9386, https://doi.org/10.21105/joss.09386Bibtex format:
@article{Pornsiriprasert2026,
doi = {10.21105/joss.09386},
url = {https://doi.org/10.21105/joss.09386},
year = {2026},
publisher = {The Open Journal},
volume = {11}, number = {118}, pages = {9386},
author = {Pornsiriprasert, Sira},
title = {Ellip: An Elliptic Integral Library for Rust},
journal = {Journal of Open Source Software} }Re-exports§
pub use legendre::ellipd;pub use legendre::ellipe;pub use legendre::ellipk;pub use legendre::ellippi;pub use legendre::ellipdinc;pub use legendre::ellipeinc;pub use legendre::ellipf;pub use legendre::ellippiinc;pub use legendre::ellippiinc_bulirsch;pub use bulirsch::cel;pub use bulirsch::cel1;pub use bulirsch::cel2;pub use bulirsch::el1;pub use bulirsch::el2;pub use bulirsch::el3;pub use carlson::elliprc;pub use carlson::elliprd;pub use carlson::elliprf;pub use carlson::elliprg;pub use carlson::elliprj;pub use misc::heuman_lambda;pub use misc::jacobi_zeta;
Modules§
- bulirsch
- Elliptic integral functions in Bulirsch’s form.
- carlson
- Elliptic integral functions in Carlson’s form.
- legendre
- Elliptic integral functions in Legendre’s form.
- misc
- Functions related to elliptic integrals
- util
- Utility functions like assert_close.
Type Aliases§
- StrErr
- Static error str