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 [email protected]
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+.