=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/Attic/gmp.info-3,v retrieving revision 1.1.1.3 retrieving revision 1.1.1.4 diff -u -p -r1.1.1.3 -r1.1.1.4 --- OpenXM_contrib/gmp/Attic/gmp.info-3 2000/12/01 05:44:46 1.1.1.3 +++ OpenXM_contrib/gmp/Attic/gmp.info-3 2003/08/25 16:06:02 1.1.1.4 @@ -1,1012 +1,1173 @@ -This is gmp.info, produced by makeinfo version 4.0 from gmp.texi. +This is gmp.info, produced by makeinfo version 4.2 from gmp.texi. +This manual describes how to install and use the GNU multiple precision +arithmetic library, version 4.1.2. + + Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this +document under the terms of the GNU Free Documentation License, Version +1.1 or any later version published by the Free Software Foundation; +with no Invariant Sections, with the Front-Cover Texts being "A GNU +Manual", and with the Back-Cover Texts being "You have freedom to copy +and modify this GNU Manual, like GNU software". A copy of the license +is included in *Note GNU Free Documentation License::. INFO-DIR-SECTION GNU libraries START-INFO-DIR-ENTRY * gmp: (gmp). GNU Multiple Precision Arithmetic Library. END-INFO-DIR-ENTRY - This file documents GNU MP, a library for arbitrary-precision -arithmetic. + +File: gmp.info, Node: Number Theoretic Functions, Next: Integer Comparisons, Prev: Integer Roots, Up: Integer Functions - Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 -Free Software Foundation, Inc. +Number Theoretic Functions +========================== - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. + - Function: int mpz_probab_prime_p (mpz_t N, int REPS) + Determine whether N is prime. Return 2 if N is definitely prime, + return 1 if N is probably prime (without being certain), or return + 0 if N is definitely composite. - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. + This function does some trial divisions, then some Miller-Rabin + probabilistic primality tests. REPS controls how many such tests + are done, 5 to 10 is a reasonable number, more will reduce the + chances of a composite being returned as "probably prime". - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Foundation. + Miller-Rabin and similar tests can be more properly called + compositeness tests. Numbers which fail are known to be composite + but those which pass might be prime or might be composite. Only a + few composites pass, hence those which pass are considered + probably prime. - -File: gmp.info, Node: Low-level Functions, Next: Random Number Functions, Prev: Floating-point Functions, Up: Top + - Function: void mpz_nextprime (mpz_t ROP, mpz_t OP) + Set ROP to the next prime greater than OP. -Low-level Functions -******************* + This function uses a probabilistic algorithm to identify primes. + For practical purposes it's adequate, the chance of a composite + passing will be extremely small. - This chapter describes low-level GMP functions, used to implement -the high-level GMP functions, but also intended for time-critical user -code. + - Function: void mpz_gcd (mpz_t ROP, mpz_t OP1, mpz_t OP2) + Set ROP to the greatest common divisor of OP1 and OP2. The result + is always positive even if one or both input operands are negative. - These functions start with the prefix `mpn_'. + - Function: unsigned long int mpz_gcd_ui (mpz_t ROP, mpz_t OP1, + unsigned long int OP2) + Compute the greatest common divisor of OP1 and OP2. If ROP is not + `NULL', store the result there. - 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. + If the result is small enough to fit in an `unsigned long int', it + is returned. If the result does not fit, 0 is returned, and the + result is equal to the argument OP1. Note that the result will + always fit if OP2 is non-zero. - 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. + - Function: void mpz_gcdext (mpz_t G, mpz_t S, mpz_t T, mpz_t A, mpz_t + B) + Set G to the greatest common divisor of A and B, and in addition + set S and T to coefficients satisfying A*S + B*T = G. G is always + positive, even if one or both of A and B are negative. - 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. + If T is `NULL' then that value is not computed. - 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. + - Function: void mpz_lcm (mpz_t ROP, mpz_t OP1, mpz_t OP2) + - Function: void mpz_lcm_ui (mpz_t ROP, mpz_t OP1, unsigned long OP2) + Set ROP to the least common multiple of OP1 and OP2. ROP is + always positive, irrespective of the signs of OP1 and OP2. ROP + will be zero if either OP1 or OP2 is zero. - The `mpn' functions are the base for the implementation of the -`mpz_', `mpf_', and `mpq_' functions. + - Function: int mpz_invert (mpz_t ROP, mpz_t OP1, mpz_t OP2) + Compute the inverse of OP1 modulo OP2 and put the result in ROP. + If the inverse exists, the return value is non-zero and ROP will + satisfy 0 <= ROP < OP2. If an inverse doesn't exist the return + value is zero and ROP is undefined. - 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. + - Function: int mpz_jacobi (mpz_t A, mpz_t B) + Calculate the Jacobi symbol (A/B). This is defined only for B odd. - cy = mpn_add_n (destp, s1p, s2p, size) + - Function: int mpz_legendre (mpz_t A, mpz_t P) + Calculate the Legendre symbol (A/P). This is defined only for P + an odd positive prime, and for such P it's identical to the Jacobi + symbol. -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: int mpz_kronecker (mpz_t A, mpz_t B) + - Function: int mpz_kronecker_si (mpz_t A, long B) + - Function: int mpz_kronecker_ui (mpz_t A, unsigned long B) + - Function: int mpz_si_kronecker (long A, mpz_t B) + - Function: int mpz_ui_kronecker (unsigned long A, mpz_t B) + Calculate the Jacobi symbol (A/B) with the Kronecker extension + (a/2)=(2/a) when a odd, or (a/2)=0 when a even. - - 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. + When B is odd the Jacobi symbol and Kronecker symbol are + identical, so `mpz_kronecker_ui' etc can be used for mixed + precision Jacobi symbols too. - 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. + For more information see Henri Cohen section 1.4.2 (*note + References::), or any number theory textbook. See also the + example program `demos/qcn.c' which uses `mpz_kronecker_ui'. - - 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: unsigned long int mpz_remove (mpz_t ROP, mpz_t OP, mpz_t F) + Remove all occurrences of the factor F from OP and store the + result in ROP. The return value is how many such occurrences were + removed. - - 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. + - Function: void mpz_fac_ui (mpz_t ROP, unsigned long int OP) + Set ROP to OP!, the factorial of OP. - This function requires that S1SIZE is greater than or equal to - S2SIZE. + - Function: void mpz_bin_ui (mpz_t ROP, mpz_t N, unsigned long int K) + - Function: void mpz_bin_uiui (mpz_t ROP, unsigned long int N, + unsigned long int K) + Compute the binomial coefficient N over K and store the result in + ROP. Negative values of N are supported by `mpz_bin_ui', using + the identity bin(-n,k) = (-1)^k * bin(n+k-1,k), see Knuth volume 1 + section 1.2.6 part G. - - 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. + - Function: void mpz_fib_ui (mpz_t FN, unsigned long int N) + - Function: void mpz_fib2_ui (mpz_t FN, mpz_t FNSUB1, unsigned long + int N) + `mpz_fib_ui' sets FN to to F[n], the N'th Fibonacci number. + `mpz_fib2_ui' sets FN to F[n], and FNSUB1 to F[n-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. + These functions are designed for calculating isolated Fibonacci + numbers. When a sequence of values is wanted it's best to start + with `mpz_fib2_ui' and iterate the defining F[n+1]=F[n]+F[n-1] or + similar. - - 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: void mpz_lucnum_ui (mpz_t LN, unsigned long int N) + - Function: void mpz_lucnum2_ui (mpz_t LN, mpz_t LNSUB1, unsigned long + int N) + `mpz_lucnum_ui' sets LN to to L[n], the N'th Lucas number. + `mpz_lucnum2_ui' sets LN to L[n], and LNSUB1 to L[n-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. + These functions are designed for calculating isolated Lucas + numbers. When a sequence of values is wanted it's best to start + with `mpz_lucnum2_ui' and iterate the defining L[n+1]=L[n]+L[n-1] + or similar. - This function requires that S1SIZE is greater than or equal to - S2SIZE. + The Fibonacci numbers and Lucas numbers are related sequences, so + it's never necessary to call both `mpz_fib2_ui' and + `mpz_lucnum2_ui'. The formulas for going from Fibonacci to Lucas + can be found in *Note Lucas Numbers Algorithm::, the reverse is + straightforward too. - - 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. + +File: gmp.info, Node: Integer Comparisons, Next: Integer Logic and Bit Fiddling, Prev: Number Theoretic Functions, Up: Integer Functions - The destination has to have space for 2*SIZE limbs, even if the - significant result might be one limb smaller. +Comparison Functions +==================== - - 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. + - Function: int mpz_cmp (mpz_t OP1, mpz_t OP2) + - Function: int mpz_cmp_d (mpz_t OP1, double OP2) + - Macro: int mpz_cmp_si (mpz_t OP1, signed long int OP2) + - Macro: int mpz_cmp_ui (mpz_t OP1, unsigned long int OP2) + Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero + if OP1 = OP2, or a negative value if OP1 < OP2. - 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. + Note that `mpz_cmp_ui' and `mpz_cmp_si' are macros and will + evaluate their arguments more than once. - 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: int mpz_cmpabs (mpz_t OP1, mpz_t OP2) + - Function: int mpz_cmpabs_d (mpz_t OP1, double OP2) + - Function: int mpz_cmpabs_ui (mpz_t OP1, unsigned long int OP2) + Compare the absolute values of OP1 and OP2. Return a positive + value if abs(OP1) > abs(OP2), zero if abs(OP1) = abs(OP2), or a + negative value if abs(OP1) < abs(OP2). - - 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. + Note that `mpz_cmpabs_si' is a macro and will evaluate its + arguments more than once. - 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. + - Macro: int mpz_sgn (mpz_t OP) + Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0. - - 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 function is actually implemented as a macro. It evaluates + its argument multiple times. - 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. + +File: gmp.info, Node: Integer Logic and Bit Fiddling, Next: I/O of Integers, Prev: Integer Comparisons, Up: Integer Functions - - 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. +Logical and Bit Manipulation Functions +====================================== - The destination has to have space for S1SIZE + S2SIZE limbs, even - if the result might be one limb smaller. + These functions behave as if twos complement arithmetic were used +(although sign-magnitude is the actual implementation). The least +significant bit is number 0. - This function requires that S1SIZE is greater than or equal to - S2SIZE. The destination must be distinct from either input - operands. + - Function: void mpz_and (mpz_t ROP, mpz_t OP1, mpz_t OP2) + Set ROP to OP1 logical-and OP2. - - Function: void 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. + - Function: void mpz_ior (mpz_t ROP, mpz_t OP1, mpz_t OP2) + Set ROP to OP1 inclusive-or OP2. - The quotient written at QP will be NN - DN + 1 limbs. The - remainder written at RP will be DN limbs. + - Function: void mpz_xor (mpz_t ROP, mpz_t OP1, mpz_t OP2) + Set ROP to OP1 exclusive-or OP2. - It is required that NN is greater than or equal to DN. The QXN - operand must be zero. + - Function: void mpz_com (mpz_t ROP, mpz_t OP) + Set ROP to the one's complement of OP. - The quotient is rounded towards 0. + - Function: unsigned long int mpz_popcount (mpz_t OP) + If OP>=0, return the population count of OP, which is the number + of 1 bits in the binary representation. If OP<0, the number of 1s + is infinite, and the return value is MAX_ULONG, the largest + possible `unsigned long'. - No overlap between arguments is permitted. + - Function: unsigned long int mpz_hamdist (mpz_t OP1, mpz_t OP2) + If OP1 and OP2 are both >=0 or both <0, return the hamming + distance between the two operands, which is the number of bit + positions where OP1 and OP2 have different bit values. If one + operand is >=0 and the other <0 then the number of bits different + is infinite, and the return value is MAX_ULONG, the largest + possible `unsigned long'. - - 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.] + - Function: unsigned long int mpz_scan0 (mpz_t OP, unsigned long int + STARTING_BIT) + - Function: unsigned long int mpz_scan1 (mpz_t OP, unsigned long int + STARTING_BIT) + Scan OP, starting from bit STARTING_BIT, towards more significant + bits, until the first 0 or 1 bit (respectively) is found. Return + the index of the found bit. - 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). + If the bit at STARTING_BIT is already what's sought, then + STARTING_BIT is returned. - In addition to an integer quotient, XSIZE fraction limbs are - developed, and stored after the integral limbs. For most usages, - XSIZE will be zero. + If there's no bit found, then MAX_ULONG is returned. This will + happen in `mpz_scan0' past the end of a positive number, or + `mpz_scan1' past the end of a negative. - 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. + - Function: void mpz_setbit (mpz_t ROP, unsigned long int BIT_INDEX) + Set bit BIT_INDEX in ROP. - If the quotient is not needed, pass RS2P + S3SIZE as R1P. Aside - from that special case, no overlap between arguments is permitted. + - Function: void mpz_clrbit (mpz_t ROP, unsigned long int BIT_INDEX) + Clear bit BIT_INDEX in ROP. - Return the most significant limb of the quotient, either 0 or 1. + - Function: int mpz_tstbit (mpz_t OP, unsigned long int BIT_INDEX) + Test bit BIT_INDEX in OP and return 0 or 1 accordingly. - The area at R1P needs to be RS2SIZE - S3SIZE + XSIZE limbs large. + +File: gmp.info, Node: I/O of Integers, Next: Integer Random Numbers, Prev: Integer Logic and Bit Fiddling, Up: Integer Functions - - 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. +Input and Output Functions +========================== - 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. + Functions that perform input from a stdio stream, and functions that +output to a stdio stream. Passing a `NULL' pointer for a STREAM +argument to any of these functions will make them read from `stdin' and +write to `stdout', respectively. - `mpn_divmod_1' exists for upward source compatibility and is - simply a macro calling `mpn_divrem_1' with an XSIZE of 0. + When using any of these functions, it is a good idea to include +`stdio.h' before `gmp.h', since that will allow `gmp.h' to define +prototypes for these functions. - The areas at R1P and S2P have to be identical or completely - separate, not partially overlapping. + - Function: size_t mpz_out_str (FILE *STREAM, int BASE, mpz_t OP) + Output OP on stdio stream STREAM, as a string of digits in base + BASE. The base may vary from 2 to 36. - - 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.* + Return the number of bytes written, or if an error occurred, + return 0. - - 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. + - Function: size_t mpz_inp_str (mpz_t ROP, FILE *STREAM, int BASE) + Input a possibly white-space preceded string in base BASE from + stdio stream STREAM, and put the read integer in ROP. The base + may vary from 2 to 36. If BASE is 0, the actual base is + determined from the leading characters: if the first two + characters are `0x' or `0X', hexadecimal is assumed, otherwise if + the first character is `0', octal is assumed, otherwise decimal is + assumed. - `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. + Return the number of bytes read, or if an error occurred, return 0. - These routines use a multiply-by-inverse and will be faster than - `mpn_divrem_1' on CPUs with fast multiplication but slow division. + - Function: size_t mpz_out_raw (FILE *STREAM, mpz_t OP) + Output OP on stdio stream STREAM, in raw binary format. The + integer is written in a portable format, with 4 bytes of size + information, and that many bytes of limbs. Both the size and the + limbs are written in decreasing significance order (i.e., in + big-endian). - 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. + The output can be read with `mpz_inp_raw'. - - 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. + Return the number of bytes written, or if an error occurred, + return 0. - - 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.* + The output of this can not be read by `mpz_inp_raw' from GMP 1, + because of changes necessary for compatibility between 32-bit and + 64-bit machines. - - 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. + - Function: size_t mpz_inp_raw (mpz_t ROP, FILE *STREAM) + Input from stdio stream STREAM in the format written by + `mpz_out_raw', and put the result in ROP. Return the number of + bytes read, or if an error occurred, return 0. - {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 routine can read the output from `mpz_out_raw' also from GMP + 1, in spite of changes necessary for compatibility between 32-bit + and 64-bit machines. - This function requires that S1SIZE * BITS_PER_MP_LIMB >= D, and - that {S2P, S2SIZE} is odd. + +File: gmp.info, Node: Integer Random Numbers, Next: Integer Import and Export, Prev: I/O of Integers, Up: Integer Functions - *This interface is preliminary. It might change incompatibly in - future revisions.* +Random Number Functions +======================= - - 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. + The random number functions of GMP come in two groups; older function +that rely on a global state, and newer functions that accept a state +parameter that is read and modified. Please see the *Note Random +Number Functions:: for more information on how to use and not to use +random number functions. - Overlapping of the destination space and the source space is - allowed in this function, provided RP >= SRC_PTR. + - Function: void mpz_urandomb (mpz_t ROP, gmp_randstate_t STATE, + unsigned long int N) + Generate a uniformly distributed random integer in the range 0 to + 2^N-1, inclusive. - This function is written in assembly for most targets. + The variable STATE must be initialized by calling one of the + `gmp_randinit' functions (*Note Random State Initialization::) + before invoking this function. - - 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. + - Function: void mpz_urandomm (mpz_t ROP, gmp_randstate_t STATE, mpz_t + N) + Generate a uniform random integer in the range 0 to N-1, inclusive. - Overlapping of the destination space and the source space is - allowed in this function, provided RP <= SRC_PTR. + The variable STATE must be initialized by calling one of the + `gmp_randinit' functions (*Note Random State Initialization::) + before invoking this function. - This function is written in assembly for most targets. + - Function: void mpz_rrandomb (mpz_t ROP, gmp_randstate_t STATE, + unsigned long int N) + Generate a random integer with long strings of zeros and ones in + the binary representation. Useful for testing functions and + algorithms, since this kind of random numbers have proven to be + more likely to trigger corner-case bugs. The random number will + be in the range 0 to 2^N-1, inclusive. - - 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. + The variable STATE must be initialized by calling one of the + `gmp_randinit' functions (*Note Random State Initialization::) + before invoking this function. - - 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. + - Function: void mpz_random (mpz_t ROP, mp_size_t MAX_SIZE) + Generate a random integer of at most MAX_SIZE limbs. The generated + random number doesn't satisfy any particular requirements of + randomness. Negative random numbers are generated when MAX_SIZE + is negative. - {S1P, S1SIZE} must have at least as many bits as {S2P, S2SIZE}, - and {S2P, S2SIZE} must be odd. + This function is obsolete. Use `mpz_urandomb' or `mpz_urandomm' + instead. - - 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: void mpz_random2 (mpz_t ROP, mp_size_t MAX_SIZE) + Generate a random integer of at most MAX_SIZE limbs, with long + strings of zeros and ones in the binary representation. Useful + for testing functions and algorithms, since this kind of random + numbers have proven to be more likely to trigger corner-case bugs. + Negative random numbers are generated when MAX_SIZE is negative. - - 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. + This function is obsolete. Use `mpz_rrandomb' instead. - {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}. + +File: gmp.info, Node: Integer Import and Export, Next: Miscellaneous Integer Functions, Prev: Integer Random Numbers, Up: Integer Functions - - 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'. +Integer Import and Export +========================= - 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. + `mpz_t' variables can be converted to and from arbitrary words of +binary data with the following functions. - 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. + - Function: void mpz_import (mpz_t ROP, size_t COUNT, int ORDER, int + SIZE, int ENDIAN, size_t NAILS, const void *OP) + Set ROP from an array of word data at OP. - The area at R1P needs to have space for ceil(SIZE/2) limbs. The - area at R2P needs to be SIZE limbs large. + The parameters specify the format of the data. COUNT many words + are read, each SIZE bytes. ORDER can be 1 for most significant + word first or -1 for least significant first. Within each word + ENDIAN can be 1 for most significant byte first, -1 for least + significant first, or 0 for the native endianness of the host CPU. + The most significant NAILS bits of each word are skipped, this + can be 0 to use the full words. - - 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. + There are no data alignment restrictions on OP, any address is + allowed. - The area at S1P is clobbered. + Here's an example converting an array of `unsigned long' data, most + significant element first and host byte order within each value. - Return the number of characters in STR. + unsigned long a[20]; + mpz_t z; + mpz_import (z, 20, 1, sizeof(a[0]), 0, 0, a); - The area at STR has to have space for the largest possible number - represented by a S1SIZE long limb array, plus one extra character. + This example assumes the full `sizeof' bytes are used for data in + the given type, which is usually true, and certainly true for + `unsigned long' everywhere we know of. However on Cray vector + systems it may be noted that `short' and `int' are always stored + in 8 bytes (and with `sizeof' indicating that) but use only 32 or + 46 bits. The NAILS feature can account for this, by passing for + instance `8*sizeof(int)-INT_BIT'. - - 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. + - Function: void *mpz_export (void *ROP, size_t *COUNT, int ORDER, int + SIZE, int ENDIAN, size_t NAILS, mpz_t OP) + Fill ROP with word data from OP. - Return the number of limbs stored in R1P. + The parameters specify the format of the data produced. Each word + will be SIZE bytes and ORDER can be 1 for most significant word + first or -1 for least significant first. Within each word ENDIAN + can be 1 for most significant byte first, -1 for least significant + first, or 0 for the native endianness of the host CPU. The most + significant NAILS bits of each word are unused and set to zero, + this can be 0 to produce full words. - - 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. + The number of words produced is written to `*COUNT'. ROP must + have enough space for the data, or if ROP is `NULL' then a result + array of the necessary size is allocated using the current GMP + allocation function (*note Custom Allocation::). In either case + the return value is the destination used, ROP or the allocated + block. - 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. + If OP is non-zero then the most significant word produced will be + non-zero. If OP is zero then the count returned will be zero and + nothing written to ROP. If ROP is `NULL' in this case, no block + is allocated, just `NULL' is returned. - - 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. + There are no data alignment restrictions on ROP, any address is + allowed. The sign of OP is ignored, just the absolute value is + used. - 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. + When an application is allocating space itself the required size + can be determined with a calculation like the following. Since + `mpz_sizeinbase' always returns at least 1, `count' here will be + at least one, which avoids any portability problems with + `malloc(0)', though if `z' is zero no space at all is actually + needed. - - 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. + numb = 8*size - nail; + count = (mpz_sizeinbase (z, 2) + numb-1) / numb; + p = malloc (count * size); - `mpn_random2' is intended for testing the correctness of the `mpn' - routines. + +File: gmp.info, Node: Miscellaneous Integer Functions, Prev: Integer Import and Export, Up: Integer Functions - - Function: unsigned long int mpn_popcount (const mp_limb_t *S1P, - unsigned long int SIZE) - Count the number of set bits in {S1P, SIZE}. +Miscellaneous Functions +======================= - - 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 mpz_fits_ulong_p (mpz_t OP) + - Function: int mpz_fits_slong_p (mpz_t OP) + - Function: int mpz_fits_uint_p (mpz_t OP) + - Function: int mpz_fits_sint_p (mpz_t OP) + - Function: int mpz_fits_ushort_p (mpz_t OP) + - Function: int mpz_fits_sshort_p (mpz_t OP) + Return non-zero iff the value of OP fits in an `unsigned long int', + `signed long int', `unsigned int', `signed int', `unsigned short + int', or `signed short int', respectively. Otherwise, return zero. - - 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. + - Macro: int mpz_odd_p (mpz_t OP) + - Macro: int mpz_even_p (mpz_t OP) + Determine whether OP is odd or even, respectively. Return + non-zero if yes, zero if no. These macros evaluate their argument + more than once. - -File: gmp.info, Node: Random Number Functions, Next: BSD Compatible Functions, Prev: Low-level Functions, Up: Top + - Function: size_t mpz_size (mpz_t OP) + Return the size of OP measured in number of limbs. If OP is zero, + the returned value will be zero. -Random Number Functions -*********************** + - Function: size_t mpz_sizeinbase (mpz_t OP, int BASE) + Return the size of OP measured in number of digits in base BASE. + The base may vary from 2 to 36. The sign of OP is ignored, just + the absolute value is used. The result will be exact or 1 too + big. If BASE is a power of 2, the result will always be exact. + If OP is zero the return value is always 1. - 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. + This function is useful in order to allocate the right amount of + space before converting OP to a string. The right amount of + allocation is normally two more than the value returned by + `mpz_sizeinbase' (one extra for a minus sign and one for the + null-terminator). - 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::). + +File: gmp.info, Node: Rational Number Functions, Next: Floating-point Functions, Prev: Integer Functions, Up: Top - 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. +Rational Number Functions +************************* - The algorithm for assigning seed is critical if the generated random -numbers are to be used for important applications, such as generating -cryptographic keys. + This chapter describes the GMP functions for performing arithmetic +on rational numbers. These functions start with the prefix `mpq_'. - 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. + Rational numbers are stored in objects of type `mpq_t'. - On some systems there is a special device, often called -`/dev/random', which provides a source of somewhat random numbers more -usable as seed. + All rational arithmetic functions assume operands have a canonical +form, and canonicalize their result. The canonical from means that the +denominator and the numerator have no common factors, and that the +denominator is positive. Zero has the unique representation 0/1. - The functions actually generating random functions are documented -under "Miscellaneous Functions" in their respective function class: -*Note Miscellaneous Integer Functions::, *Note Miscellaneous Float -Functions::. + Pure assignment functions do not canonicalize the assigned variable. +It is the responsibility of the user to canonicalize the assigned +variable before any arithmetic operations are performed on that +variable. + - Function: void mpq_canonicalize (mpq_t OP) + Remove any factors that are common to the numerator and + denominator of OP, and make the denominator positive. + * Menu: -* Random State Initialization:: How to initialize a random state. +* Initializing Rationals:: +* Rational Conversions:: +* Rational Arithmetic:: +* Comparing Rationals:: +* Applying Integer Functions:: +* I/O of Rationals:: -File: gmp.info, Node: Random State Initialization, Prev: Random Number Functions, Up: Random Number Functions +File: gmp.info, Node: Initializing Rationals, Next: Rational Conversions, Prev: Rational Number Functions, Up: Rational Number Functions -Random State Initialization -=========================== +Initialization and Assignment Functions +======================================= - See *Note Random Number Functions:: for a discussion on how to -choose the initial seed value passed to these functions. + - Function: void mpq_init (mpq_t DEST_RATIONAL) + Initialize DEST_RATIONAL and set it to 0/1. Each variable should + normally only be initialized once, or at least cleared out (using + the function `mpq_clear') between each initialization. - - Function: void gmp_randinit (gmp_randstate_t STATE, gmp_randalg_t - ALG, ...) - Initialize random state variable STATE. + - Function: void mpq_clear (mpq_t RATIONAL_NUMBER) + Free the space occupied by RATIONAL_NUMBER. Make sure to call this + function for all `mpq_t' variables when you are done with them. - ALG denotes what algorithm to use for random number generation. - Use one of - - GMP_RAND_ALG_LC -- Linear congruential. + - Function: void mpq_set (mpq_t ROP, mpq_t OP) + - Function: void mpq_set_z (mpq_t ROP, mpz_t OP) + Assign ROP from OP. - A fast generator defined by X = (aX + c) mod m. + - Function: void mpq_set_ui (mpq_t ROP, unsigned long int OP1, + unsigned long int OP2) + - Function: void mpq_set_si (mpq_t ROP, signed long int OP1, unsigned + long int OP2) + Set the value of ROP to OP1/OP2. Note that if OP1 and OP2 have + common factors, ROP has to be passed to `mpq_canonicalize' before + any operations are performed on ROP. - 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. + - Function: int mpq_set_str (mpq_t ROP, char *STR, int BASE) + Set ROP from a null-terminated string STR in the given BASE. - 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. + The string can be an integer like "41" or a fraction like + "41/152". The fraction must be in canonical form (*note Rational + Number Functions::), or if not then `mpq_canonicalize' must be + called. + The numerator and optional denominator are parsed the same as in + `mpz_set_str' (*note Assigning Integers::). White space is + allowed in the string, and is simply ignored. The BASE can vary + from 2 to 36, or if BASE is 0 then the leading characters are + used: `0x' for hex, `0' for octal, or decimal otherwise. Note + that this is done separately for the numerator and denominator, so + for instance `0xEF/100' is 239/100, whereas `0xEF/0x100' is + 239/256. - 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). + The return value is 0 if the entire string is a valid number, or + -1 if not. - When you're done with a STATE variable, call `gmp_randclear' to - deallocate any memory allocated by this function. + - Function: void mpq_swap (mpq_t ROP1, mpq_t ROP2) + Swap the values ROP1 and ROP2 efficiently. - `gmp_randinit' may set the following bits in GMP_ERRNO: - * GMP_ERROR_UNSUPPORTED_ARGUMENT -- ALG is unsupported + +File: gmp.info, Node: Rational Conversions, Next: Rational Arithmetic, Prev: Initializing Rationals, Up: Rational Number Functions - * GMP_ERROR_INVALID_ARGUMENT -- SIZE is too big +Conversion Functions +==================== - - Function: void gmp_randinit_lc_2exp (gmp_randstate_t STATE, mpz_t A, - unsigned long int C, unsigned long int M2EXP) + - Function: double mpq_get_d (mpq_t OP) + Convert OP to a `double'. - Initialize random state variable STATE with given linear - congruential scheme. + - Function: void mpq_set_d (mpq_t ROP, double OP) + - Function: void mpq_set_f (mpq_t ROP, mpf_t OP) + Set ROP to the value of OP, without rounding. - 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. + - Function: char * mpq_get_str (char *STR, int BASE, mpq_t OP) + Convert OP to a string of digits in base BASE. The base may vary + from 2 to 36. The string will be of the form `num/den', or if the + denominator is 1 then just `num'. - 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. + If STR is `NULL', the result string is allocated using the current + allocation function (*note Custom Allocation::). The block will be + `strlen(str)+1' bytes, that being exactly enough for the string and + null-terminator. - When you're done with a STATE variable, call `gmp_randclear' to - deallocate any memory allocated by this function. + If STR is not `NULL', it should point to a block of storage large + enough for the result, that being - - 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. + mpz_sizeinbase (mpq_numref(OP), BASE) + + mpz_sizeinbase (mpq_denref(OP), BASE) + 3 - 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. + The three extra bytes are for a possible minus sign, possible + slash, and the null-terminator. - - 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. + A pointer to the result string is returned, being either the + allocated block, or the given STR. -File: gmp.info, Node: BSD Compatible Functions, Next: Custom Allocation, Prev: Random Number Functions, Up: Top +File: gmp.info, Node: Rational Arithmetic, Next: Comparing Rationals, Prev: Rational Conversions, Up: Rational Number Functions -Berkeley MP Compatible Functions -******************************** +Arithmetic 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::). + - Function: void mpq_add (mpq_t SUM, mpq_t ADDEND1, mpq_t ADDEND2) + Set SUM to ADDEND1 + ADDEND2. - 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. + - Function: void mpq_sub (mpq_t DIFFERENCE, mpq_t MINUEND, mpq_t + SUBTRAHEND) + Set DIFFERENCE to MINUEND - SUBTRAHEND. - 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'. + - Function: void mpq_mul (mpq_t PRODUCT, mpq_t MULTIPLIER, mpq_t + MULTIPLICAND) + Set PRODUCT to MULTIPLIER times MULTIPLICAND. - 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