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.