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.