Annotation of OpenXM_contrib/gmp/gmp.info-3, Revision 1.1.1.2
1.1.1.2 ! maekawa 1: This is gmp.info, produced by makeinfo version 4.0 from gmp.texi.
1.1 maekawa 2:
1.1.1.2 ! maekawa 3: INFO-DIR-SECTION GNU libraries
1.1 maekawa 4: START-INFO-DIR-ENTRY
1.1.1.2 ! maekawa 5: * gmp: (gmp). GNU Multiple Precision Arithmetic Library.
1.1 maekawa 6: END-INFO-DIR-ENTRY
7:
8: This file documents GNU MP, a library for arbitrary-precision
9: arithmetic.
10:
1.1.1.2 ! maekawa 11: Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
! 12: Free Software Foundation, Inc.
1.1 maekawa 13:
14: Permission is granted to make and distribute verbatim copies of this
15: manual provided the copyright notice and this permission notice are
16: preserved on all copies.
17:
18: Permission is granted to copy and distribute modified versions of
19: this manual under the conditions for verbatim copying, provided that
20: the entire resulting derived work is distributed under the terms of a
21: permission notice identical to this one.
22:
23: Permission is granted to copy and distribute translations of this
24: manual into another language, under the above conditions for modified
25: versions, except that this permission notice may be stated in a
26: translation approved by the Foundation.
27:
28:
1.1.1.2 ! maekawa 29: File: gmp.info, Node: Low-level Functions, Next: Random Number Functions, Prev: Floating-point Functions, Up: Top
1.1 maekawa 30:
1.1.1.2 ! maekawa 31: Low-level Functions
! 32: *******************
! 33:
! 34: This chapter describes low-level GMP functions, used to implement
! 35: the high-level GMP functions, but also intended for time-critical user
! 36: code.
! 37:
! 38: These functions start with the prefix `mpn_'.
! 39:
! 40: The `mpn' functions are designed to be as fast as possible, *not* to
! 41: provide a coherent calling interface. The different functions have
! 42: somewhat similar interfaces, but there are variations that make them
! 43: hard to use. These functions do as little as possible apart from the
! 44: real multiple precision computation, so that no time is spent on things
! 45: that not all callers need.
! 46:
! 47: A source operand is specified by a pointer to the least significant
! 48: limb and a limb count. A destination operand is specified by just a
! 49: pointer. It is the responsibility of the caller to ensure that the
! 50: destination has enough space for storing the result.
! 51:
! 52: With this way of specifying operands, it is possible to perform
! 53: computations on subranges of an argument, and store the result into a
! 54: subrange of a destination.
! 55:
! 56: A common requirement for all functions is that each source area
! 57: needs at least one limb. No size argument may be zero. Unless
! 58: otherwise stated, in-place operations are allowed where source and
! 59: destination are the same, but not where they only partly overlap.
! 60:
! 61: The `mpn' functions are the base for the implementation of the
! 62: `mpz_', `mpf_', and `mpq_' functions.
! 63:
! 64: This example adds the number beginning at S1P and the number
! 65: beginning at S2P and writes the sum at DESTP. All areas have SIZE
! 66: limbs.
! 67:
! 68: cy = mpn_add_n (destp, s1p, s2p, size)
! 69:
! 70: In the notation used here, a source operand is identified by the
! 71: pointer to the least significant limb, and the limb count in braces.
! 72: For example, {s1p, s1size}.
! 73:
! 74: - Function: mp_limb_t mpn_add_n (mp_limb_t *RP, const mp_limb_t *S1P,
! 75: const mp_limb_t *S2P, mp_size_t SIZE)
! 76: Add {S1P, SIZE} and {S2P, SIZE}, and write the SIZE least
! 77: significant limbs of the result to RP. Return carry, either 0 or
! 78: 1.
! 79:
! 80: This is the lowest-level function for addition. It is the
! 81: preferred function for addition, since it is written in assembly
! 82: for most targets. For addition of a variable to itself (i.e., S1P
! 83: equals S2P, use `mpn_lshift' with a count of 1 for optimal speed.
! 84:
! 85: - Function: mp_limb_t mpn_add_1 (mp_limb_t *RP, const mp_limb_t *S1P,
! 86: mp_size_t SIZE, mp_limb_t S2LIMB)
! 87: Add {S1P, SIZE} and S2LIMB, and write the SIZE least significant
! 88: limbs of the result to RP. Return carry, either 0 or 1.
! 89:
! 90: - Function: mp_limb_t mpn_add (mp_limb_t *RP, const mp_limb_t *S1P,
! 91: mp_size_t S1SIZE, const mp_limb_t *S2P, mp_size_t S2SIZE)
! 92: Add {S1P, S1SIZE} and {S2P, S2SIZE}, and write the S1SIZE least
! 93: significant limbs of the result to RP. Return carry, either 0 or
! 94: 1.
! 95:
! 96: This function requires that S1SIZE is greater than or equal to
! 97: S2SIZE.
! 98:
! 99: - Function: mp_limb_t mpn_sub_n (mp_limb_t *RP, const mp_limb_t *S1P,
! 100: const mp_limb_t *S2P, mp_size_t SIZE)
! 101: Subtract {S2P, S2SIZE} from {S1P, SIZE}, and write the SIZE least
! 102: significant limbs of the result to RP. Return borrow, either 0 or
! 103: 1.
! 104:
! 105: This is the lowest-level function for subtraction. It is the
! 106: preferred function for subtraction, since it is written in
! 107: assembly for most targets.
! 108:
! 109: - Function: mp_limb_t mpn_sub_1 (mp_limb_t *RP, const mp_limb_t *S1P,
! 110: mp_size_t SIZE, mp_limb_t S2LIMB)
! 111: Subtract S2LIMB from {S1P, SIZE}, and write the SIZE least
! 112: significant limbs of the result to RP. Return borrow, either 0 or
! 113: 1.
! 114:
! 115: - Function: mp_limb_t mpn_sub (mp_limb_t *RP, const mp_limb_t *S1P,
! 116: mp_size_t S1SIZE, const mp_limb_t *S2P, mp_size_t S2SIZE)
! 117: Subtract {S2P, S2SIZE} from {S1P, S1SIZE}, and write the S1SIZE
! 118: least significant limbs of the result to RP. Return borrow,
! 119: either 0 or 1.
! 120:
! 121: This function requires that S1SIZE is greater than or equal to
! 122: S2SIZE.
! 123:
! 124: - Function: void mpn_mul_n (mp_limb_t *RP, const mp_limb_t *S1P, const
! 125: mp_limb_t *S2P, mp_size_t SIZE)
! 126: Multiply {S1P, SIZE} and {S2P, SIZE}, and write the *entire*
! 127: result to RP.
! 128:
! 129: The destination has to have space for 2*SIZE limbs, even if the
! 130: significant result might be one limb smaller.
! 131:
! 132: - Function: mp_limb_t mpn_mul_1 (mp_limb_t *RP, const mp_limb_t *S1P,
! 133: mp_size_t SIZE, mp_limb_t S2LIMB)
! 134: Multiply {S1P, SIZE} and S2LIMB, and write the SIZE least
! 135: significant limbs of the product to RP. Return the most
! 136: significant limb of the product.
! 137:
! 138: This is a low-level function that is a building block for general
! 139: multiplication as well as other operations in GMP. It is written
! 140: in assembly for most targets.
! 141:
! 142: Don't call this function if S2LIMB is a power of 2; use
! 143: `mpn_lshift' with a count equal to the logarithm of S2LIMB
! 144: instead, for optimal speed.
! 145:
! 146: - Function: mp_limb_t mpn_addmul_1 (mp_limb_t *RP, const mp_limb_t
! 147: *S1P, mp_size_t SIZE, mp_limb_t S2LIMB)
! 148: Multiply {S1P, SIZE} and S2LIMB, and add the SIZE least
! 149: significant limbs of the product to {RP, SIZE} and write the
! 150: result to RP. Return the most significant limb of the product,
! 151: plus carry-out from the addition.
! 152:
! 153: This is a low-level function that is a building block for general
! 154: multiplication as well as other operations in GMP. It is written
! 155: in assembly for most targets.
! 156:
! 157: - Function: mp_limb_t mpn_submul_1 (mp_limb_t *RP, const mp_limb_t
! 158: *S1P, mp_size_t SIZE, mp_limb_t S2LIMB)
! 159: Multiply {S1P, SIZE} and S2LIMB, and subtract the SIZE least
! 160: significant limbs of the product from {RP, SIZE} and write the
! 161: result to RP. Return the most significant limb of the product,
! 162: minus borrow-out from the subtraction.
! 163:
! 164: This is a low-level function that is a building block for general
! 165: multiplication and division as well as other operations in GMP.
! 166: It is written in assembly for most targets.
! 167:
! 168: - Function: mp_limb_t mpn_mul (mp_limb_t *RP, const mp_limb_t *S1P,
! 169: mp_size_t S1SIZE, const mp_limb_t *S2P, mp_size_t S2SIZE)
! 170: Multiply {S1P, S1SIZE} and {S2P, S2SIZE}, and write the result to
! 171: RP. Return the most significant limb of the result.
! 172:
! 173: The destination has to have space for S1SIZE + S2SIZE limbs, even
! 174: if the result might be one limb smaller.
! 175:
! 176: This function requires that S1SIZE is greater than or equal to
! 177: S2SIZE. The destination must be distinct from either input
! 178: operands.
! 179:
! 180: - Function: mp_limb_t mpn_tdiv_qr (mp_limb_t *QP, mp_limb_t *RP,
! 181: mp_size_t QXN, const mp_limb_t *NP, mp_size_t NN, const
! 182: mp_limb_t *DP, mp_size_t DN)
! 183: Divide {NP, NN} by {DP, DN}. Write the quotient at QP and the
! 184: remainder at RP.
! 185:
! 186: The quotient written at QP will be NN - DN + 1 limbs. The
! 187: remainder written at RP will be DN limbs.
! 188:
! 189: It is required that NN is greater than or equal to DN. The QXN
! 190: operand must be zero.
! 191:
! 192: The quotient is rounded towards 0.
! 193:
! 194: No overlap between arguments is permitted.
! 195:
! 196: - Function: mp_limb_t mpn_divrem (mp_limb_t *R1P, mp_size_t XSIZE,
! 197: mp_limb_t *RS2P, mp_size_t RS2SIZE, const mp_limb_t *S3P,
! 198: mp_size_t S3SIZE)
! 199: [This function is obsolete. Please call `mpn_tdiv_qr' instead for
! 200: best performance.]
! 201:
! 202: Divide {RS2P, RS2SIZE} by {S3P, S3SIZE}, and write the quotient at
! 203: R1P, with the exception of the most significant limb, which is
! 204: returned. The remainder replaces the dividend at RS2P; it will be
! 205: S3SIZE limbs long (i.e., as many limbs as the divisor).
! 206:
! 207: In addition to an integer quotient, XSIZE fraction limbs are
! 208: developed, and stored after the integral limbs. For most usages,
! 209: XSIZE will be zero.
! 210:
! 211: It is required that RS2SIZE is greater than or equal to S3SIZE.
! 212: It is required that the most significant bit of the divisor is set.
! 213:
! 214: If the quotient is not needed, pass RS2P + S3SIZE as R1P. Aside
! 215: from that special case, no overlap between arguments is permitted.
! 216:
! 217: Return the most significant limb of the quotient, either 0 or 1.
! 218:
! 219: The area at R1P needs to be RS2SIZE - S3SIZE + XSIZE limbs large.
! 220:
! 221: - Function: mp_limb_t mpn_divrem_1 (mp_limb_t *R1P, mp_size_t XSIZE,
! 222: mp_limb_t *S2P, mp_size_t S2SIZE, mp_limb_t S3LIMB)
! 223: - Macro: mp_limb_t mpn_divmod_1 (mp_limb_t *R1P, mp_limb_t *S2P,
! 224: mp_size_t S2SIZE, mp_limb_t S3LIMB)
! 225: Divide {S2P, S2SIZE} by S3LIMB, and write the quotient at R1P.
! 226: Return the remainder.
! 227:
! 228: The integer quotient is written to {R1P+XSIZE, S2SIZE} and in
! 229: addition XSIZE fraction limbs are developed and written to {R1P,
! 230: XSIZE}. Either or both S2SIZE and XSIZE can be zero. For most
! 231: usages, XSIZE will be zero.
! 232:
! 233: `mpn_divmod_1' exists for upward source compatibility and is
! 234: simply a macro calling `mpn_divrem_1' with an XSIZE of 0.
! 235:
! 236: The areas at R1P and S2P have to be identical or completely
! 237: separate, not partially overlapping.
! 238:
! 239: - Function: mp_limb_t mpn_divmod (mp_limb_t *R1P, mp_limb_t *RS2P,
! 240: mp_size_t RS2SIZE, const mp_limb_t *S3P, mp_size_t S3SIZE)
! 241: *This interface is obsolete. It will disappear from future
! 242: releases. Use `mpn_divrem' in its stead.*
! 243:
! 244: - Macro: mp_limb_t mpn_divexact_by3 (mp_limb_t *RP, mp_limb_t *SP,
! 245: mp_size_t SIZE)
! 246: - Function: mp_limb_t mpn_divexact_by3c (mp_limb_t *RP, mp_limb_t *SP,
! 247: mp_size_t SIZE, mp_limb_t CARRY)
! 248: Divide {SP, SIZE} by 3, expecting it to divide exactly, and
! 249: writing the result to {RP, SIZE}. If 3 divides exactly, the
! 250: return value is zero and the result is the quotient. If not, the
! 251: return value is non-zero and the result won't be anything useful.
! 252:
! 253: `mpn_divexact_by3c' takes an initial carry parameter, which can be
! 254: the return value from a previous call, so a large calculation can
! 255: be done piece by piece. `mpn_divexact_by3' is simply a macro
! 256: calling `mpn_divexact_by3c' with a 0 carry parameter.
! 257:
! 258: These routines use a multiply-by-inverse and will be faster than
! 259: `mpn_divrem_1' on CPUs with fast multiplication but slow division.
! 260:
! 261: The source a, result q, size n, initial carry i, and return value
! 262: c satisfy c*b^n + a-i = 3*q, where b is the size of a limb (2^32
! 263: or 2^64). c is always 0, 1 or 2, and the initial carry must also
! 264: be 0, 1 or 2 (these are both borrows really). When c=0, clearly
! 265: q=(a-i)/3. When c!=0, the remainder (a-i) mod 3 is given by 3-c,
! 266: because b == 1 mod 3.
! 267:
! 268: - Function: mp_limb_t mpn_mod_1 (mp_limb_t *S1P, mp_size_t S1SIZE,
! 269: mp_limb_t S2LIMB)
! 270: Divide {S1P, S1SIZE} by S2LIMB, and return the remainder. S1SIZE
! 271: can be zero.
! 272:
! 273: - Function: mp_limb_t mpn_preinv_mod_1 (mp_limb_t *S1P, mp_size_t
! 274: S1SIZE, mp_limb_t S2LIMB, mp_limb_t S3LIMB)
! 275: *This interface is obsolete. It will disappear from future
! 276: releases. Use `mpn_mod_1' in its stead.*
! 277:
! 278: - Function: mp_limb_t mpn_bdivmod (mp_limb_t *RP, mp_limb_t *S1P,
! 279: mp_size_t S1SIZE, const mp_limb_t *S2P, mp_size_t S2SIZE,
! 280: unsigned long int D)
! 281: The function puts the low [D/BITS_PER_MP_LIMB] limbs of Q = {S1P,
! 282: S1SIZE}/{S2P, S2SIZE} mod 2^D at RP, and returns the high D mod
! 283: BITS_PER_MP_LIMB bits of Q.
! 284:
! 285: {S1P, S1SIZE} - Q * {S2P, S2SIZE} mod 2^(S1SIZE*BITS_PER_MP_LIMB)
! 286: is placed at S1P. Since the low [D/BITS_PER_MP_LIMB] limbs of
! 287: this difference are zero, it is possible to overwrite the low
! 288: limbs at S1P with this difference, provided RP <= S1P.
! 289:
! 290: This function requires that S1SIZE * BITS_PER_MP_LIMB >= D, and
! 291: that {S2P, S2SIZE} is odd.
! 292:
! 293: *This interface is preliminary. It might change incompatibly in
! 294: future revisions.*
! 295:
! 296: - Function: mp_limb_t mpn_lshift (mp_limb_t *RP, const mp_limb_t
! 297: *SRC_PTR, mp_size_t SRC_SIZE, unsigned long int COUNT)
! 298: Shift {SRC_PTR, SRC_SIZE} COUNT bits to the left, and write the
! 299: SRC_SIZE least significant limbs of the result to RP. COUNT might
! 300: be in the range 1 to n - 1, on an n-bit machine. The bits shifted
! 301: out to the left are returned.
! 302:
! 303: Overlapping of the destination space and the source space is
! 304: allowed in this function, provided RP >= SRC_PTR.
! 305:
! 306: This function is written in assembly for most targets.
! 307:
! 308: - Function: mp_limp_t mpn_rshift (mp_limb_t *RP, const mp_limb_t
! 309: *SRC_PTR, mp_size_t SRC_SIZE, unsigned long int COUNT)
! 310: Shift {SRC_PTR, SRC_SIZE} COUNT bits to the right, and write the
! 311: SRC_SIZE most significant limbs of the result to RP. COUNT might
! 312: be in the range 1 to n - 1, on an n-bit machine. The bits shifted
! 313: out to the right are returned.
! 314:
! 315: Overlapping of the destination space and the source space is
! 316: allowed in this function, provided RP <= SRC_PTR.
! 317:
! 318: This function is written in assembly for most targets.
! 319:
! 320: - Function: int mpn_cmp (const mp_limb_t *S1P, const mp_limb_t *S2P,
! 321: mp_size_t SIZE)
! 322: Compare {S1P, SIZE} and {S2P, SIZE} and return a positive value if
! 323: s1 > src2, 0 of they are equal, and a negative value if s1 < src2.
! 324:
! 325: - Function: mp_size_t mpn_gcd (mp_limb_t *RP, mp_limb_t *S1P,
! 326: mp_size_t S1SIZE, mp_limb_t *S2P, mp_size_t S2SIZE)
! 327: Puts at RP the greatest common divisor of {S1P, S1SIZE} and {S2P,
! 328: S2SIZE}; both source operands are destroyed by the operation. The
! 329: size in limbs of the greatest common divisor is returned.
! 330:
! 331: {S1P, S1SIZE} must have at least as many bits as {S2P, S2SIZE},
! 332: and {S2P, S2SIZE} must be odd.
! 333:
! 334: - Function: mp_limb_t mpn_gcd_1 (const mp_limb_t *S1P, mp_size_t
! 335: S1SIZE, mp_limb_t S2LIMB)
! 336: Return the greatest common divisor of {S1P, S1SIZE} and S2LIMB,
! 337: where S2LIMB (as well as S1SIZE) must be different from 0.
! 338:
! 339: - Function: mp_size_t mpn_gcdext (mp_limb_t *R1P, mp_limb_t *R2P,
! 340: mp_size_t *R2SIZE, mp_limb_t *S1P, mp_size_t S1SIZE,
! 341: mp_limb_t *S2P, mp_size_t S2SIZE)
! 342: Compute the greatest common divisor of {S1P, S1SIZE} and {S2P,
! 343: S2SIZE}. Store the gcd at R1P and return its size in limbs.
! 344: Write the first cofactor at R2P and store its size in *R2SIZE. If
! 345: the cofactor is negative, *R2SIZE is negative and R2P is the
! 346: absolute value of the cofactor.
! 347:
! 348: {S1P, S1SIZE} must be greater than or equal to {S2P, S2SIZE}.
! 349: Neither operand may equal 0. Both source operands are destroyed,
! 350: plus one limb past the end of each, ie. {S1P, S1SIZE+1} and {S2P,
! 351: S2SIZE+1}.
! 352:
! 353: - Function: mp_size_t mpn_sqrtrem (mp_limb_t *R1P, mp_limb_t *R2P,
! 354: const mp_limb_t *SP, mp_size_t SIZE)
! 355: Compute the square root of {SP, SIZE} and put the result at R1P.
! 356: Write the remainder at R2P, unless R2P is `NULL'.
! 357:
! 358: Return the size of the remainder, whether R2P was `NULL' or
! 359: non-`NULL'. Iff the operand was a perfect square, the return
! 360: value will be 0.
! 361:
! 362: The areas at R1P and SP have to be distinct. The areas at R2P and
! 363: SP have to be identical or completely separate, not partially
! 364: overlapping.
! 365:
! 366: The area at R1P needs to have space for ceil(SIZE/2) limbs. The
! 367: area at R2P needs to be SIZE limbs large.
! 368:
! 369: - Function: mp_size_t mpn_get_str (unsigned char *STR, int BASE,
! 370: mp_limb_t *S1P, mp_size_t S1SIZE)
! 371: Convert {S1P, S1SIZE} to a raw unsigned char array in base BASE.
! 372: The string is not in ASCII; to convert it to printable format, add
! 373: the ASCII codes for `0' or `A', depending on the base and range.
! 374: There may be leading zeros in the string.
! 375:
! 376: The area at S1P is clobbered.
! 377:
! 378: Return the number of characters in STR.
! 379:
! 380: The area at STR has to have space for the largest possible number
! 381: represented by a S1SIZE long limb array, plus one extra character.
! 382:
! 383: - Function: mp_size_t mpn_set_str (mp_limb_t *R1P, const char *STR,
! 384: size_t STRSIZE, int BASE)
! 385: Convert the raw unsigned char array at STR of length STRSIZE to a
! 386: limb array {S1P, S1SIZE}. The base of STR is BASE.
! 387:
! 388: Return the number of limbs stored in R1P.
! 389:
! 390: - Function: unsigned long int mpn_scan0 (const mp_limb_t *S1P,
! 391: unsigned long int BIT)
! 392: Scan S1P from bit position BIT for the next clear bit.
! 393:
! 394: It is required that there be a clear bit within the area at S1P at
! 395: or beyond bit position BIT, so that the function has something to
! 396: return.
! 397:
! 398: - Function: unsigned long int mpn_scan1 (const mp_limb_t *S1P,
! 399: unsigned long int BIT)
! 400: Scan S1P from bit position BIT for the next set bit.
! 401:
! 402: It is required that there be a set bit within the area at S1P at or
! 403: beyond bit position BIT, so that the function has something to
! 404: return.
! 405:
! 406: - Function: void mpn_random (mp_limb_t *R1P, mp_size_t R1SIZE)
! 407: - Function: void mpn_random2 (mp_limb_t *R1P, mp_size_t R1SIZE)
! 408: Generate a random number of length R1SIZE and store it at R1P.
! 409: The most significant limb is always non-zero. `mpn_random'
! 410: generates uniformly distributed limb data, `mpn_random2' generates
! 411: long strings of zeros and ones in the binary representation.
! 412:
! 413: `mpn_random2' is intended for testing the correctness of the `mpn'
! 414: routines.
! 415:
! 416: - Function: unsigned long int mpn_popcount (const mp_limb_t *S1P,
! 417: unsigned long int SIZE)
! 418: Count the number of set bits in {S1P, SIZE}.
! 419:
! 420: - Function: unsigned long int mpn_hamdist (const mp_limb_t *S1P, const
! 421: mp_limb_t *S2P, unsigned long int SIZE)
! 422: Compute the hamming distance between {S1P, SIZE} and {S2P, SIZE}.
! 423:
! 424: - Function: int mpn_perfect_square_p (const mp_limb_t *S1P, mp_size_t
! 425: SIZE)
! 426: Return non-zero iff {S1P, SIZE} is a perfect square.
! 427:
! 428:
! 429: File: gmp.info, Node: Random Number Functions, Next: BSD Compatible Functions, Prev: Low-level Functions, Up: Top
! 430:
! 431: Random Number Functions
1.1 maekawa 432: ***********************
433:
1.1.1.2 ! maekawa 434: There are two groups of random number functions in GNU MP; older
! 435: functions that call C library random number generators, rely on a global
! 436: state, and aren't very random; and newer functions that don't have these
! 437: problems. The newer functions are self-contained, they accept a random
! 438: state parameter that supplants global state, and generate good random
! 439: numbers.
! 440:
! 441: The random state parameter is of the type `gmp_randstate_t'. It
! 442: must be initialized by a call to one of the `gmp_randinit' functions
! 443: (*Note Random State Initialization::). The initial seed is set using
! 444: one of the `gmp_randseed' functions (*Note Random State
! 445: Initialization::).
! 446:
! 447: The size of the seed determines the number of different sequences of
! 448: random numbers that is possible to generate. The "quality" of the seed
! 449: is the randomness of a given seed compared to the previous seed used
! 450: and affects the randomness of separate number sequences.
! 451:
! 452: The algorithm for assigning seed is critical if the generated random
! 453: numbers are to be used for important applications, such as generating
! 454: cryptographic keys.
! 455:
! 456: The traditional method is to use the current system time for
! 457: seeding. One has to be careful when using the current time though. If
! 458: the application seeds the random functions very often, say several
! 459: times per second, and the resolution of the system clock is
! 460: comparatively low, like one second, the same sequence of numbers will
! 461: be generated until the system clock ticks. Furthermore, the current
! 462: system time is quite easy to guess, so a system depending on any
! 463: unpredictability of the random number sequence should absolutely not
! 464: use that as its only source for a seed value.
! 465:
! 466: On some systems there is a special device, often called
! 467: `/dev/random', which provides a source of somewhat random numbers more
! 468: usable as seed.
! 469:
! 470: The functions actually generating random functions are documented
! 471: under "Miscellaneous Functions" in their respective function class:
! 472: *Note Miscellaneous Integer Functions::, *Note Miscellaneous Float
! 473: Functions::.
! 474:
1.1 maekawa 475: * Menu:
476:
1.1.1.2 ! maekawa 477: * Random State Initialization:: How to initialize a random state.
! 478:
! 479:
! 480: File: gmp.info, Node: Random State Initialization, Prev: Random Number Functions, Up: Random Number Functions
! 481:
! 482: Random State Initialization
! 483: ===========================
! 484:
! 485: See *Note Random Number Functions:: for a discussion on how to
! 486: choose the initial seed value passed to these functions.
! 487:
! 488: - Function: void gmp_randinit (gmp_randstate_t STATE, gmp_randalg_t
! 489: ALG, ...)
! 490: Initialize random state variable STATE.
! 491:
! 492: ALG denotes what algorithm to use for random number generation.
! 493: Use one of
! 494: - GMP_RAND_ALG_LC -- Linear congruential.
! 495:
! 496: A fast generator defined by X = (aX + c) mod m.
! 497:
! 498: A third argument SIZE of type unsigned long int is required.
! 499: SIZE is the size of the largest good quality random number to
! 500: be generated, expressed in number of bits. If the random
! 501: generation functions are asked for a bigger random number
! 502: than indicated by this parameter, two or more numbers of SIZE
! 503: bits will be generated and concatenated, resulting in a "bad"
! 504: random number. This can be used to generate big random
! 505: numbers relatively cheap if the quality of randomness isn't
! 506: of great importance.
! 507:
! 508: a, c, and m are picked from a table where the modulus (m) is
! 509: a power of 2 and the multiplier is congruent to 5 (mod 8).
! 510: The choice is based on the SIZE parameter. The maximum SIZE
! 511: supported by this algorithm is 128. If you need bigger
! 512: random numbers, use your own scheme and call one of the other
! 513: `gmp_randinit' functions.
! 514:
! 515:
! 516: If ALG is 0 or GMP_RAND_ALG_DEFAULT, the default algorithm is
! 517: used. The default algorithm is typically a fast algorithm like
! 518: the linear congruential and requires a third SIZE argument (see
! 519: GMP_RAND_ALG_LC).
! 520:
! 521: When you're done with a STATE variable, call `gmp_randclear' to
! 522: deallocate any memory allocated by this function.
! 523:
! 524: `gmp_randinit' may set the following bits in GMP_ERRNO:
! 525: * GMP_ERROR_UNSUPPORTED_ARGUMENT -- ALG is unsupported
! 526:
! 527: * GMP_ERROR_INVALID_ARGUMENT -- SIZE is too big
! 528:
! 529: - Function: void gmp_randinit_lc_2exp (gmp_randstate_t STATE, mpz_t A,
! 530: unsigned long int C, unsigned long int M2EXP)
! 531:
! 532: Initialize random state variable STATE with given linear
! 533: congruential scheme.
! 534:
! 535: Parameters A, C, and M2EXP are the multiplier, adder, and modulus
! 536: for the linear congruential scheme to use, respectively. The
! 537: modulus is expressed as a power of 2, so that M = 2^M2EXP.
! 538:
! 539: The least significant bits of a random number generated by the
! 540: linear congruential algorithm where the modulus is a power of two
! 541: are not very random. Therefore, the lower half of a random number
! 542: generated by an LC scheme initialized with this function is
! 543: discarded. Thus, the size of a random number is M2EXP / 2
! 544: (rounded upwards) bits when this function has been used for
! 545: initializing the random state.
! 546:
! 547: When you're done with a STATE variable, call `gmp_randclear' to
! 548: deallocate any memory allocated by this function.
! 549:
! 550: - Function: void gmp_randseed (gmp_randstate_t STATE, mpz_t SEED)
! 551: - Function: void gmp_randseed_ui (gmp_randstate_t STATE, unsigned long
! 552: int SEED)
! 553: Set the initial seed value.
! 554:
! 555: Parameter SEED is the initial random seed. The function
! 556: `gmp_randseed_ui' takes the SEED as an unsigned long int rather
! 557: than as an mpz_t.
! 558:
! 559: - Function: void gmp_randclear (gmp_randstate_t STATE)
! 560: Free all memory occupied by STATE. Make sure to call this
! 561: function for all `gmp_randstate_t' variables when you are done with
! 562: them.
! 563:
! 564:
! 565: File: gmp.info, Node: BSD Compatible Functions, Next: Custom Allocation, Prev: Random Number Functions, Up: Top
! 566:
! 567: Berkeley MP Compatible Functions
! 568: ********************************
! 569:
! 570: These functions are intended to be fully compatible with the
! 571: Berkeley MP library which is available on many BSD derived U*ix
! 572: systems. The `--enable-mpbsd' option must be used when building GNU MP
! 573: to make these available (*note Installing GMP::).
! 574:
! 575: The original Berkeley MP library has a usage restriction: you cannot
! 576: use the same variable as both source and destination in a single
! 577: function call. The compatible functions in GNU MP do not share this
! 578: restriction--inputs and outputs may overlap.
! 579:
! 580: It is not recommended that new programs are written using these
! 581: functions. Apart from the incomplete set of functions, the interface
! 582: for initializing `MINT' objects is more error prone, and the `pow'
! 583: function collides with `pow' in `libm.a'.
! 584:
! 585: Include the header `mp.h' to get the definition of the necessary
! 586: types and functions. If you are on a BSD derived system, make sure to
! 587: include GNU `mp.h' if you are going to link the GNU `libmp.a' to your
! 588: program. This means that you probably need to give the -I<dir> option
! 589: to the compiler, where <dir> is the directory where you have GNU `mp.h'.
! 590:
! 591: - Function: MINT * itom (signed short int INITIAL_VALUE)
! 592: Allocate an integer consisting of a `MINT' object and dynamic limb
! 593: space. Initialize the integer to INITIAL_VALUE. Return a pointer
! 594: to the `MINT' object.
! 595:
! 596: - Function: MINT * xtom (char *INITIAL_VALUE)
! 597: Allocate an integer consisting of a `MINT' object and dynamic limb
! 598: space. Initialize the integer from INITIAL_VALUE, a hexadecimal,
! 599: '\0'-terminate C string. Return a pointer to the `MINT' object.
! 600:
! 601: - Function: void move (MINT *SRC, MINT *DEST)
! 602: Set DEST to SRC by copying. Both variables must be previously
! 603: initialized.
! 604:
! 605: - Function: void madd (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION)
! 606: Add SRC_1 and SRC_2 and put the sum in DESTINATION.
! 607:
! 608: - Function: void msub (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION)
! 609: Subtract SRC_2 from SRC_1 and put the difference in DESTINATION.
! 610:
! 611: - Function: void mult (MINT *SRC_1, MINT *SRC_2, MINT *DESTINATION)
! 612: Multiply SRC_1 and SRC_2 and put the product in DESTINATION.
! 613:
! 614: - Function: void mdiv (MINT *DIVIDEND, MINT *DIVISOR, MINT *QUOTIENT,
! 615: MINT *REMAINDER)
! 616: - Function: void sdiv (MINT *DIVIDEND, signed short int DIVISOR, MINT
! 617: *QUOTIENT, signed short int *REMAINDER)
! 618: Set QUOTIENT to DIVIDEND/DIVISOR, and REMAINDER to DIVIDEND mod
! 619: DIVISOR. The quotient is rounded towards zero; the remainder has
! 620: the same sign as the dividend unless it is zero.
! 621:
! 622: Some implementations of these functions work differently--or not
! 623: at all--for negative arguments.
! 624:
! 625: - Function: void msqrt (MINT *OPERAND, MINT *ROOT, MINT *REMAINDER)
! 626: Set ROOT to the truncated integer part of the square root of
! 627: OPERAND. Set REMAINDER to OPERAND-ROOT*ROOT, (i.e., zero if
! 628: OPERAND is a perfect square).
! 629:
! 630: If ROOT and REMAINDER are the same variable, the results are
! 631: undefined.
! 632:
! 633: - Function: void pow (MINT *BASE, MINT *EXP, MINT *MOD, MINT *DEST)
! 634: Set DEST to (BASE raised to EXP) modulo MOD.
! 635:
! 636: - Function: void rpow (MINT *BASE, signed short int EXP, MINT *DEST)
! 637: Set DEST to BASE raised to EXP.
! 638:
! 639: - Function: void gcd (MINT *OPERAND1, MINT *OPERAND2, MINT *RES)
! 640: Set RES to the greatest common divisor of OPERAND1 and OPERAND2.
! 641:
! 642: - Function: int mcmp (MINT *OPERAND1, MINT *OPERAND2)
! 643: Compare OPERAND1 and OPERAND2. Return a positive value if
! 644: OPERAND1 > OPERAND2, zero if OPERAND1 = OPERAND2, and a negative
! 645: value if OPERAND1 < OPERAND2.
! 646:
! 647: - Function: void min (MINT *DEST)
! 648: Input a decimal string from `stdin', and put the read integer in
! 649: DEST. SPC and TAB are allowed in the number string, and are
! 650: ignored.
! 651:
! 652: - Function: void mout (MINT *SRC)
! 653: Output SRC to `stdout', as a decimal string. Also output a
! 654: newline.
! 655:
! 656: - Function: char * mtox (MINT *OPERAND)
! 657: Convert OPERAND to a hexadecimal string, and return a pointer to
! 658: the string. The returned string is allocated using the default
! 659: memory allocation function, `malloc' by default.
! 660:
! 661: - Function: void mfree (MINT *OPERAND)
! 662: De-allocate, the space used by OPERAND. *This function should
! 663: only be passed a value returned by `itom' or `xtom'.*
! 664:
! 665:
! 666: File: gmp.info, Node: Custom Allocation, Next: Contributors, Prev: BSD Compatible Functions, Up: Top
! 667:
! 668: Custom Allocation
! 669: *****************
! 670:
! 671: By default, GMP uses `malloc', `realloc' and `free' for memory
! 672: allocation. If `malloc' or `realloc' fails, GMP prints a message to
! 673: the standard error output and terminates execution.
! 674:
! 675: Some applications might want to allocate memory in other ways, or
! 676: might not want a fatal error when there is no more memory available.
! 677: To accomplish this, you can specify alternative memory allocation
! 678: functions.
! 679:
! 680: This can be done in the Berkeley compatibility library as well as
! 681: the main GMP library.
! 682:
! 683: - Function: void mp_set_memory_functions (
! 684: void *(*ALLOC_FUNC_PTR) (size_t),
! 685: void *(*REALLOC_FUNC_PTR) (void *, size_t, size_t),
! 686: void (*FREE_FUNC_PTR) (void *, size_t))
! 687: Replace the current allocation functions from the arguments. If
! 688: an argument is `NULL', the corresponding default function is
! 689: retained.
! 690:
! 691: *Be sure to call this function only when there are no active GMP
! 692: objects allocated using the previous memory functions! Usually,
! 693: that means that you have to call this function before any other
! 694: GMP function.*
! 695:
! 696: The functions you supply should fit the following declarations:
! 697:
! 698: - Function: void * allocate_function (size_t ALLOC_SIZE)
! 699: This function should return a pointer to newly allocated space
! 700: with at least ALLOC_SIZE storage units.
! 701:
! 702: - Function: void * reallocate_function (void *PTR, size_t OLD_SIZE,
! 703: size_t NEW_SIZE)
! 704: This function should return a pointer to newly allocated space of
! 705: at least NEW_SIZE storage units, after copying at least the first
! 706: OLD_SIZE storage units from PTR. It should also de-allocate the
! 707: space at PTR.
! 708:
! 709: You can assume that the space at PTR was formerly returned from
! 710: `allocate_function' or `reallocate_function', for a request for
! 711: OLD_SIZE storage units.
! 712:
! 713: - Function: void deallocate_function (void *PTR, size_t SIZE)
! 714: De-allocate the space pointed to by PTR.
! 715:
! 716: You can assume that the space at PTR was formerly returned from
! 717: `allocate_function' or `reallocate_function', for a request for
! 718: SIZE storage units.
! 719:
! 720: (A "storage unit" is the unit in which the `sizeof' operator returns
! 721: the size of an object, normally an 8 bit byte.)
! 722:
! 723:
! 724: File: gmp.info, Node: Contributors, Next: References, Prev: Custom Allocation, Up: Top
! 725:
! 726: Contributors
! 727: ************
! 728:
! 729: Torbjorn Granlund wrote the original GMP library and is still
! 730: developing and maintaining it. Several other individuals and
! 731: organizations have contributed to GMP in various ways. Here is a list
! 732: in chronological order:
! 733:
! 734: Gunnar Sjoedin and Hans Riesel helped with mathematical problems in
! 735: early versions of the library.
! 736:
! 737: Richard Stallman contributed to the interface design and revised the
! 738: first version of this manual.
! 739:
! 740: Brian Beuning and Doug Lea helped with testing of early versions of
! 741: the library and made creative suggestions.
! 742:
! 743: John Amanatides of York University in Canada contributed the function
! 744: `mpz_probab_prime_p'.
! 745:
! 746: Paul Zimmermann of Inria sparked the development of GMP 2, with his
! 747: comparisons between bignum packages.
! 748:
! 749: Ken Weber (Kent State University, Universidade Federal do Rio Grande
! 750: do Sul) contributed `mpz_gcd', `mpz_divexact', `mpn_gcd', and
! 751: `mpn_bdivmod', partially supported by CNPq (Brazil) grant 301314194-2.
! 752:
! 753: Per Bothner of Cygnus Support helped to set up GMP to use Cygnus'
! 754: configure. He has also made valuable suggestions and tested numerous
! 755: intermediary releases.
! 756:
! 757: Joachim Hollman was involved in the design of the `mpf' interface,
! 758: and in the `mpz' design revisions for version 2.
! 759:
! 760: Bennet Yee contributed the functions `mpz_jacobi' and `mpz_legendre'.
! 761:
! 762: Andreas Schwab contributed the files `mpn/m68k/lshift.S' and
! 763: `mpn/m68k/rshift.S'.
! 764:
! 765: The development of floating point functions of GNU MP 2, were
! 766: supported in part by the ESPRIT-BRA (Basic Research Activities) 6846
! 767: project POSSO (POlynomial System SOlving).
! 768:
! 769: GNU MP 2 was finished and released by SWOX AB (formerly known as TMG
! 770: Datakonsult), Swedenborgsgatan 23, SE-118 27 STOCKHOLM, SWEDEN, in
! 771: cooperation with the IDA Center for Computing Sciences, USA.
! 772:
! 773: Robert Harley of Inria, France and David Seal of ARM, England,
! 774: suggested clever improvements for population count.
! 775:
! 776: Robert Harley also wrote highly optimized Karatsuba and 3-way Toom
! 777: multiplication functions for GMP 3. He also contributed the ARM
! 778: assembly code.
! 779:
! 780: Torsten Ekedahl of the Mathematical department of Stockholm
! 781: University provided significant inspiration during several phases of
! 782: the GMP development. His mathematical expertise helped improve several
! 783: algorithms.
! 784:
! 785: Paul Zimmermann wrote the Burnikel-Ziegler division code, the REDC
! 786: code, the REDC-based mpz_powm code, and the FFT multiply code. The
! 787: ECMNET project Paul is organizing has been a driving force behind many
! 788: of the optimization of GMP 3.
! 789:
! 790: Linus Nordberg wrote the new configure system based on autoconf and
! 791: implemented the new random functions.
! 792:
! 793: Kent Boortz made the Macintosh port.
! 794:
! 795: Kevin Ryde wrote a lot of very high quality x86 code, optimized for
! 796: most CPU variants. He also made countless other valuable contributions.
! 797:
! 798: Steve Root helped write the optimized alpha 21264 assembly code.
! 799:
! 800: GNU MP 3.1 was finished and released by Torbjorn Granlund and Kevin
! 801: Ryde. Torbjorn's work was partially funded by the IDA Center for
! 802: Computing Sciences, USA.
! 803:
! 804: (This list is chronological, not ordered after significance. If you
! 805: have contributed to GMP but are not listed above, please tell
! 806: <tege@swox.com> about the omission!)
! 807:
! 808:
! 809: File: gmp.info, Node: References, Next: Concept Index, Prev: Contributors, Up: Top
! 810:
! 811: References
! 812: **********
! 813:
! 814: * Donald E. Knuth, "The Art of Computer Programming", vol 2,
! 815: "Seminumerical Algorithms", 3rd edition, Addison-Wesley, 1988.
! 816:
! 817: * John D. Lipson, "Elements of Algebra and Algebraic Computing", The
! 818: Benjamin Cummings Publishing Company Inc, 1981.
! 819:
! 820: * Richard M. Stallman, "Using and Porting GCC", Free Software
! 821: Foundation, 1999, available online
! 822: `http://www.gnu.org/software/gcc/onlinedocs/', and in the GCC
! 823: package `ftp://ftp.gnu.org/pub/gnu/gcc/'.
! 824:
! 825: * Peter L. Montgomery, "Modular Multiplication Without Trial
! 826: Division", in Mathematics of Computation, volume 44, number 170,
! 827: April 1985.
! 828:
! 829: * Torbjorn Granlund and Peter L. Montgomery, "Division by Invariant
! 830: Integers using Multiplication", in Proceedings of the SIGPLAN
! 831: PLDI'94 Conference, June 1994. Available online,
! 832: `ftp://ftp.cwi.nl/pub/pmontgom/divcnst.psa4.gz' (and .psl.gz too).
! 833:
! 834: * Tudor Jebelean, "An algorithm for exact division", Journal of
! 835: Symbolic Computation, v. 15, 1993, pp. 169-180. Research report
! 836: version available online
! 837: `ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-35.ps.gz'
! 838:
! 839: * Kenneth Weber, "The accelerated integer GCD algorithm", ACM
! 840: Transactions on Mathematical Software, v. 21 (March), 1995, pp.
! 841: 111-122.
! 842:
! 843: * Christoph Burnikel and Joachim Ziegler, "Fast Recursive Division",
! 844: Max-Planck-Institut fuer Informatik Research Report
! 845: MPI-I-98-1-022,
! 846: `http://www.mpi-sb.mpg.de/~ziegler/TechRep.ps.gz'.
! 847:
! 848: * Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone,
! 849: "Handbook of Applied Cryptography",
! 850: `http://cacr.math.uwaterloo.ca/hac/'.
! 851:
! 852: * Henri Cohen, "A Course in Computational Algebraic Number Theory",
! 853: Graduate Texts in Mathematics number 138, Springer-Verlag, 1993.
! 854: Errata available online
! 855: `http://www.math.u-bordeaux.fr/~cohen'
! 856:
! 857:
! 858: File: gmp.info, Node: Concept Index, Next: Function Index, Prev: References, Up: Top
! 859:
! 860: Concept Index
! 861: *************
! 862:
! 863: * Menu:
1.1 maekawa 864:
1.1.1.2 ! maekawa 865: * ABI: ABI and ISA.
! 866: * About this manual: Introduction to GMP.
! 867: * alloca: Build Options.
! 868: * Allocation of memory: Custom Allocation.
! 869: * Anonymous FTP of latest version: Getting the Latest Version of GMP.
! 870: * Arithmetic functions <1>: Float Arithmetic.
! 871: * Arithmetic functions <2>: Rational Arithmetic.
! 872: * Arithmetic functions: Integer Arithmetic.
! 873: * Assignment functions <1>: Assigning Floats.
! 874: * Assignment functions: Assigning Integers.
! 875: * Basics: GMP Basics.
! 876: * Berkeley MP compatible functions: BSD Compatible Functions.
! 877: * Binomial coefficient functions: Number Theoretic Functions.
! 878: * Bit manipulation functions: Integer Logic and Bit Fiddling.
! 879: * Bit shift left: Integer Arithmetic.
! 880: * Bit shift right: Integer Division.
! 881: * Bits per limb: Useful Macros and Constants.
! 882: * BSD MP compatible functions: BSD Compatible Functions.
! 883: * Bug reporting: Reporting Bugs.
! 884: * Build notes for binary packaging: Notes for Package Builds.
! 885: * Build notes for particular systems: Notes for Particular Systems.
! 886: * Build options: Build Options.
! 887: * Build problems known: Known Build Problems.
! 888: * Comparison functions <1>: Integer Comparisons.
! 889: * Comparison functions <2>: Comparing Rationals.
! 890: * Comparison functions: Float Comparison.
! 891: * Compatibility with older versions: Compatibility with older versions.
! 892: * Conditions for copying GNU MP: Copying.
! 893: * Configuring GMP: Installing GMP.
! 894: * Constants: Useful Macros and Constants.
! 895: * Contributors: Contributors.
! 896: * Conventions for variables: GMP Variable Conventions.
! 897: * Conversion functions <1>: Converting Integers.
! 898: * Conversion functions: Converting Floats.
! 899: * Copying conditions: Copying.
! 900: * CPUs supported: Introduction to GMP.
! 901: * Custom allocation: Custom Allocation.
! 902: * Demonstration programs: Build Options.
! 903: * Division functions <1>: Integer Division.
! 904: * Division functions <2>: Rational Arithmetic.
! 905: * Division functions: Float Arithmetic.
! 906: * Exact division functions: Integer Division.
! 907: * Example programs: Build Options.
! 908: * Exponentiation functions <1>: Float Arithmetic.
! 909: * Exponentiation functions: Integer Exponentiation.
! 910: * Extended GCD: Number Theoretic Functions.
! 911: * Factorial functions: Number Theoretic Functions.
! 912: * Fibonacci sequence functions: Number Theoretic Functions.
! 913: * Float arithmetic functions: Float Arithmetic.
! 914: * Float assignment functions: Assigning Floats.
! 915: * Float comparison functions: Float Comparison.
! 916: * Float conversion functions: Converting Floats.
! 917: * Float functions: Floating-point Functions.
! 918: * Float init and assign functions: Simultaneous Float Init & Assign.
! 919: * Float initialization functions: Initializing Floats.
! 920: * Float input and output functions: I/O of Floats.
! 921: * Float miscellaneous functions: Miscellaneous Float Functions.
! 922: * Floating-point functions: Floating-point Functions.
! 923: * Floating-point number: Nomenclature and Types.
! 924: * FTP of latest version: Getting the Latest Version of GMP.
! 925: * Function classes: Function Classes.
! 926: * GMP version number: Useful Macros and Constants.
! 927: * gmp.h: GMP Basics.
! 928: * Greatest common divisor functions: Number Theoretic Functions.
! 929: * Home page: Introduction to GMP.
! 930: * I/O functions <1>: I/O of Rationals.
! 931: * I/O functions <2>: I/O of Integers.
! 932: * I/O functions: I/O of Floats.
! 933: * Initialization and assignment functions <1>: Initializing Rationals.
! 934: * Initialization and assignment functions <2>: Simultaneous Float Init & Assign.
! 935: * Initialization and assignment functions: Simultaneous Integer Init & Assign.
! 936: * Initialization functions <1>: Initializing Integers.
! 937: * Initialization functions: Initializing Floats.
! 938: * Input functions <1>: I/O of Floats.
! 939: * Input functions <2>: I/O of Rationals.
! 940: * Input functions: I/O of Integers.
! 941: * Installing GMP: Installing GMP.
! 942: * Integer: Nomenclature and Types.
! 943: * Integer arithmetic functions: Integer Arithmetic.
! 944: * Integer assignment functions: Assigning Integers.
! 945: * Integer bit manipulation functions: Integer Logic and Bit Fiddling.
! 946: * Integer comparison functions: Integer Comparisons.
! 947: * Integer conversion functions: Converting Integers.
! 948: * Integer division functions: Integer Division.
! 949: * Integer exponentiation functions: Integer Exponentiation.
! 950: * Integer functions: Integer Functions.
! 951: * Integer init and assign: Simultaneous Integer Init & Assign.
! 952: * Integer initialization functions: Initializing Integers.
! 953: * Integer input and output functions: I/O of Integers.
! 954: * Integer miscellaneous functions: Miscellaneous Integer Functions.
! 955: * Integer random number functions: Integer Random Numbers.
! 956: * Integer root functions: Integer Roots.
! 957: * Introduction: Introduction to GMP.
! 958: * ISA: ABI and ISA.
! 959: * Jabobi symbol functions: Number Theoretic Functions.
! 960: * Kronecker symbol functions: Number Theoretic Functions.
! 961: * Latest version of GMP: Getting the Latest Version of GMP.
! 962: * Least common multiple functions: Number Theoretic Functions.
! 963: * Libtool versioning: Notes for Package Builds.
! 964: * Limb: Nomenclature and Types.
! 965: * Limb size: Useful Macros and Constants.
! 966: * Logical functions: Integer Logic and Bit Fiddling.
! 967: * Low-level functions: Low-level Functions.
! 968: * Mailing list: Introduction to GMP.
! 969: * Memory allocation: Custom Allocation.
! 970: * Miscellaneous float functions: Miscellaneous Float Functions.
! 971: * Miscellaneous integer functions: Miscellaneous Integer Functions.
! 972: * Miscellaneous rational functions: Miscellaneous Rational Functions.
! 973: * Modular inverse functions: Number Theoretic Functions.
! 974: * mp.h: BSD Compatible Functions.
! 975: * Multi-threading: GMP and Reentrancy.
! 976: * Nomenclature: Nomenclature and Types.
! 977: * Number theoretic functions: Number Theoretic Functions.
! 978: * Numerator and denominator: Applying Integer Functions.
! 979: * Output functions <1>: I/O of Floats.
! 980: * Output functions <2>: I/O of Integers.
! 981: * Output functions: I/O of Rationals.
! 982: * Packaged builds: Notes for Package Builds.
! 983: * Parameter conventions: GMP Variable Conventions.
! 984: * Precision of floats: Floating-point Functions.
! 985: * Prime testing functions: Number Theoretic Functions.
! 986: * Random number functions <1>: Integer Random Numbers.
! 987: * Random number functions: Random Number Functions.
! 988: * Random number state: Random State Initialization.
! 989: * Rational arithmetic functions: Rational Arithmetic.
! 990: * Rational comparison functions: Comparing Rationals.
! 991: * Rational init and assign: Initializing Rationals.
! 992: * Rational input and output functions: I/O of Rationals.
! 993: * Rational miscellaneous functions: Miscellaneous Rational Functions.
! 994: * Rational number: Nomenclature and Types.
! 995: * Rational number functions: Rational Number Functions.
! 996: * Rational numerator and denominator: Applying Integer Functions.
! 997: * Reentrancy: GMP and Reentrancy.
! 998: * References: References.
! 999: * Reporting bugs: Reporting Bugs.
! 1000: * Root extraction functions <1>: Float Arithmetic.
! 1001: * Root extraction functions: Integer Roots.
! 1002: * Stack overflow segfaults: Build Options.
! 1003: * Stripped libraries: Known Build Problems.
! 1004: * Thread safety: GMP and Reentrancy.
! 1005: * Types: Nomenclature and Types.
! 1006: * Upward compatibility: Compatibility with older versions.
! 1007: * Useful macros and constants: Useful Macros and Constants.
! 1008: * User-defined precision: Floating-point Functions.
! 1009: * Variable conventions: GMP Variable Conventions.
! 1010: * Version number: Useful Macros and Constants.
! 1011: * Web page: Introduction to GMP.
1.1 maekawa 1012:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>