Go to the previous, next section.

Introduction to MP

GNU MP is a portable library for arbitrary precision integer and rational number arithmetic.(1) It aims to provide the fastest possible arithmetic for all applications that need more than two words of integer precision.

Most often, applications tend to use just a few words of precision; but some applications may need thousands of words. GNU MP is designed to give good performance for both kinds of applications, by choosing algorithms based on the sizes of the operands.

There are five groups of functions in the MP library:

  1. Functions for signed integer arithmetic, with names beginning with mpz_.

  2. Functions for rational number arithmetic, with names beginning with mpq_.

  3. Functions compatible with Berkeley MP, such as itom, madd, and mult.

  4. Fast low-level functions that operate on natural numbers. These are used by the functions in the preceding groups, and you can also call them directly from very time-critical user programs. These functions' names begin with mpn_.

  5. Miscellaneous functions.

As a general rule, all MP functions expect output arguments before input arguments. This notation is based on an analogy with the assignment operator. (The BSD MP compatibility functions disobey this rule, having the output argument(s) last.) Multi-precision numbers, whether output or input, are always passed as addresses to the declared type.

Nomenclature and Data Types

In this manual, integer means a multiple precision integer, as used in the MP package. The C data type for such integers is MP_INT. For example:

MP_INT sum;

struct foo { MP_INT x, y; };

MP_INT vec[20];

Rational number means a multiple precision fraction. The C data type for these fractions is MP_RAT. For example:

MP_RAT quotient;

A limb means the part of a multi-precision number that fits in a single word. (We chose this word because a limb of the human body is analogous to a digit, only larger, and containing several digits.) Normally a limb contains 32 bits.


I would like to thank Gunnar Sjoedin and Hans Riesel for their help with mathematical problems, Richard Stallman for his help with design issues and for revising this manual, Brian Beuning and Doug Lea for their testing of various versions of the library, and Joachim Hollman for his many valuable suggestions.

Special thanks to Brian Beuning, he has shaked out many bugs from early versions of the code!

John Amanatides of York University in Canada contributed the function mpz_probab_prime_p.

Go to the previous, next section.