Annotation of coherent/a/usr/man/COHERENT/multiple-preci, revision 1.1.1.1

1.1       root        1: 
                      2: 
                      3: multiple-precision mathematicsOverviewmultiple-precision mathematics
                      4: 
                      5: 
                      6: 
                      7: 
                      8: The COHERENT  system includes  the library libmp,  whose routines
                      9: allow  you  to  perform  multiple  precision  arithmetic.   These
                     10: functions manipulate  a data structure  called a mint,  or ``mul-
                     11: tiple-precision integer,'' which  the header file mprec.h defines
                     12: as follows:
                     13: 
                     14: 
                     15: typedef struct {
                     16:         unsigned len;
                     17:         char *val;
                     18: } mint;
                     19: 
                     20: 
                     21: You should  not depend on the details  of this structure, because
                     22: on  some machines  a different representation  may be  more effi-
                     23: cient.  Using the listed functions is always safe.
                     24: 
                     25: The following gives the multiple-precision routines:
                     26: 
                     27: ggccdd()     Set variable to greatest common divisor
                     28: iissppooss()   Return if variable is positive or negative
                     29: iittoomm()    Create a multiple-precision integer
                     30: mmaadddd()    Add multiple-precision integers
                     31: mmccmmpp()    Compare multiple-precision integers
                     32: mmccooppyy()   Copy a multiple-precision integer
                     33: mmddiivv()    Divide multiple-precision integers
                     34: mmiinn()     Read multiple-precision integer from stdin
                     35: mmiinniitt()   Condition global or auto multiple-precision integer
                     36: mmiinnttffrr()  Free a multiple-precision integer
                     37: mmiittoomm()   Reinitialize a multiple-precision integer
                     38: mmnneegg()    Negate multiple-precision integer
                     39: mmoouutt()    Write multiple-precision integer to stdout
                     40: mmssqqrrtt()   Compute square root of multiple-precision integer
                     41: mmssuubb()    Subtract multiple-precision integers
                     42: mmttooii()    Convert multiple-precision integer to integer
                     43: mmttooss()    Convert multiple-precision integer to string
                     44: mmuulltt()    Multiple multiple-precision integers
                     45: mmvvffrreeee()  Free multiple-precision integer
                     46: ppooww()     Raise multiple-precision integer to power
                     47: rrppooww()    Raise multiple-precision integer to power
                     48: ssddiivv()    Divide multiple-precision integers
                     49: ssmmuulltt()   Multiply multiple-precision integers
                     50: ssppooww()    Raise multiple-precision integer to power
                     51: xxggccdd()    Extended greatest-common-divisor function
                     52: zzeerroopp()   Indicate if multi-precision integer is zero
                     53: 
                     54: itom() creates  a new mint, initializes it  to the signed integer
                     55: value n,  and returns a  pointer to it.   Storage used by  a mint
                     56: created with itom may be reclaimed using mintfr().
                     57: 
                     58: A mint that already exists may be reinitialized by mitom(), which
                     59: sets a to  the value n.  If the mint  was declared as a global or
                     60: automatic variable,  it must be  conditioned before first  use by
                     61: minit(), which prevents garbage values in the mint structure from
                     62: 
                     63: 
                     64: COHERENT Lexicon                                           Page 1
                     65: 
                     66: 
                     67: 
                     68: 
                     69: multiple-precision mathematicsOverviewmultiple-precision mathematics
                     70: 
                     71: 
                     72: 
                     73: causing  chaos.  A  mint  conditioned by  minit()  has no  value;
                     74: however, it  may be used  to receive the result  of an operation.
                     75: For mints automatic to a function, mvfree() should be used before
                     76: the function is exited to free  the storage used by the val field
                     77: of  the mint  structure.  Otherwise, this  storage will  never be
                     78: reclaimed.
                     79: 
                     80: madd(),  msub(), and  mult()  set c  to the  sum, difference,  or
                     81: product of a and b.  mdiv  divides a by b and writes the quotient
                     82: and remainder  in q and r.   b must not be  zero.  The results of
                     83: the operation are defined by the following conditions:
                     84: 
                     85: 11. _a=_q*_b+_r
                     86: 
                     87: 22. The sign of _r equals the sign of q
                     88: 
                     89: 33. The absolute value of r < the absolute value of b.
                     90: 
                     91: smult() is like mult(),  except the second argument is an integer
                     92: in the  range 0 <= n  <= 127.  sdiv() is  like mdiv(), except the
                     93: second argument is an integer in the range 1 <= n <= 128, and the
                     94: remainder argument points to an int instead of a mint().
                     95: 
                     96: pow() sets c to a raised to the b power reduced modulo m.  rpow()
                     97: sets c to a raised to the b power.  spow() is like rpow(), except
                     98: the exponent is an integer.  In no case may the exponent be nega-
                     99: tive.
                    100: 
                    101: mcopy() sets b equal to a.  mneg() sets b equal to negative a.
                    102: 
                    103: msqrt() sets  b to  the integral  portion of the  positive square
                    104: root of  a; r is set  to the remainder.  a  must not be negative.
                    105: The result of the operation is defined by the condition
                    106: 
                    107: 
                    108:      _a = _b * _b + _r
                    109: 
                    110: 
                    111: gcd() sets c  to the greatest common divisor of  a and b.  xgcd()
                    112: is an  extended gcd  routine that sets  g to the  greatest common
                    113: divisor of a and b, and sets r and s so the relation
                    114: 
                    115: 
                    116:                _g = _a * _r + _b * _s
                    117: 
                    118: 
                    119: holds.  For xgcd(), r, s and g must all be distinct.
                    120: 
                    121: mints may be compared with mcmp(), which returns a signed integer
                    122: less than, equal to, or  greater than zero according to whether a
                    123: is less than, equal to,  or greater than b.  ispos() returns true
                    124: (nonzero) if  a is not  negative, false (zero) if  a is negative.
                    125: zerop returns true if a is zero, false otherwise.
                    126: 
                    127: 
                    128: 
                    129: 
                    130: COHERENT Lexicon                                           Page 2
                    131: 
                    132: 
                    133: 
                    134: 
                    135: multiple-precision mathematicsOverviewmultiple-precision mathematics
                    136: 
                    137: 
                    138: 
                    139: mtoi() returns an  integer equal to the value of  a.  a should be
                    140: in the allowable range for a signed integer.
                    141: 
                    142: The external  integers ibase and  obase govern the  I/O and ASCII
                    143: conversion routines.   Allowable bases run from  two to 16.  Per-
                    144: missible digits are 0 through  9 and A through F (lower-case let-
                    145: ters are not  allowed).  min reads a mint in  base ibase from the
                    146: standard input  and sets a to that value.   Leading blanks and an
                    147: optional leading minus sign are allowed; the number is terminated
                    148: by the  first non-legal digit.  mout() outputs  a on the standard
                    149: output  in base  obase.  mtos() performs  the same  conversion as
                    150: mout(), but the result is placed in a character string instead of
                    151: being output; a pointer to the string is returned.  The string is
                    152: actually allocated by malloc(), and may be freed by free().
                    153: 
                    154: mzero()  and mone()  point  to mints  with values  zero and  one.
                    155: mminint() and mmaxint() point to mints containing the minimum and
                    156: maximum values  that will  fit in  a signed integer.   These con-
                    157: stants should never be used as the result of an operation.
                    158: 
                    159: All the  necessary declarations for  these constants and  for the
                    160: library functions are contained in the header file mprec.h.  They
                    161: need not be repeated.
                    162: 
                    163: To link  mp modules with  an executable object,  use the argument
                    164: -lmp with the cc or ld commands.
                    165: 
                    166: ***** Example *****
                    167: 
                    168: The following  example converts  a string into  a multi-precision
                    169: integer.
                    170: 
                    171: 
                    172: #include <stdio.h>
                    173: #include <mprec.h>
                    174: #include <ctype.h>
                    175: 
                    176: 
                    177: 
                    178: /*
                    179:  * "ibase" is an int which contains the input base used by "stom".
                    180:  * It should be between 2 and 16.
                    181:  */
                    182: int ibase = 10;
                    183: 
                    184: 
                    185: 
                    186: /*
                    187:  * stom() reads in a number in base ibase from string 'a' and returns
                    188:  * pointer to multiple-precision integer.
                    189:  */
                    190: mint *stom(s)
                    191: register char *s;
                    192: {
                    193:           char cval;
                    194: 
                    195: 
                    196: COHERENT Lexicon                                           Page 3
                    197: 
                    198: 
                    199: 
                    200: 
                    201: multiple-precision mathematicsOverviewmultiple-precision mathematics
                    202: 
                    203: 
                    204: 
                    205:           mint c = {1, &cval};
                    206:           register int ch;
                    207:           char mifl = 0;/* leading minus flag */
                    208:           static mintnumber;
                    209: 
                    210: 
                    211: 
                    212:           mcopy(mzero, &number);/* set number to zero */
                    213:           if ((ch = *s) == '-') {/* skip leading '-' */
                    214:           mifl = 1;
                    215:           ch = *++s;
                    216:           }
                    217: 
                    218: 
                    219: 
                    220:           /* scan thru string 's', building result in "number" */
                    221:           while (isascii(ch) && isdigit(ch)) {
                    222:           cval = (isdigit(ch) ? ch - '0': ch - 'A');
                    223:           smult(&number, ibase, &number);
                    224:           madd(&number, &c, &number);
                    225:           ch = *++s;
                    226:           }
                    227: 
                    228: 
                    229: 
                    230:           if (mifl)/* adjust sign of a "number" */
                    231:           mneg(&number, &number);
                    232:           return(&number);
                    233: }
                    234: 
                    235: 
                    236: 
                    237: /* simple test for "stom" */
                    238: main()
                    239: {
                    240:           charbuffer[80];
                    241: 
                    242: 
                    243: 
                    244:           printf("Input string ? ");
                    245:           gets(buffer);
                    246:           mout(stom(buffer)); /* Print in stdout multiple-precision int */
                    247: }
                    248: 
                    249: 
                    250: ***** Files *****
                    251: 
                    252: <mprec.h>
                    253: /usr/lib/libmp.a
                    254: 
                    255: ***** See Also *****
                    256: 
                    257: bc, dc, libraries, malloc, mprec.h
                    258: 
                    259: 
                    260: 
                    261: 
                    262: COHERENT Lexicon                                           Page 4
                    263: 
                    264: 
                    265: 
                    266: 
                    267: multiple-precision mathematicsOverviewmultiple-precision mathematics
                    268: 
                    269: 
                    270: 
                    271: ***** Diagnostics *****
                    272: 
                    273: On any error,  such as division by zero, running  out of space or
                    274: taking the square root  of a negative number, an appropriate mes-
                    275: sage is printed on the  standard error stream and the program ex-
                    276: its with a nonzero status.
                    277: 
                    278: 
                    279: 
                    280: 
                    281: 
                    282: 
                    283: 
                    284: 
                    285: 
                    286: 
                    287: 
                    288: 
                    289: 
                    290: 
                    291: 
                    292: 
                    293: 
                    294: 
                    295: 
                    296: 
                    297: 
                    298: 
                    299: 
                    300: 
                    301: 
                    302: 
                    303: 
                    304: 
                    305: 
                    306: 
                    307: 
                    308: 
                    309: 
                    310: 
                    311: 
                    312: 
                    313: 
                    314: 
                    315: 
                    316: 
                    317: 
                    318: 
                    319: 
                    320: 
                    321: 
                    322: 
                    323: 
                    324: 
                    325: 
                    326: 
                    327: 
                    328: COHERENT Lexicon                                           Page 5
                    329: 
                    330: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.