[BACK]Return to gmp.info-1 CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp

Annotation of OpenXM_contrib/gmp/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>