
Security News
Software Engineering Daily Podcast: Feross on AI, Open Source, and Supply Chain Risk
Socket CEO Feross Aboukhadijeh joins Software Engineering Daily to discuss modern software supply chain attacks and rising AI-driven security risks.
python-flint
Advanced tools
Python extension module wrapping FLINT (Fast Library for Number Theory) and Arb (arbitrary-precision ball arithmetic). Features:
Documentation: https://python-flint.readthedocs.io/en/latest/
Repository: https://github.com/flintlib/python-flint/
Author: Fredrik Johansson fredrik.johansson@gmail.com
Currently python-flint supports CPython versions 3.11-3.14 and 3.14t (free-threaded) and provides binaries on PyPI for the following platforms:
For these platforms python-flint can be installed simply with pip
pip install python-flint
Alternatively python-flint can be installed using conda
conda install -c conda-forge python-flint
For other platforms or architectures installation needs to build from source. First install FLINT 3. Starting with python-flint 0.5.0 older versions of Flint such as 2.9 are not supported any more. Note that as of Flint 3 Arb no longer needs to be built separately as it is now merged into Flint.
As of e.g. Ubuntu 24.04 a new enough version of FLINT (at least version 3) can be installed from the Ubuntu repos like
sudo apt-get install libflint-dev
For older distros the version in the repos is too old and a newer version of FLINT needs to be built. See here for instructions on building FLINT:
A script that builds and installs FLINT on Ubuntu can be found here:
The latest release of Python-FLINT can then be built from source and installed using:
pip install --no-binary python-flint python-flint
Python-FLINT can also be installed from a git checkout or a source archive as follows:
pip install .
See the documentation for further notes on building and installing python-flint:
Import Python-FLINT:
>>> from flint import *
Number-theoretic functions:
>>> fmpz(1000).partitions_p()
24061467864032622473692149727991
>>> fmpq.bernoulli(64)
-106783830147866529886385444979142647942017/510
Polynomial arithmetic:
>>> a = fmpz_poly([1,2,3]); b = fmpz_poly([2,3,4]); a.gcd(a * b)
3*x^2 + 2*x + 1
>>> a = fmpz_poly(list(range(10001))); b = fmpz_poly(list(range(10000))); a.gcd(a * b).degree()
10000
>>> x = fmpz_poly([0,1]); ((1-x**2)*(1+x**3)**3*(1+x+2*x)).factor()
(-1, [(3*x + 1, 1), (x + (-1), 1), (x^2 + (-1)*x + 1, 3), (x + 1, 4)])
Matrix arithmetic:
>>> fmpz_mat([[1,1],[1,0]]) ** 10
[89, 55]
[55, 34]
>>> fmpq_mat.hilbert(10,10).det()
1/46206893947914691316295628839036278726983680000000000
Numerical evaluation:
>>> showgood(lambda: (arb.pi() * arb(163).sqrt()).exp() - 640320**3 - 744, dps=25)
-7.499274028018143111206461e-13
>>> showgood(lambda: (arb.pi() * 10**100 + arb(1)/1000).sin(), dps=25)
0.0009999998333333416666664683
Numerical integration:
>>> ctx.dps = 30
>>> acb.integral(lambda x, _: (-x**2).exp(), -100, 100) ** 2
[3.141592653589793238462643383 +/- 3.11e-28]
ZZ(1) etc rather than fmpz_poly([1, 2]).Generally each release of python-flint will be compatible with a range of
Python versions. Since python-flint 0.5.0 the minimum supported Flint version
is 3.0 and each release of python-flint supports all versions of Flint
>=3.0 available at the time of release.
Compatible versions:
| python-flint | Release date | CPython | FLINT | Cython |
|---|---|---|---|---|
0.8.0 | 29th Aug 2025 | 3.11-3.14 | 3.0-3.3 | 3.1 only |
0.7.0 | 16th Mar 2025 | 3.11-3.13 | 3.0-3.2 | 3.0.11-3.1.0a1 |
0.6.0 | 1st Feb 2024 | 3.9-3.12 | 3.0 only | 3.0 only |
The requirement for Cython 3.1 is only for CPython's free-threaded build. Otherwise Cython 3.0 is fine. As of python-flint 0.7.0, CPython 3.13 PEP 703 free-threaded (no-GIL) builds of python-flint are provided. In the the free-threaded build, mutating matrices or polynomials from multiple threads can lead to memory corruption. There are some other known issues with the free-threaded build so it should be considered experimental.
Contributors (0.8.0):
Notes (0.8.0):
Changes (0.8.0):
truncate, left_shift and right_shift methods to
fmpz_poly, fmpq_poly, nmod_poly, acb_poly, arb_poly
to match other univariate polynomial types. (RO)fmpz, fmpq, nmod, fmpz_mod,
fq_default, fmpz_poly, fmpq_poly, nmod_poly,
fmpz_mod_poly, fq_default_poly, fmpz_mpoly, fmpq_mpoly,
nmod_mpoly, fmpz_mod_mpoly, fmpz_series and fmpq_series
(about half of the codebase). (OB)arb.repr which now returns a Python representation that
round trips. (OB)fmpq constructor now accepts fmpq numerator and denominator
as input. (OB).prec attribute to series types fmpz_series, fmpq_series,
arb_series and acb_series. (OB)fmpz_poly, fmpq_poly and
nmod_poly. Now all univariate and polynomial types have the
resultant method except for fq_default_poly. (RDB)Contributors (0.7.0):
Highlights (0.7.0):
fq_default and fq_default_poly for finite fields and
univariate polynomials over finite fields. This exposes all
of the different implementations of finite fields (fq_zech,
fq_nmod etc) via the fq_default interface. (GP)fmpz_mpoly, fmpq_mpoly, nmod_poly and fmpz_mod_poly
types for multivariate polynomials with integer, rational or
integers mod n coefficients. (JM)acb_theta module for the numerical evaluation of theta
functions (only
available for Flint >= 3.1). (EC)Compatibility break (0.7.0):
fmpq_poly.factor() now returns
primitive rather than monic factors i.e. 2*x + 1 rather than
x + 1/2. This ensures consistency between all poly types
including between fmpq_poly and fmpq_mpoly. (OB)Other changes (0.7.0):
is_zero, is_one and is_constant methods. All polynomial
types now consistently handle negative powers where possible.fmpz_mat.fflu for fraction-free LU decomposition of
an integer matrix.extraprec, extradps, workprec and workdps. (TH)fmpq.gcd() method.sqrt. All poly types now
have factor_squarefree and leading_coefficient methods.
Exception types raised in a number of places were changed to
DomainError for better consistency. (OB)equal_trunc, add_trunc, sub_trunc, mul_low,
mul_mod and pow_trunc methods to fmpz_mod_poly. (GP)fmpq constructor. (OB)pow_mod and compose_mod methods to nmod_poly and
fmpz_mod_poly. Also add some missing methods to nmod_poly
that other poly types already have. (GP)fmpz_is_square. (JR)is_one and is_zero for all poly types. (OB)acb.lerch_phi to compute the Lerch transcendent. (OB)bits to arb and acb, add log_base to arb. (JR)rel_one_accuracy_bits to arb and acb. (EC)erfinv and erfcinv for arb. (JR)--no-build-isolation.fmpz(6)/fmpz(3)
returns an exact result fmpz(2) or raises an error if an exact
result is not possible. Similar changes for fmpz_poly/fmpz,
fmpz_mat/fmpz, and for polynomial division with fmpz_poly,
fmpq_poly, nmod_poly and fmpz_mod_poly.fmpz_mod_mat for matrices of integers mod n where n is
larger than word sized.Important compatibility changes:
New features:
fmpz_mod_poly type for polynomials over fmpz_mod.fmpz_mod.fmpz_mod type for multi-precision integer mods.Bug fixes:
pow(int, int, fmpz) which previously gave
incorrect results.nmod type.python-flint into
submodulesarb_poly is not supported. Use either the
complex_roots method or acb_roots(p).roots() to get the old
behaviour of returning the complex roots. The roots method on
fmpz_poly and fmpq_poly now return integer and rational
roots respectively. To access complex roots on these types, use
the complex_roots method. For acb_poly, both roots and
complex_roots behave the samepython-flintroots method of arb_poly, and nmod_poly is no longer
supported. Use acb_roots(p).roots() to get the old behaviour
of returning the roots as acb. Note that the roots method of
fmpz_poly and fmpq_poly currently returns the complex roots
of the polynomial.python-flintPython-FLINT is licensed MIT. FLINT and Arb are LGPL v2.1+.
FAQs
Bindings for FLINT
We found that python-flint demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Socket CEO Feross Aboukhadijeh joins Software Engineering Daily to discuss modern software supply chain attacks and rising AI-driven security risks.

Security News
GitHub has revoked npm classic tokens for publishing; maintainers must migrate, but OpenJS warns OIDC trusted publishing still has risky gaps for critical projects.

Security News
Rust’s crates.io team is advancing an RFC to add a Security tab that surfaces RustSec vulnerability and unsoundness advisories directly on crate pages.