version 1.1.1.1, 2000/01/10 15:35:21 |
version 1.1.1.2, 2000/09/09 14:12:19 |
|
|
This is Info file gmp.info, produced by Makeinfo-1.64 from the input |
This is gmp.info, produced by makeinfo version 4.0 from gmp.texi. |
file gmp.texi. |
|
|
|
|
INFO-DIR-SECTION GNU libraries |
START-INFO-DIR-ENTRY |
START-INFO-DIR-ENTRY |
* gmp: (gmp.info). GNU Multiple Precision Arithmetic Library. |
* gmp: (gmp). GNU Multiple Precision Arithmetic Library. |
END-INFO-DIR-ENTRY |
END-INFO-DIR-ENTRY |
|
|
This file documents GNU MP, a library for arbitrary-precision |
This file documents GNU MP, a library for arbitrary-precision |
arithmetic. |
arithmetic. |
|
|
Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, |
Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 |
Inc. |
Free Software Foundation, Inc. |
|
|
Permission is granted to make and distribute verbatim copies of this |
Permission is granted to make and distribute verbatim copies of this |
manual provided the copyright notice and this permission notice are |
manual provided the copyright notice and this permission notice are |
Line 26 versions, except that this permission notice may be st |
|
Line 26 versions, except that this permission notice may be st |
|
translation approved by the Foundation. |
translation approved by the Foundation. |
|
|
|
|
File: gmp.info, Node: Function Index, Up: Top |
File: gmp.info, Node: Low-level Functions, Next: Random Number Functions, Prev: Floating-point Functions, Up: Top |
|
|
Function and Type Index |
Low-level Functions |
|
******************* |
|
|
|
This chapter describes low-level GMP functions, used to implement |
|
the high-level GMP functions, but also intended for time-critical user |
|
code. |
|
|
|
These functions start with the prefix `mpn_'. |
|
|
|
The `mpn' functions are designed to be as fast as possible, *not* to |
|
provide a coherent calling interface. The different functions have |
|
somewhat similar interfaces, but there are variations that make them |
|
hard to use. These functions do as little as possible apart from the |
|
real multiple precision computation, so that no time is spent on things |
|
that not all callers need. |
|
|
|
A source operand is specified by a pointer to the least significant |
|
limb and a limb count. A destination operand is specified by just a |
|
pointer. It is the responsibility of the caller to ensure that the |
|
destination has enough space for storing the result. |
|
|
|
With this way of specifying operands, it is possible to perform |
|
computations on subranges of an argument, and store the result into a |
|
subrange of a destination. |
|
|
|
A common requirement for all functions is that each source area |
|
needs at least one limb. No size argument may be zero. Unless |
|
otherwise stated, in-place operations are allowed where source and |
|
destination are the same, but not where they only partly overlap. |
|
|
|
The `mpn' functions are the base for the implementation of the |
|
`mpz_', `mpf_', and `mpq_' functions. |
|
|
|
This example adds the number beginning at S1P and the number |
|
beginning at S2P and writes the sum at DESTP. All areas have SIZE |
|
limbs. |
|
|
|
cy = mpn_add_n (destp, s1p, s2p, size) |
|
|
|
In the notation used here, a source operand is identified by the |
|
pointer to the least significant limb, and the limb count in braces. |
|
For example, {s1p, s1size}. |
|
|
|
- Function: mp_limb_t mpn_add_n (mp_limb_t *RP, const mp_limb_t *S1P, |
|
const mp_limb_t *S2P, mp_size_t SIZE) |
|
Add {S1P, SIZE} and {S2P, SIZE}, and write the SIZE least |
|
significant limbs of the result to RP. Return carry, either 0 or |
|
1. |
|
|
|
This is the lowest-level function for addition. It is the |
|
preferred function for addition, since it is written in assembly |
|
for most targets. For addition of a variable to itself (i.e., S1P |
|
equals S2P, use `mpn_lshift' with a count of 1 for optimal speed. |
|
|
|
- Function: mp_limb_t mpn_add_1 (mp_limb_t *RP, const mp_limb_t *S1P, |
|
mp_size_t SIZE, mp_limb_t S2LIMB) |
|
Add {S1P, SIZE} and S2LIMB, and write the SIZE least significant |
|
limbs of the result to RP. Return carry, either 0 or 1. |
|
|
|
- Function: mp_limb_t mpn_add (mp_limb_t *RP, const mp_limb_t *S1P, |
|
mp_size_t S1SIZE, const mp_limb_t *S2P, mp_size_t S2SIZE) |
|
Add {S1P, S1SIZE} and {S2P, S2SIZE}, and write the S1SIZE least |
|
significant limbs of the result to RP. Return carry, either 0 or |
|
1. |
|
|
|
This function requires that S1SIZE is greater than or equal to |
|
S2SIZE. |
|
|
|
- Function: mp_limb_t mpn_sub_n (mp_limb_t *RP, const mp_limb_t *S1P, |
|
const mp_limb_t *S2P, mp_size_t SIZE) |
|
Subtract {S2P, S2SIZE} from {S1P, SIZE}, and write the SIZE least |
|
significant limbs of the result to RP. Return borrow, either 0 or |
|
1. |
|
|
|
This is the lowest-level function for subtraction. It is the |
|
preferred function for subtraction, since it is written in |
|
assembly for most targets. |
|
|
|
- Function: mp_limb_t mpn_sub_1 (mp_limb_t *RP, const mp_limb_t *S1P, |
|
mp_size_t SIZE, mp_limb_t S2LIMB) |
|
Subtract S2LIMB from {S1P, SIZE}, and write the SIZE least |
|
significant limbs of the result to RP. Return borrow, either 0 or |
|
1. |
|
|
|
- Function: mp_limb_t mpn_sub (mp_limb_t *RP, const mp_limb_t *S1P, |
|
mp_size_t S1SIZE, const mp_limb_t *S2P, mp_size_t S2SIZE) |
|
Subtract {S2P, S2SIZE} from {S1P, S1SIZE}, and write the S1SIZE |
|
least significant limbs of the result to RP. Return borrow, |
|
either 0 or 1. |
|
|
|
This function requires that S1SIZE is greater than or equal to |
|
S2SIZE. |
|
|
|
- Function: void mpn_mul_n (mp_limb_t *RP, const mp_limb_t *S1P, const |
|
mp_limb_t *S2P, mp_size_t SIZE) |
|
Multiply {S1P, SIZE} and {S2P, SIZE}, and write the *entire* |
|
result to RP. |
|
|
|
The destination has to have space for 2*SIZE limbs, even if the |
|
significant result might be one limb smaller. |
|
|
|
- Function: mp_limb_t mpn_mul_1 (mp_limb_t *RP, const mp_limb_t *S1P, |
|
mp_size_t SIZE, mp_limb_t S2LIMB) |
|
Multiply {S1P, SIZE} and S2LIMB, and write the SIZE least |
|
significant limbs of the product to RP. Return the most |
|
significant limb of the product. |
|
|
|
This is a low-level function that is a building block for general |
|
multiplication as well as other operations in GMP. It is written |
|
in assembly for most targets. |
|
|
|
Don't call this function if S2LIMB is a power of 2; use |
|
`mpn_lshift' with a count equal to the logarithm of S2LIMB |
|
instead, for optimal speed. |
|
|
|
- Function: mp_limb_t mpn_addmul_1 (mp_limb_t *RP, const mp_limb_t |
|
*S1P, mp_size_t SIZE, mp_limb_t S2LIMB) |
|
Multiply {S1P, SIZE} and S2LIMB, and add the SIZE least |
|
significant limbs of the product to {RP, SIZE} and write the |
|
result to RP. Return the most significant limb of the product, |
|
plus carry-out from the addition. |
|
|
|
This is a low-level function that is a building block for general |
|
multiplication as well as other operations in GMP. It is written |
|
in assembly for most targets. |
|
|
|
- Function: mp_limb_t mpn_submul_1 (mp_limb_t *RP, const mp_limb_t |
|
*S1P, mp_size_t SIZE, mp_limb_t S2LIMB) |
|
Multiply {S1P, SIZE} and S2LIMB, and subtract the SIZE least |
|
significant limbs of the product from {RP, SIZE} and write the |
|
result to RP. Return the most significant limb of the product, |
|
minus borrow-out from the subtraction. |
|
|
|
This is a low-level function that is a building block for general |
|
multiplication and division as well as other operations in GMP. |
|
It is written in assembly for most targets. |
|
|
|
- Function: mp_limb_t mpn_mul (mp_limb_t *RP, const mp_limb_t *S1P, |
|
mp_size_t S1SIZE, const mp_limb_t *S2P, mp_size_t S2SIZE) |
|
Multiply {S1P, S1SIZE} and {S2P, S2SIZE}, and write the result to |
|
RP. Return the most significant limb of the result. |
|
|
|
The destination has to have space for S1SIZE + S2SIZE limbs, even |
|
if the result might be one limb smaller. |
|
|
|
This function requires that S1SIZE is greater than or equal to |
|
S2SIZE. The destination must be distinct from either input |
|
operands. |
|
|
|
- Function: mp_limb_t mpn_tdiv_qr (mp_limb_t *QP, mp_limb_t *RP, |
|
mp_size_t QXN, const mp_limb_t *NP, mp_size_t NN, const |
|
mp_limb_t *DP, mp_size_t DN) |
|
Divide {NP, NN} by {DP, DN}. Write the quotient at QP and the |
|
remainder at RP. |
|
|
|
The quotient written at QP will be NN - DN + 1 limbs. The |
|
remainder written at RP will be DN limbs. |
|
|
|
It is required that NN is greater than or equal to DN. The QXN |
|
operand must be zero. |
|
|
|
The quotient is rounded towards 0. |
|
|
|
No overlap between arguments is permitted. |
|
|
|
- Function: mp_limb_t mpn_divrem (mp_limb_t *R1P, mp_size_t XSIZE, |
|
mp_limb_t *RS2P, mp_size_t RS2SIZE, const mp_limb_t *S3P, |
|
mp_size_t S3SIZE) |
|
[This function is obsolete. Please call `mpn_tdiv_qr' instead for |
|
best performance.] |
|
|
|
Divide {RS2P, RS2SIZE} by {S3P, S3SIZE}, and write the quotient at |
|
R1P, with the exception of the most significant limb, which is |
|
returned. The remainder replaces the dividend at RS2P; it will be |
|
S3SIZE limbs long (i.e., as many limbs as the divisor). |
|
|
|
In addition to an integer quotient, XSIZE fraction limbs are |
|
developed, and stored after the integral limbs. For most usages, |
|
XSIZE will be zero. |
|
|
|
It is required that RS2SIZE is greater than or equal to S3SIZE. |
|
It is required that the most significant bit of the divisor is set. |
|
|
|
If the quotient is not needed, pass RS2P + S3SIZE as R1P. Aside |
|
from that special case, no overlap between arguments is permitted. |
|
|
|
Return the most significant limb of the quotient, either 0 or 1. |
|
|
|
The area at R1P needs to be RS2SIZE - S3SIZE + XSIZE limbs large. |
|
|
|
- Function: mp_limb_t mpn_divrem_1 (mp_limb_t *R1P, mp_size_t XSIZE, |
|
mp_limb_t *S2P, mp_size_t S2SIZE, mp_limb_t S3LIMB) |
|
- Macro: mp_limb_t mpn_divmod_1 (mp_limb_t *R1P, mp_limb_t *S2P, |
|
mp_size_t S2SIZE, mp_limb_t S3LIMB) |
|
Divide {S2P, S2SIZE} by S3LIMB, and write the quotient at R1P. |
|
Return the remainder. |
|
|
|
The integer quotient is written to {R1P+XSIZE, S2SIZE} and in |
|
addition XSIZE fraction limbs are developed and written to {R1P, |
|
XSIZE}. Either or both S2SIZE and XSIZE can be zero. For most |
|
usages, XSIZE will be zero. |
|
|
|
`mpn_divmod_1' exists for upward source compatibility and is |
|
simply a macro calling `mpn_divrem_1' with an XSIZE of 0. |
|
|
|
The areas at R1P and S2P have to be identical or completely |
|
separate, not partially overlapping. |
|
|
|
- Function: mp_limb_t mpn_divmod (mp_limb_t *R1P, mp_limb_t *RS2P, |
|
mp_size_t RS2SIZE, const mp_limb_t *S3P, mp_size_t S3SIZE) |
|
*This interface is obsolete. It will disappear from future |
|
releases. Use `mpn_divrem' in its stead.* |
|
|
|
- Macro: mp_limb_t mpn_divexact_by3 (mp_limb_t *RP, mp_limb_t *SP, |
|
mp_size_t SIZE) |
|
- Function: mp_limb_t mpn_divexact_by3c (mp_limb_t *RP, mp_limb_t *SP, |
|
mp_size_t SIZE, mp_limb_t CARRY) |
|
Divide {SP, SIZE} by 3, expecting it to divide exactly, and |
|
writing the result to {RP, SIZE}. If 3 divides exactly, the |
|
return value is zero and the result is the quotient. If not, the |
|
return value is non-zero and the result won't be anything useful. |
|
|
|
`mpn_divexact_by3c' takes an initial carry parameter, which can be |
|
the return value from a previous call, so a large calculation can |
|
be done piece by piece. `mpn_divexact_by3' is simply a macro |
|
calling `mpn_divexact_by3c' with a 0 carry parameter. |
|
|
|
These routines use a multiply-by-inverse and will be faster than |
|
`mpn_divrem_1' on CPUs with fast multiplication but slow division. |
|
|
|
The source a, result q, size n, initial carry i, and return value |
|
c satisfy c*b^n + a-i = 3*q, where b is the size of a limb (2^32 |
|
or 2^64). c is always 0, 1 or 2, and the initial carry must also |
|
be 0, 1 or 2 (these are both borrows really). When c=0, clearly |
|
q=(a-i)/3. When c!=0, the remainder (a-i) mod 3 is given by 3-c, |
|
because b == 1 mod 3. |
|
|
|
- Function: mp_limb_t mpn_mod_1 (mp_limb_t *S1P, mp_size_t S1SIZE, |
|
mp_limb_t S2LIMB) |
|
Divide {S1P, S1SIZE} by S2LIMB, and return the remainder. S1SIZE |
|
can be zero. |
|
|
|
- Function: mp_limb_t mpn_preinv_mod_1 (mp_limb_t *S1P, mp_size_t |
|
S1SIZE, mp_limb_t S2LIMB, mp_limb_t S3LIMB) |
|
*This interface is obsolete. It will disappear from future |
|
releases. Use `mpn_mod_1' in its stead.* |
|
|
|
- Function: mp_limb_t mpn_bdivmod (mp_limb_t *RP, mp_limb_t *S1P, |
|
mp_size_t S1SIZE, const mp_limb_t *S2P, mp_size_t S2SIZE, |
|
unsigned long int D) |
|
The function puts the low [D/BITS_PER_MP_LIMB] limbs of Q = {S1P, |
|
S1SIZE}/{S2P, S2SIZE} mod 2^D at RP, and returns the high D mod |
|
BITS_PER_MP_LIMB bits of Q. |
|
|
|
{S1P, S1SIZE} - Q * {S2P, S2SIZE} mod 2^(S1SIZE*BITS_PER_MP_LIMB) |
|
is placed at S1P. Since the low [D/BITS_PER_MP_LIMB] limbs of |
|
this difference are zero, it is possible to overwrite the low |
|
limbs at S1P with this difference, provided RP <= S1P. |
|
|
|
This function requires that S1SIZE * BITS_PER_MP_LIMB >= D, and |
|
that {S2P, S2SIZE} is odd. |
|
|
|
*This interface is preliminary. It might change incompatibly in |
|
future revisions.* |
|
|
|
- Function: mp_limb_t mpn_lshift (mp_limb_t *RP, const mp_limb_t |
|
*SRC_PTR, mp_size_t SRC_SIZE, unsigned long int COUNT) |
|
Shift {SRC_PTR, SRC_SIZE} COUNT bits to the left, and write the |
|
SRC_SIZE least significant limbs of the result to RP. COUNT might |
|
be in the range 1 to n - 1, on an n-bit machine. The bits shifted |
|
out to the left are returned. |
|
|
|
Overlapping of the destination space and the source space is |
|
allowed in this function, provided RP >= SRC_PTR. |
|
|
|
This function is written in assembly for most targets. |
|
|
|
- Function: mp_limp_t mpn_rshift (mp_limb_t *RP, const mp_limb_t |
|
*SRC_PTR, mp_size_t SRC_SIZE, unsigned long int COUNT) |
|
Shift {SRC_PTR, SRC_SIZE} COUNT bits to the right, and write the |
|
SRC_SIZE most significant limbs of the result to RP. COUNT might |
|
be in the range 1 to n - 1, on an n-bit machine. The bits shifted |
|
out to the right are returned. |
|
|
|
Overlapping of the destination space and the source space is |
|
allowed in this function, provided RP <= SRC_PTR. |
|
|
|
This function is written in assembly for most targets. |
|
|
|
- Function: int mpn_cmp (const mp_limb_t *S1P, const mp_limb_t *S2P, |
|
mp_size_t SIZE) |
|
Compare {S1P, SIZE} and {S2P, SIZE} and return a positive value if |
|
s1 > src2, 0 of they are equal, and a negative value if s1 < src2. |
|
|
|
- Function: mp_size_t mpn_gcd (mp_limb_t *RP, mp_limb_t *S1P, |
|
mp_size_t S1SIZE, mp_limb_t *S2P, mp_size_t S2SIZE) |
|
Puts at RP the greatest common divisor of {S1P, S1SIZE} and {S2P, |
|
S2SIZE}; both source operands are destroyed by the operation. The |
|
size in limbs of the greatest common divisor is returned. |
|
|
|
{S1P, S1SIZE} must have at least as many bits as {S2P, S2SIZE}, |
|
and {S2P, S2SIZE} must be odd. |
|
|
|
- Function: mp_limb_t mpn_gcd_1 (const mp_limb_t *S1P, mp_size_t |
|
S1SIZE, mp_limb_t S2LIMB) |
|
Return the greatest common divisor of {S1P, S1SIZE} and S2LIMB, |
|
where S2LIMB (as well as S1SIZE) must be different from 0. |
|
|
|
- Function: mp_size_t mpn_gcdext (mp_limb_t *R1P, mp_limb_t *R2P, |
|
mp_size_t *R2SIZE, mp_limb_t *S1P, mp_size_t S1SIZE, |
|
mp_limb_t *S2P, mp_size_t S2SIZE) |
|
Compute the greatest common divisor of {S1P, S1SIZE} and {S2P, |
|
S2SIZE}. Store the gcd at R1P and return its size in limbs. |
|
Write the first cofactor at R2P and store its size in *R2SIZE. If |
|
the cofactor is negative, *R2SIZE is negative and R2P is the |
|
absolute value of the cofactor. |
|
|
|
{S1P, S1SIZE} must be greater than or equal to {S2P, S2SIZE}. |
|
Neither operand may equal 0. Both source operands are destroyed, |
|
plus one limb past the end of each, ie. {S1P, S1SIZE+1} and {S2P, |
|
S2SIZE+1}. |
|
|
|
- Function: mp_size_t mpn_sqrtrem (mp_limb_t *R1P, mp_limb_t *R2P, |
|
const mp_limb_t *SP, mp_size_t SIZE) |
|
Compute the square root of {SP, SIZE} and put the result at R1P. |
|
Write the remainder at R2P, unless R2P is `NULL'. |
|
|
|
Return the size of the remainder, whether R2P was `NULL' or |
|
non-`NULL'. Iff the operand was a perfect square, the return |
|
value will be 0. |
|
|
|
The areas at R1P and SP have to be distinct. The areas at R2P and |
|
SP have to be identical or completely separate, not partially |
|
overlapping. |
|
|
|
The area at R1P needs to have space for ceil(SIZE/2) limbs. The |
|
area at R2P needs to be SIZE limbs large. |
|
|
|
- Function: mp_size_t mpn_get_str (unsigned char *STR, int BASE, |
|
mp_limb_t *S1P, mp_size_t S1SIZE) |
|
Convert {S1P, S1SIZE} to a raw unsigned char array in base BASE. |
|
The string is not in ASCII; to convert it to printable format, add |
|
the ASCII codes for `0' or `A', depending on the base and range. |
|
There may be leading zeros in the string. |
|
|
|
The area at S1P is clobbered. |
|
|
|
Return the number of characters in STR. |
|
|
|
The area at STR has to have space for the largest possible number |
|
represented by a S1SIZE long limb array, plus one extra character. |
|
|
|
- Function: mp_size_t mpn_set_str (mp_limb_t *R1P, const char *STR, |
|
size_t STRSIZE, int BASE) |
|
Convert the raw unsigned char array at STR of length STRSIZE to a |
|
limb array {S1P, S1SIZE}. The base of STR is BASE. |
|
|
|
Return the number of limbs stored in R1P. |
|
|
|
- Function: unsigned long int mpn_scan0 (const mp_limb_t *S1P, |
|
unsigned long int BIT) |
|
Scan S1P from bit position BIT for the next clear bit. |
|
|
|
It is required that there be a clear bit within the area at S1P at |
|
or beyond bit position BIT, so that the function has something to |
|
return. |
|
|
|
- Function: unsigned long int mpn_scan1 (const mp_limb_t *S1P, |
|
unsigned long int BIT) |
|
Scan S1P from bit position BIT for the next set bit. |
|
|
|
It is required that there be a set bit within the area at S1P at or |
|
beyond bit position BIT, so that the function has something to |
|
return. |
|
|
|
- Function: void mpn_random (mp_limb_t *R1P, mp_size_t R1SIZE) |
|
- Function: void mpn_random2 (mp_limb_t *R1P, mp_size_t R1SIZE) |
|
Generate a random number of length R1SIZE and store it at R1P. |
|
The most significant limb is always non-zero. `mpn_random' |
|
generates uniformly distributed limb data, `mpn_random2' generates |
|
long strings of zeros and ones in the binary representation. |
|
|
|
`mpn_random2' is intended for testing the correctness of the `mpn' |
|
routines. |
|
|
|
- Function: unsigned long int mpn_popcount (const mp_limb_t *S1P, |
|
unsigned long int SIZE) |
|
Count the number of set bits in {S1P, SIZE}. |
|
|
|
- Function: unsigned long int mpn_hamdist (const mp_limb_t *S1P, const |
|
mp_limb_t *S2P, unsigned long int SIZE) |
|
Compute the hamming distance between {S1P, SIZE} and {S2P, SIZE}. |
|
|
|
- Function: int mpn_perfect_square_p (const mp_limb_t *S1P, mp_size_t |
|
SIZE) |
|
Return non-zero iff {S1P, SIZE} is a perfect square. |
|
|
|
|
|
File: gmp.info, Node: Random Number Functions, Next: BSD Compatible Functions, Prev: Low-level Functions, Up: Top |
|
|
|
Random Number Functions |
*********************** |
*********************** |
|
|
|
There are two groups of random number functions in GNU MP; older |
|
functions that call C library random number generators, rely on a global |
|
state, and aren't very random; and newer functions that don't have these |
|
problems. The newer functions are self-contained, they accept a random |
|
state parameter that supplants global state, and generate good random |
|
numbers. |
|
|
|
The random state parameter is of the type `gmp_randstate_t'. It |
|
must be initialized by a call to one of the `gmp_randinit' functions |
|
(*Note Random State Initialization::). The initial seed is set using |
|
one of the `gmp_randseed' functions (*Note Random State |
|
Initialization::). |
|
|
|
The size of the seed determines the number of different sequences of |
|
random numbers that is possible to generate. The "quality" of the seed |
|
is the randomness of a given seed compared to the previous seed used |
|
and affects the randomness of separate number sequences. |
|
|
|
The algorithm for assigning seed is critical if the generated random |
|
numbers are to be used for important applications, such as generating |
|
cryptographic keys. |
|
|
|
The traditional method is to use the current system time for |
|
seeding. One has to be careful when using the current time though. If |
|
the application seeds the random functions very often, say several |
|
times per second, and the resolution of the system clock is |
|
comparatively low, like one second, the same sequence of numbers will |
|
be generated until the system clock ticks. Furthermore, the current |
|
system time is quite easy to guess, so a system depending on any |
|
unpredictability of the random number sequence should absolutely not |
|
use that as its only source for a seed value. |
|
|
|
On some systems there is a special device, often called |
|
`/dev/random', which provides a source of somewhat random numbers more |
|
usable as seed. |
|
|
|
The functions actually generating random functions are documented |
|
under "Miscellaneous Functions" in their respective function class: |
|
*Note Miscellaneous Integer Functions::, *Note Miscellaneous Float |
|
Functions::. |
|
|
* Menu: |
* Menu: |
|
|
* mp_limb_t: MP Basics. |
* Random State Initialization:: How to initialize a random state. |
* mpf_t: MP Basics. |
|
* mpq_t: MP Basics. |
|
* mpz_t: MP Basics. |
|
* __GNU_MP_VERSION: MP Basics. |
|
* __GNU_MP_VERSION_MINOR: MP Basics. |
|
* _mpz_realloc: Initializing Integers. |
|
* allocate_function: Custom Allocation. |
|
* deallocate_function: Custom Allocation. |
|
* gcd: BSD Compatible Functions. |
|
* itom: BSD Compatible Functions. |
|
* madd: BSD Compatible Functions. |
|
* mcmp: BSD Compatible Functions. |
|
* mdiv: BSD Compatible Functions. |
|
* mfree: BSD Compatible Functions. |
|
* min: BSD Compatible Functions. |
|
* mout: BSD Compatible Functions. |
|
* move: BSD Compatible Functions. |
|
* mp_set_memory_functions: Custom Allocation. |
|
* mpf_abs: Float Arithmetic. |
|
* mpf_add: Float Arithmetic. |
|
* mpf_add_ui: Float Arithmetic. |
|
* mpf_clear: Initializing Floats. |
|
* mpf_cmp: Float Comparison. |
|
* mpf_cmp_si: Float Comparison. |
|
* mpf_cmp_ui: Float Comparison. |
|
* mpf_div: Float Arithmetic. |
|
* mpf_div_2exp: Float Arithmetic. |
|
* mpf_div_ui: Float Arithmetic. |
|
* mpf_eq: Float Comparison. |
|
* mpf_get_d: Converting Floats. |
|
* mpf_get_prec: Initializing Floats. |
|
* mpf_get_str: Converting Floats. |
|
* mpf_init: Initializing Floats. |
|
* mpf_init2: Initializing Floats. |
|
* mpf_init_set: Simultaneous Float Init & Assign. |
|
* mpf_init_set_d: Simultaneous Float Init & Assign. |
|
* mpf_init_set_si: Simultaneous Float Init & Assign. |
|
* mpf_init_set_str: Simultaneous Float Init & Assign. |
|
* mpf_init_set_ui: Simultaneous Float Init & Assign. |
|
* mpf_inp_str: I/O of Floats. |
|
* mpf_mul: Float Arithmetic. |
|
* mpf_mul_2exp: Float Arithmetic. |
|
* mpf_mul_ui: Float Arithmetic. |
|
* mpf_neg: Float Arithmetic. |
|
* mpf_out_str: I/O of Floats. |
|
* mpf_random2: Miscellaneous Float Functions. |
|
* mpf_reldiff: Float Comparison. |
|
* mpf_set: Assigning Floats. |
|
* mpf_set_d: Assigning Floats. |
|
* mpf_set_default_prec: Initializing Floats. |
|
* mpf_set_prec: Initializing Floats. |
|
* mpf_set_prec_raw: Initializing Floats. |
|
* mpf_set_q: Assigning Floats. |
|
* mpf_set_si: Assigning Floats. |
|
* mpf_set_str: Assigning Floats. |
|
* mpf_set_ui: Assigning Floats. |
|
* mpf_set_z: Assigning Floats. |
|
* mpf_sgn: Float Comparison. |
|
* mpf_sqrt: Float Arithmetic. |
|
* mpf_sqrt_ui: Float Arithmetic. |
|
* mpf_sub: Float Arithmetic. |
|
* mpf_sub_ui: Float Arithmetic. |
|
* mpf_ui_div: Float Arithmetic. |
|
* mpf_ui_sub: Float Arithmetic. |
|
* mpn_add: Low-level Functions. |
|
* mpn_add_1: Low-level Functions. |
|
* mpn_add_n: Low-level Functions. |
|
* mpn_addmul_1: Low-level Functions. |
|
* mpn_bdivmod: Low-level Functions. |
|
* mpn_cmp: Low-level Functions. |
|
* mpn_divmod: Low-level Functions. |
|
* mpn_divmod_1: Low-level Functions. |
|
* mpn_divrem: Low-level Functions. |
|
* mpn_divrem_1: Low-level Functions. |
|
* mpn_gcd: Low-level Functions. |
|
* mpn_gcd_1: Low-level Functions. |
|
* mpn_gcdext: Low-level Functions. |
|
* mpn_get_str: Low-level Functions. |
|
* mpn_hamdist: Low-level Functions. |
|
* mpn_lshift: Low-level Functions. |
|
* mpn_mod_1: Low-level Functions. |
|
* mpn_mul: Low-level Functions. |
|
* mpn_mul_1: Low-level Functions. |
|
* mpn_mul_n: Low-level Functions. |
|
* mpn_perfect_square_p: Low-level Functions. |
|
* mpn_popcount: Low-level Functions. |
|
* mpn_preinv_mod_1: Low-level Functions. |
|
* mpn_random2: Low-level Functions. |
|
* mpn_rshift: Low-level Functions. |
|
* mpn_scan0: Low-level Functions. |
|
* mpn_scan1: Low-level Functions. |
|
* mpn_set_str: Low-level Functions. |
|
* mpn_sqrtrem: Low-level Functions. |
|
* mpn_sub: Low-level Functions. |
|
* mpn_sub_1: Low-level Functions. |
|
* mpn_sub_n: Low-level Functions. |
|
* mpn_submul_1: Low-level Functions. |
|
* mpq_add: Assigning Rationals. |
|
* mpq_canonicalize: Rational Number Functions. |
|
* mpq_clear: Initializing Rationals. |
|
* mpq_cmp: Comparing Rationals. |
|
* mpq_cmp_ui: Comparing Rationals. |
|
* mpq_denref: Applying Integer Functions. |
|
* mpq_div: Assigning Rationals. |
|
* mpq_equal: Comparing Rationals. |
|
* mpq_get_d: Miscellaneous Rational Functions. |
|
* mpq_get_den: Miscellaneous Rational Functions. |
|
* mpq_get_num: Miscellaneous Rational Functions. |
|
* mpq_init: Initializing Rationals. |
|
* mpq_inv: Assigning Rationals. |
|
* mpq_mul: Assigning Rationals. |
|
* mpq_neg: Assigning Rationals. |
|
* mpq_numref: Applying Integer Functions. |
|
* mpq_set: Initializing Rationals. |
|
* mpq_set_den: Miscellaneous Rational Functions. |
|
* mpq_set_num: Miscellaneous Rational Functions. |
|
* mpq_set_si: Initializing Rationals. |
|
* mpq_set_ui: Initializing Rationals. |
|
* mpq_set_z: Initializing Rationals. |
|
* mpq_sgn: Comparing Rationals. |
|
* mpq_sub: Assigning Rationals. |
|
* mpz_abs: Integer Arithmetic. |
|
* mpz_add: Integer Arithmetic. |
|
* mpz_add_ui: Integer Arithmetic. |
|
* mpz_and: Integer Logic and Bit Fiddling. |
|
* mpz_array_init: Initializing Integers. |
|
* mpz_cdiv_q: Integer Arithmetic. |
|
* mpz_cdiv_q_ui: Integer Arithmetic. |
|
* mpz_cdiv_qr: Integer Arithmetic. |
|
* mpz_cdiv_qr_ui: Integer Arithmetic. |
|
* mpz_cdiv_r: Integer Arithmetic. |
|
* mpz_cdiv_r_ui: Integer Arithmetic. |
|
* mpz_cdiv_ui: Integer Arithmetic. |
|
* mpz_clear: Initializing Integers. |
|
* mpz_clrbit: Integer Logic and Bit Fiddling. |
|
* mpz_cmp: Comparison Functions. |
|
* mpz_cmp_si: Comparison Functions. |
|
* mpz_cmp_ui: Comparison Functions. |
|
* mpz_com: Integer Logic and Bit Fiddling. |
|
* mpz_divexact: Integer Arithmetic. |
|
* mpz_fac_ui: Integer Arithmetic. |
|
* mpz_fdiv_q: Integer Arithmetic. |
|
* mpz_fdiv_q_2exp: Integer Arithmetic. |
|
* mpz_fdiv_q_ui: Integer Arithmetic. |
|
* mpz_fdiv_qr: Integer Arithmetic. |
|
* mpz_fdiv_qr_ui: Integer Arithmetic. |
|
* mpz_fdiv_r: Integer Arithmetic. |
|
* mpz_fdiv_r_2exp: Integer Arithmetic. |
|
* mpz_fdiv_r_ui: Integer Arithmetic. |
|
* mpz_fdiv_ui: Integer Arithmetic. |
|
* mpz_gcd: Integer Arithmetic. |
|
* mpz_gcd_ui: Integer Arithmetic. |
|
* mpz_gcdext: Integer Arithmetic. |
|
* mpz_get_d: Converting Integers. |
|
* mpz_get_si: Converting Integers. |
|
* mpz_get_str: Converting Integers. |
|
* mpz_get_ui: Converting Integers. |
|
* mpz_hamdist: Integer Logic and Bit Fiddling. |
|
* mpz_init: Initializing Integers. |
|
* mpz_init_set: Simultaneous Integer Init & Assign. |
|
* mpz_init_set_d: Simultaneous Integer Init & Assign. |
|
* mpz_init_set_si: Simultaneous Integer Init & Assign. |
|
* mpz_init_set_str: Simultaneous Integer Init & Assign. |
|
* mpz_init_set_ui: Simultaneous Integer Init & Assign. |
|
* mpz_inp_raw: I/O of Integers. |
|
* mpz_inp_str: I/O of Integers. |
|
* mpz_invert: Integer Arithmetic. |
|
* mpz_ior: Integer Logic and Bit Fiddling. |
|
* mpz_jacobi: Integer Arithmetic. |
|
* mpz_legendre: Integer Arithmetic. |
|
* mpz_mod: Integer Arithmetic. |
|
* mpz_mod_ui: Integer Arithmetic. |
|
* mpz_mul: Integer Arithmetic. |
|
* mpz_mul_2exp: Integer Arithmetic. |
|
* mpz_mul_ui: Integer Arithmetic. |
|
* mpz_neg: Integer Arithmetic. |
|
* mpz_out_raw: I/O of Integers. |
|
* mpz_out_str: I/O of Integers. |
|
* mpz_perfect_square_p: Integer Arithmetic. |
|
* mpz_popcount: Integer Logic and Bit Fiddling. |
|
* mpz_pow_ui: Integer Arithmetic. |
|
* mpz_powm: Integer Arithmetic. |
|
* mpz_powm_ui: Integer Arithmetic. |
|
* mpz_probab_prime_p: Integer Arithmetic. |
|
* mpz_random: Miscellaneous Integer Functions. |
|
* mpz_random2: Miscellaneous Integer Functions. |
|
* mpz_scan0: Integer Logic and Bit Fiddling. |
|
* mpz_scan1: Integer Logic and Bit Fiddling. |
|
* mpz_set: Assigning Integers. |
|
* mpz_set_d: Assigning Integers. |
|
* mpz_set_f: Assigning Integers. |
|
* mpz_set_q: Assigning Integers. |
|
* mpz_set_si: Assigning Integers. |
|
* mpz_set_str: Assigning Integers. |
|
* mpz_set_ui: Assigning Integers. |
|
* mpz_setbit: Integer Logic and Bit Fiddling. |
|
* mpz_sgn: Comparison Functions. |
|
* mpz_size: Miscellaneous Integer Functions. |
|
* mpz_sizeinbase: Miscellaneous Integer Functions. |
|
* mpz_sqrt: Integer Arithmetic. |
|
* mpz_sqrtrem: Integer Arithmetic. |
|
* mpz_sub: Integer Arithmetic. |
|
* mpz_sub_ui: Integer Arithmetic. |
|
* mpz_tdiv_q: Integer Arithmetic. |
|
* mpz_tdiv_q_2exp: Integer Arithmetic. |
|
* mpz_tdiv_q_ui: Integer Arithmetic. |
|
* mpz_tdiv_qr: Integer Arithmetic. |
|
* mpz_tdiv_qr_ui: Integer Arithmetic. |
|
* mpz_tdiv_r: Integer Arithmetic. |
|
* mpz_tdiv_r_2exp: Integer Arithmetic. |
|
* mpz_tdiv_r_ui: Integer Arithmetic. |
|
* mpz_ui_pow_ui: Integer Arithmetic. |
|
* msqrt: BSD Compatible Functions. |
|
* msub: BSD Compatible Functions. |
|
* mtox: BSD Compatible Functions. |
|
* mult: BSD Compatible Functions. |
|
* pow: BSD Compatible Functions. |
|
* reallocate_function: Custom Allocation. |
|
* rpow: BSD Compatible Functions. |
|
* sdiv: BSD Compatible Functions. |
|
* xtom: BSD Compatible Functions. |
|
|
|
|
|
|
File: gmp.info, Node: Random State Initialization, Prev: Random Number Functions, Up: Random Number Functions |
|
|
|
Random State Initialization |
|
=========================== |
|
|
|
See *Note Random Number Functions:: for a discussion on how to |
|
choose the initial seed value passed to these functions. |
|
|
|
- Function: void gmp_randinit (gmp_randstate_t STATE, gmp_randalg_t |
|
ALG, ...) |
|
Initialize random state variable STATE. |
|
|
|
ALG denotes what algorithm to use for random number generation. |
|
Use one of |
|
- GMP_RAND_ALG_LC -- Linear congruential. |
|
|
|
A fast generator defined by X = (aX + c) mod m. |
|
|
|
A third argument SIZE of type unsigned long int is required. |
|
SIZE is the size of the largest good quality random number to |
|
be generated, expressed in number of bits. If the random |
|
generation functions are asked for a bigger random number |
|
than indicated by this parameter, two or more numbers of SIZE |
|
bits will be generated and concatenated, resulting in a "bad" |
|
random number. This can be used to generate big random |
|
numbers relatively cheap if the quality of randomness isn't |
|
of great importance. |
|
|
|
a, c, and m are picked from a table where the modulus (m) is |
|
a power of 2 and the multiplier is congruent to 5 (mod 8). |
|
The choice is based on the SIZE parameter. The maximum SIZE |
|
supported by this algorithm is 128. If you need bigger |
|
random numbers, use your own scheme and call one of the other |
|
`gmp_randinit' functions. |
|
|
|
|
|
If ALG is 0 or GMP_RAND_ALG_DEFAULT, the default algorithm is |
|
used. The default algorithm is typically a fast algorithm like |
|
the linear congruential and requires a third SIZE argument (see |
|
GMP_RAND_ALG_LC). |
|
|
|
When you're done with a STATE variable, call `gmp_randclear' to |
|
deallocate any memory allocated by this function. |
|
|
|
`gmp_randinit' may set the following bits in GMP_ERRNO: |
|
* GMP_ERROR_UNSUPPORTED_ARGUMENT -- ALG is unsupported |
|
|
|
* GMP_ERROR_INVALID_ARGUMENT -- SIZE is too big |
|
|
|
- Function: void gmp_randinit_lc_2exp (gmp_randstate_t STATE, mpz_t A, |
|
unsigned long int C, unsigned long int M2EXP) |
|
|
|
Initialize random state variable STATE with given linear |
|
congruential scheme. |
|
|
|
Parameters A, C, and M2EXP are the multiplier, adder, and modulus |
|
for the linear congruential scheme to use, respectively. The |
|
modulus is expressed as a power of 2, so that M = 2^M2EXP. |
|
|
|
The least significant bits of a random number generated by the |
|
linear congruential algorithm where the modulus is a power of two |
|
are not very random. Therefore, the lower half of a random number |
|
generated by an LC scheme initialized with this function is |
|
discarded. Thus, the size of a random number is M2EXP / 2 |
|
(rounded upwards) bits when this function has been used for |
|
initializing the random state. |
|
|
|
When you're done with a STATE variable, call `gmp_randclear' to |
|
deallocate any memory allocated by this function. |
|
|
|
- Function: void gmp_randseed (gmp_randstate_t STATE, mpz_t SEED) |
|
- Function: void gmp_randseed_ui (gmp_randstate_t STATE, unsigned long |
|
int SEED) |
|
Set the initial seed value. |
|
|
|
Parameter SEED is the initial random seed. The function |
|
`gmp_randseed_ui' takes the SEED as an unsigned long int rather |
|
than as an mpz_t. |
|
|
|
- Function: void gmp_randclear (gmp_randstate_t STATE) |
|
Free all memory occupied by STATE. Make sure to call this |
|
function for all `gmp_randstate_t' variables when you are done with |
|
them. |
|
|
|
|
|
File: gmp.info, Node: BSD Compatible Functions, Next: Custom Allocation, Prev: Random Number Functions, Up: Top |
|
|
|
Berkeley MP Compatible Functions |
|
******************************** |
|
|
|
These functions are intended to be fully compatible with the |
|
Berkeley MP library which is available on many BSD derived U*ix |
|
systems. The `--enable-mpbsd' option must be used when building GNU MP |
|
to make these available (*note Installing GMP::). |
|
|
|
The original Berkeley MP library has a usage restriction: you cannot |
|
use the same variable as both source and destination in a single |
|
function call. The compatible functions in GNU MP do not share this |
|
restriction--inputs and outputs may overlap. |
|
|
|
It is not recommended that new programs are written using these |
|
functions. Apart from the incomplete set of functions, the interface |
|
for initializing `MINT' objects is more error prone, and the `pow' |
|
function collides with `pow' in `libm.a'. |
|
|
|
Include the header `mp.h' to get the definition of the necessary |
|
types and functions. If you are on a BSD derived system, make sure to |
|
include GNU `mp.h' if you are going to link the GNU `libmp.a' to your |
|
program. This means that you probably need to give the -I<dir> option |
|
to the compiler, where <dir> is the directory where you have GNU `mp.h'. |
|
|
|
- Function: MINT * itom (signed short int INITIAL_VALUE) |
|
Allocate an integer consisting of a `MINT' object and dynamic limb |
|
space. Initialize the integer to INITIAL_VALUE. Return a pointer |
|
to the `MINT' object. |
|
|
|
- Function: MINT * xtom (char *INITIAL_VALUE) |
|
Allocate an integer consisting of a `MINT' object and dynamic limb |
|
space. Initialize the integer from INITIAL_VALUE, a hexadecimal, |
|
'\0'-terminate C string. Return a pointer to the `MINT' object. |
|
|
|
- Function: void move (MINT *SRC, MINT *DEST) |
|
Set DEST to SRC by copying. Both variables must be previously |
|
initialized. |
|
|
|
- Function: void madd (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) |
|
Add SRC_1 and SRC_2 and put the sum in DESTINATION. |
|
|
|
- Function: void msub (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) |
|
Subtract SRC_2 from SRC_1 and put the difference in DESTINATION. |
|
|
|
- Function: void mult (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION) |
|
Multiply SRC_1 and SRC_2 and put the product in DESTINATION. |
|
|
|
- Function: void mdiv (MINT *DIVIDEND, MINT *DIVISOR, MINT *QUOTIENT, |
|
MINT *REMAINDER) |
|
- Function: void sdiv (MINT *DIVIDEND, signed short int DIVISOR, MINT |
|
*QUOTIENT, signed short int *REMAINDER) |
|
Set QUOTIENT to DIVIDEND/DIVISOR, and REMAINDER to DIVIDEND mod |
|
DIVISOR. The quotient is rounded towards zero; the remainder has |
|
the same sign as the dividend unless it is zero. |
|
|
|
Some implementations of these functions work differently--or not |
|
at all--for negative arguments. |
|
|
|
- Function: void msqrt (MINT *OPERAND, MINT *ROOT, MINT *REMAINDER) |
|
Set ROOT to the truncated integer part of the square root of |
|
OPERAND. Set REMAINDER to OPERAND-ROOT*ROOT, (i.e., zero if |
|
OPERAND is a perfect square). |
|
|
|
If ROOT and REMAINDER are the same variable, the results are |
|
undefined. |
|
|
|
- Function: void pow (MINT *BASE, MINT *EXP, MINT *MOD, MINT *DEST) |
|
Set DEST to (BASE raised to EXP) modulo MOD. |
|
|
|
- Function: void rpow (MINT *BASE, signed short int EXP, MINT *DEST) |
|
Set DEST to BASE raised to EXP. |
|
|
|
- Function: void gcd (MINT *OPERAND1, MINT *OPERAND2, MINT *RES) |
|
Set RES to the greatest common divisor of OPERAND1 and OPERAND2. |
|
|
|
- Function: int mcmp (MINT *OPERAND1, MINT *OPERAND2) |
|
Compare OPERAND1 and OPERAND2. Return a positive value if |
|
OPERAND1 > OPERAND2, zero if OPERAND1 = OPERAND2, and a negative |
|
value if OPERAND1 < OPERAND2. |
|
|
|
- Function: void min (MINT *DEST) |
|
Input a decimal string from `stdin', and put the read integer in |
|
DEST. SPC and TAB are allowed in the number string, and are |
|
ignored. |
|
|
|
- Function: void mout (MINT *SRC) |
|
Output SRC to `stdout', as a decimal string. Also output a |
|
newline. |
|
|
|
- Function: char * mtox (MINT *OPERAND) |
|
Convert OPERAND to a hexadecimal string, and return a pointer to |
|
the string. The returned string is allocated using the default |
|
memory allocation function, `malloc' by default. |
|
|
|
- Function: void mfree (MINT *OPERAND) |
|
De-allocate, the space used by OPERAND. *This function should |
|
only be passed a value returned by `itom' or `xtom'.* |
|
|
|
|
|
File: gmp.info, Node: Custom Allocation, Next: Contributors, Prev: BSD Compatible Functions, Up: Top |
|
|
|
Custom Allocation |
|
***************** |
|
|
|
By default, GMP uses `malloc', `realloc' and `free' for memory |
|
allocation. If `malloc' or `realloc' fails, GMP prints a message to |
|
the standard error output and terminates execution. |
|
|
|
Some applications might want to allocate memory in other ways, or |
|
might not want a fatal error when there is no more memory available. |
|
To accomplish this, you can specify alternative memory allocation |
|
functions. |
|
|
|
This can be done in the Berkeley compatibility library as well as |
|
the main GMP library. |
|
|
|
- Function: void mp_set_memory_functions ( |
|
void *(*ALLOC_FUNC_PTR) (size_t), |
|
void *(*REALLOC_FUNC_PTR) (void *, size_t, size_t), |
|
void (*FREE_FUNC_PTR) (void *, size_t)) |
|
Replace the current allocation functions from the arguments. If |
|
an argument is `NULL', the corresponding default function is |
|
retained. |
|
|
|
*Be sure to call this function only when there are no active GMP |
|
objects allocated using the previous memory functions! Usually, |
|
that means that you have to call this function before any other |
|
GMP function.* |
|
|
|
The functions you supply should fit the following declarations: |
|
|
|
- Function: void * allocate_function (size_t ALLOC_SIZE) |
|
This function should return a pointer to newly allocated space |
|
with at least ALLOC_SIZE storage units. |
|
|
|
- Function: void * reallocate_function (void *PTR, size_t OLD_SIZE, |
|
size_t NEW_SIZE) |
|
This function should return a pointer to newly allocated space of |
|
at least NEW_SIZE storage units, after copying at least the first |
|
OLD_SIZE storage units from PTR. It should also de-allocate the |
|
space at PTR. |
|
|
|
You can assume that the space at PTR was formerly returned from |
|
`allocate_function' or `reallocate_function', for a request for |
|
OLD_SIZE storage units. |
|
|
|
- Function: void deallocate_function (void *PTR, size_t SIZE) |
|
De-allocate the space pointed to by PTR. |
|
|
|
You can assume that the space at PTR was formerly returned from |
|
`allocate_function' or `reallocate_function', for a request for |
|
SIZE storage units. |
|
|
|
(A "storage unit" is the unit in which the `sizeof' operator returns |
|
the size of an object, normally an 8 bit byte.) |
|
|
|
|
|
File: gmp.info, Node: Contributors, Next: References, Prev: Custom Allocation, Up: Top |
|
|
|
Contributors |
|
************ |
|
|
|
Torbjorn Granlund wrote the original GMP library and is still |
|
developing and maintaining it. Several other individuals and |
|
organizations have contributed to GMP in various ways. Here is a list |
|
in chronological order: |
|
|
|
Gunnar Sjoedin and Hans Riesel helped with mathematical problems in |
|
early versions of the library. |
|
|
|
Richard Stallman contributed to the interface design and revised the |
|
first version of this manual. |
|
|
|
Brian Beuning and Doug Lea helped with testing of early versions of |
|
the library and made creative suggestions. |
|
|
|
John Amanatides of York University in Canada contributed the function |
|
`mpz_probab_prime_p'. |
|
|
|
Paul Zimmermann of Inria sparked the development of GMP 2, with his |
|
comparisons between bignum packages. |
|
|
|
Ken Weber (Kent State University, Universidade Federal do Rio Grande |
|
do Sul) contributed `mpz_gcd', `mpz_divexact', `mpn_gcd', and |
|
`mpn_bdivmod', partially supported by CNPq (Brazil) grant 301314194-2. |
|
|
|
Per Bothner of Cygnus Support helped to set up GMP to use Cygnus' |
|
configure. He has also made valuable suggestions and tested numerous |
|
intermediary releases. |
|
|
|
Joachim Hollman was involved in the design of the `mpf' interface, |
|
and in the `mpz' design revisions for version 2. |
|
|
|
Bennet Yee contributed the functions `mpz_jacobi' and `mpz_legendre'. |
|
|
|
Andreas Schwab contributed the files `mpn/m68k/lshift.S' and |
|
`mpn/m68k/rshift.S'. |
|
|
|
The development of floating point functions of GNU MP 2, were |
|
supported in part by the ESPRIT-BRA (Basic Research Activities) 6846 |
|
project POSSO (POlynomial System SOlving). |
|
|
|
GNU MP 2 was finished and released by SWOX AB (formerly known as TMG |
|
Datakonsult), Swedenborgsgatan 23, SE-118 27 STOCKHOLM, SWEDEN, in |
|
cooperation with the IDA Center for Computing Sciences, USA. |
|
|
|
Robert Harley of Inria, France and David Seal of ARM, England, |
|
suggested clever improvements for population count. |
|
|
|
Robert Harley also wrote highly optimized Karatsuba and 3-way Toom |
|
multiplication functions for GMP 3. He also contributed the ARM |
|
assembly code. |
|
|
|
Torsten Ekedahl of the Mathematical department of Stockholm |
|
University provided significant inspiration during several phases of |
|
the GMP development. His mathematical expertise helped improve several |
|
algorithms. |
|
|
|
Paul Zimmermann wrote the Burnikel-Ziegler division code, the REDC |
|
code, the REDC-based mpz_powm code, and the FFT multiply code. The |
|
ECMNET project Paul is organizing has been a driving force behind many |
|
of the optimization of GMP 3. |
|
|
|
Linus Nordberg wrote the new configure system based on autoconf and |
|
implemented the new random functions. |
|
|
|
Kent Boortz made the Macintosh port. |
|
|
|
Kevin Ryde wrote a lot of very high quality x86 code, optimized for |
|
most CPU variants. He also made countless other valuable contributions. |
|
|
|
Steve Root helped write the optimized alpha 21264 assembly code. |
|
|
|
GNU MP 3.1 was finished and released by Torbjorn Granlund and Kevin |
|
Ryde. Torbjorn's work was partially funded by the IDA Center for |
|
Computing Sciences, USA. |
|
|
|
(This list is chronological, not ordered after significance. If you |
|
have contributed to GMP but are not listed above, please tell |
|
<tege@swox.com> about the omission!) |
|
|
|
|
|
File: gmp.info, Node: References, Next: Concept Index, Prev: Contributors, Up: Top |
|
|
|
References |
|
********** |
|
|
|
* Donald E. Knuth, "The Art of Computer Programming", vol 2, |
|
"Seminumerical Algorithms", 3rd edition, Addison-Wesley, 1988. |
|
|
|
* John D. Lipson, "Elements of Algebra and Algebraic Computing", The |
|
Benjamin Cummings Publishing Company Inc, 1981. |
|
|
|
* Richard M. Stallman, "Using and Porting GCC", Free Software |
|
Foundation, 1999, available online |
|
`http://www.gnu.org/software/gcc/onlinedocs/', and in the GCC |
|
package `ftp://ftp.gnu.org/pub/gnu/gcc/'. |
|
|
|
* Peter L. Montgomery, "Modular Multiplication Without Trial |
|
Division", in Mathematics of Computation, volume 44, number 170, |
|
April 1985. |
|
|
|
* Torbjorn Granlund and Peter L. Montgomery, "Division by Invariant |
|
Integers using Multiplication", in Proceedings of the SIGPLAN |
|
PLDI'94 Conference, June 1994. Available online, |
|
`ftp://ftp.cwi.nl/pub/pmontgom/divcnst.psa4.gz' (and .psl.gz too). |
|
|
|
* Tudor Jebelean, "An algorithm for exact division", Journal of |
|
Symbolic Computation, v. 15, 1993, pp. 169-180. Research report |
|
version available online |
|
`ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-35.ps.gz' |
|
|
|
* Kenneth Weber, "The accelerated integer GCD algorithm", ACM |
|
Transactions on Mathematical Software, v. 21 (March), 1995, pp. |
|
111-122. |
|
|
|
* Christoph Burnikel and Joachim Ziegler, "Fast Recursive Division", |
|
Max-Planck-Institut fuer Informatik Research Report |
|
MPI-I-98-1-022, |
|
`http://www.mpi-sb.mpg.de/~ziegler/TechRep.ps.gz'. |
|
|
|
* Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone, |
|
"Handbook of Applied Cryptography", |
|
`http://cacr.math.uwaterloo.ca/hac/'. |
|
|
|
* Henri Cohen, "A Course in Computational Algebraic Number Theory", |
|
Graduate Texts in Mathematics number 138, Springer-Verlag, 1993. |
|
Errata available online |
|
`http://www.math.u-bordeaux.fr/~cohen' |
|
|
|
|
|
File: gmp.info, Node: Concept Index, Next: Function Index, Prev: References, Up: Top |
|
|
|
Concept Index |
|
************* |
|
|
|
* Menu: |
|
|
|
* ABI: ABI and ISA. |
|
* About this manual: Introduction to GMP. |
|
* alloca: Build Options. |
|
* Allocation of memory: Custom Allocation. |
|
* Anonymous FTP of latest version: Getting the Latest Version of GMP. |
|
* Arithmetic functions <1>: Float Arithmetic. |
|
* Arithmetic functions <2>: Rational Arithmetic. |
|
* Arithmetic functions: Integer Arithmetic. |
|
* Assignment functions <1>: Assigning Floats. |
|
* Assignment functions: Assigning Integers. |
|
* Basics: GMP Basics. |
|
* Berkeley MP compatible functions: BSD Compatible Functions. |
|
* Binomial coefficient functions: Number Theoretic Functions. |
|
* Bit manipulation functions: Integer Logic and Bit Fiddling. |
|
* Bit shift left: Integer Arithmetic. |
|
* Bit shift right: Integer Division. |
|
* Bits per limb: Useful Macros and Constants. |
|
* BSD MP compatible functions: BSD Compatible Functions. |
|
* Bug reporting: Reporting Bugs. |
|
* Build notes for binary packaging: Notes for Package Builds. |
|
* Build notes for particular systems: Notes for Particular Systems. |
|
* Build options: Build Options. |
|
* Build problems known: Known Build Problems. |
|
* Comparison functions <1>: Integer Comparisons. |
|
* Comparison functions <2>: Comparing Rationals. |
|
* Comparison functions: Float Comparison. |
|
* Compatibility with older versions: Compatibility with older versions. |
|
* Conditions for copying GNU MP: Copying. |
|
* Configuring GMP: Installing GMP. |
|
* Constants: Useful Macros and Constants. |
|
* Contributors: Contributors. |
|
* Conventions for variables: GMP Variable Conventions. |
|
* Conversion functions <1>: Converting Integers. |
|
* Conversion functions: Converting Floats. |
|
* Copying conditions: Copying. |
|
* CPUs supported: Introduction to GMP. |
|
* Custom allocation: Custom Allocation. |
|
* Demonstration programs: Build Options. |
|
* Division functions <1>: Integer Division. |
|
* Division functions <2>: Rational Arithmetic. |
|
* Division functions: Float Arithmetic. |
|
* Exact division functions: Integer Division. |
|
* Example programs: Build Options. |
|
* Exponentiation functions <1>: Float Arithmetic. |
|
* Exponentiation functions: Integer Exponentiation. |
|
* Extended GCD: Number Theoretic Functions. |
|
* Factorial functions: Number Theoretic Functions. |
|
* Fibonacci sequence functions: Number Theoretic Functions. |
|
* Float arithmetic functions: Float Arithmetic. |
|
* Float assignment functions: Assigning Floats. |
|
* Float comparison functions: Float Comparison. |
|
* Float conversion functions: Converting Floats. |
|
* Float functions: Floating-point Functions. |
|
* Float init and assign functions: Simultaneous Float Init & Assign. |
|
* Float initialization functions: Initializing Floats. |
|
* Float input and output functions: I/O of Floats. |
|
* Float miscellaneous functions: Miscellaneous Float Functions. |
|
* Floating-point functions: Floating-point Functions. |
|
* Floating-point number: Nomenclature and Types. |
|
* FTP of latest version: Getting the Latest Version of GMP. |
|
* Function classes: Function Classes. |
|
* GMP version number: Useful Macros and Constants. |
|
* gmp.h: GMP Basics. |
|
* Greatest common divisor functions: Number Theoretic Functions. |
|
* Home page: Introduction to GMP. |
|
* I/O functions <1>: I/O of Rationals. |
|
* I/O functions <2>: I/O of Integers. |
|
* I/O functions: I/O of Floats. |
|
* Initialization and assignment functions <1>: Initializing Rationals. |
|
* Initialization and assignment functions <2>: Simultaneous Float Init & Assign. |
|
* Initialization and assignment functions: Simultaneous Integer Init & Assign. |
|
* Initialization functions <1>: Initializing Integers. |
|
* Initialization functions: Initializing Floats. |
|
* Input functions <1>: I/O of Floats. |
|
* Input functions <2>: I/O of Rationals. |
|
* Input functions: I/O of Integers. |
|
* Installing GMP: Installing GMP. |
|
* Integer: Nomenclature and Types. |
|
* Integer arithmetic functions: Integer Arithmetic. |
|
* Integer assignment functions: Assigning Integers. |
|
* Integer bit manipulation functions: Integer Logic and Bit Fiddling. |
|
* Integer comparison functions: Integer Comparisons. |
|
* Integer conversion functions: Converting Integers. |
|
* Integer division functions: Integer Division. |
|
* Integer exponentiation functions: Integer Exponentiation. |
|
* Integer functions: Integer Functions. |
|
* Integer init and assign: Simultaneous Integer Init & Assign. |
|
* Integer initialization functions: Initializing Integers. |
|
* Integer input and output functions: I/O of Integers. |
|
* Integer miscellaneous functions: Miscellaneous Integer Functions. |
|
* Integer random number functions: Integer Random Numbers. |
|
* Integer root functions: Integer Roots. |
|
* Introduction: Introduction to GMP. |
|
* ISA: ABI and ISA. |
|
* Jabobi symbol functions: Number Theoretic Functions. |
|
* Kronecker symbol functions: Number Theoretic Functions. |
|
* Latest version of GMP: Getting the Latest Version of GMP. |
|
* Least common multiple functions: Number Theoretic Functions. |
|
* Libtool versioning: Notes for Package Builds. |
|
* Limb: Nomenclature and Types. |
|
* Limb size: Useful Macros and Constants. |
|
* Logical functions: Integer Logic and Bit Fiddling. |
|
* Low-level functions: Low-level Functions. |
|
* Mailing list: Introduction to GMP. |
|
* Memory allocation: Custom Allocation. |
|
* Miscellaneous float functions: Miscellaneous Float Functions. |
|
* Miscellaneous integer functions: Miscellaneous Integer Functions. |
|
* Miscellaneous rational functions: Miscellaneous Rational Functions. |
|
* Modular inverse functions: Number Theoretic Functions. |
|
* mp.h: BSD Compatible Functions. |
|
* Multi-threading: GMP and Reentrancy. |
|
* Nomenclature: Nomenclature and Types. |
|
* Number theoretic functions: Number Theoretic Functions. |
|
* Numerator and denominator: Applying Integer Functions. |
|
* Output functions <1>: I/O of Floats. |
|
* Output functions <2>: I/O of Integers. |
|
* Output functions: I/O of Rationals. |
|
* Packaged builds: Notes for Package Builds. |
|
* Parameter conventions: GMP Variable Conventions. |
|
* Precision of floats: Floating-point Functions. |
|
* Prime testing functions: Number Theoretic Functions. |
|
* Random number functions <1>: Integer Random Numbers. |
|
* Random number functions: Random Number Functions. |
|
* Random number state: Random State Initialization. |
|
* Rational arithmetic functions: Rational Arithmetic. |
|
* Rational comparison functions: Comparing Rationals. |
|
* Rational init and assign: Initializing Rationals. |
|
* Rational input and output functions: I/O of Rationals. |
|
* Rational miscellaneous functions: Miscellaneous Rational Functions. |
|
* Rational number: Nomenclature and Types. |
|
* Rational number functions: Rational Number Functions. |
|
* Rational numerator and denominator: Applying Integer Functions. |
|
* Reentrancy: GMP and Reentrancy. |
|
* References: References. |
|
* Reporting bugs: Reporting Bugs. |
|
* Root extraction functions <1>: Float Arithmetic. |
|
* Root extraction functions: Integer Roots. |
|
* Stack overflow segfaults: Build Options. |
|
* Stripped libraries: Known Build Problems. |
|
* Thread safety: GMP and Reentrancy. |
|
* Types: Nomenclature and Types. |
|
* Upward compatibility: Compatibility with older versions. |
|
* Useful macros and constants: Useful Macros and Constants. |
|
* User-defined precision: Floating-point Functions. |
|
* Variable conventions: GMP Variable Conventions. |
|
* Version number: Useful Macros and Constants. |
|
* Web page: Introduction to GMP. |
|
|