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.13 and 3.13t (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 as described in SPEC
0. 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 (note that 0.7.0 is not yet released):
| python-flint | Release date | CPython | FLINT | Cython |
|--------------|---------------|-------------|------------|------------------|
| 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 |
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. Provided matrices or polynomials are not mutated when shared across threads there are no known issues with the free-threaded build but these should be considered experimental.
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-flint
roots
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-flint
Python-FLINT is licensed MIT. FLINT and Arb are LGPL v2.1+.