- Supports a wide range of lattice reduction algorithms:
- several variants of LLL;
- Schnorr-Euchner BKZ (by Schnorr and Euchner);
- Simplified BKZ (by Hanrot, Pujol and Stehle);
- Terminating BKZ (by Hanrot, Pujol and Stehle);
- Primal-Dual BKZ (by Koy);
- Slide Reduction (by Gama and Nguyen);
- Improved Slide Reduction (by Schnorr);
- Semi Block 2k Reduction (by Schnorr);
- Sampling Reduction (by Buchmann and Ludwig).
- Supports a wide range of SVP solvers:
- single-core and multi-core Kannan-Schnorr-Euchner enumeration;
- Schnorr's new SVP solver;
- Voronoi Cell computation;
- several sieving algorithms.
- Supports a wide range of arithmetics:
- native CPU integers and floating point arithmetic
- GMP and MPFR arbitrary precision integer and floating point arithmetic;
- rational arithmetic;
- double-double and quad-double arithmetic (incomplete support).
- Supports a wide range of options:
- several Deep Insertions configurations and variants;
- different Gram-Schmidt orthogonalizations;
- possibility to compute transformation matrices;
- possibility to set up callback functions;
- working on subranges of the lattice (using orthogonal projections).
- The library is threading-safe and can use several cores for enumeration.
- Support for C++11 move semantics.
First, a (mostly) conforming C++ compiler (either C++03 or C++11/14)
is needed. We have tested
plll with the following compilers in both modes:
In theory, it should also work fine with other conforming compilers.
An older version of
plll also built with an older version of Oracle Solaris Studio
on a UltraSparc machine. It might be possible that newer versions won't compile
plll anymore since parts of the code have been rewritten after we had no
longer access to a UltraSparc machine.
Besides a C++ compiler, the following libraries are needed to compile
- GMP (forks such as MPIR should work as well);
- the Boost libraries, in particular the thread, system and function libraries.
plll will use the following library if it can find it:
plll uses CMake as a build system.
plll is mainly a C++98/03
library, it is C++11/14 enabled in the sense that it has support for
move operations and will use
std::unique_ptr instead of
some situations internally. Even when compiled in C++11/14 mode, it will still use
boost::function instead of
std::function so that the interface does not depend (except move semantics) whether
the library is compiled in C++98/03 or C++11/14 mode. This might change in later versions,
- 2011–2014: development of the first version of the library at the University of Zurich.
- 2012 and 2013: during extensive tests of the
pllllibrary's LLL, BKZ and Deep Insertion code, several entries in the hall of fame of the SVP Challenge were added.
- July 2014: release as open source under the MIT license by the Applied Algebra group at the University of Zurich. (See also here.)
plll is licensed under the MIT
Copyright (c) 2011—2014 University of Zurich
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.