Annotation of OpenXM/src/kan96xx/gmp-2.0.2/gmp.info-1, Revision 1.1
1.1 ! maekawa 1: This is Info file gmp.info, produced by Makeinfo-1.64 from the input
! 2: file gmp.texi.
! 3:
! 4: START-INFO-DIR-ENTRY
! 5: * gmp: (gmp.info). GNU Multiple Precision Arithmetic Library.
! 6: END-INFO-DIR-ENTRY
! 7:
! 8: This file documents GNU MP, a library for arbitrary-precision
! 9: arithmetic.
! 10:
! 11: Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation,
! 12: Inc.
! 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:
! 29: File: gmp.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir)
! 30:
! 31: GNU MP
! 32: ******
! 33:
! 34: This manual documents how to install and use the GNU multiple
! 35: precision arithmetic library, version 2.0.2.
! 36:
! 37: * Menu:
! 38:
! 39: * Copying:: GMP Copying Conditions (LGPL).
! 40: * Introduction to MP:: Brief introduction to GNU MP.
! 41: * Installing MP:: How to configure and compile the MP library.
! 42: * MP Basics:: What every MP user should now.
! 43: * Reporting Bugs:: How to usefully report bugs.
! 44: * Integer Functions:: Functions for arithmetic on signed integers.
! 45: * Rational Number Functions:: Functions for arithmetic on rational numbers.
! 46: * Floating-point Functions:: Functions for arithmetic on floats.
! 47: * Low-level Functions:: Fast functions for natural numbers.
! 48: * BSD Compatible Functions:: All functions found in BSD MP.
! 49: * Custom Allocation:: How to customize the internal allocation.
! 50:
! 51: * Contributors::
! 52: * References::
! 53: * Concept Index::
! 54: * Function Index::
! 55:
! 56:
! 57: File: gmp.info, Node: Copying, Next: Introduction to MP, Prev: Top, Up: Top
! 58:
! 59: GNU MP Copying Conditions
! 60: *************************
! 61:
! 62: This library is "free"; this means that everyone is free to use it
! 63: and free to redistribute it on a free basis. The library is not in the
! 64: public domain; it is copyrighted and there are restrictions on its
! 65: distribution, but these restrictions are designed to permit everything
! 66: that a good cooperating citizen would want to do. What is not allowed
! 67: is to try to prevent others from further sharing any version of this
! 68: library that they might get from you.
! 69:
! 70: Specifically, we want to make sure that you have the right to give
! 71: away copies of the library, that you receive source code or else can
! 72: get it if you want it, that you can change this library or use pieces
! 73: of it in new free programs, and that you know you can do these things.
! 74:
! 75: To make sure that everyone has such rights, we have to forbid you to
! 76: deprive anyone else of these rights. For example, if you distribute
! 77: copies of the GNU MP library, you must give the recipients all the
! 78: rights that you have. You must make sure that they, too, receive or
! 79: can get the source code. And you must tell them their rights.
! 80:
! 81: Also, for our own protection, we must make certain that everyone
! 82: finds out that there is no warranty for the GNU MP library. If it is
! 83: modified by someone else and passed on, we want their recipients to
! 84: know that what they have is not what we distributed, so that any
! 85: problems introduced by others will not reflect on our reputation.
! 86:
! 87: The precise conditions of the license for the GNU MP library are
! 88: found in the Library General Public License that accompany the source
! 89: code.
! 90:
! 91:
! 92: File: gmp.info, Node: Introduction to MP, Next: Installing MP, Prev: Copying, Up: Top
! 93:
! 94: Introduction to GNU MP
! 95: **********************
! 96:
! 97: GNU MP is a portable library written in C for arbitrary precision
! 98: arithmetic on integers, rational numbers, and floating-point numbers.
! 99: It aims to provide the fastest possible arithmetic for all applications
! 100: that need higher precision than is directly supported by the basic C
! 101: types.
! 102:
! 103: Many applications use just a few hundred bits of precision; but some
! 104: applications may need thousands or even millions of bits. MP is
! 105: designed to give good performance for both, by choosing algorithms
! 106: based on the sizes of the operands, and by carefully keeping the
! 107: overhead at a minimum.
! 108:
! 109: The speed of MP is achieved by using fullwords as the basic
! 110: arithmetic type, by using sophisticated algorithms, by including
! 111: carefully optimized assembly code for the most common inner loops for
! 112: many different CPUs, and by a general emphasis on speed (as opposed to
! 113: simplicity or elegance).
! 114:
! 115: There is carefully optimized assembly code for these CPUs: DEC
! 116: Alpha, Amd 29000, HPPA 1.0 and 1.1, Intel Pentium and generic x86,
! 117: Intel i960, Motorola MC68000, MC68020, MC88100, and MC88110,
! 118: Motorola/IBM PowerPC, National NS32000, IBM POWER, MIPS R3000, R4000,
! 119: SPARCv7, SuperSPARC, generic SPARCv8, and DEC VAX. Some optimizations
! 120: also for ARM, Clipper, IBM ROMP (RT), and Pyramid AP/XP.
! 121:
! 122: This version of MP is released under a more liberal license than
! 123: previous versions. It is now permitted to link MP to non-free
! 124: programs, as long as MP source code is provided when distributing the
! 125: non-free program.
! 126:
! 127: How to use this Manual
! 128: ======================
! 129:
! 130: Everyone should read *Note MP Basics::. If you need to install the
! 131: library yourself, you need to read *Note Installing MP::, too.
! 132:
! 133: The rest of the manual can be used for later reference, although it
! 134: is probably a good idea to glance through it.
! 135:
! 136:
! 137: File: gmp.info, Node: Installing MP, Next: MP Basics, Prev: Introduction to MP, Up: Top
! 138:
! 139: Installing MP
! 140: *************
! 141:
! 142: To build MP, you first have to configure it for your CPU and
! 143: operating system. You need a C compiler, preferably GCC, but any
! 144: reasonable compiler should work. And you need a standard Unix `make'
! 145: program, plus some other standard Unix utility programs.
! 146:
! 147: (If you're on an MS-DOS machine, your can build MP using `make.bat'.
! 148: It requires that djgpp is installed. It does not require
! 149: configuration, nor is `make' needed; `make.bat' both configures and
! 150: builds the library.)
! 151:
! 152: Here are the steps needed to install the library on Unix systems:
! 153:
! 154: 1. In most cases, `./configure --target=cpu-vendor-os', should work
! 155: both for native and cross-compilation. If you get error messages,
! 156: your machine might not be supported.
! 157:
! 158: If you want to compile in a separate object directory, cd to that
! 159: directory, and prefix the configure command with the path to the
! 160: MP source directory. Not all `make' programs have the necessary
! 161: features to support this. In particular, SunOS and Slowaris
! 162: `make' have bugs that makes them unable to build from a separate
! 163: object directory. Use GNU `make' instead.
! 164:
! 165: In addition to the standard cpu-vendor-os tuples, MP recognizes
! 166: sparc8 and supersparc as valid CPU names. Specifying these CPU
! 167: names for relevant systems will improve performance significantly.
! 168:
! 169: In general, if you want a library that runs as fast as possible,
! 170: you should make sure you configure MP for the exact CPU type your
! 171: system uses.
! 172:
! 173: If you have `gcc' in your `PATH', it will be used by default. To
! 174: override this, pass `-with-gcc=no' to `configure'.
! 175:
! 176: 2. `make'
! 177:
! 178: This will compile MP, and create a library archive file `libgmp.a'
! 179: in the working directory.
! 180:
! 181: 3. `make check'
! 182:
! 183: This will make sure MP was built correctly. If you get error
! 184: messages, please report this to `bug-gmp@prep.ai.mit.edu'. (*Note
! 185: Reporting Bugs::, for information on what to include in useful bug
! 186: reports.)
! 187:
! 188: 4. `make install'
! 189:
! 190: This will copy the file `gmp.h' and `libgmp.a', as well as the info
! 191: files, to `/usr/local' (or if you passed the `--prefix' option to
! 192: `configure', to the directory given as argument to `--prefix').
! 193:
! 194: If you wish to build and install the BSD MP compatible functions, use
! 195: `make libmp.a' and `make install-bsdmp'.
! 196:
! 197: There are some other useful make targets:
! 198:
! 199: * `doc'
! 200:
! 201: Create a DVI version of the manual, in `gmp.dvi' and a set of info
! 202: files, in `gmp.info', `gmp.info-1', `gmp.info-2', etc.
! 203:
! 204: * `ps'
! 205:
! 206: Create a Postscript version of the manual, in `gmp.ps'.
! 207:
! 208: * `html'
! 209:
! 210: Create a HTML version of the manual, in `gmp.html'.
! 211:
! 212: * `clean'
! 213:
! 214: Delete all object files and archive files, but not the
! 215: configuration files.
! 216:
! 217: * `distclean'
! 218:
! 219: Delete all files not included in the distribution.
! 220:
! 221: * `uninstall'
! 222:
! 223: Delete all files copied by `make install'.
! 224:
! 225: Known Build Problems
! 226: ====================
! 227:
! 228: GCC 2.7.2 (as well as 2.6.3) for the RS/6000 and PowerPC can not be
! 229: used to compile MP, due to a bug in GCC. If you want to use GCC for
! 230: these machines, you need to apply the patch below to GCC, or use a
! 231: later version of the compiler.
! 232:
! 233: If you are on a Sequent Symmetry, use the GNU assembler instead of
! 234: the system's assembler, since the latter has serious bugs.
! 235:
! 236: The system compiler on NeXT is a massacred and old gcc, even if the
! 237: compiler calls itself `cc'. This compiler cannot be used to build MP.
! 238: You need to get a real gcc, and install that before you compile MP.
! 239: (NeXT might have fixed this in newer releases of their system.)
! 240:
! 241: The system C compiler under SunOS 4 has a bug that makes it
! 242: miscompile mpq/get_d.c. This will make `make check' fail.
! 243:
! 244: Please report other problems to `bug-gmp@prep.ai.mit.edu'. *Note
! 245: Reporting Bugs::.
! 246:
! 247: Patch to apply to GCC 2.6.3 and 2.7.2:
! 248:
! 249: *** config/rs6000/rs6000.md Sun Feb 11 08:22:11 1996
! 250: --- config/rs6000/rs6000.md.new Sun Feb 18 03:33:37 1996
! 251: ***************
! 252: *** 920,926 ****
! 253: (set (match_operand:SI 0 "gpc_reg_operand" "=r")
! 254: (not:SI (match_dup 1)))]
! 255: ""
! 256: ! "nor. %0,%2,%1"
! 257: [(set_attr "type" "compare")])
! 258:
! 259: (define_insn ""
! 260: --- 920,926 ----
! 261: (set (match_operand:SI 0 "gpc_reg_operand" "=r")
! 262: (not:SI (match_dup 1)))]
! 263: ""
! 264: ! "nor. %0,%1,%1"
! 265: [(set_attr "type" "compare")])
! 266:
! 267: (define_insn ""
! 268:
! 269:
! 270: File: gmp.info, Node: MP Basics, Next: Reporting Bugs, Prev: Installing MP, Up: Top
! 271:
! 272: MP Basics
! 273: *********
! 274:
! 275: All declarations needed to use MP are collected in the include file
! 276: `gmp.h'. It is designed to work with both C and C++ compilers.
! 277:
! 278: Nomenclature and Types
! 279: ======================
! 280:
! 281: In this manual, "integer" usually means a multiple precision integer, as
! 282: defined by the MP library. The C data type for such integers is
! 283: `mpz_t'. Here are some examples of how to declare such integers:
! 284:
! 285: mpz_t sum;
! 286:
! 287: struct foo { mpz_t x, y; };
! 288:
! 289: mpz_t vec[20];
! 290:
! 291: "Rational number" means a multiple precision fraction. The C data type
! 292: for these fractions is `mpq_t'. For example:
! 293:
! 294: mpq_t quotient;
! 295:
! 296: "Floating point number" or "Float" for short, is an arbitrary precision
! 297: mantissa with an limited precision exponent. The C data type for such
! 298: objects is `mpf_t'.
! 299:
! 300: A "limb" means the part of a multi-precision number that fits in a
! 301: single word. (We chose this word because a limb of the human body is
! 302: analogous to a digit, only larger, and containing several digits.)
! 303: Normally a limb contains 32 or 64 bits. The C data type for a limb is
! 304: `mp_limb_t'.
! 305:
! 306: Function Classes
! 307: ================
! 308:
! 309: There are six classes of functions in the MP library:
! 310:
! 311: 1. Functions for signed integer arithmetic, with names beginning with
! 312: `mpz_'. The associated type is `mpz_t'. There are about 100
! 313: functions in this class.
! 314:
! 315: 2. Functions for rational number arithmetic, with names beginning with
! 316: `mpq_'. The associated type is `mpq_t'. There are about 20
! 317: functions in this class, but the functions in the previous class
! 318: can be used for performing arithmetic on the numerator and
! 319: denominator separately.
! 320:
! 321: 3. Functions for floating-point arithmetic, with names beginning with
! 322: `mpf_'. The associated type is `mpf_t'. There are about 50
! 323: functions is this class.
! 324:
! 325: 4. Functions compatible with Berkeley MP, such as `itom', `madd', and
! 326: `mult'. The associated type is `MINT'.
! 327:
! 328: 5. Fast low-level functions that operate on natural numbers. These
! 329: are used by the functions in the preceding groups, and you can
! 330: also call them directly from very time-critical user programs.
! 331: These functions' names begin with `mpn_'. There are about 30
! 332: (hard-to-use) functions in this class.
! 333:
! 334: The associated type is array of `mp_limb_t'.
! 335:
! 336: 6. Miscellaneous functions. Functions for setting up custom
! 337: allocation.
! 338:
! 339: MP Variable Conventions
! 340: =======================
! 341:
! 342: As a general rule, all MP functions expect output arguments before
! 343: input arguments. This notation is based on an analogy with the
! 344: assignment operator. (The BSD MP compatibility functions disobey this
! 345: rule, having the output argument(s) last.)
! 346:
! 347: MP allows you to use the same variable for both input and output in
! 348: the same expression. For example, the main function for integer
! 349: multiplication, `mpz_mul', can be used like this: `mpz_mul (x, x, x)'.
! 350: This computes the square of X and puts the result back in X.
! 351:
! 352: Before you can assign to an MP variable, you need to initialize it
! 353: by calling one of the special initialization functions. When you're
! 354: done with a variable, you need to clear it out, using one of the
! 355: functions for that purpose. Which function to use depends on the type
! 356: of variable. See the chapters on integer functions, rational number
! 357: functions, and floating-point functions for details.
! 358:
! 359: A variable should only be initialized once, or at least cleared out
! 360: between each initialization. After a variable has been initialized, it
! 361: may be assigned to any number of times.
! 362:
! 363: For efficiency reasons, avoid to initialize and clear out a variable
! 364: in loops. Instead, initialize it before entering the loop, and clear
! 365: it out after the loop has exited.
! 366:
! 367: You don't need to be concerned about allocating additional space for
! 368: MP variables. All functions in MP automatically allocate additional
! 369: space when a variable does not already have enough space. They do not,
! 370: however, reduce the space when a smaller number is stored in the
! 371: object. Most of the time, this policy is best, since it avoids
! 372: frequent re-allocation.
! 373:
! 374: Useful Macros and Constants
! 375: ===========================
! 376:
! 377: - Global Constant: const int mp_bits_per_limb
! 378: The number of bits per limb.
! 379:
! 380: - Macro: __GNU_MP_VERSION
! 381: - Macro: __GNU_MP_VERSION_MINOR
! 382: The major and minor MP version, respectively, as integers.
! 383:
! 384: Compatibility with Version 1.x
! 385: ==============================
! 386:
! 387: This version of MP is upward compatible with previous versions of
! 388: MP, with a few exceptions.
! 389:
! 390: 1. Integer division functions round the result differently. The old
! 391: functions (`mpz_div', `mpz_divmod', `mpz_mdiv', `mpz_mdivmod',
! 392: etc) now all use floor rounding (i.e., they round the quotient to
! 393: -infinity). There are a lot of new functions for integer
! 394: division, giving the user better control over the rounding.
! 395:
! 396: 2. The function `mpz_mod' now compute the true *mod* function.
! 397:
! 398: 3. The functions `mpz_powm' and `mpz_powm_ui' now use *mod* for
! 399: reduction.
! 400:
! 401: 4. The assignment functions for rational numbers do no longer
! 402: canonicalize their results. In the case a non-canonical result
! 403: could arise from an assignment, the user need to insert an
! 404: explicit call to `mpq_canonicalize'. This change was made for
! 405: efficiency.
! 406:
! 407: 5. Output generated by `mpz_out_raw' in this release cannot be read
! 408: by `mpz_inp_raw' in previous releases. This change was made for
! 409: making the file format truly portable between machines with
! 410: different word sizes.
! 411:
! 412: 6. Several `mpn' functions have changed. But they were intentionally
! 413: undocumented in previous releases.
! 414:
! 415: 7. The functions `mpz_cmp_ui', `mpz_cmp_si', and `mpq_cmp_ui' are now
! 416: implementated as macros, and thereby sometimes evaluate their
! 417: arguments multiple times.
! 418:
! 419: 8. The functions `mpz_pow_ui' and `mpz_ui_pow_ui' now yield 1 for
! 420: 0^0. (In version 1, they yielded 0.)
! 421:
! 422:
! 423: Getting the Latest Version of MP
! 424: ================================
! 425:
! 426: The latest version of the MP library is available by anonymous ftp
! 427: from from `prep.ai.mit.edu'. The file name is
! 428: `/pub/gnu/gmp-M.N.tar.gz'. Many sites around the world mirror `prep';
! 429: please use a mirror site near you.
! 430:
! 431:
! 432: File: gmp.info, Node: Reporting Bugs, Next: Integer Functions, Prev: MP Basics, Up: Top
! 433:
! 434: Reporting Bugs
! 435: **************
! 436:
! 437: If you think you have found a bug in the MP library, please
! 438: investigate it and report it. We have made this library available to
! 439: you, and it is not to ask too much from you, to ask you to report the
! 440: bugs that you find.
! 441:
! 442: There are a few things you should think about when you put your bug
! 443: report together.
! 444:
! 445: You have to send us a test case that makes it possible for us to
! 446: reproduce the bug. Include instructions on how to run the test case.
! 447:
! 448: You also have to explain what is wrong; if you get a crash, or if
! 449: the results printed are incorrect and in that case, in what way.
! 450:
! 451: It is not uncommon that an observed problem is actually due to a bug
! 452: in the compiler used when building MP; the MP code tends to explore
! 453: interesting corners in compilers. Therefore, please include compiler
! 454: version information in your bug report. This can be extracted using
! 455: `what `which cc`', or, if you're using gcc, `gcc -v'. Also, include
! 456: the output from `uname -a'.
! 457:
! 458: If your bug report is good, we will do our best to help you to get a
! 459: corrected version of the library; if the bug report is poor, we won't
! 460: do anything about it (aside of chiding you to send better bug reports).
! 461:
! 462: Send your bug report to: `bug-gmp@prep.ai.mit.edu'.
! 463:
! 464: If you think something in this manual is unclear, or downright
! 465: incorrect, or if the language needs to be improved, please send a note
! 466: to the same address.
! 467:
! 468:
! 469: File: gmp.info, Node: Integer Functions, Next: Rational Number Functions, Prev: Reporting Bugs, Up: Top
! 470:
! 471: Integer Functions
! 472: *****************
! 473:
! 474: This chapter describes the MP functions for performing integer
! 475: arithmetic. These functions start with the prefix `mpz_'.
! 476:
! 477: Arbitrary precision integers are stored in objects of type `mpz_t'.
! 478:
! 479: * Menu:
! 480:
! 481: * Initializing Integers::
! 482: * Assigning Integers::
! 483: * Simultaneous Integer Init & Assign::
! 484: * Converting Integers::
! 485: * Integer Arithmetic::
! 486: * Comparison Functions::
! 487: * Integer Logic and Bit Fiddling::
! 488: * I/O of Integers::
! 489: * Miscellaneous Integer Functions::
! 490:
! 491:
! 492: File: gmp.info, Node: Initializing Integers, Next: Assigning Integers, Up: Integer Functions
! 493:
! 494: Initialization and Assignment Functions
! 495: =======================================
! 496:
! 497: The functions for integer arithmetic assume that all integer objects
! 498: are initialized. You do that by calling the function `mpz_init'.
! 499:
! 500: - Function: void mpz_init (mpz_t INTEGER)
! 501: Initialize INTEGER with limb space and set the initial numeric
! 502: value to 0. Each variable should normally only be initialized
! 503: once, or at least cleared out (using `mpz_clear') between each
! 504: initialization.
! 505:
! 506: Here is an example of using `mpz_init':
! 507:
! 508: {
! 509: mpz_t integ;
! 510: mpz_init (integ);
! 511: ...
! 512: mpz_add (integ, ...);
! 513: ...
! 514: mpz_sub (integ, ...);
! 515:
! 516: /* Unless the program is about to exit, do ... */
! 517: mpz_clear (integ);
! 518: }
! 519:
! 520: As you can see, you can store new values any number of times, once an
! 521: object is initialized.
! 522:
! 523: - Function: void mpz_clear (mpz_t INTEGER)
! 524: Free the limb space occupied by INTEGER. Make sure to call this
! 525: function for all `mpz_t' variables when you are done with them.
! 526:
! 527: - Function: void * _mpz_realloc (mpz_t INTEGER, mp_size_t NEW_ALLOC)
! 528: Change the limb space allocation to NEW_ALLOC limbs. This
! 529: function is not normally called from user code, but it can be used
! 530: to give memory back to the heap, or to increase the space of a
! 531: variable to avoid repeated automatic re-allocation.
! 532:
! 533: - Function: void mpz_array_init (mpz_t INTEGER_ARRAY[], size_t
! 534: ARRAY_SIZE, mp_size_t FIXED_NUM_BITS)
! 535: Allocate *fixed* limb space for all ARRAY_SIZE integers in
! 536: INTEGER_ARRAY. The fixed allocation for each integer in the array
! 537: is enough to store FIXED_NUM_BITS. If the fixed space will be
! 538: insufficient for storing the result of a subsequent calculation,
! 539: the result is unpredictable.
! 540:
! 541: This function is useful for decreasing the working set for some
! 542: algorithms that use large integer arrays.
! 543:
! 544: There is no way to de-allocate the storage allocated by this
! 545: function. Don't call `mpz_clear'!
! 546:
! 547:
! 548: File: gmp.info, Node: Assigning Integers, Next: Simultaneous Integer Init & Assign, Prev: Initializing Integers, Up: Integer Functions
! 549:
! 550: Assignment Functions
! 551: --------------------
! 552:
! 553: These functions assign new values to already initialized integers
! 554: (*note Initializing Integers::.).
! 555:
! 556: - Function: void mpz_set (mpz_t ROP, mpz_t OP)
! 557: - Function: void mpz_set_ui (mpz_t ROP, unsigned long int OP)
! 558: - Function: void mpz_set_si (mpz_t ROP, signed long int OP)
! 559: - Function: void mpz_set_d (mpz_t ROP, double OP)
! 560: - Function: void mpz_set_q (mpz_t ROP, mpq_t OP)
! 561: - Function: void mpz_set_f (mpz_t ROP, mpf_t OP)
! 562: Set the value of ROP from OP.
! 563:
! 564: - Function: int mpz_set_str (mpz_t ROP, char *STR, int BASE)
! 565: Set the value of ROP from STR, a '\0'-terminated C string in base
! 566: BASE. White space is allowed in the string, and is simply
! 567: ignored. The base may vary from 2 to 36. If BASE is 0, the
! 568: actual base is determined from the leading characters: if the
! 569: first two characters are `0x' or `0X', hexadecimal is assumed,
! 570: otherwise if the first character is `0', octal is assumed,
! 571: otherwise decimal is assumed.
! 572:
! 573: This function returns 0 if the entire string up to the '\0' is a
! 574: valid number in base BASE. Otherwise it returns -1.
! 575:
! 576:
! 577: File: gmp.info, Node: Simultaneous Integer Init & Assign, Next: Converting Integers, Prev: Assigning Integers, Up: Integer Functions
! 578:
! 579: Combined Initialization and Assignment Functions
! 580: ------------------------------------------------
! 581:
! 582: For convenience, MP provides a parallel series of initialize-and-set
! 583: functions which initialize the output and then store the value there.
! 584: These functions' names have the form `mpz_init_set...'
! 585:
! 586: Here is an example of using one:
! 587:
! 588: {
! 589: mpz_t pie;
! 590: mpz_init_set_str (pie, "3141592653589793238462643383279502884", 10);
! 591: ...
! 592: mpz_sub (pie, ...);
! 593: ...
! 594: mpz_clear (pie);
! 595: }
! 596:
! 597: Once the integer has been initialized by any of the `mpz_init_set...'
! 598: functions, it can be used as the source or destination operand for the
! 599: ordinary integer functions. Don't use an initialize-and-set function
! 600: on a variable already initialized!
! 601:
! 602: - Function: void mpz_init_set (mpz_t ROP, mpz_t OP)
! 603: - Function: void mpz_init_set_ui (mpz_t ROP, unsigned long int OP)
! 604: - Function: void mpz_init_set_si (mpz_t ROP, signed long int OP)
! 605: - Function: void mpz_init_set_d (mpz_t ROP, double OP)
! 606: Initialize ROP with limb space and set the initial numeric value
! 607: from OP.
! 608:
! 609: - Function: int mpz_init_set_str (mpz_t ROP, char *STR, int BASE)
! 610: Initialize ROP and set its value like `mpz_set_str' (see its
! 611: documentation above for details).
! 612:
! 613: If the string is a correct base BASE number, the function returns
! 614: 0; if an error occurs it returns -1. ROP is initialized even if
! 615: an error occurs. (I.e., you have to call `mpz_clear' for it.)
! 616:
! 617:
! 618: File: gmp.info, Node: Converting Integers, Next: Integer Arithmetic, Prev: Simultaneous Integer Init & Assign, Up: Integer Functions
! 619:
! 620: Conversion Functions
! 621: ====================
! 622:
! 623: This section describes functions for converting arbitrary precision
! 624: integers to standard C types. Functions for converting *to* arbitrary
! 625: precision integers are described in *Note Assigning Integers:: and
! 626: *Note I/O of Integers::.
! 627:
! 628: - Function: unsigned long int mpz_get_ui (mpz_t OP)
! 629: Return the least significant part from OP. This function combined
! 630: with
! 631: `mpz_tdiv_q_2exp(..., OP, CHAR_BIT*sizeof(unsigned long int))' can
! 632: be used to extract the limbs of an integer.
! 633:
! 634: - Function: signed long int mpz_get_si (mpz_t OP)
! 635: If OP fits into a `signed long int' return the value of OP.
! 636: Otherwise return the least significant part of OP, with the same
! 637: sign as OP.
! 638:
! 639: If OP is too large to fit in a `signed long int', the returned
! 640: result is probably not very useful.
! 641:
! 642: - Function: double mpz_get_d (mpz_t OP)
! 643: Convert OP to a double.
! 644:
! 645: - Function: char * mpz_get_str (char *STR, int BASE, mpz_t OP)
! 646: Convert OP to a string of digits in base BASE. The base may vary
! 647: from 2 to 36.
! 648:
! 649: If STR is NULL, space for the result string is allocated using the
! 650: default allocation function, and a pointer to the string is
! 651: returned.
! 652:
! 653: If STR is not NULL, it should point to a block of storage enough
! 654: large for the result. To find out the right amount of space to
! 655: provide for STR, use `mpz_sizeinbase (OP, BASE) + 2'. The two
! 656: extra bytes are for a possible minus sign, and for the terminating
! 657: null character.
! 658:
! 659:
! 660: File: gmp.info, Node: Integer Arithmetic, Next: Comparison Functions, Prev: Converting Integers, Up: Integer Functions
! 661:
! 662: Arithmetic Functions
! 663: ====================
! 664:
! 665: - Function: void mpz_add (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 666: - Function: void mpz_add_ui (mpz_t ROP, mpz_t OP1, unsigned long int
! 667: OP2)
! 668: Set ROP to OP1 + OP2.
! 669:
! 670: - Function: void mpz_sub (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 671: - Function: void mpz_sub_ui (mpz_t ROP, mpz_t OP1, unsigned long int
! 672: OP2)
! 673: Set ROP to OP1 - OP2.
! 674:
! 675: - Function: void mpz_mul (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 676: - Function: void mpz_mul_ui (mpz_t ROP, mpz_t OP1, unsigned long int
! 677: OP2)
! 678: Set ROP to OP1 times OP2.
! 679:
! 680: - Function: void mpz_mul_2exp (mpz_t ROP, mpz_t OP1, unsigned long int
! 681: OP2)
! 682: Set ROP to OP1 times 2 raised to OP2. This operation can also be
! 683: defined as a left shift, OP2 steps.
! 684:
! 685: - Function: void mpz_neg (mpz_t ROP, mpz_t OP)
! 686: Set ROP to -OP.
! 687:
! 688: - Function: void mpz_abs (mpz_t ROP, mpz_t OP)
! 689: Set ROP to the absolute value of OP.
! 690:
! 691: - Function: void mpz_fac_ui (mpz_t ROP, unsigned long int OP)
! 692: Set ROP to OP!, the factorial of OP.
! 693:
! 694: Division functions
! 695: ------------------
! 696:
! 697: Division is undefined if the divisor is zero, and passing a zero
! 698: divisor to the divide or modulo functions, as well passing a zero mod
! 699: argument to the `mpz_powm' and `mpz_powm_ui' functions, will make these
! 700: functions intentionally divide by zero. This gives the user the
! 701: possibility to handle arithmetic exceptions in these functions in the
! 702: same manner as other arithmetic exceptions.
! 703:
! 704: There are three main groups of division functions:
! 705: * Functions that truncate the quotient towards 0. The names of these
! 706: functions start with `mpz_tdiv'. The `t' in the name is short for
! 707: `truncate'.
! 708:
! 709: * Functions that round the quotient towards -infinity. The names of
! 710: these routines start with `mpz_fdiv'. The `f' in the name is
! 711: short for `floor'.
! 712:
! 713: * Functions that round the quotient towards +infinity. The names of
! 714: these routines start with `mpz_cdiv'. The `c' in the name is
! 715: short for `ceil'.
! 716:
! 717: For each rounding mode, there are a couple of variants. Here `q'
! 718: means that the quotient is computed, while `r' means that the remainder
! 719: is computed. Functions that compute both the quotient and remainder
! 720: have `qr' in the name.
! 721:
! 722: - Function: void mpz_tdiv_q (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 723: - Function: void mpz_tdiv_q_ui (mpz_t ROP, mpz_t OP1, unsigned long
! 724: int OP2)
! 725: Set ROP to [OP1/OP2]. The quotient is truncated towards 0.
! 726:
! 727: - Function: void mpz_tdiv_r (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 728: - Function: void mpz_tdiv_r_ui (mpz_t ROP, mpz_t OP1, unsigned long
! 729: int OP2)
! 730: Set ROP to (OP1 - [OP1/OP2] * OP2). Unless the remainder is zero,
! 731: it has the same sign as the dividend.
! 732:
! 733: - Function: void mpz_tdiv_qr (mpz_t ROP1, mpz_t ROP2, mpz_t OP1, mpz_t
! 734: OP2)
! 735: - Function: void mpz_tdiv_qr_ui (mpz_t ROP1, mpz_t ROP2, mpz_t OP1,
! 736: unsigned long int OP2)
! 737: Divide OP1 by OP2 and put the quotient in ROP1 and the remainder
! 738: in ROP2. The quotient is rounded towards 0. Unless the remainder
! 739: is zero, it has the same sign as the dividend.
! 740:
! 741: If ROP1 and ROP2 are the same variable, the results are undefined.
! 742:
! 743: - Function: void mpz_fdiv_q (mpz_t ROP1, mpz_t OP1, mpz_t OP2)
! 744: - Function: void mpz_fdiv_q_ui (mpz_t ROP, mpz_t OP1, unsigned long
! 745: int OP2)
! 746: Set ROP to OP1/OP2. The quotient is rounded towards -infinity.
! 747:
! 748: - Function: void mpz_fdiv_r (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 749: - Function: unsigned long int mpz_fdiv_r_ui (mpz_t ROP, mpz_t OP1,
! 750: unsigned long int OP2)
! 751: Divide OP1 by OP2 and put the remainder in ROP. Unless the
! 752: remainder is zero, it has the same sign as the divisor.
! 753:
! 754: For `mpz_fdiv_r_ui' the remainder is small enough to fit in an
! 755: `unsigned long int', and is therefore returned.
! 756:
! 757: - Function: void mpz_fdiv_qr (mpz_t ROP1, mpz_t ROP2, mpz_t OP1, mpz_t
! 758: OP2)
! 759: - Function: unsigned long int mpz_fdiv_qr_ui (mpz_t ROP1, mpz_t ROP2,
! 760: mpz_t OP1, unsigned long int OP2)
! 761: Divide OP1 by OP2 and put the quotient in ROP1 and the remainder
! 762: in ROP2. The quotient is rounded towards -infinity. Unless the
! 763: remainder is zero, it has the same sign as the divisor.
! 764:
! 765: For `mpz_fdiv_qr_ui' the remainder is small enough to fit in an
! 766: `unsigned long int', and is therefore returned.
! 767:
! 768: If ROP1 and ROP2 are the same variable, the results are undefined.
! 769:
! 770: - Function: unsigned long int mpz_fdiv_ui (mpz_t OP1, unsigned long
! 771: int OP2)
! 772: This function is similar to `mpz_fdiv_r_ui', but the remainder is
! 773: only returned; it is not stored anywhere.
! 774:
! 775: - Function: void mpz_cdiv_q (mpz_t ROP1, mpz_t OP1, mpz_t OP2)
! 776: - Function: void mpz_cdiv_q_ui (mpz_t ROP, mpz_t OP1, unsigned long
! 777: int OP2)
! 778: Set ROP to OP1/OP2. The quotient is rounded towards +infinity.
! 779:
! 780: - Function: void mpz_cdiv_r (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 781: - Function: unsigned long int mpz_cdiv_r_ui (mpz_t ROP, mpz_t OP1,
! 782: unsigned long int OP2)
! 783: Divide OP1 by OP2 and put the remainder in ROP. Unless the
! 784: remainder is zero, it has the opposite sign as the divisor.
! 785:
! 786: For `mpz_cdiv_r_ui' the negated remainder is small enough to fit
! 787: in an `unsigned long int', and it is therefore returned.
! 788:
! 789: - Function: void mpz_cdiv_qr (mpz_t ROP1, mpz_t ROP2, mpz_t OP1, mpz_t
! 790: OP2)
! 791: - Function: unsigned long int mpz_cdiv_qr_ui (mpz_t ROP1, mpz_t ROP2,
! 792: mpz_t OP1, unsigned long int OP2)
! 793: Divide OP1 by OP2 and put the quotient in ROP1 and the remainder
! 794: in ROP2. The quotient is rounded towards +infinity. Unless the
! 795: remainder is zero, it has the opposite sign as the divisor.
! 796:
! 797: For `mpz_cdiv_qr_ui' the negated remainder is small enough to fit
! 798: in an `unsigned long int', and it is therefore returned.
! 799:
! 800: If ROP1 and ROP2 are the same variable, the results are undefined.
! 801:
! 802: - Function: unsigned long int mpz_cdiv_ui (mpz_t OP1, unsigned long
! 803: int OP2)
! 804: Return the negated remainder, similar to `mpz_cdiv_r_ui'. (The
! 805: difference is that this function doesn't store the remainder
! 806: anywhere.)
! 807:
! 808: - Function: void mpz_mod (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 809: - Function: unsigned long int mpz_mod_ui (mpz_t ROP, mpz_t OP1,
! 810: unsigned long int OP2)
! 811: Set ROP to OP1 `mod' OP2. The sign of the divisor is ignored, and
! 812: the result is always non-negative.
! 813:
! 814: For `mpz_mod_ui' the remainder is small enough to fit in an
! 815: `unsigned long int', and is therefore returned.
! 816:
! 817: - Function: void mpz_divexact (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 818: Set ROP to OP1/OP2. This function produces correct results only
! 819: when it is known in advance that OP2 divides OP1.
! 820:
! 821: Since mpz_divexact is much faster than any of the other routines
! 822: that produce the quotient (*note References::. Jebelean), it is
! 823: the best choice for instances in which exact division is known to
! 824: occur, such as reducing a rational to lowest terms.
! 825:
! 826: - Function: void mpz_tdiv_q_2exp (mpz_t ROP, mpz_t OP1, unsigned long
! 827: int OP2)
! 828: Set ROP to OP1 divided by 2 raised to OP2. The quotient is
! 829: rounded towards 0.
! 830:
! 831: - Function: void mpz_tdiv_r_2exp (mpz_t ROP, mpz_t OP1, unsigned long
! 832: int OP2)
! 833: Divide OP1 by (2 raised to OP2) and put the remainder in ROP.
! 834: Unless it is zero, ROP will have the same sign as OP1.
! 835:
! 836: - Function: void mpz_fdiv_q_2exp (mpz_t ROP, mpz_t OP1, unsigned long
! 837: int OP2)
! 838: Set ROP to OP1 divided by 2 raised to OP2. The quotient is
! 839: rounded towards -infinity.
! 840:
! 841: - Function: void mpz_fdiv_r_2exp (mpz_t ROP, mpz_t OP1, unsigned long
! 842: int OP2)
! 843: Divide OP1 by (2 raised to OP2) and put the remainder in ROP. The
! 844: sign of ROP will always be positive.
! 845:
! 846: This operation can also be defined as masking of the OP2 least
! 847: significant bits.
! 848:
! 849: Exponentialization Functions
! 850: ----------------------------
! 851:
! 852: - Function: void mpz_powm (mpz_t ROP, mpz_t BASE, mpz_t EXP, mpz_t MOD)
! 853: - Function: void mpz_powm_ui (mpz_t ROP, mpz_t BASE, unsigned long int
! 854: EXP, mpz_t MOD)
! 855: Set ROP to (BASE raised to EXP) `mod' MOD. If EXP is negative,
! 856: the result is undefined.
! 857:
! 858: - Function: void mpz_pow_ui (mpz_t ROP, mpz_t BASE, unsigned long int
! 859: EXP)
! 860: - Function: void mpz_ui_pow_ui (mpz_t ROP, unsigned long int BASE,
! 861: unsigned long int EXP)
! 862: Set ROP to BASE raised to EXP. The case of 0^0 yields 1.
! 863:
! 864: Square Root Functions
! 865: ---------------------
! 866:
! 867: - Function: void mpz_sqrt (mpz_t ROP, mpz_t OP)
! 868: Set ROP to the truncated integer part of the square root of OP.
! 869:
! 870: - Function: void mpz_sqrtrem (mpz_t ROP1, mpz_t ROP2, mpz_t OP)
! 871: Set ROP1 to the truncated integer part of the square root of OP,
! 872: like `mpz_sqrt'. Set ROP2 to OP-ROP1*ROP1, (i.e., zero if OP is a
! 873: perfect square).
! 874:
! 875: If ROP1 and ROP2 are the same variable, the results are undefined.
! 876:
! 877: - Function: int mpz_perfect_square_p (mpz_t OP)
! 878: Return non-zero if OP is a perfect square, i.e., if the square
! 879: root of OP is an integer. Return zero otherwise.
! 880:
! 881: Number Theoretic Functions
! 882: --------------------------
! 883:
! 884: - Function: int mpz_probab_prime_p (mpz_t OP, int REPS)
! 885: If this function returns 0, OP is definitely not prime. If it
! 886: returns 1, then OP is `probably' prime. The probability of a
! 887: false positive is (1/4)**REPS. A reasonable value of reps is 25.
! 888:
! 889: An implementation of the probabilistic primality test found in
! 890: Seminumerical Algorithms (*note References::. Knuth).
! 891:
! 892: - Function: void mpz_gcd (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 893: Set ROP to the greatest common divisor of OP1 and OP2.
! 894:
! 895: - Function: unsigned long int mpz_gcd_ui (mpz_t ROP, mpz_t OP1,
! 896: unsigned long int OP2)
! 897: Compute the greatest common divisor of OP1 and OP2. If ROP is not
! 898: NULL, store the result there.
! 899:
! 900: If the result is small enough to fit in an `unsigned long int', it
! 901: is returned. If the result does not fit, 0 is returned, and the
! 902: result is equal to the argument OP1. Note that the result will
! 903: always fit if OP2 is non-zero.
! 904:
! 905: - Function: void mpz_gcdext (mpz_t G, mpz_t S, mpz_t T, mpz_t A, mpz_t
! 906: B)
! 907: Compute G, S, and T, such that AS + BT = G = `gcd' (A, B). If T is
! 908: NULL, that argument is not computed.
! 909:
! 910: - Function: int mpz_invert (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 911: Compute the inverse of OP1 modulo OP2 and put the result in ROP.
! 912: Return non-zero if an inverse exist, zero otherwise. When the
! 913: function returns zero, do not assume anything about the value in
! 914: ROP.
! 915:
! 916: - Function: int mpz_jacobi (mpz_t OP1, mpz_t OP2)
! 917: - Function: int mpz_legendre (mpz_t OP1, mpz_t OP2)
! 918: Compute the Jacobi and Legendre symbols, respectively.
! 919:
! 920:
! 921: File: gmp.info, Node: Comparison Functions, Next: Integer Logic and Bit Fiddling, Prev: Integer Arithmetic, Up: Integer Functions
! 922:
! 923: Comparison Functions
! 924: ====================
! 925:
! 926: - Function: int mpz_cmp (mpz_t OP1, mpz_t OP2)
! 927: Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero
! 928: if OP1 = OP2, and a negative value if OP1 < OP2.
! 929:
! 930: - Macro: int mpz_cmp_ui (mpz_t OP1, unsigned long int OP2)
! 931: - Macro: int mpz_cmp_si (mpz_t OP1, signed long int OP2)
! 932: Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero
! 933: if OP1 = OP2, and a negative value if OP1 < OP2.
! 934:
! 935: These functions are actually implemented as macros. They evaluate
! 936: their arguments multiple times.
! 937:
! 938: - Macro: int mpz_sgn (mpz_t OP)
! 939: Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0.
! 940:
! 941: This function is actually implemented as a macro. It evaluates its
! 942: arguments multiple times.
! 943:
! 944:
! 945: File: gmp.info, Node: Integer Logic and Bit Fiddling, Next: I/O of Integers, Prev: Comparison Functions, Up: Integer Functions
! 946:
! 947: Logical and Bit Manipulation Functions
! 948: ======================================
! 949:
! 950: These functions behave as if two's complement arithmetic were used
! 951: (although sign-magnitude is used by the actual implementation).
! 952:
! 953: - Function: void mpz_and (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 954: Set ROP to OP1 logical-and OP2.
! 955:
! 956: - Function: void mpz_ior (mpz_t ROP, mpz_t OP1, mpz_t OP2)
! 957: Set ROP to OP1 inclusive-or OP2.
! 958:
! 959: - Function: void mpz_com (mpz_t ROP, mpz_t OP)
! 960: Set ROP to the one's complement of OP.
! 961:
! 962: - Function: unsigned long int mpz_popcount (mpz_t OP)
! 963: For non-negative numbers, return the population count of OP. For
! 964: negative numbers, return the largest possible value (MAX_ULONG).
! 965:
! 966: - Function: unsigned long int mpz_hamdist (mpz_t OP1, mpz_t OP2)
! 967: If OP1 and OP2 are both non-negative, return the hamming distance
! 968: between the two operands. Otherwise, return the largest possible
! 969: value (MAX_ULONG).
! 970:
! 971: It is possible to extend this function to return a useful value
! 972: when the operands are both negative, but the current
! 973: implementation returns MAX_ULONG in this case. *Do not depend on
! 974: this behavior, since it will change in future versions of the
! 975: library.*
! 976:
! 977: - Function: unsigned long int mpz_scan0 (mpz_t OP, unsigned long int
! 978: STARTING_BIT)
! 979: Scan OP, starting with bit STARTING_BIT, towards more significant
! 980: bits, until the first clear bit is found. Return the index of the
! 981: found bit.
! 982:
! 983: - Function: unsigned long int mpz_scan1 (mpz_t OP, unsigned long int
! 984: STARTING_BIT)
! 985: Scan OP, starting with bit STARTING_BIT, towards more significant
! 986: bits, until the first set bit is found. Return the index of the
! 987: found bit.
! 988:
! 989: - Function: void mpz_setbit (mpz_t ROP, unsigned long int BIT_INDEX)
! 990: Set bit BIT_INDEX in OP1.
! 991:
! 992: - Function: void mpz_clrbit (mpz_t ROP, unsigned long int BIT_INDEX)
! 993: Clear bit BIT_INDEX in OP1.
! 994:
! 995:
! 996: File: gmp.info, Node: I/O of Integers, Next: Miscellaneous Integer Functions, Prev: Integer Logic and Bit Fiddling, Up: Integer Functions
! 997:
! 998: Input and Output Functions
! 999: ==========================
! 1000:
! 1001: Functions that perform input from a stdio stream, and functions that
! 1002: output to a stdio stream. Passing a NULL pointer for a STREAM argument
! 1003: to any of these functions will make them read from `stdin' and write to
! 1004: `stdout', respectively.
! 1005:
! 1006: When using any of these functions, it is a good idea to include
! 1007: `stdio.h' before `gmp.h', since that will allow `gmp.h' to define
! 1008: prototypes for these functions.
! 1009:
! 1010: - Function: size_t mpz_out_str (FILE *STREAM, int BASE, mpz_t OP)
! 1011: Output OP on stdio stream STREAM, as a string of digits in base
! 1012: BASE. The base may vary from 2 to 36.
! 1013:
! 1014: Return the number of bytes written, or if an error occurred,
! 1015: return 0.
! 1016:
! 1017: - Function: size_t mpz_inp_str (mpz_t ROP, FILE *STREAM, int BASE)
! 1018: Input a possibly white-space preceded string in base BASE from
! 1019: stdio stream STREAM, and put the read integer in ROP. The base
! 1020: may vary from 2 to 36. If BASE is 0, the actual base is
! 1021: determined from the leading characters: if the first two
! 1022: characters are `0x' or `0X', hexadecimal is assumed, otherwise if
! 1023: the first character is `0', octal is assumed, otherwise decimal is
! 1024: assumed.
! 1025:
! 1026: Return the number of bytes read, or if an error occurred, return 0.
! 1027:
! 1028: - Function: size_t mpz_out_raw (FILE *STREAM, mpz_t OP)
! 1029: Output OP on stdio stream STREAM, in raw binary format. The
! 1030: integer is written in a portable format, with 4 bytes of size
! 1031: information, and that many bytes of limbs. Both the size and the
! 1032: limbs are written in decreasing significance order (i.e., in
! 1033: big-endian).
! 1034:
! 1035: The output can be read with `mpz_inp_raw'.
! 1036:
! 1037: Return the number of bytes written, or if an error occurred,
! 1038: return 0.
! 1039:
! 1040: The output of this can not be read by `mpz_inp_raw' from GMP 1,
! 1041: because of changes necessary for compatibility between 32-bit and
! 1042: 64-bit machines.
! 1043:
! 1044: - Function: size_t mpz_inp_raw (mpz_t ROP, FILE *STREAM)
! 1045: Input from stdio stream STREAM in the format written by
! 1046: `mpz_out_raw', and put the result in ROP. Return the number of
! 1047: bytes read, or if an error occurred, return 0.
! 1048:
! 1049: This routine can read the output from `mpz_out_raw' also from GMP
! 1050: 1, in spite of changes necessary for compatibility between 32-bit
! 1051: and 64-bit machines.
! 1052:
! 1053:
! 1054: File: gmp.info, Node: Miscellaneous Integer Functions, Prev: I/O of Integers, Up: Integer Functions
! 1055:
! 1056: Miscellaneous Functions
! 1057: =======================
! 1058:
! 1059: - Function: void mpz_random (mpz_t ROP, mp_size_t MAX_SIZE)
! 1060: Generate a random integer of at most MAX_SIZE limbs. The generated
! 1061: random number doesn't satisfy any particular requirements of
! 1062: randomness. Negative random numbers are generated when MAX_SIZE
! 1063: is negative.
! 1064:
! 1065: - Function: void mpz_random2 (mpz_t ROP, mp_size_t MAX_SIZE)
! 1066: Generate a random integer of at most MAX_SIZE limbs, with long
! 1067: strings of zeros and ones in the binary representation. Useful
! 1068: for testing functions and algorithms, since this kind of random
! 1069: numbers have proven to be more likely to trigger corner-case bugs.
! 1070: Negative random numbers are generated when MAX_SIZE is negative.
! 1071:
! 1072: - Function: size_t mpz_size (mpz_t OP)
! 1073: Return the size of OP measured in number of limbs. If OP is zero,
! 1074: the returned value will be zero.
! 1075:
! 1076: *This function is obsolete. It will disappear from future MP
! 1077: releases.*
! 1078:
! 1079: - Function: size_t mpz_sizeinbase (mpz_t OP, int BASE)
! 1080: Return the size of OP measured in number of digits in base BASE.
! 1081: The base may vary from 2 to 36. The returned value will be exact
! 1082: or 1 too big. If BASE is a power of 2, the returned value will
! 1083: always be exact.
! 1084:
! 1085: This function is useful in order to allocate the right amount of
! 1086: space before converting OP to a string. The right amount of
! 1087: allocation is normally two more than the value returned by
! 1088: `mpz_sizeinbase' (one extra for a minus sign and one for the
! 1089: terminating '\0').
! 1090:
! 1091:
! 1092: File: gmp.info, Node: Rational Number Functions, Next: Floating-point Functions, Prev: Integer Functions, Up: Top
! 1093:
! 1094: Rational Number Functions
! 1095: *************************
! 1096:
! 1097: This chapter describes the MP functions for performing arithmetic on
! 1098: rational numbers. These functions start with the prefix `mpq_'.
! 1099:
! 1100: Rational numbers are stored in objects of type `mpq_t'.
! 1101:
! 1102: All rational arithmetic functions assume operands have a canonical
! 1103: form, and canonicalize their result. The canonical from means that the
! 1104: denominator and the numerator have no common factors, and that the
! 1105: denominator is positive. Zero has the unique representation 0/1.
! 1106:
! 1107: Pure assignment functions do not canonicalize the assigned variable.
! 1108: It is the responsibility of the user to canonicalize the assigned
! 1109: variable before any arithmetic operations are performed on that
! 1110: variable. *Note that this is an incompatible change from version 1 of
! 1111: the library.*
! 1112:
! 1113: - Function: void mpq_canonicalize (mpq_t OP)
! 1114: Remove any factors that are common to the numerator and
! 1115: denominator of OP, and make the denominator positive.
! 1116:
! 1117: * Menu:
! 1118:
! 1119: * Initializing Rationals::
! 1120: * Assigning Rationals::
! 1121: * Simultaneous Integer Init & Assign::
! 1122: * Comparing Rationals::
! 1123: * Applying Integer Functions::
! 1124: * Miscellaneous Rational Functions::
! 1125:
! 1126:
! 1127: File: gmp.info, Node: Initializing Rationals, Next: Assigning Rationals, Prev: Rational Number Functions, Up: Rational Number Functions
! 1128:
! 1129: Initialization and Assignment Functions
! 1130: =======================================
! 1131:
! 1132: - Function: void mpq_init (mpq_t DEST_RATIONAL)
! 1133: Initialize DEST_RATIONAL and set it to 0/1. Each variable should
! 1134: normally only be initialized once, or at least cleared out (using
! 1135: the function `mpq_clear') between each initialization.
! 1136:
! 1137: - Function: void mpq_clear (mpq_t RATIONAL_NUMBER)
! 1138: Free the space occupied by RATIONAL_NUMBER. Make sure to call this
! 1139: function for all `mpq_t' variables when you are done with them.
! 1140:
! 1141: - Function: void mpq_set (mpq_t ROP, mpq_t OP)
! 1142: - Function: void mpq_set_z (mpq_t ROP, mpz_t OP)
! 1143: Assign ROP from OP.
! 1144:
! 1145: - Function: void mpq_set_ui (mpq_t ROP, unsigned long int OP1,
! 1146: unsigned long int OP2)
! 1147: - Function: void mpq_set_si (mpq_t ROP, signed long int OP1, unsigned
! 1148: long int OP2)
! 1149: Set the value of ROP to OP1/OP2. Note that if OP1 and OP2 have
! 1150: common factors, ROP has to be passed to `mpq_canonicalize' before
! 1151: any operations are performed on ROP.
! 1152:
! 1153:
! 1154: File: gmp.info, Node: Assigning Rationals, Next: Comparing Rationals, Prev: Initializing Rationals, Up: Rational Number Functions
! 1155:
! 1156: Arithmetic Functions
! 1157: ====================
! 1158:
! 1159: - Function: void mpq_add (mpq_t SUM, mpq_t ADDEND1, mpq_t ADDEND2)
! 1160: Set SUM to ADDEND1 + ADDEND2.
! 1161:
! 1162: - Function: void mpq_sub (mpq_t DIFFERENCE, mpq_t MINUEND, mpq_t
! 1163: SUBTRAHEND)
! 1164: Set DIFFERENCE to MINUEND - SUBTRAHEND.
! 1165:
! 1166: - Function: void mpq_mul (mpq_t PRODUCT, mpq_t MULTIPLIER, mpq_t
! 1167: MULTIPLICAND)
! 1168: Set PRODUCT to MULTIPLIER times MULTIPLICAND.
! 1169:
! 1170: - Function: void mpq_div (mpq_t QUOTIENT, mpq_t DIVIDEND, mpq_t
! 1171: DIVISOR)
! 1172: Set QUOTIENT to DIVIDEND/DIVISOR.
! 1173:
! 1174: - Function: void mpq_neg (mpq_t NEGATED_OPERAND, mpq_t OPERAND)
! 1175: Set NEGATED_OPERAND to -OPERAND.
! 1176:
! 1177: - Function: void mpq_inv (mpq_t INVERTED_NUMBER, mpq_t NUMBER)
! 1178: Set INVERTED_NUMBER to 1/NUMBER. If the new denominator is zero,
! 1179: this routine will divide by zero.
! 1180:
! 1181:
! 1182: File: gmp.info, Node: Comparing Rationals, Next: Applying Integer Functions, Prev: Assigning Rationals, Up: Rational Number Functions
! 1183:
! 1184: Comparison Functions
! 1185: ====================
! 1186:
! 1187: - Function: int mpq_cmp (mpq_t OP1, mpq_t OP2)
! 1188: Compare OP1 and OP2. Return a positive value if OP1 > OP2, zero
! 1189: if OP1 = OP2, and a negative value if OP1 < OP2.
! 1190:
! 1191: To determine if two rationals are equal, `mpq_equal' is faster than
! 1192: `mpq_cmp'.
! 1193:
! 1194: - Macro: int mpq_cmp_ui (mpq_t OP1, unsigned long int NUM2, unsigned
! 1195: long int DEN2)
! 1196: Compare OP1 and NUM2/DEN2. Return a positive value if OP1 >
! 1197: NUM2/DEN2, zero if OP1 = NUM2/DEN2, and a negative value if OP1 <
! 1198: NUM2/DEN2.
! 1199:
! 1200: This routine allows that NUM2 and DEN2 have common factors.
! 1201:
! 1202: This function is actually implemented as a macro. It evaluates its
! 1203: arguments multiple times.
! 1204:
! 1205: - Macro: int mpq_sgn (mpq_t OP)
! 1206: Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0.
! 1207:
! 1208: This function is actually implemented as a macro. It evaluates its
! 1209: arguments multiple times.
! 1210:
! 1211: - Function: int mpq_equal (mpq_t OP1, mpq_t OP2)
! 1212: Return non-zero if OP1 and OP2 are equal, zero if they are
! 1213: non-equal. Although `mpq_cmp' can be used for the same purpose,
! 1214: this function is much faster.
! 1215:
! 1216:
! 1217: File: gmp.info, Node: Applying Integer Functions, Next: Miscellaneous Rational Functions, Prev: Comparing Rationals, Up: Rational Number Functions
! 1218:
! 1219: Applying Integer Functions to Rationals
! 1220: =======================================
! 1221:
! 1222: The set of `mpq' functions is quite small. In particular, there are
! 1223: no functions for either input or output. But there are two macros that
! 1224: allow us to apply any `mpz' function on the numerator or denominator of
! 1225: a rational number. If these macros are used to assign to the rational
! 1226: number, `mpq_canonicalize' normally need to be called afterwards.
! 1227:
! 1228: - Macro: mpz_t mpq_numref (mpq_t OP)
! 1229: - Macro: mpz_t mpq_denref (mpq_t OP)
! 1230: Return a reference to the numerator and denominator of OP,
! 1231: respectively. The `mpz' functions can be used on the result of
! 1232: these macros.
! 1233:
! 1234:
! 1235: File: gmp.info, Node: Miscellaneous Rational Functions, Prev: Applying Integer Functions, Up: Rational Number Functions
! 1236:
! 1237: Miscellaneous Functions
! 1238: =======================
! 1239:
! 1240: - Function: double mpq_get_d (mpq_t OP)
! 1241: Convert OP to a double.
! 1242:
! 1243: These functions assign between either the numerator or denominator
! 1244: of a rational, and an integer. Instead of using these functions, it is
! 1245: preferable to use the more general mechanisms `mpq_numref' and
! 1246: `mpq_denref', together with `mpz_set'.
! 1247:
! 1248: - Function: void mpq_set_num (mpq_t RATIONAL, mpz_t NUMERATOR)
! 1249: Copy NUMERATOR to the numerator of RATIONAL. When this risks to
! 1250: make the numerator and denominator of RATIONAL have common
! 1251: factors, you have to pass RATIONAL to `mpq_canonicalize' before
! 1252: any operations are performed on RATIONAL.
! 1253:
! 1254: This function is equivalent to `mpz_set (mpq_numref (RATIONAL),
! 1255: NUMERATOR)'.
! 1256:
! 1257: - Function: void mpq_set_den (mpq_t RATIONAL, mpz_t DENOMINATOR)
! 1258: Copy DENOMINATOR to the denominator of RATIONAL. When this risks
! 1259: to make the numerator and denominator of RATIONAL have common
! 1260: factors, or if the denominator might be negative, you have to pass
! 1261: RATIONAL to `mpq_canonicalize' before any operations are performed
! 1262: on RATIONAL.
! 1263:
! 1264: *In version 1 of the library, negative denominators were handled by
! 1265: copying the sign to the numerator. That is no longer done.*
! 1266:
! 1267: This function is equivalent to `mpz_set (mpq_denref (RATIONAL),
! 1268: DENOMINATORS)'.
! 1269:
! 1270: - Function: void mpq_get_num (mpz_t NUMERATOR, mpq_t RATIONAL)
! 1271: Copy the numerator of RATIONAL to the integer NUMERATOR, to
! 1272: prepare for integer operations on the numerator.
! 1273:
! 1274: This function is equivalent to `mpz_set (NUMERATOR, mpq_numref
! 1275: (RATIONAL))'.
! 1276:
! 1277: - Function: void mpq_get_den (mpz_t DENOMINATOR, mpq_t RATIONAL)
! 1278: Copy the denominator of RATIONAL to the integer DENOMINATOR, to
! 1279: prepare for integer operations on the denominator.
! 1280:
! 1281: This function is equivalent to `mpz_set (DENOMINATOR, mpq_denref
! 1282: (RATIONAL))'.
! 1283:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>