COHERENT manpages
This page displays the COHERENT manpage for libmp [Library for multiple-precision mathematics].
List of available manpages
Index
libmp -- Library
Library for multiple-precision mathematics
/usr/lib/libmp.a
The COHERENT library libmp contains routines that allow you to perform
multiple-precision arithmetic. These functions manipulate a data structure
called a mint, or ``multiple-precision integer,'' which the header file
mprec.h defines as follows:
typedef struct {
unsigned len;
char *val;
} mint;
You should not depend on the details of this structure, because on some
machines a different representation may be more efficient. Using the
listed functions is always safe.
The following gives the multiple-precision routines:
gcd()..........Set variable to greatest common divisor
ispos()........Return if variable is positive or negative
itom().........Create a multiple-precision integer
madd().........Add multiple-precision integers
mcmp().........Compare multiple-precision integers
mcopy()........Copy a multiple-precision integer
mdiv().........Divide multiple-precision integers
min()..........Read multiple-precision integer from stdin
minit()........Condition global or auto multiple-precision integer
mintfr().......Free a multiple-precision integer
mitom()........Reinitialize a multiple-precision integer
mneg().........Negate multiple-precision integer
mout().........Write multiple-precision integer to stdout
msqrt()........Compute square root of multiple-precision integer
msub().........Subtract multiple-precision integers
mtoi().........Convert multiple-precision integer to integer
mtos().........Convert multiple-precision integer to string
mult().........Multiply multiple-precision integers
mvfree().......Free multiple-precision integer
pow()..........Raise multiple-precision integer to power
rpow().........Raise multiple-precision integer to power
sdiv().........Divide multiple-precision integers
smult()........Multiply multiple-precision integers
spow().........Raise multiple-precision integer to power
xgcd().........Extended greatest-common-divisor function
zerop()........Indicate if multi-precision integer is zero
itom() creates a new mint, initializes it to the signed integer value n,
and returns a pointer to it. Storage used by a mint created with itom may
be reclaimed using mintfr().
A mint that already exists may be reinitialized by mitom(), which sets a to
the value n. If the mint was declared as a global or automatic variable, it
must be conditioned before first use by minit(), which prevents garbage
values in the mint structure from causing chaos. A mint conditioned by
minit() has no value; however, it may be used to receive the result of an
operation. For mints automatic to a function, mvfree() should be used
before the function is exited to free the storage used by the val field of
the mint structure. Otherwise, this storage will never be reclaimed.
madd(), msub(), and mult() set c to the sum, difference, or product of a
and b. mdiv divides a by b and writes the quotient and remainder in q and
r. b must not be zero. The results of the operation are defined by the
following conditions:
1. a=q*b+r
2. The sign of r equals the sign of q
3. The absolute value of r < the absolute value of b.
smult() is like mult(), except the second argument is an integer in the
range 0 <= n <= 127. sdiv() is like mdiv(), except the second argument is
an integer in the range 1 <= n <= 128, and the remainder argument points to
an int instead of a mint().
pow() sets c to a raised to the b power reduced modulo m. rpow() sets c to
a raised to the b power. spow() is like rpow(), except the exponent is an
integer. In no case may the exponent be negative.
mcopy() sets b equal to a. mneg() sets b equal to negative a.
msqrt() sets b to the integral portion of the positive square root of a; r
is set to the remainder. a must not be negative. The result of the
operation is defined by the condition
a = b * b + r
gcd() sets c to the greatest common divisor of a and b. xgcd() is an
extended gcd routine that sets g to the greatest common divisor of a and b,
and sets r and s so the relation
g = a * r + b * s
holds. For xgcd(), r, s and g must all be distinct.
mints may be compared with mcmp(), which returns a signed integer less
than, equal to, or greater than zero according to whether a is less than,
equal to, or greater than b. ispos() returns true (nonzero) if a is not
negative, false (zero) if a is negative. zerop returns true if a is zero,
false otherwise.
mtoi() returns an integer equal to the value of a. a should be in the
allowable range for a signed integer.
The external integers ibase and obase govern the I/O and ASCII conversion
routines. Allowable bases run from two to 16. Permissible digits are 0
through 9 and A through F (lower-case letters are not allowed). min reads
a mint in base ibase from the standard input and sets a to that value.
Leading blanks and an optional leading minus sign are allowed; the number
is terminated by the first non-legal digit. mout() outputs a on the
standard output in base obase. mtos() performs the same conversion as
mout(), but the result is placed in a character string instead of being
output; a pointer to the string is returned. The string is actually
allocated by malloc(), and may be freed by free().
mzero() and mone() point to mints with values zero and one. mminint() and
mmaxint() point to mints containing the minimum and maximum values that
will fit in a signed integer. These constants should never be used as the
result of an operation.
All the necessary declarations for these constants and for the library
functions are contained in the header file mprec.h. They need not be
repeated.
To link libmp modules into an executable object, use the argument -lmp at
the end of the cc command.
Example
The following example converts a string into a multi-precision integer.
#include <stdio.h>
#include <mprec.h>
#include <ctype.h>
/*
* "ibase" is an int which contains the input base used by "stom".
* It should be between 2 and 16.
*/
int ibase = 10;
/*
* stom() reads in a number in base ibase from string 'a' and returns
* pointer to multiple-precision integer.
*/
mint *stom(s)
register char *s;
{
char cval;
mint c = {1, &cval};
register int ch;
char mifl = 0; /* leading minus flag */
static mint number;
mcopy(mzero, &number); /* set number to zero */
if ((ch = *s) == '-') { /* skip leading '-' */
mifl = 1;
ch = *++s;
}
/* scan thru string 's', building result in "number" */
while (isascii(ch) && isdigit(ch)) {
cval = (isdigit(ch) ? ch - '0': ch - 'A');
smult(&number, ibase, &number);
madd(&number, &c, &number);
ch = *++s;
}
if (mifl) /* adjust sign of a "number" */
mneg(&number, &number);
return(&number);
}
/* simple test for "stom" */
main()
{
char buffer[80];
printf("Input string ? ");
gets(buffer);
mout(stom(buffer)); /* Print in stdout multiple-precision int */
}
Files
<mprec.h>
/usr/lib/libmp.a
See Also
bc,
dc,
libraries,
malloc(),
mprec.h
Diagnostics
On any error, such as division by zero, running out of space or taking the
square root of a negative number, an appropriate message is printed on the
standard error stream and the program exits with a nonzero status.






