patrick@gentoo.org
Patrick Lauer
LibTomMath is a free open source portable number theoretic multiple-precision
integer library written entirely in C. (phew!). The library is designed to
provide a simple to work with API that provides fairly efficient routines that
build out of the box without configuration.
The library builds out of the box with GCC 2.95 [and up] as well as Visual C++
v6.00 [with SP5] without configuration. The source code is arranged to make it
easy to dive into a particular area very quickly. The code is also littered with
comments [This is one of the on going goals] that help explain the algorithms and
their implementations. Ideally the code will serve as an educational tool in the
future for CS students studying number theory.
The library provides a vast array of highly optimized routines from various
branches of number theory.
* Simple Algebraic
o Addition
o Subtraction
o Multiplication
o Squaring
o Division
* Digit Manipulation
o Shift left/right whole digits (mult by 2b by moving digits)
o Fast multiplication/division by 2 and 2k for k>1
o Binary AND, OR and XOR gates
* Modular Reductions
o Barrett Reduction (fast for any p)
o Montgomery Reduction (faster for any odd p)
o DR Reduction (faster for any restricted p see manual)
o 2k Reduction (fast reduction modulo 2p - k)
o The exptmod logic can use any of the four reduction algorithms when
appropriate with a single function call.
* Number Theoretic
o Greatest Common Divisor
o Least Common Multiple
o Jacobi Symbol Computation (falls back to Legendre for prime moduli)
o Multiplicative Inverse
o Extended Euclidean Algorithm
o Modular Exponentiation
o Fermat and Miller-Rabin Primality Tests, utility function such as
is_prime and next_prime
* Miscellaneous
o Root finding over Z
o Pseudo-random integers
o Signed and Unsigned comparisons
* Optimizations
o Fast Comba based Multiplier, Squaring and Montgomery routines.
o Montgomery, Diminished Radix and Barrett based modular
exponentiation.
o Karatsuba and Toom-Cook multiplication algorithms.
o Many pointer aliasing optimiztions throughout the entire library.
libtom/libtommath