Skip to main content

A Python interface for https://github.com/fplll/fplll

Project description

A Python wrapper for fplll.

https://github.com/fplll/fpylll/workflows/Tests/badge.svg https://badge.fury.io/py/fpylll.svg https://readthedocs.org/projects/fpylll/badge/?version=latest
>>> from fpylll import *

>>> A = IntegerMatrix(50, 50)
>>> A.randomize("ntrulike", bits=50, q=127)
>>> A[0].norm()
3564748886669202.5

>>> M = GSO.Mat(A)
>>> M.update_gso()
>>> M.get_mu(1,0)
0.815748944429783

>>> L = LLL.Reduction(M)
>>> L()
>>> M.get_mu(1,0)
0.41812865497076024
>>> A[0].norm()
24.06241883103193

The basic BKZ algorithm can be implemented in about 60 pretty readable lines of Python code (cf. simple_bkz.py). For a quick tour of the library, you can check out the tutorial.

How to cite

@unpublished{fpylll,
    author = {The {FPLLL} development team},
    title = {{fpylll}, a {Python} wrapper for the {fplll} lattice reduction library, {Version}: 0.6.1},
    year = 2023,
    note = {Available at \url{https://github.com/fplll/fpylll}},
    url = {https://github.com/fplll/fpylll}
}

Requirements

fpylll relies on the following C/C++ libraries:

  • GMP or MPIR for arbitrary precision integer arithmetic.

  • MPFR for arbitrary precision floating point arithmetic.

  • QD for double double and quad double arithmetic (optional).

  • fplll for pretty much everything.

fpylll also relies on

  • Cython for linking Python and C/C++.

  • cysignals for signal handling such as interrupting C++ code.

  • py.test for testing Python.

  • flake8 for linting.

We also suggest

  • virtualenv to build and install fpylll in

  • IPython for interacting with Python

  • Numpy for numerical computations (e.g. with Gram-Schmidt values)

Online

fpylll ships with Sage. Thus, it is available via SageMathCell and CoCalc (select a Jupyter notebook with a Sage kernel).

Getting Started

Note: fpylll is also available via PyPI and Conda-Forge for Conda. In what follows, we explain manual installation.

We recommend virtualenv for isolating Python build environments and virtualenvwrapper to manage virtual environments. We indicate active virtualenvs by the prefix (fpylll).

Automatic install

  1. Run bootstrap.sh

    $ ./bootstrap.sh
    $ source ./activate

Manual install

  1. Create a new virtualenv and activate it:

    $ virtualenv env
    $ ln -s ./env/bin/activate ./
    $ source ./activate
  2. Install the required libraries - GMP or MPIR and MPFR - if not available already. You may also want to install QD.

  3. Install fplll:

    $ (fpylll) ./install-dependencies.sh $VIRTUAL_ENV

    Some OSX users report that they required export CXXFLAGS="-stdlib=libc++ -mmacosx-version-min=10.7" and export CXX=clang++ (after installing a recent clang with brew) since the default GCC installed by Apple does not have full C++11 support.

  4. Then, execute:

    $ (fpylll) pip install -r requirements.txt

    to install the required Python packages (see above).

  5. If you are so inclined, run:

    $ (fpylll) pip install -r suggestions.txt

    to install suggested Python packages as well (optional).

  6. Build the Python extension:

    $ (fpylll) export PKG_CONFIG_PATH="$VIRTUAL_ENV/lib/pkgconfig:$PKG_CONFIG_PATH"
    $ (fpylll) python setup.py build_ext
    $ (fpylll) python setup.py install
  7. To run fpylll, you will need to:

    $ (fpylll) export LD_LIBRARY_PATH="$VIRTUAL_ENV/lib"

    so that Python can find fplll and friends.

    Note that you can also patch activate to set LD_LIBRRY_PATH. For this, add:

    ### LD_LIBRARY_HACK
    _OLD_LD_LIBRARY_PATH="$LD_LIBRARY_PATH"
    LD_LIBRARY_PATH="$VIRTUAL_ENV/lib:$LD_LIBRARY_PATH"
    export LD_LIBRARY_PATH
    ### END_LD_LIBRARY_HACK
    
    ### PKG_CONFIG_HACK
    _OLD_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
    PKG_CONFIG_PATH="$VIRTUAL_ENV/lib/pkgconfig:$PKG_CONFIG_PATH"
    export PKG_CONFIG_PATH
    ### END_PKG_CONFIG_HACK

    towards the end and:

    ### LD_LIBRARY_HACK
    if ! [ -z ${_OLD_LD_LIBRARY_PATH+x} ] ; then
        LD_LIBRARY_PATH="$_OLD_LD_LIBRARY_PATH"
        export LD_LIBRARY_PATH
        unset _OLD_LD_LIBRARY_PATH
    fi
    ### END_LD_LIBRARY_HACK
    
    ### PKG_CONFIG_HACK
    if ! [ -z ${_OLD_PKG_CONFIG_PATH+x} ] ; then
        PKG_CONFIG_PATH="$_OLD_PKG_CONFIG_PATH"
        export PKG_CONFIG_PATH
        unset _OLD_PKG_CONFIG_PATH
    fi
    ### END_PKG_CONFIG_HACK

    in the deactivate function in the activate script.

Running fpylll

  1. To (re)activate the virtual environment, simply run:

    $ source ./activate
  2. Start Python:

    $ (fpylll) ipython

Manual update of fpylll and fplll inside Sagemath 9.0+

The instructions are very similar to the manual ones above.

  1. Activate the sage-sh virtualenv:

    $ sage -sh
  2. Install the required libraries - GMP or MPIR and MPFR - if not available already. You may also want to install QD.

  3. Install fplll:

    $ (sage-sh) ./install-dependencies.sh $SAGE_LOCAL

    Some OSX users report that they required export CXXFLAGS="-stdlib=libc++ -mmacosx-version-min=10.7" and export CXX=clang++ (after installing a recent clang with brew) since the default GCC installed by Apple does not have full C++11 support.

  4. Then, execute:

    $ (sage-sh) pip3 install -r requirements.txt

    to install the required Python packages (see above).

  5. If you are so inclined, run:

    $ (sage-sh) pip3 install -r suggestions.txt

    to install suggested Python packages as well (optional).

  6. Build the Python extension:

    $ (sage-sh) export PKG_CONFIG_PATH="$SAGE_LOCAL/lib/pkgconfig:$PKG_CONFIG_PATH"
    $ (sage-sh) python3 setup.py build_ext
    $ (sage-sh) python3 setup.py install
    $ (sage-sh) exit
  7. Verify the upgrade went well:

    $ sage
    sage: import fpylll
    sage: print(fpylll.__version__)

    The output should match the value of __version__ in src/fpylll/__init__.py.

Multicore Support

fpylll supports parallelisation on multiple cores. For all C++ support to drop the GIL is enabled, allowing the use of threads to parallelise. Fplll is thread safe as long as each thread works on a separate object such as IntegerMatrix or MatGSO. Also, fpylll does not actually drop the GIL in all calls to C++ functions yet. In many scenarios using multiprocessing, which sidesteps the GIL and thread safety issues by using processes instead of threads, will be the better choice.

The example below calls LLL.reduction on 128 matrices of dimension 30 on four worker processes.

from fpylll import IntegerMatrix, LLL
from multiprocessing import Pool

d, workers, tasks = 30, 4, 128

def run_it(p, f, A, prefix=""):
    """Print status during parallel execution."""
    import sys
    r = []
    for i, retval in enumerate(p.imap_unordered(f, A, 1)):
        r.append(retval)
        sys.stderr.write('\r{0} done: {1:.2%}'.format(prefix, float(i)/len(A)))
        sys.stderr.flush()
    sys.stderr.write('\r{0} done {1:.2%}\n'.format(prefix, float(i+1)/len(A)))
    return r

A = [IntegerMatrix.random(d, "uniform", bits=30) for _ in range(tasks)]
A = run_it(Pool(workers), LLL.reduction, A)

To test threading simply replace the line from multiprocessing import Pool with from multiprocessing.pool import ThreadPool as Pool. For calling BKZ.reduction this way, which expects a second parameter with options, using functools.partial is a good choice.

Contributing

fpylll welcomes contributions, cf. the list of open issues. To contribute, clone this repository, commit your code on a separate branch and send a pull request. Please write tests for your code. You can run them by calling:

$ (fpylll) PY_IGNORE_IMPORTMISMATCH=1 py.test

from the top-level directory which runs all tests in tests/test_*.py. We run flake8 on every commit automatically, In particular, we run:

$ (fpylll) flake8 --max-line-length=120 --max-complexity=16 --ignore=E22,E241 src

Note that fpylll supports Python 3. In particular, tests are run using Python 3.10, 3.11 and 3.12. See .tests.yml for details on automated testing.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fpylll-0.6.1.tar.gz (1.1 MB view details)

Uploaded Source

File details

Details for the file fpylll-0.6.1.tar.gz.

File metadata

  • Download URL: fpylll-0.6.1.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.8

File hashes

Hashes for fpylll-0.6.1.tar.gz
Algorithm Hash digest
SHA256 dfd9529a26c50993a2a716177debd7994312219070574cad31b35b4f0c040a19
MD5 0130245003b5ff4733f94b26787a2f94
BLAKE2b-256 6706dceddea886571d206b83639af0dd08c42ad3b61e39b50f7168d26ede6761

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page