version 1.1.1.1, 2000/01/10 15:35:21 |
version 1.1.1.2, 2000/09/09 14:12:11 |
|
|
|
|
THE GNU MP LIBRARY |
THE GNU MP LIBRARY |
|
|
|
|
GNU MP is a library for arbitrary precision arithmetic, operating on signed |
GNU MP is a library for arbitrary precision arithmetic, operating on signed |
integers, rational numbers, and floating point numbers. It has a rich set |
integers, rational numbers, and floating point numbers. It has a rich set of |
of functions, and the functions have a regular interface. |
functions, and the functions have a regular interface. |
|
|
GNU MP is designed to be as fast as possible, both for small operands and for |
GNU MP is designed to be as fast as possible, both for small operands and huge |
huge operands. The speed is achieved by using fullwords as the basic |
operands. The speed is achieved by using fullwords as the basic arithmetic |
arithmetic type, by using fast algorithms, by carefully optimized assembly |
type, by using fast algorithms, with carefully optimized assembly code for the |
code for the most common inner loops for a lots of CPUs, and by a general |
most common inner loops for lots of CPUs, and by a general emphasis on speed |
emphasis on speed (instead of simplicity or elegance). |
(instead of simplicity or elegance). |
|
|
The speed of GNU MP is believed to be faster than any other similar library. |
GNU MP is believed to be faster than any other similar library. Its advantage |
The advantage for GNU MP increases with the operand sizes for certain |
increases with operand sizes for certain operations, since GNU MP in many |
operations, since GNU MP in many cases has asymptotically faster algorithms. |
cases has asymptotically faster algorithms. |
|
|
|
GNU MP is free software and may be freely copied on the terms contained in the |
|
files COPYING.LIB and COPYING (most of GNU MP is under the former, some under |
|
the latter). |
|
|
GETTING STARTED |
|
|
|
First, you have to configure and compiler GNU MP. Simply typing |
|
|
|
./configure; make |
|
|
|
will normally do a reasonable job, but will not give optimal library |
|
execution speed. So unless you're very unpatient, please read the detailed |
|
instructions in the file INSTALL or in gmp.texi. |
|
|
|
Once you have compiled the library, you should write some small example, and |
|
make sure you can compile them. A typical compilation command is this: |
|
|
|
gcc -g your-file.c -I<gmp-source-dir> <gmp-bin-dir>libgmp.a -lm |
|
|
|
If you have installed the library, you can simply do: |
|
|
|
gcc -g your-file.c -lgmp -lm |
|
|
|
The -lm is normally not needed, since only a few functions in GNU MP use the |
|
math library. |
|
|
|
Here is a sample program that declares 2 variables, initializes them as |
|
required, and sets one of them from a signed integer, and the other from a |
|
string of digits. It then prints the product of the two numbers in base 10. |
|
|
|
#include <stdio.h> |
|
#include "gmp.h" |
|
|
|
main () |
|
{ |
|
mpz_t a, b, p; |
|
|
|
mpz_init (a); /* initialize variables */ |
|
mpz_init (b); |
|
mpz_init (p); |
|
|
|
mpz_set_si (a, 756839); /* assign variables */ |
|
mpz_set_str (b, "314159265358979323846", 0); |
|
mpz_mul (p, a, b); /* generate product */ |
|
mpz_out_str (stdout, 10, p); /* print number without newline */ |
|
puts (""); /* print newline */ |
|
|
|
mpz_clear (a); /* clear out variables */ |
|
mpz_clear (b); |
|
mpz_clear (p); |
|
|
|
exit (0); |
|
} |
|
|
|
This might look tedious, with all initializing and clearing. Fortunately |
|
some of these operations can be combined, and other operations can often be |
|
avoided. The example above would be written differently by an experienced |
|
GNU MP user: |
|
|
|
#include <stdio.h> |
|
#include "gmp.h" |
|
|
|
main () |
|
{ |
|
mpz_t b, p; |
|
|
|
mpz_init (p); |
|
|
|
mpz_init_set_str (b, "314159265358979323846", 0); |
|
mpz_mul_ui (p, b, 756839); /* generate product */ |
|
mpz_out_str (stdout, 10, p); /* print number without newline */ |
|
puts (""); /* print newline */ |
|
|
|
exit (0); |
|
} |
|
|
|
|
|
OVERVIEW OF GNU MP |
OVERVIEW OF GNU MP |
|
|
There are five classes of functions in GNU MP. |
There are five classes of functions in GNU MP. |
|
|
1. Signed integer arithmetic functions, mpz_*. These functions are intended |
1. Signed integer arithmetic functions (mpz). These functions are intended |
to be easy to use, with their regular interface. The associated type is |
to be easy to use, with their regular interface. The associated type is |
`mpz_t'. |
`mpz_t'. |
|
|
2. Rational arithmetic functions, mpq_*. For now, just a small set of |
2. Rational arithmetic functions (mpq). For now, just a small set of |
functions necessary for basic rational arithmetics. The associated type |
functions necessary for basic rational arithmetics. The associated type |
is `mpq_t'. |
is `mpq_t'. |
|
|
3. Floating-point arithmetic functions, mpf_*. If the C type `double' |
3. Floating-point arithmetic functions (mpf). If the C type `double' |
doesn't give enough precision for your application, declare your |
doesn't give enough precision for your application, declare your |
variables as `mpf_t' instead, set the precision to any number desired, |
variables as `mpf_t' instead, set the precision to any number desired, |
and call the functions in the mpf class for the arithmetic operations. |
and call the functions in the mpf class for the arithmetic operations. |
|
|
4. Positive-integer, hard-to-use, very low overhead functions are in the |
4. Positive-integer, hard-to-use, very low overhead functions are in the |
mpn_* class. No memory management is performed. The caller must ensure |
mpn class. No memory management is performed. The caller must ensure |
enough space is available for the results. The set of functions is not |
enough space is available for the results. The set of functions is not |
regular, nor is the calling interface. These functions accept input |
regular, nor is the calling interface. These functions accept input |
arguments in the form of pairs consisting of a pointer to the least |
arguments in the form of pairs consisting of a pointer to the least |
significant word, and a integral size telling how many limbs (= words) |
significant word, and an integral size telling how many limbs (= words) |
the pointer points to. |
the pointer points to. |
|
|
Almost all calculations, in the entire package, are made by calling these |
Almost all calculations, in the entire package, are made by calling these |
Line 128 printed. How to do that, as well how to build the lib |
|
Line 61 printed. How to do that, as well how to build the lib |
|
the INSTALL file in this directory. |
the INSTALL file in this directory. |
|
|
|
|
|
|
REPORTING BUGS |
REPORTING BUGS |
|
|
If you find a bug in the library, please make sure to tell us about it! |
If you find a bug in the library, please make sure to tell us about it! |
|
|
Report bugs and propose modifications and enhancements to |
You should first check the GNU MP web pages at http://www.swox.com/gmp/, |
bug-gmp@prep.ai.mit.edu. What information is needed in a good bug report is |
under "Status of the current release". There will be patches for all known |
described in the manual. |
serious bugs there. |
|
|
|
Report bugs to bug-gmp@gnu.org. What information is needed in a good bug |
|
report is described in the manual. The same address can be used for |
|
suggesting modifications and enhancements. |
|
|
|
|
|
|
|
|
|
---------------- |
|
Local variables: |
|
mode: text |
|
fill-column: 78 |
|
End: |