[BACK]Return to gmp.texi CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp

Annotation of OpenXM_contrib/gmp/gmp.texi, Revision 1.1

1.1     ! maekawa     1: \input texinfo    @c -*-texinfo-*-
        !             2: @c %**start of header
        !             3: @setfilename gmp.info
        !             4: @settitle GNU MP 2.0.2
        !             5: @synindex tp fn
        !             6: @iftex
        !             7: @afourpaper
        !             8: @end iftex
        !             9: @comment %**end of header
        !            10:
        !            11: @ifinfo
        !            12: @format
        !            13: START-INFO-DIR-ENTRY
        !            14: * gmp: (gmp.info).               GNU Multiple Precision Arithmetic Library.
        !            15: END-INFO-DIR-ENTRY
        !            16: @end format
        !            17: @end ifinfo
        !            18:
        !            19: @c smallbook
        !            20:
        !            21: @iftex
        !            22: @finalout
        !            23: @end iftex
        !            24:
        !            25: @c Note: the edition number is listed in *three* places; please update
        !            26: @c all three.  Also, update the month and year where appropriate.
        !            27:
        !            28: @c ==> Update edition number for settitle and subtitle, and in the
        !            29: @c ==> following paragraph; update date, too.
        !            30:
        !            31:
        !            32: @ifinfo
        !            33: This file documents GNU MP, a library for arbitrary-precision arithmetic.
        !            34:
        !            35: Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
        !            36:
        !            37: Permission is granted to make and distribute verbatim copies of
        !            38: this manual provided the copyright notice and this permission notice
        !            39: are preserved on all copies.
        !            40:
        !            41: @ignore
        !            42: Permission is granted to process this file through TeX and print the
        !            43: results, provided the printed document carries copying permission
        !            44: notice identical to this one except for the removal of this paragraph
        !            45: (this paragraph not being relevant to the printed manual).
        !            46:
        !            47: @end ignore
        !            48: Permission is granted to copy and distribute modified versions of this
        !            49: manual under the conditions for verbatim copying, provided that the entire
        !            50: resulting derived work is distributed under the terms of a permission
        !            51: notice identical to this one.
        !            52:
        !            53: Permission is granted to copy and distribute translations of this manual
        !            54: into another language, under the above conditions for modified versions,
        !            55: except that this permission notice may be stated in a translation approved
        !            56: by the Foundation.
        !            57: @end ifinfo
        !            58:
        !            59: @setchapternewpage on
        !            60: @titlepage
        !            61: @c  use the new format for titles
        !            62:
        !            63: @title GNU MP
        !            64: @subtitle The GNU Multiple Precision Arithmetic Library
        !            65: @subtitle Edition 2.0.2
        !            66: @subtitle June 1996
        !            67:
        !            68: @author by Torbj@"orn Granlund, TMG Datakonsult
        !            69:
        !            70: @c Include the Distribution inside the titlepage so
        !            71: @c that headings are turned off.
        !            72:
        !            73: @tex
        !            74: \global\parindent=0pt
        !            75: \global\parskip=8pt
        !            76: \global\baselineskip=13pt
        !            77: @end tex
        !            78:
        !            79: @page
        !            80: @vskip 0pt plus 1filll
        !            81: Copyright @copyright{} 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
        !            82:
        !            83: @sp 2
        !            84:
        !            85: Published by the Free Software Foundation @*
        !            86: 59 Temple Place - Suite 330 @*
        !            87: Boston, MA 02111-1307, USA @*
        !            88:
        !            89: Permission is granted to make and distribute verbatim copies of
        !            90: this manual provided the copyright notice and this permission notice
        !            91: are preserved on all copies.
        !            92:
        !            93: Permission is granted to copy and distribute modified versions of this
        !            94: manual under the conditions for verbatim copying, provided that the entire
        !            95: resulting derived work is distributed under the terms of a permission
        !            96: notice identical to this one.
        !            97:
        !            98: Permission is granted to copy and distribute translations of this manual
        !            99: into another language, under the above conditions for modified versions,
        !           100: except that this permission notice may be stated in a translation approved
        !           101: by the Foundation.
        !           102: @end titlepage
        !           103: @headings double
        !           104:
        !           105: @ifinfo
        !           106: @node Top, Copying, (dir), (dir)
        !           107:
        !           108: @top GNU MP
        !           109:
        !           110: This manual documents how to install and use the GNU multiple precision
        !           111: arithmetic library, version 2.0.2.
        !           112:
        !           113: @end ifinfo
        !           114:
        !           115: @menu
        !           116: * Copying::                   GMP Copying Conditions (LGPL).
        !           117: * Introduction to MP::        Brief introduction to GNU MP.
        !           118: * Installing MP::             How to configure and compile the MP library.
        !           119: * MP Basics::                 What every MP user should now.
        !           120: * Reporting Bugs::            How to usefully report bugs.
        !           121: * Integer Functions::         Functions for arithmetic on signed integers.
        !           122: * Rational Number Functions:: Functions for arithmetic on rational numbers.
        !           123: * Floating-point Functions::  Functions for arithmetic on floats.
        !           124: * Low-level Functions::       Fast functions for natural numbers.
        !           125: * BSD Compatible Functions::  All functions found in BSD MP.
        !           126: * Custom Allocation::         How to customize the internal allocation.
        !           127:
        !           128: * Contributors::
        !           129: * References::
        !           130: * Concept Index::
        !           131: * Function Index::
        !           132: @end menu
        !           133:
        !           134: @node Copying, Introduction to MP, Top, Top
        !           135: @comment  node-name, next, previous,  up
        !           136: @unnumbered GNU MP Copying Conditions
        !           137: @cindex Copying conditions
        !           138: @cindex Conditions for copying GNU MP
        !           139:
        !           140: This library is @dfn{free}; this means that everyone is free to use it and
        !           141: free to redistribute it on a free basis.  The library is not in the public
        !           142: domain; it is copyrighted and there are restrictions on its distribution, but
        !           143: these restrictions are designed to permit everything that a good cooperating
        !           144: citizen would want to do.  What is not allowed is to try to prevent others
        !           145: from further sharing any version of this library that they might get from
        !           146: you.@refill
        !           147:
        !           148: Specifically, we want to make sure that you have the right to give away copies
        !           149: of the library, that you receive source code or else can get it if you want
        !           150: it, that you can change this library or use pieces of it in new free programs,
        !           151: and that you know you can do these things.@refill
        !           152:
        !           153: To make sure that everyone has such rights, we have to forbid you to deprive
        !           154: anyone else of these rights.  For example, if you distribute copies of the GNU
        !           155: MP library, you must give the recipients all the rights that you have.  You
        !           156: must make sure that they, too, receive or can get the source code.  And you
        !           157: must tell them their rights.@refill
        !           158:
        !           159: Also, for our own protection, we must make certain that everyone finds out
        !           160: that there is no warranty for the GNU MP library.  If it is modified by
        !           161: someone else and passed on, we want their recipients to know that what they
        !           162: have is not what we distributed, so that any problems introduced by others
        !           163: will not reflect on our reputation.@refill
        !           164:
        !           165: The precise conditions of the license for the GNU MP library are found in the
        !           166: Library General Public License that accompany the source code.@refill
        !           167:
        !           168: @node Introduction to MP, Installing MP, Copying, Top
        !           169: @comment  node-name,  next,  previous,  up
        !           170: @chapter Introduction to GNU MP
        !           171:
        !           172:
        !           173: GNU MP is a portable library written in C for arbitrary precision arithmetic
        !           174: on integers, rational numbers, and floating-point numbers.  It aims to provide
        !           175: the fastest possible arithmetic for all applications that need higher
        !           176: precision than is directly supported by the basic C types.
        !           177:
        !           178: Many applications use just a few hundred bits of precision; but some
        !           179: applications may need thousands or even millions of bits.  MP is designed to
        !           180: give good performance for both, by choosing algorithms based on the sizes of
        !           181: the operands, and by carefully keeping the overhead at a minimum.
        !           182:
        !           183: The speed of MP is achieved by using fullwords as the basic arithmetic type,
        !           184: by using sophisticated algorithms, by including carefully optimized assembly
        !           185: code for the most common inner loops for many different CPUs, and by a general
        !           186: emphasis on speed (as opposed to simplicity or elegance).
        !           187:
        !           188: There is carefully optimized assembly code for these CPUs: DEC Alpha, Amd
        !           189: 29000, HPPA 1.0 and 1.1, Intel Pentium and generic x86, Intel i960, Motorola
        !           190: MC68000, MC68020, MC88100, and MC88110, Motorola/IBM PowerPC, National
        !           191: NS32000, IBM POWER, MIPS R3000, R4000, SPARCv7, SuperSPARC, generic SPARCv8,
        !           192: and DEC VAX.  Some optimizations also for ARM, Clipper, IBM ROMP (RT), and
        !           193: Pyramid AP/XP.
        !           194:
        !           195: This version of MP is released under a more liberal license than previous
        !           196: versions.  It is now permitted to link MP to non-free programs, as long as MP
        !           197: source code is provided when distributing the non-free program.
        !           198:
        !           199:
        !           200: @section How to use this Manual
        !           201:
        !           202: Everyone should read @ref{MP Basics}.  If you need to install the library
        !           203: yourself, you need to read @ref{Installing MP}, too.
        !           204:
        !           205: The rest of the manual can be used for later reference, although it is
        !           206: probably a good idea to glance through it.
        !           207:
        !           208:
        !           209: @node Installing MP, MP Basics, Introduction to MP, Top
        !           210: @comment  node-name,  next,  previous,  up
        !           211: @chapter Installing MP
        !           212: @cindex Installation
        !           213:
        !           214: To build MP, you first have to configure it for your CPU and operating system.
        !           215: You need a C compiler, preferably GCC, but any reasonable compiler should
        !           216: work.  And you need a standard Unix @samp{make} program, plus some other
        !           217: standard Unix utility programs.
        !           218:
        !           219: (If you're on an MS-DOS machine, your can build MP using @file{make.bat}.  It
        !           220: requires that djgpp is installed.  It does not require configuration, nor is
        !           221: @samp{make} needed; @file{make.bat} both configures and builds the library.)
        !           222:
        !           223: Here are the steps needed to install the library on Unix systems:
        !           224:
        !           225: @enumerate
        !           226: @item
        !           227: In most cases, @samp{./configure --target=cpu-vendor-os}, should work both for
        !           228: native and cross-compilation.  If you get error messages, your machine might
        !           229: not be supported.
        !           230:
        !           231: If you want to compile in a separate object directory, cd to that directory,
        !           232: and prefix the configure command with the path to the MP source directory.
        !           233: Not all @samp{make} programs have the necessary features to support this.  In
        !           234: particular, SunOS and Slowaris @samp{make} have bugs that makes them unable to
        !           235: build from a separate object directory.  Use GNU @samp{make} instead.
        !           236:
        !           237: In addition to the standard cpu-vendor-os tuples, MP recognizes sparc8 and
        !           238: supersparc as valid CPU names.  Specifying these CPU names for relevant
        !           239: systems will improve performance significantly.
        !           240:
        !           241: In general, if you want a library that runs as fast as possible, you should
        !           242: make sure you configure MP for the exact CPU type your system uses.
        !           243:
        !           244: If you have @code{gcc} in your @code{PATH}, it will be used by default.  To
        !           245: override this, pass @samp{-with-gcc=no} to @file{configure}.
        !           246:
        !           247: @item
        !           248: @samp{make}
        !           249:
        !           250: This will compile MP, and create a library archive file @file{libgmp.a} in the
        !           251: working directory.
        !           252:
        !           253: @item
        !           254: @samp{make check}
        !           255:
        !           256: This will make sure MP was built correctly.  If you get error messages, please
        !           257: report this to @samp{bug-gmp@@prep.ai.mit.edu}.  (@xref{Reporting Bugs}, for
        !           258: information on what to include in useful bug reports.)
        !           259:
        !           260: @item
        !           261: @samp{make install}
        !           262:
        !           263: This will copy the file @file{gmp.h} and @file{libgmp.a}, as well as the info
        !           264: files, to @file{/usr/local} (or if you passed the @samp{--prefix} option to
        !           265: @file{configure}, to the directory given as argument to @samp{--prefix}).
        !           266: @end enumerate
        !           267:
        !           268: @noindent
        !           269: If you wish to build and install the BSD MP compatible functions, use
        !           270: @samp{make libmp.a} and @samp{make install-bsdmp}.
        !           271:
        !           272: There are some other useful make targets:
        !           273:
        !           274: @itemize @bullet
        !           275: @item
        !           276: @samp{doc}
        !           277:
        !           278: Create a DVI version of the manual, in @file{gmp.dvi} and a set of info files,
        !           279: in @file{gmp.info}, @file{gmp.info-1}, @file{gmp.info-2}, etc.
        !           280:
        !           281: @item
        !           282: @samp{ps}
        !           283:
        !           284: Create a Postscript version of the manual, in @file{gmp.ps}.
        !           285:
        !           286: @item
        !           287: @samp{html}
        !           288:
        !           289: Create a HTML version of the manual, in @file{gmp.html}.
        !           290:
        !           291: @item
        !           292: @samp{clean}
        !           293:
        !           294: Delete all object files and archive files, but not the configuration files.
        !           295:
        !           296: @item
        !           297: @samp{distclean}
        !           298:
        !           299: Delete all files not included in the distribution.
        !           300:
        !           301: @item
        !           302: @samp{uninstall}
        !           303:
        !           304: Delete all files copied by @samp{make install}.
        !           305: @end itemize
        !           306:
        !           307:
        !           308: @section Known Build Problems
        !           309:
        !           310: GCC 2.7.2 (as well as 2.6.3) for the RS/6000 and PowerPC can not be used to
        !           311: compile MP, due to a bug in GCC.  If you want to use GCC for these machines,
        !           312: you need to apply the patch below to GCC, or use a later version of the
        !           313: compiler.
        !           314:
        !           315: If you are on a Sequent Symmetry, use the GNU assembler instead of the
        !           316: system's assembler, since the latter has serious bugs.
        !           317:
        !           318: The system compiler on NeXT is a massacred and old gcc, even if the compiler
        !           319: calls itself @file{cc}.  This compiler cannot be used to build MP.  You need
        !           320: to get a real gcc, and install that before you compile MP.  (NeXT might have
        !           321: fixed this in newer releases of their system.)
        !           322:
        !           323: The system C compiler under SunOS 4 has a bug that makes it miscompile
        !           324: mpq/get_d.c.  This will make @samp{make check} fail.
        !           325:
        !           326: Please report other problems to @samp{bug-gmp@@prep.ai.mit.edu}.
        !           327: @xref{Reporting Bugs}.
        !           328:
        !           329:
        !           330: Patch to apply to GCC 2.6.3 and 2.7.2:
        !           331:
        !           332: @example
        !           333: *** config/rs6000/rs6000.md    Sun Feb 11 08:22:11 1996
        !           334: --- config/rs6000/rs6000.md.new        Sun Feb 18 03:33:37 1996
        !           335: ***************
        !           336: *** 920,926 ****
        !           337:      (set (match_operand:SI 0 "gpc_reg_operand" "=r")
        !           338:        (not:SI (match_dup 1)))]
        !           339:     ""
        !           340: !   "nor. %0,%2,%1"
        !           341:     [(set_attr "type" "compare")])
        !           342:
        !           343:   (define_insn ""
        !           344: --- 920,926 ----
        !           345:      (set (match_operand:SI 0 "gpc_reg_operand" "=r")
        !           346:        (not:SI (match_dup 1)))]
        !           347:     ""
        !           348: !   "nor. %0,%1,%1"
        !           349:     [(set_attr "type" "compare")])
        !           350:
        !           351:   (define_insn ""
        !           352: @end example
        !           353:
        !           354: @node MP Basics, Reporting Bugs, Installing MP, Top
        !           355: @comment  node-name,  next,  previous,  up
        !           356: @chapter MP Basics
        !           357:
        !           358:
        !           359: @cindex @file{gmp.h}
        !           360: All declarations needed to use MP are collected in the include file
        !           361: @file{gmp.h}.  It is designed to work with both C and C++ compilers.
        !           362:
        !           363:
        !           364: @section Nomenclature and Types
        !           365:
        !           366: @cindex Integer
        !           367: @tindex @code{mpz_t}
        !           368: @noindent
        !           369: In this manual, @dfn{integer} usually means a multiple precision integer, as
        !           370: defined by the MP library.  The C data type for such integers is @code{mpz_t}.
        !           371: Here are some examples of how to declare such integers:
        !           372:
        !           373: @example
        !           374: mpz_t sum;
        !           375:
        !           376: struct foo @{ mpz_t x, y; @};
        !           377:
        !           378: mpz_t vec[20];
        !           379: @end example
        !           380:
        !           381: @cindex Rational number
        !           382: @tindex @code{mpq_t}
        !           383: @noindent
        !           384: @dfn{Rational number} means a multiple precision fraction.  The C data type
        !           385: for these fractions is @code{mpq_t}.  For example:
        !           386:
        !           387: @example
        !           388: mpq_t quotient;
        !           389: @end example
        !           390:
        !           391: @cindex Floating-point number
        !           392: @tindex @code{mpf_t}
        !           393: @noindent
        !           394: @dfn{Floating point number} or @dfn{Float} for short, is an arbitrary precision
        !           395: mantissa with an limited precision exponent.  The C data type for such objects
        !           396: is @code{mpf_t}.
        !           397:
        !           398: @cindex Limb
        !           399: @tindex @code{mp_limb_t}
        !           400: @noindent
        !           401: A @dfn{limb} means the part of a multi-precision number that fits in a single
        !           402: word.  (We chose this word because a limb of the human body is analogous to a
        !           403: digit, only larger, and containing several digits.)  Normally a limb contains
        !           404: 32 or 64 bits.  The C data type for a limb is @code{mp_limb_t}.
        !           405:
        !           406:
        !           407: @section Function Classes
        !           408:
        !           409: There are six classes of functions in the MP library:
        !           410:
        !           411: @enumerate
        !           412: @item
        !           413: Functions for signed integer arithmetic, with names beginning with
        !           414: @code{mpz_}.  The associated type is @code{mpz_t}.  There are about 100
        !           415: functions in this class.
        !           416:
        !           417: @item
        !           418: Functions for rational number arithmetic, with names beginning with
        !           419: @code{mpq_}.  The associated type is @code{mpq_t}.  There are about 20
        !           420: functions in this class, but the functions in the previous class can be used
        !           421: for performing arithmetic on the numerator and denominator separately.
        !           422:
        !           423: @item
        !           424: Functions for floating-point arithmetic, with names beginning with
        !           425: @code{mpf_}.  The associated type is @code{mpf_t}.  There are about 50
        !           426: functions is this class.
        !           427:
        !           428: @item
        !           429: Functions compatible with Berkeley MP, such as @code{itom}, @code{madd}, and
        !           430: @code{mult}.  The associated type is @code{MINT}.
        !           431:
        !           432: @item
        !           433: Fast low-level functions that operate on natural numbers.  These are used by
        !           434: the functions in the preceding groups, and you can also call them directly
        !           435: from very time-critical user programs.  These functions' names begin with
        !           436: @code{mpn_}.  There are about 30 (hard-to-use) functions in this class.
        !           437:
        !           438: The associated type is array of @code{mp_limb_t}.
        !           439:
        !           440: @item
        !           441: Miscellaneous functions.  Functions for setting up custom allocation.
        !           442: @end enumerate
        !           443:
        !           444:
        !           445: @section MP Variable Conventions
        !           446:
        !           447: As a general rule, all MP functions expect output arguments before input
        !           448: arguments.  This notation is based on an analogy with the assignment operator.
        !           449: (The BSD MP compatibility functions disobey this rule, having the output
        !           450: argument(s) last.)
        !           451:
        !           452: MP allows you to use the same variable for both input and output in the same
        !           453: expression.  For example, the main function for integer multiplication,
        !           454: @code{mpz_mul}, can be used like this: @code{mpz_mul (x, x, x)}.  This
        !           455: computes the square of @var{x} and puts the result back in @var{x}.
        !           456:
        !           457: Before you can assign to an MP variable, you need to initialize it by calling
        !           458: one of the special initialization functions.  When you're done with a
        !           459: variable, you need to clear it out, using one of the functions for that
        !           460: purpose.  Which function to use depends on the type of variable.  See the
        !           461: chapters on integer functions, rational number functions, and floating-point
        !           462: functions for details.
        !           463:
        !           464: A variable should only be initialized once, or at least cleared out between
        !           465: each initialization.  After a variable has been initialized, it may be
        !           466: assigned to any number of times.
        !           467:
        !           468: For efficiency reasons, avoid to initialize and clear out a variable in loops.
        !           469: Instead, initialize it before entering the loop, and clear it out after the
        !           470: loop has exited.
        !           471:
        !           472: You don't need to be concerned about allocating additional space for MP
        !           473: variables.  All functions in MP automatically allocate additional space when a
        !           474: variable does not already have enough space.  They do not, however, reduce the
        !           475: space when a smaller number is stored in the object.  Most of the time, this
        !           476: policy is best, since it avoids frequent re-allocation.
        !           477:
        !           478:
        !           479: @section Useful Macros and Constants
        !           480:
        !           481: @deftypevr {Global Constant} {const int} mp_bits_per_limb
        !           482: The number of bits per limb.
        !           483: @end deftypevr
        !           484:
        !           485: @defmac __GNU_MP_VERSION
        !           486: @defmacx __GNU_MP_VERSION_MINOR
        !           487: The major and minor MP version, respectively, as integers.
        !           488: @end defmac
        !           489:
        !           490: @section Compatibility with Version 1.x
        !           491:
        !           492: This version of MP is upward compatible with previous versions of MP, with a
        !           493: few exceptions.
        !           494:
        !           495: @enumerate
        !           496: @item Integer division functions round the result differently.  The old
        !           497: functions (@code{mpz_div}, @code{mpz_divmod}, @code{mpz_mdiv},
        !           498: @code{mpz_mdivmod}, etc) now all use floor rounding (i.e., they round the
        !           499: quotient to @minus{}infinity).  There are a lot of new functions for integer
        !           500: division, giving the user better control over the rounding.
        !           501:
        !           502: @item The function @code{mpz_mod} now compute the true @strong{mod} function.
        !           503:
        !           504: @item The functions @code{mpz_powm} and @code{mpz_powm_ui} now use
        !           505: @strong{mod} for reduction.
        !           506:
        !           507: @item The assignment functions for rational numbers do no longer canonicalize
        !           508: their results.  In the case a non-canonical result could arise from an
        !           509: assignment, the user need to insert an explicit call to
        !           510: @code{mpq_canonicalize}.  This change was made for efficiency.
        !           511:
        !           512: @item Output generated by @code{mpz_out_raw} in this release cannot be read
        !           513: by @code{mpz_inp_raw} in previous releases.  This change was made for making
        !           514: the file format truly portable between machines with different word sizes.
        !           515:
        !           516: @item Several @code{mpn} functions have changed.  But they were intentionally
        !           517: undocumented in previous releases.
        !           518:
        !           519: @item The functions @code{mpz_cmp_ui}, @code{mpz_cmp_si}, and @code{mpq_cmp_ui}
        !           520: are now implementated as macros, and thereby sometimes evaluate their
        !           521: arguments multiple times.
        !           522:
        !           523: @item The functions @code{mpz_pow_ui} and @code{mpz_ui_pow_ui} now yield 1
        !           524: for 0^0.  (In version 1, they yielded 0.)
        !           525:
        !           526: @end enumerate
        !           527:
        !           528:
        !           529: @section Getting the Latest Version of MP
        !           530:
        !           531: The latest version of the MP library is available by anonymous ftp from
        !           532: from @samp{prep.ai.mit.edu}.  The file name is
        !           533: @file{/pub/gnu/gmp-M.N.tar.gz}.  Many sites around the world mirror
        !           534: @samp{prep}; please use a mirror site near you.
        !           535:
        !           536: @node Reporting Bugs, Integer Functions, MP Basics, Top
        !           537: @comment  node-name,  next,  previous,  up
        !           538: @chapter Reporting Bugs
        !           539: @cindex Reporting bugs
        !           540:
        !           541: If you think you have found a bug in the MP library, please investigate it and
        !           542: report it.  We have made this library available to you, and it is not to ask
        !           543: too much from you, to ask you to report the bugs that you find.
        !           544:
        !           545: There are a few things you should think about when you put your bug report
        !           546: together.
        !           547:
        !           548: You have to send us a test case that makes it possible for us to reproduce the
        !           549: bug.  Include instructions on how to run the test case.
        !           550:
        !           551: You also have to explain what is wrong; if you get a crash, or if the results
        !           552: printed are incorrect and in that case, in what way.
        !           553:
        !           554: It is not uncommon that an observed problem is actually due to a bug in the
        !           555: compiler used when building MP; the MP code tends to explore interesting
        !           556: corners in compilers.  Therefore, please include compiler version information
        !           557: in your bug report.  This can be extracted using @samp{what `which cc`}, or,
        !           558: if you're using gcc, @samp{gcc -v}.  Also, include the output from @samp{uname
        !           559: -a}.
        !           560:
        !           561: If your bug report is good, we will do our best to help you to get a corrected
        !           562: version of the library; if the bug report is poor, we won't do anything about
        !           563: it (aside of chiding you to send better bug reports).
        !           564:
        !           565: Send your bug report to: @samp{bug-gmp@@prep.ai.mit.edu}.
        !           566:
        !           567: If you think something in this manual is unclear, or downright incorrect, or if
        !           568: the language needs to be improved, please send a note to the same address.
        !           569:
        !           570:
        !           571: @node Integer Functions, Rational Number Functions, Reporting Bugs, Top
        !           572: @comment  node-name,  next,  previous,  up
        !           573: @chapter Integer Functions
        !           574: @cindex Integer functions
        !           575:
        !           576: This chapter describes the MP functions for performing integer arithmetic.
        !           577: These functions start with the prefix @code{mpz_}.
        !           578:
        !           579: Arbitrary precision integers are stored in objects of type @code{mpz_t}.
        !           580:
        !           581: @menu
        !           582: * Initializing Integers::
        !           583: * Assigning Integers::
        !           584: * Simultaneous Integer Init & Assign::
        !           585: * Converting Integers::
        !           586: * Integer Arithmetic::
        !           587: * Comparison Functions::
        !           588: * Integer Logic and Bit Fiddling::
        !           589: * I/O of Integers::
        !           590: * Miscellaneous Integer Functions::
        !           591: @end menu
        !           592:
        !           593: @node Initializing Integers, Assigning Integers, , Integer Functions
        !           594: @comment  node-name,  next,  previous,  up
        !           595: @section Initialization and Assignment Functions
        !           596:
        !           597: The functions for integer arithmetic assume that all integer objects are
        !           598: initialized.  You do that by calling the function @code{mpz_init}.
        !           599:
        !           600: @deftypefun void mpz_init (mpz_t @var{integer})
        !           601: Initialize @var{integer} with limb space and set the initial numeric value to
        !           602: 0.  Each variable should normally only be initialized once, or at least cleared
        !           603: out (using @code{mpz_clear}) between each initialization.
        !           604: @end deftypefun
        !           605:
        !           606: Here is an example of using @code{mpz_init}:
        !           607:
        !           608: @example
        !           609: @{
        !           610:   mpz_t integ;
        !           611:   mpz_init (integ);
        !           612:   @dots{}
        !           613:   mpz_add (integ, @dots{});
        !           614:   @dots{}
        !           615:   mpz_sub (integ, @dots{});
        !           616:
        !           617:   /* Unless the program is about to exit, do ... */
        !           618:   mpz_clear (integ);
        !           619: @}
        !           620: @end example
        !           621:
        !           622: @noindent
        !           623: As you can see, you can store new values any number of times, once an
        !           624: object is initialized.
        !           625:
        !           626: @deftypefun void mpz_clear (mpz_t @var{integer})
        !           627: Free the limb space occupied by @var{integer}.  Make sure to call this
        !           628: function for all @code{mpz_t} variables when you are done with them.
        !           629: @end deftypefun
        !           630:
        !           631: @deftypefun {void *} _mpz_realloc (mpz_t @var{integer}, mp_size_t @var{new_alloc})
        !           632: Change the limb space allocation to @var{new_alloc} limbs.  This function is
        !           633: not normally called from user code, but it can be used to give memory back to
        !           634: the heap, or to increase the space of a variable to avoid repeated automatic
        !           635: re-allocation.
        !           636: @end deftypefun
        !           637:
        !           638: @deftypefun void mpz_array_init (mpz_t @var{integer_array}[], size_t @var{array_size}, mp_size_t @var{fixed_num_bits})
        !           639: Allocate @strong{fixed} limb space for all @var{array_size} integers in
        !           640: @var{integer_array}.  The fixed allocation for each integer in the array is
        !           641: enough to store @var{fixed_num_bits}.  If the fixed space will be insufficient
        !           642: for storing the result of a subsequent calculation, the result is
        !           643: unpredictable.
        !           644:
        !           645: This function is useful for decreasing the working set for some algorithms
        !           646: that use large integer arrays.
        !           647:
        !           648: There is no way to de-allocate the storage allocated by this function.
        !           649: Don't call @code{mpz_clear}!
        !           650: @end deftypefun
        !           651:
        !           652:
        !           653: @node Assigning Integers, Simultaneous Integer Init & Assign, Initializing Integers, Integer Functions
        !           654: @comment  node-name,  next,  previous,  up
        !           655: @subsection Assignment Functions
        !           656: @cindex Integer assignment functions
        !           657:
        !           658: These functions assign new values to already initialized integers
        !           659: (@pxref{Initializing Integers}).
        !           660:
        !           661: @deftypefun void mpz_set (mpz_t @var{rop}, mpz_t @var{op})
        !           662: @deftypefunx void mpz_set_ui (mpz_t @var{rop}, unsigned long int @var{op})
        !           663: @deftypefunx void mpz_set_si (mpz_t @var{rop}, signed long int @var{op})
        !           664: @deftypefunx void mpz_set_d (mpz_t @var{rop}, double @var{op})
        !           665: @deftypefunx void mpz_set_q (mpz_t @var{rop}, mpq_t @var{op})
        !           666: @deftypefunx void mpz_set_f (mpz_t @var{rop}, mpf_t @var{op})
        !           667: Set the value of @var{rop} from @var{op}.
        !           668: @end deftypefun
        !           669:
        !           670: @deftypefun int mpz_set_str (mpz_t @var{rop}, char *@var{str}, int @var{base})
        !           671: Set the value of @var{rop} from @var{str}, a '\0'-terminated C string in base
        !           672: @var{base}.  White space is allowed in the string, and is simply ignored.  The
        !           673: base may vary from 2 to 36.  If @var{base} is 0, the actual base is determined
        !           674: from the leading characters: if the first two characters are `0x' or `0X',
        !           675: hexadecimal is assumed, otherwise if the first character is `0', octal is
        !           676: assumed, otherwise decimal is assumed.
        !           677:
        !           678: This function returns 0 if the entire string up to the '\0' is a valid
        !           679: number in base @var{base}.  Otherwise it returns @minus{}1.
        !           680: @end deftypefun
        !           681:
        !           682:
        !           683: @node Simultaneous Integer Init & Assign, Converting Integers, Assigning Integers, Integer Functions
        !           684: @comment  node-name,  next,  previous,  up
        !           685: @subsection Combined Initialization and Assignment Functions
        !           686: @cindex Initialization and assignment functions
        !           687:
        !           688: For convenience, MP provides a parallel series of initialize-and-set functions
        !           689: which initialize the output and then store the value there.  These functions'
        !           690: names have the form @code{mpz_init_set@dots{}}
        !           691:
        !           692: Here is an example of using one:
        !           693:
        !           694: @example
        !           695: @{
        !           696:   mpz_t pie;
        !           697:   mpz_init_set_str (pie, "3141592653589793238462643383279502884", 10);
        !           698:   @dots{}
        !           699:   mpz_sub (pie, @dots{});
        !           700:   @dots{}
        !           701:   mpz_clear (pie);
        !           702: @}
        !           703: @end example
        !           704:
        !           705: @noindent
        !           706: Once the integer has been initialized by any of the @code{mpz_init_set@dots{}}
        !           707: functions, it can be used as the source or destination operand for the ordinary
        !           708: integer functions.  Don't use an initialize-and-set function on a variable
        !           709: already initialized!
        !           710:
        !           711: @deftypefun void mpz_init_set (mpz_t @var{rop}, mpz_t @var{op})
        !           712: @deftypefunx void mpz_init_set_ui (mpz_t @var{rop}, unsigned long int @var{op})
        !           713: @deftypefunx void mpz_init_set_si (mpz_t @var{rop}, signed long int @var{op})
        !           714: @deftypefunx void mpz_init_set_d (mpz_t @var{rop}, double @var{op})
        !           715: Initialize @var{rop} with limb space and set the initial numeric value from
        !           716: @var{op}.
        !           717: @end deftypefun
        !           718:
        !           719: @deftypefun int mpz_init_set_str (mpz_t @var{rop}, char *@var{str}, int @var{base})
        !           720: Initialize @var{rop} and set its value like @code{mpz_set_str} (see its
        !           721: documentation above for details).
        !           722:
        !           723: If the string is a correct base @var{base} number, the function returns 0;
        !           724: if an error occurs it returns @minus{}1.  @var{rop} is initialized even if
        !           725: an error occurs.  (I.e., you have to call @code{mpz_clear} for it.)
        !           726: @end deftypefun
        !           727:
        !           728:
        !           729: @node Converting Integers,  Integer Arithmetic, Simultaneous Integer Init & Assign, Integer Functions
        !           730: @comment  node-name,  next,  previous,  up
        !           731: @section Conversion Functions
        !           732: @cindex Integer conversion functions
        !           733: @cindex Conversion functions
        !           734:
        !           735: This section describes functions for converting arbitrary precision integers
        !           736: to standard C types.  Functions for converting @emph{to} arbitrary
        !           737: precision integers are described in @ref{Assigning Integers} and @ref{I/O of
        !           738: Integers}.
        !           739:
        !           740: @deftypefun {unsigned long int} mpz_get_ui (mpz_t @var{op})
        !           741: Return the least significant part from @var{op}.  This function combined
        !           742: with @* @code{mpz_tdiv_q_2exp(@dots{}, @var{op}, CHAR_BIT*sizeof(unsigned
        !           743: long int))} can be used to extract the limbs of an integer.
        !           744: @end deftypefun
        !           745:
        !           746: @deftypefun {signed long int} mpz_get_si (mpz_t @var{op})
        !           747: If @var{op} fits into a @code{signed long int} return the value of @var{op}.
        !           748: Otherwise return the least significant part of @var{op}, with the same sign
        !           749: as @var{op}.
        !           750:
        !           751: If @var{op} is too large to fit in a @code{signed long int}, the returned
        !           752: result is probably not very useful.  @c To find out if the value will fit, use
        !           753: @c the function @code{mpz_fits_si}.
        !           754: @end deftypefun
        !           755:
        !           756: @deftypefun double mpz_get_d (mpz_t @var{op})
        !           757: Convert @var{op} to a double.
        !           758: @end deftypefun
        !           759:
        !           760: @deftypefun {char *} mpz_get_str (char *@var{str}, int @var{base}, mpz_t @var{op})
        !           761: Convert @var{op} to a string of digits in base @var{base}.  The base may vary
        !           762: from 2 to 36.
        !           763:
        !           764: If @var{str} is NULL, space for the result string is allocated using the
        !           765: default allocation function, and a pointer to the string is returned.
        !           766:
        !           767: If @var{str} is not NULL, it should point to a block of storage enough large
        !           768: for the result.  To find out the right amount of space to provide for
        !           769: @var{str}, use @code{mpz_sizeinbase (@var{op}, @var{base}) + 2}.  The two
        !           770: extra bytes are for a possible minus sign, and for the terminating null
        !           771: character.
        !           772: @end deftypefun
        !           773:
        !           774:
        !           775: @node Integer Arithmetic, Comparison Functions, Converting Integers, Integer Functions
        !           776: @comment  node-name,  next,  previous,  up
        !           777: @section Arithmetic Functions
        !           778: @cindex Integer arithmetic functions
        !           779: @cindex Arithmetic functions
        !           780:
        !           781: @deftypefun void mpz_add (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           782: @deftypefunx void mpz_add_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           783: @ifinfo
        !           784: Set @var{rop} to @var{op1} + @var{op2}.
        !           785: @end ifinfo
        !           786: @iftex
        !           787: @tex
        !           788: Set @var{rop} to $@var{op1} + @var{op2}$.
        !           789: @end tex
        !           790: @end iftex
        !           791: @end deftypefun
        !           792:
        !           793: @deftypefun void mpz_sub (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           794: @deftypefunx void mpz_sub_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           795: Set @var{rop} to @var{op1} @minus{} @var{op2}.
        !           796: @end deftypefun
        !           797:
        !           798: @deftypefun void mpz_mul (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           799: @deftypefunx void mpz_mul_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           800: @ifinfo
        !           801: Set @var{rop} to @var{op1} times @var{op2}.
        !           802: @end ifinfo
        !           803: @iftex
        !           804: @tex
        !           805: Set @var{rop} to $@var{op1} \times @var{op2}$.
        !           806: @end tex
        !           807: @end iftex
        !           808: @end deftypefun
        !           809:
        !           810: @deftypefun void mpz_mul_2exp (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           811: @ifinfo
        !           812: Set @var{rop} to @var{op1} times 2 raised to @var{op2}.  This operation can
        !           813: also be defined as a left shift, @var{op2} steps.
        !           814: @end ifinfo
        !           815: @iftex
        !           816: @tex
        !           817: Set @var{rop} to $@var{op1} \times 2^{op2}$.  This operation can also be
        !           818: defined as a left shift, @var{op2} steps.
        !           819: @end tex
        !           820: @end iftex
        !           821: @end deftypefun
        !           822:
        !           823: @deftypefun void mpz_neg (mpz_t @var{rop}, mpz_t @var{op})
        !           824: Set @var{rop} to @minus{}@var{op}.
        !           825: @end deftypefun
        !           826:
        !           827: @deftypefun void mpz_abs (mpz_t @var{rop}, mpz_t @var{op})
        !           828: Set @var{rop} to the absolute value of @var{op}.
        !           829: @end deftypefun
        !           830:
        !           831: @deftypefun void mpz_fac_ui (mpz_t @var{rop}, unsigned long int @var{op})
        !           832: Set @var{rop} to @var{op}!, the factorial of @var{op}.
        !           833: @end deftypefun
        !           834:
        !           835: @subsection Division functions
        !           836:
        !           837: Division is undefined if the divisor is zero, and passing a zero divisor to
        !           838: the divide or modulo functions, as well passing a zero mod argument to the
        !           839: @code{mpz_powm} and @code{mpz_powm_ui} functions, will make these functions
        !           840: intentionally divide by zero.  This gives the user the possibility to handle
        !           841: arithmetic exceptions in these functions in the same manner as other
        !           842: arithmetic exceptions.
        !           843:
        !           844: There are three main groups of division functions:
        !           845: @itemize @bullet
        !           846: @item
        !           847: Functions that truncate the quotient towards 0.  The names of these
        !           848: functions start with @code{mpz_tdiv}.  The @samp{t} in the name is short for
        !           849: @samp{truncate}.
        !           850: @item
        !           851: Functions that round the quotient towards @minus{}infinity.  The names of
        !           852: these routines start with @code{mpz_fdiv}.  The @samp{f} in the name is
        !           853: short for @samp{floor}.
        !           854: @item
        !           855: Functions that round the quotient towards +infinity.  The names of
        !           856: these routines start with @code{mpz_cdiv}.  The @samp{c} in the name is
        !           857: short for @samp{ceil}.
        !           858: @end itemize
        !           859:
        !           860: For each rounding mode, there are a couple of variants.  Here @samp{q} means
        !           861: that the quotient is computed, while @samp{r} means that the remainder is
        !           862: computed.  Functions that compute both the quotient and remainder have
        !           863: @samp{qr} in the name.
        !           864:
        !           865: @deftypefun void mpz_tdiv_q (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           866: @deftypefunx void mpz_tdiv_q_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           867: Set @var{rop} to [@var{op1}/@var{op2}].  The quotient is truncated towards
        !           868: 0.
        !           869: @end deftypefun
        !           870:
        !           871: @deftypefun void mpz_tdiv_r (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           872: @deftypefunx void mpz_tdiv_r_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           873: Set @var{rop} to (@var{op1} - [@var{op1}/@var{op2}] * @var{op2}).
        !           874: Unless the remainder is zero, it has the same sign as the dividend.
        !           875: @end deftypefun
        !           876:
        !           877: @deftypefun void mpz_tdiv_qr (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op1}, mpz_t @var{op2})
        !           878: @deftypefunx void mpz_tdiv_qr_ui (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           879: Divide @var{op1} by @var{op2} and put the quotient in @var{rop1} and the
        !           880: remainder in @var{rop2}.  The quotient is rounded towards 0.  Unless the
        !           881: remainder is zero, it has the same sign as the dividend.
        !           882:
        !           883: If @var{rop1} and @var{rop2} are the same variable, the results are
        !           884: undefined.
        !           885: @end deftypefun
        !           886:
        !           887: @deftypefun void mpz_fdiv_q (mpz_t @var{rop1}, mpz_t @var{op1}, mpz_t @var{op2})
        !           888: @deftypefunx void mpz_fdiv_q_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           889: @ifinfo
        !           890: Set @var{rop} to @var{op1}/@var{op2}.  The quotient is rounded towards
        !           891: @minus{}infinity.
        !           892: @end ifinfo
        !           893: @iftex
        !           894: @tex
        !           895: Set @var{rop} to $\lfloor@var{op1}/@var{op2}\rfloor$.  (I.e., round
        !           896: the quotient towards $-\infty$.)
        !           897: @end tex
        !           898: @end iftex
        !           899: @end deftypefun
        !           900:
        !           901: @deftypefun void mpz_fdiv_r (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           902: @deftypefunx {unsigned long int} mpz_fdiv_r_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           903: Divide @var{op1} by @var{op2} and put the remainder in @var{rop}.  Unless
        !           904: the remainder is zero, it has the same sign as the divisor.
        !           905:
        !           906: For @code{mpz_fdiv_r_ui} the remainder is small enough to fit in an
        !           907: @code{unsigned long int}, and is therefore returned.
        !           908: @end deftypefun
        !           909:
        !           910: @deftypefun void mpz_fdiv_qr (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op1}, mpz_t @var{op2})
        !           911: @deftypefunx {unsigned long int} mpz_fdiv_qr_ui (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           912: Divide @var{op1} by @var{op2} and put the quotient in @var{rop1} and the
        !           913: remainder in @var{rop2}.  The quotient is rounded towards @minus{}infinity.
        !           914: Unless the remainder is zero, it has the same sign as the divisor.
        !           915:
        !           916: For @code{mpz_fdiv_qr_ui} the remainder is small enough to fit in an
        !           917: @code{unsigned long int}, and is therefore returned.
        !           918:
        !           919: If @var{rop1} and @var{rop2} are the same variable, the results are
        !           920: undefined.
        !           921: @end deftypefun
        !           922:
        !           923: @deftypefun {unsigned long int} mpz_fdiv_ui (mpz_t @var{op1}, unsigned long int @var{op2})
        !           924: This function is similar to @code{mpz_fdiv_r_ui}, but the remainder is only
        !           925: returned; it is not stored anywhere.
        !           926: @end deftypefun
        !           927:
        !           928: @deftypefun void mpz_cdiv_q (mpz_t @var{rop1}, mpz_t @var{op1}, mpz_t @var{op2})
        !           929: @deftypefunx void mpz_cdiv_q_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           930: @ifinfo
        !           931: Set @var{rop} to @var{op1}/@var{op2}.  The quotient is rounded towards
        !           932: +infinity.
        !           933: @end ifinfo
        !           934: @iftex
        !           935: @tex
        !           936: Set @var{rop} to $\lceil@var{op1}/@var{op2}\rceil$.  (I.e., round the
        !           937: quotient towards $+\infty$.)
        !           938: @end tex
        !           939: @end iftex
        !           940: @end deftypefun
        !           941:
        !           942: @deftypefun void mpz_cdiv_r (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           943: @deftypefunx {unsigned long int} mpz_cdiv_r_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           944: Divide @var{op1} by @var{op2} and put the remainder in @var{rop}.  Unless
        !           945: the remainder is zero, it has the opposite sign as the divisor.
        !           946:
        !           947: For @code{mpz_cdiv_r_ui} the negated remainder is small enough to fit in an
        !           948: @code{unsigned long int}, and it is therefore returned.
        !           949: @end deftypefun
        !           950:
        !           951: @deftypefun void mpz_cdiv_qr (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op1}, mpz_t @var{op2})
        !           952: @deftypefunx {unsigned long int} mpz_cdiv_qr_ui (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           953: Divide @var{op1} by @var{op2} and put the quotient in @var{rop1} and the
        !           954: remainder in @var{rop2}.  The quotient is rounded towards +infinity.  Unless
        !           955: the remainder is zero, it has the opposite sign as the divisor.
        !           956:
        !           957: For @code{mpz_cdiv_qr_ui} the negated remainder is small enough to fit in an
        !           958: @code{unsigned long int}, and it is therefore returned.
        !           959:
        !           960: If @var{rop1} and @var{rop2} are the same variable, the results are
        !           961: undefined.
        !           962: @end deftypefun
        !           963:
        !           964: @deftypefun {unsigned long int} mpz_cdiv_ui (mpz_t @var{op1}, unsigned long int @var{op2})
        !           965: Return the negated remainder, similar to @code{mpz_cdiv_r_ui}.  (The
        !           966: difference is that this function doesn't store the remainder anywhere.)
        !           967: @end deftypefun
        !           968:
        !           969: @deftypefun void mpz_mod (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           970: @deftypefunx {unsigned long int} mpz_mod_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           971: Set @var{rop} to @var{op1} @code{mod} @var{op2}.  The sign of the divisor is
        !           972: ignored, and the result is always non-negative.
        !           973:
        !           974: For @code{mpz_mod_ui} the remainder is small enough to fit in an
        !           975: @code{unsigned long int}, and is therefore returned.
        !           976: @end deftypefun
        !           977:
        !           978: @deftypefun void mpz_divexact (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !           979: Set @var{rop} to @var{op1}/@var{op2}.  This function produces correct
        !           980: results only when it is known in advance that @var{op2} divides
        !           981: @var{op1}.
        !           982:
        !           983: Since mpz_divexact is much faster than any of the other routines that produce
        !           984: the quotient (@pxref{References} Jebelean), it is the best choice for
        !           985: instances in which exact division is known to occur, such as reducing a
        !           986: rational to lowest terms.
        !           987: @end deftypefun
        !           988:
        !           989: @deftypefun void mpz_tdiv_q_2exp (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !           990: @ifinfo
        !           991: Set @var{rop} to @var{op1} divided by 2 raised to @var{op2}.  The quotient is
        !           992: rounded towards 0.
        !           993: @end ifinfo
        !           994: @iftex
        !           995: @tex
        !           996: Set @var{rop} to $@var{op1}/2^{op2}$.  The quotient is rounded towards 0.
        !           997: @end tex
        !           998: @end iftex
        !           999: @end deftypefun
        !          1000:
        !          1001: @deftypefun void mpz_tdiv_r_2exp (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !          1002: @ifinfo
        !          1003: Divide @var{op1} by (2 raised to @var{op2}) and put the remainder in
        !          1004: @var{rop}.  Unless it is zero, @var{rop} will have the same sign as @var{op1}.
        !          1005: @end ifinfo
        !          1006: @iftex
        !          1007: @tex
        !          1008: Divide @var{op1} by $2^{op2}$ and put the remainder in @var{rop}.  Unless it is
        !          1009: zero, @var{rop} will have the same sign as @var{op1}.
        !          1010: @end tex
        !          1011: @end iftex
        !          1012: @end deftypefun
        !          1013:
        !          1014: @deftypefun void mpz_fdiv_q_2exp (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !          1015: @ifinfo
        !          1016: Set @var{rop} to @var{op1} divided by 2 raised to @var{op2}.  The quotient is
        !          1017: rounded towards @minus{}infinity.
        !          1018: @end ifinfo
        !          1019: @iftex
        !          1020: @tex
        !          1021: Set @var{rop} to $\lfloor@var{op1}/2^{op2}\rfloor$.  The quotient is rounded
        !          1022: towards $-\infty$.
        !          1023: @end tex
        !          1024: @end iftex
        !          1025: @end deftypefun
        !          1026:
        !          1027: @deftypefun void mpz_fdiv_r_2exp (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !          1028: @ifinfo
        !          1029: Divide @var{op1} by (2 raised to @var{op2}) and put the remainder in
        !          1030: @var{rop}.  The sign of @var{rop} will always be positive.
        !          1031: @end ifinfo
        !          1032: @iftex
        !          1033: @tex
        !          1034: Divide @var{op1} by $2^{op2}$ and put the remainder in @var{rop}.  The sign of
        !          1035: @var{rop} will always be positive.
        !          1036: @end tex
        !          1037: @end iftex
        !          1038:
        !          1039: This operation can also be defined as masking of the @var{op2} least
        !          1040: significant bits.
        !          1041: @end deftypefun
        !          1042:
        !          1043: @subsection Exponentialization Functions
        !          1044:
        !          1045: @deftypefun void mpz_powm (mpz_t @var{rop}, mpz_t @var{base}, mpz_t @var{exp}, mpz_t @var{mod})
        !          1046: @deftypefunx void mpz_powm_ui (mpz_t @var{rop}, mpz_t @var{base}, unsigned long int @var{exp}, mpz_t @var{mod})
        !          1047: Set @var{rop} to (@var{base} raised to @var{exp}) @code{mod} @var{mod}.  If
        !          1048: @var{exp} is negative, the result is undefined.
        !          1049: @end deftypefun
        !          1050:
        !          1051: @deftypefun void mpz_pow_ui (mpz_t @var{rop}, mpz_t @var{base}, unsigned long int @var{exp})
        !          1052: @deftypefunx void mpz_ui_pow_ui (mpz_t @var{rop}, unsigned long int @var{base}, unsigned long int @var{exp})
        !          1053: Set @var{rop} to @var{base} raised to @var{exp}.
        !          1054: @ifinfo
        !          1055: The case of 0^0 yields 1.
        !          1056: @end ifinfo
        !          1057: @iftex
        !          1058: @tex
        !          1059: The case of $0^0$ yields 1.
        !          1060: @end tex
        !          1061: @end iftex
        !          1062: @end deftypefun
        !          1063:
        !          1064: @subsection Square Root Functions
        !          1065:
        !          1066: @deftypefun void mpz_sqrt (mpz_t @var{rop}, mpz_t @var{op})
        !          1067: @ifinfo
        !          1068: Set @var{rop} to the truncated integer part of the square root of
        !          1069: @var{op}.
        !          1070: @end ifinfo
        !          1071: @iftex
        !          1072: @tex
        !          1073: Set @var{rop} to $\lfloor\sqrt{@var{op}}\rfloor$, the truncated integer
        !          1074: part of the square root of @var{op}.
        !          1075: @end tex
        !          1076: @end iftex
        !          1077: @end deftypefun
        !          1078:
        !          1079: @deftypefun void mpz_sqrtrem (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op})
        !          1080: @ifinfo
        !          1081: Set @var{rop1} to the truncated integer part of the square root of @var{op},
        !          1082: like @code{mpz_sqrt}.  Set @var{rop2} to
        !          1083: @var{op}@minus{}@var{rop1}*@var{rop1},
        !          1084: @end ifinfo
        !          1085: @iftex
        !          1086: @tex
        !          1087: Set @var{rop1} to $\lfloor\sqrt{@var{op}}\rfloor$, like @code{mpz_sqrt}.
        !          1088: Set @var{rop2} to $(@var{op} - @var{rop1}^2)$,
        !          1089: @end tex
        !          1090: @end iftex
        !          1091: (i.e., zero if @var{op} is a perfect square).
        !          1092:
        !          1093: If @var{rop1} and @var{rop2} are the same variable, the results are
        !          1094: undefined.
        !          1095: @end deftypefun
        !          1096:
        !          1097: @deftypefun int mpz_perfect_square_p (mpz_t @var{op})
        !          1098: Return non-zero if @var{op} is a perfect square, i.e., if the square root of
        !          1099: @var{op} is an integer.  Return zero otherwise.
        !          1100: @end deftypefun
        !          1101:
        !          1102: @subsection Number Theoretic Functions
        !          1103:
        !          1104: @deftypefun int mpz_probab_prime_p (mpz_t @var{op}, int @var{reps})
        !          1105: @ifinfo
        !          1106: If this function returns 0, @var{op} is definitely not prime.  If it returns
        !          1107: 1, then @var{op} is `probably' prime.  The probability of a false positive is
        !          1108: (1/4)**@var{reps}.
        !          1109: @end ifinfo
        !          1110: @iftex
        !          1111: @tex
        !          1112: If this function returns 0, @var{op} is definitely not prime.  If it returns
        !          1113: 1, then @var{op} is `probably' prime.  The probability of a false positive is
        !          1114: $(1/4)^{{reps}}$.
        !          1115: @end tex
        !          1116: @end iftex
        !          1117: A reasonable value of reps is 25.
        !          1118:
        !          1119: An implementation of the probabilistic primality test found in Seminumerical
        !          1120: Algorithms (@pxref{References} Knuth).
        !          1121: @end deftypefun
        !          1122:
        !          1123: @deftypefun void mpz_gcd (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !          1124: Set @var{rop} to the greatest common divisor of @var{op1} and @var{op2}.
        !          1125: @end deftypefun
        !          1126:
        !          1127: @deftypefun {unsigned long int} mpz_gcd_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2})
        !          1128: Compute the greatest common divisor of @var{op1} and @var{op2}.  If
        !          1129: @var{rop} is not NULL, store the result there.
        !          1130:
        !          1131: If the result is small enough to fit in an @code{unsigned long int}, it is
        !          1132: returned.  If the result does not fit, 0 is returned, and the result is equal
        !          1133: to the argument @var{op1}.  Note that the result will always fit if @var{op2}
        !          1134: is non-zero.
        !          1135: @end deftypefun
        !          1136:
        !          1137: @deftypefun void mpz_gcdext (mpz_t @var{g}, mpz_t @var{s}, mpz_t @var{t}, mpz_t @var{a}, mpz_t @var{b})
        !          1138: Compute @var{g}, @var{s}, and @var{t}, such that @var{a}@var{s} +
        !          1139: @var{b}@var{t} = @var{g} = @code{gcd} (@var{a}, @var{b}).  If @var{t} is
        !          1140: NULL, that argument is not computed.
        !          1141: @end deftypefun
        !          1142:
        !          1143: @deftypefun int mpz_invert (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !          1144: Compute the inverse of @var{op1} modulo @var{op2} and put the result in
        !          1145: @var{rop}.  Return non-zero if an inverse exist, zero otherwise.  When the
        !          1146: function returns zero, do not assume anything about the value in @var{rop}.
        !          1147: @end deftypefun
        !          1148:
        !          1149: @deftypefun int mpz_jacobi (mpz_t @var{op1}, mpz_t @var{op2})
        !          1150: @deftypefunx int mpz_legendre (mpz_t @var{op1}, mpz_t @var{op2})
        !          1151: Compute the Jacobi and Legendre symbols, respectively.
        !          1152: @end deftypefun
        !          1153:
        !          1154: @need 2000
        !          1155: @node Comparison Functions, Integer Logic and Bit Fiddling, Integer Arithmetic, Integer Functions
        !          1156: @comment  node-name,  next,  previous,  up
        !          1157: @section Comparison Functions
        !          1158:
        !          1159: @deftypefun int mpz_cmp (mpz_t @var{op1}, mpz_t @var{op2})
        !          1160: @ifinfo
        !          1161: Compare @var{op1} and @var{op2}.  Return a positive value if @var{op1} >
        !          1162: @var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} <
        !          1163: @var{op2}.
        !          1164: @end ifinfo
        !          1165: @iftex
        !          1166: @tex
        !          1167: Compare @var{op1} and @var{op2}.  Return a positive value if $@var{op1} >
        !          1168: @var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1}
        !          1169: < @var{op2}$.
        !          1170: @end tex
        !          1171: @end iftex
        !          1172: @end deftypefun
        !          1173:
        !          1174: @deftypefn Macro int mpz_cmp_ui (mpz_t @var{op1}, unsigned long int @var{op2})
        !          1175: @deftypefnx Macro int mpz_cmp_si (mpz_t @var{op1}, signed long int @var{op2})
        !          1176: @ifinfo
        !          1177: Compare @var{op1} and @var{op2}.  Return a positive value if @var{op1} >
        !          1178: @var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} <
        !          1179: @var{op2}.
        !          1180: @end ifinfo
        !          1181: @iftex
        !          1182: @tex
        !          1183: Compare @var{op1} and @var{op2}.  Return a positive value if $@var{op1} >
        !          1184: @var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1}
        !          1185: < @var{op2}$.
        !          1186: @end tex
        !          1187: @end iftex
        !          1188:
        !          1189: These functions are actually implemented as macros.  They evaluate their
        !          1190: arguments multiple times.
        !          1191: @end deftypefn
        !          1192:
        !          1193: @deftypefn Macro int mpz_sgn (mpz_t @var{op})
        !          1194: @ifinfo
        !          1195: Return +1 if @var{op} > 0, 0 if @var{op} = 0, and @minus{}1 if @var{op} < 0.
        !          1196: @end ifinfo
        !          1197: @iftex
        !          1198: @tex
        !          1199: Return $+1$ if $@var{op} > 0$, 0 if $@var{op} = 0$, and $-1$ if $@var{op} < 0$.
        !          1200: @end tex
        !          1201: @end iftex
        !          1202:
        !          1203: This function is actually implemented as a macro.  It evaluates its
        !          1204: arguments multiple times.
        !          1205: @end deftypefn
        !          1206:
        !          1207: @node Integer Logic and Bit Fiddling, I/O of Integers, Comparison Functions, Integer Functions
        !          1208: @comment  node-name,  next,  previous,  up
        !          1209: @section Logical and Bit Manipulation Functions
        !          1210: @cindex Logical functions
        !          1211: @cindex Bit manipulation functions
        !          1212:
        !          1213: These functions behave as if two's complement arithmetic were used (although
        !          1214: sign-magnitude is used by the actual implementation).
        !          1215:
        !          1216: @deftypefun void mpz_and (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !          1217: Set @var{rop} to @var{op1} logical-and @var{op2}.
        !          1218: @end deftypefun
        !          1219:
        !          1220: @deftypefun void mpz_ior (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !          1221: Set @var{rop} to @var{op1} inclusive-or @var{op2}.
        !          1222: @end deftypefun
        !          1223:
        !          1224: @c @deftypefun void mpz_xor (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2})
        !          1225: @c Set @var{rop} to @var{op1} exclusive-or @var{op2}.
        !          1226: @c @end deftypefun
        !          1227:
        !          1228: @deftypefun void mpz_com (mpz_t @var{rop}, mpz_t @var{op})
        !          1229: Set @var{rop} to the one's complement of @var{op}.
        !          1230: @end deftypefun
        !          1231:
        !          1232: @deftypefun {unsigned long int} mpz_popcount (mpz_t @var{op})
        !          1233: For non-negative numbers, return the population count of @var{op}.  For
        !          1234: negative numbers, return the largest possible value (@var{MAX_ULONG}).
        !          1235: @end deftypefun
        !          1236:
        !          1237: @deftypefun {unsigned long int} mpz_hamdist (mpz_t @var{op1}, mpz_t @var{op2})
        !          1238: If @var{op1} and @var{op2} are both non-negative, return the hamming distance
        !          1239: between the two operands.  Otherwise, return the largest possible value
        !          1240: (@var{MAX_ULONG}).
        !          1241:
        !          1242: It is possible to extend this function to return a useful value when the
        !          1243: operands are both negative, but the current implementation returns
        !          1244: @var{MAX_ULONG} in this case.  @strong{Do not depend on this behavior, since
        !          1245: it will change in future versions of the library.}
        !          1246: @end deftypefun
        !          1247:
        !          1248: @deftypefun {unsigned long int} mpz_scan0 (mpz_t @var{op}, unsigned long int @var{starting_bit})
        !          1249: Scan @var{op}, starting with bit @var{starting_bit}, towards more significant
        !          1250: bits, until the first clear bit is found.  Return the index of the found bit.
        !          1251: @end deftypefun
        !          1252:
        !          1253: @deftypefun {unsigned long int} mpz_scan1 (mpz_t @var{op}, unsigned long int @var{starting_bit})
        !          1254: Scan @var{op}, starting with bit @var{starting_bit}, towards more significant
        !          1255: bits, until the first set bit is found.  Return the index of the found bit.
        !          1256: @end deftypefun
        !          1257:
        !          1258: @deftypefun void mpz_setbit (mpz_t @var{rop}, unsigned long int @var{bit_index})
        !          1259: Set bit @var{bit_index} in @var{op1}.
        !          1260: @end deftypefun
        !          1261:
        !          1262: @deftypefun void mpz_clrbit (mpz_t @var{rop}, unsigned long int @var{bit_index})
        !          1263: Clear bit @var{bit_index} in @var{op1}.
        !          1264: @end deftypefun
        !          1265:
        !          1266: @node I/O of Integers, Miscellaneous Integer Functions, Integer Logic and Bit Fiddling, Integer Functions
        !          1267: @comment  node-name,  next,  previous,  up
        !          1268: @section Input and Output Functions
        !          1269: @cindex Integer input and output functions
        !          1270: @cindex Input functions
        !          1271: @cindex Output functions
        !          1272: @cindex I/O functions
        !          1273:
        !          1274: Functions that perform input from a stdio stream, and functions that output to
        !          1275: a stdio stream.  Passing a NULL pointer for a @var{stream} argument to any of
        !          1276: these functions will make them read from @code{stdin} and write to
        !          1277: @code{stdout}, respectively.
        !          1278:
        !          1279: When using any of these functions, it is a good idea to include @file{stdio.h}
        !          1280: before @file{gmp.h}, since that will allow @file{gmp.h} to define prototypes
        !          1281: for these functions.
        !          1282:
        !          1283: @deftypefun size_t mpz_out_str (FILE *@var{stream}, int @var{base}, mpz_t @var{op})
        !          1284: Output @var{op} on stdio stream @var{stream}, as a string of digits in base
        !          1285: @var{base}.  The base may vary from 2 to 36.
        !          1286:
        !          1287: Return the number of bytes written, or if an error occurred, return 0.
        !          1288: @end deftypefun
        !          1289:
        !          1290: @deftypefun size_t mpz_inp_str (mpz_t @var{rop}, FILE *@var{stream}, int @var{base})
        !          1291: Input a possibly white-space preceded string in base @var{base} from stdio
        !          1292: stream @var{stream}, and put the read integer in @var{rop}.  The base may vary
        !          1293: from 2 to 36.  If @var{base} is 0, the actual base is determined from the
        !          1294: leading characters: if the first two characters are `0x' or `0X', hexadecimal
        !          1295: is assumed, otherwise if the first character is `0', octal is assumed,
        !          1296: otherwise decimal is assumed.
        !          1297:
        !          1298: Return the number of bytes read, or if an error occurred, return 0.
        !          1299: @end deftypefun
        !          1300:
        !          1301: @deftypefun size_t mpz_out_raw (FILE *@var{stream}, mpz_t @var{op})
        !          1302: Output @var{op} on stdio stream @var{stream}, in raw binary format.  The
        !          1303: integer is written in a portable format, with 4 bytes of size information, and
        !          1304: that many bytes of limbs.  Both the size and the limbs are written in
        !          1305: decreasing significance order (i.e., in big-endian).
        !          1306:
        !          1307: The output can be read with @code{mpz_inp_raw}.
        !          1308:
        !          1309: Return the number of bytes written, or if an error occurred, return 0.
        !          1310:
        !          1311: The output of this can not be read by @code{mpz_inp_raw} from GMP 1, because
        !          1312: of changes necessary for compatibility between 32-bit and 64-bit machines.
        !          1313: @end deftypefun
        !          1314:
        !          1315: @deftypefun size_t mpz_inp_raw (mpz_t @var{rop}, FILE *@var{stream})
        !          1316: Input from stdio stream @var{stream} in the format written by
        !          1317: @code{mpz_out_raw}, and put the result in @var{rop}.  Return the number of
        !          1318: bytes read, or if an error occurred, return 0.
        !          1319:
        !          1320: This routine can read the output from @code{mpz_out_raw} also from GMP 1, in
        !          1321: spite of changes necessary for compatibility between 32-bit and 64-bit
        !          1322: machines.
        !          1323: @end deftypefun
        !          1324:
        !          1325:
        !          1326: @need 2000
        !          1327: @node Miscellaneous Integer Functions,, I/O of Integers, Integer Functions
        !          1328: @comment  node-name,  next,  previous,  up
        !          1329: @section Miscellaneous Functions
        !          1330: @cindex Miscellaneous integer functions
        !          1331:
        !          1332: @deftypefun void mpz_random (mpz_t @var{rop}, mp_size_t @var{max_size})
        !          1333: Generate a random integer of at most @var{max_size} limbs.  The generated
        !          1334: random number doesn't satisfy any particular requirements of randomness.
        !          1335: Negative random numbers are generated when @var{max_size} is negative.
        !          1336: @end deftypefun
        !          1337:
        !          1338: @deftypefun void mpz_random2 (mpz_t @var{rop}, mp_size_t @var{max_size})
        !          1339: Generate a random integer of at most @var{max_size} limbs, with long strings
        !          1340: of zeros and ones in the binary representation.  Useful for testing functions
        !          1341: and algorithms, since this kind of random numbers have proven to be more
        !          1342: likely to trigger corner-case bugs.  Negative random numbers are generated
        !          1343: when @var{max_size} is negative.
        !          1344: @end deftypefun
        !          1345:
        !          1346: @deftypefun size_t mpz_size (mpz_t @var{op})
        !          1347: Return the size of @var{op} measured in number of limbs.  If @var{op} is zero,
        !          1348: the returned value will be zero.
        !          1349: @c (@xref{Nomenclature}, for an explanation of the concept @dfn{limb}.)
        !          1350:
        !          1351: @strong{This function is obsolete.  It will disappear from future MP
        !          1352: releases.}
        !          1353: @end deftypefun
        !          1354:
        !          1355: @deftypefun size_t mpz_sizeinbase (mpz_t @var{op}, int @var{base})
        !          1356: Return the size of @var{op} measured in number of digits in base @var{base}.
        !          1357: The base may vary from 2 to 36.  The returned value will be exact or 1 too
        !          1358: big.  If @var{base} is a power of 2, the returned value will always be exact.
        !          1359:
        !          1360: This function is useful in order to allocate the right amount of space before
        !          1361: converting @var{op} to a string.  The right amount of allocation is normally
        !          1362: two more than the value returned by @code{mpz_sizeinbase} (one extra for a
        !          1363: minus sign and one for the terminating '\0').
        !          1364: @end deftypefun
        !          1365:
        !          1366:
        !          1367: @node Rational Number Functions, Floating-point Functions, Integer Functions, Top
        !          1368: @comment  node-name,  next,  previous,  up
        !          1369: @chapter Rational Number Functions
        !          1370: @cindex Rational number functions
        !          1371:
        !          1372: This chapter describes the MP functions for performing arithmetic on rational
        !          1373: numbers.  These functions start with the prefix @code{mpq_}.
        !          1374:
        !          1375: Rational numbers are stored in objects of type @code{mpq_t}.
        !          1376:
        !          1377: All rational arithmetic functions assume operands have a canonical form, and
        !          1378: canonicalize their result.  The canonical from means that the denominator and
        !          1379: the numerator have no common factors, and that the denominator is positive.
        !          1380: Zero has the unique representation 0/1.
        !          1381:
        !          1382: Pure assignment functions do not canonicalize the assigned variable.  It is
        !          1383: the responsibility of the user to canonicalize the assigned variable before
        !          1384: any arithmetic operations are performed on that variable.  @strong{Note that
        !          1385: this is an incompatible change from version 1 of the library.}
        !          1386:
        !          1387: @deftypefun void mpq_canonicalize (mpq_t @var{op})
        !          1388: Remove any factors that are common to the numerator and denominator of
        !          1389: @var{op}, and make the denominator positive.
        !          1390: @end deftypefun
        !          1391:
        !          1392: @menu
        !          1393: * Initializing Rationals::
        !          1394: * Assigning Rationals::
        !          1395: * Simultaneous Integer Init & Assign::
        !          1396: * Comparing Rationals::
        !          1397: * Applying Integer Functions::
        !          1398: * Miscellaneous Rational Functions::
        !          1399: @end menu
        !          1400:
        !          1401: @node Initializing Rationals, Assigning Rationals, Rational Number Functions, Rational Number Functions
        !          1402: @comment  node-name,  next,  previous,  up
        !          1403: @section Initialization and Assignment Functions
        !          1404:
        !          1405: @deftypefun void mpq_init (mpq_t @var{dest_rational})
        !          1406: Initialize @var{dest_rational} and set it to 0/1.  Each variable should
        !          1407: normally only be initialized once, or at least cleared out (using the function
        !          1408: @code{mpq_clear}) between each initialization.
        !          1409: @end deftypefun
        !          1410:
        !          1411: @deftypefun void mpq_clear (mpq_t @var{rational_number})
        !          1412: Free the space occupied by @var{rational_number}.  Make sure to call this
        !          1413: function for all @code{mpq_t} variables when you are done with them.
        !          1414: @end deftypefun
        !          1415:
        !          1416: @deftypefun void mpq_set (mpq_t @var{rop}, mpq_t @var{op})
        !          1417: @deftypefunx void mpq_set_z (mpq_t @var{rop}, mpz_t @var{op})
        !          1418: Assign @var{rop} from @var{op}.
        !          1419: @end deftypefun
        !          1420:
        !          1421: @deftypefun void mpq_set_ui (mpq_t @var{rop}, unsigned long int @var{op1}, unsigned long int @var{op2})
        !          1422: @deftypefunx void mpq_set_si (mpq_t @var{rop}, signed long int @var{op1}, unsigned long int @var{op2})
        !          1423: Set the value of @var{rop} to @var{op1}/@var{op2}.  Note that if @var{op1} and
        !          1424: @var{op2} have common factors, @var{rop} has to be passed to
        !          1425: @code{mpq_canonicalize} before any operations are performed on @var{rop}.
        !          1426: @end deftypefun
        !          1427:
        !          1428: @node Assigning Rationals, Comparing Rationals, Initializing Rationals, Rational Number Functions
        !          1429: @comment  node-name,  next,  previous,  up
        !          1430: @section Arithmetic Functions
        !          1431:
        !          1432: @deftypefun void mpq_add (mpq_t @var{sum}, mpq_t @var{addend1}, mpq_t @var{addend2})
        !          1433: Set @var{sum} to @var{addend1} + @var{addend2}.
        !          1434: @end deftypefun
        !          1435:
        !          1436: @deftypefun void mpq_sub (mpq_t @var{difference}, mpq_t @var{minuend}, mpq_t @var{subtrahend})
        !          1437: Set @var{difference} to @var{minuend} @minus{} @var{subtrahend}.
        !          1438: @end deftypefun
        !          1439:
        !          1440: @deftypefun void mpq_mul (mpq_t @var{product}, mpq_t @var{multiplier}, mpq_t @var{multiplicand})
        !          1441: @ifinfo
        !          1442: Set @var{product} to @var{multiplier} times @var{multiplicand}.
        !          1443: @end ifinfo
        !          1444: @iftex
        !          1445: @tex
        !          1446: Set @var{product} to $@var{multiplier} \times @var{multiplicand}$.
        !          1447: @end tex
        !          1448: @end iftex
        !          1449: @end deftypefun
        !          1450:
        !          1451: @deftypefun void mpq_div (mpq_t @var{quotient}, mpq_t @var{dividend}, mpq_t @var{divisor})
        !          1452: Set @var{quotient} to @var{dividend}/@var{divisor}.
        !          1453: @end deftypefun
        !          1454:
        !          1455: @deftypefun void mpq_neg (mpq_t @var{negated_operand}, mpq_t @var{operand})
        !          1456: Set @var{negated_operand} to @minus{}@var{operand}.
        !          1457: @end deftypefun
        !          1458:
        !          1459: @deftypefun void mpq_inv (mpq_t @var{inverted_number}, mpq_t @var{number})
        !          1460: Set @var{inverted_number} to 1/@var{number}.  If the new denominator is
        !          1461: zero, this routine will divide by zero.
        !          1462: @end deftypefun
        !          1463:
        !          1464: @node Comparing Rationals, Applying Integer Functions, Assigning Rationals, Rational Number Functions
        !          1465: @comment  node-name,  next,  previous,  up
        !          1466: @section Comparison Functions
        !          1467:
        !          1468: @deftypefun int mpq_cmp (mpq_t @var{op1}, mpq_t @var{op2})
        !          1469: @ifinfo
        !          1470: Compare @var{op1} and @var{op2}.  Return a positive value if @var{op1} >
        !          1471: @var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} <
        !          1472: @var{op2}.
        !          1473: @end ifinfo
        !          1474: @iftex
        !          1475: @tex
        !          1476: Compare @var{op1} and @var{op2}.  Return a positive value if $@var{op1} >
        !          1477: @var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1}
        !          1478: < @var{op2}$.
        !          1479: @end tex
        !          1480: @end iftex
        !          1481:
        !          1482: To determine if two rationals are equal, @code{mpq_equal} is faster than
        !          1483: @code{mpq_cmp}.
        !          1484: @end deftypefun
        !          1485:
        !          1486: @deftypefn Macro int mpq_cmp_ui (mpq_t @var{op1}, unsigned long int @var{num2}, unsigned long int @var{den2})
        !          1487: @ifinfo
        !          1488: Compare @var{op1} and @var{num2}/@var{den2}.  Return a positive value if
        !          1489: @var{op1} > @var{num2}/@var{den2}, zero if @var{op1} = @var{num2}/@var{den2},
        !          1490: and a negative value if @var{op1} < @var{num2}/@var{den2}.
        !          1491: @end ifinfo
        !          1492: @iftex
        !          1493: @tex
        !          1494: Compare @var{op1} and @var{num2}/@var{den2}.  Return a positive value if
        !          1495: $@var{op1} > @var{num2}/@var{den2}$, zero if $@var{op1} =
        !          1496: @var{num2}/@var{den2}$, and a negative value if $@var{op1} <
        !          1497: @var{num2}/@var{den2}$.
        !          1498: @end tex
        !          1499: @end iftex
        !          1500:
        !          1501: This routine allows that @var{num2} and @var{den2} have common factors.
        !          1502:
        !          1503: This function is actually implemented as a macro.  It evaluates its
        !          1504: arguments multiple times.
        !          1505: @end deftypefn
        !          1506:
        !          1507: @deftypefn Macro int mpq_sgn (mpq_t @var{op})
        !          1508: @ifinfo
        !          1509: Return +1 if @var{op} > 0, 0 if @var{op} = 0, and @minus{}1 if @var{op} < 0.
        !          1510: @end ifinfo
        !          1511: @iftex
        !          1512: @tex
        !          1513: Return $+1$ if $@var{op} > 0$, 0 if $@var{op} = 0$, and $-1$ if $@var{op} < 0$.
        !          1514: @end tex
        !          1515: @end iftex
        !          1516:
        !          1517: This function is actually implemented as a macro.  It evaluates its
        !          1518: arguments multiple times.
        !          1519: @end deftypefn
        !          1520:
        !          1521: @deftypefun int mpq_equal (mpq_t @var{op1}, mpq_t @var{op2})
        !          1522: Return non-zero if @var{op1} and @var{op2} are equal, zero if they are
        !          1523: non-equal.  Although @code{mpq_cmp} can be used for the same purpose, this
        !          1524: function is much faster.
        !          1525: @end deftypefun
        !          1526:
        !          1527: @node Applying Integer Functions, Miscellaneous Rational Functions, Comparing Rationals, Rational Number Functions
        !          1528: @comment  node-name,  next,  previous,  up
        !          1529: @section Applying Integer Functions to Rationals
        !          1530:
        !          1531: The set of @code{mpq} functions is quite small.  In particular, there are no
        !          1532: functions for either input or output.  But there are two macros that allow us
        !          1533: to apply any @code{mpz} function on the numerator or denominator of a rational
        !          1534: number.  If these macros are used to assign to the rational number,
        !          1535: @code{mpq_canonicalize} normally need to be called afterwards.
        !          1536:
        !          1537: @deftypefn Macro mpz_t mpq_numref (mpq_t @var{op})
        !          1538: @deftypefnx Macro mpz_t mpq_denref (mpq_t @var{op})
        !          1539: Return a reference to the numerator and denominator of @var{op}, respectively.
        !          1540: The @code{mpz} functions can be used on the result of these macros.
        !          1541: @end deftypefn
        !          1542:
        !          1543: @need 2000
        !          1544: @node Miscellaneous Rational Functions, , Applying Integer Functions, Rational Number Functions
        !          1545: @comment  node-name,  next,  previous,  up
        !          1546: @section Miscellaneous Functions
        !          1547:
        !          1548: @deftypefun double mpq_get_d (mpq_t @var{op})
        !          1549: Convert @var{op} to a double.
        !          1550: @end deftypefun
        !          1551:
        !          1552: These functions assign between either the numerator or denominator of a
        !          1553: rational, and an integer.  Instead of using these functions, it is preferable
        !          1554: to use the more general mechanisms @code{mpq_numref} and @code{mpq_denref},
        !          1555: together with @code{mpz_set}.
        !          1556:
        !          1557: @deftypefun void mpq_set_num (mpq_t @var{rational}, mpz_t @var{numerator})
        !          1558: Copy @var{numerator} to the numerator of @var{rational}.  When this risks to
        !          1559: make the numerator and denominator of @var{rational} have common factors, you
        !          1560: have to pass @var{rational} to @code{mpq_canonicalize} before any operations
        !          1561: are performed on @var{rational}.
        !          1562:
        !          1563: This function is equivalent to
        !          1564: @code{mpz_set (mpq_numref (@var{rational}), @var{numerator})}.
        !          1565: @end deftypefun
        !          1566:
        !          1567: @deftypefun void mpq_set_den (mpq_t @var{rational}, mpz_t @var{denominator})
        !          1568: Copy @var{denominator} to the denominator of @var{rational}.  When this risks
        !          1569: to make the numerator and denominator of @var{rational} have common factors,
        !          1570: or if the denominator might be negative, you have to pass @var{rational} to
        !          1571: @code{mpq_canonicalize} before any operations are performed on @var{rational}.
        !          1572:
        !          1573: @strong{In version 1 of the library, negative denominators were handled by
        !          1574: copying the sign to the numerator.  That is no longer done.}
        !          1575:
        !          1576: This function is equivalent to
        !          1577: @code{mpz_set (mpq_denref (@var{rational}), @var{denominators})}.
        !          1578: @end deftypefun
        !          1579:
        !          1580: @deftypefun void mpq_get_num (mpz_t @var{numerator}, mpq_t @var{rational})
        !          1581: Copy the numerator of @var{rational} to the integer @var{numerator}, to
        !          1582: prepare for integer operations on the numerator.
        !          1583:
        !          1584: This function is equivalent to
        !          1585: @code{mpz_set (@var{numerator}, mpq_numref (@var{rational}))}.
        !          1586: @end deftypefun
        !          1587:
        !          1588: @deftypefun void mpq_get_den (mpz_t @var{denominator}, mpq_t @var{rational})
        !          1589: Copy the denominator of @var{rational} to the integer @var{denominator}, to
        !          1590: prepare for integer operations on the denominator.
        !          1591:
        !          1592: This function is equivalent to
        !          1593: @code{mpz_set (@var{denominator}, mpq_denref (@var{rational}))}.
        !          1594: @end deftypefun
        !          1595:
        !          1596:
        !          1597: @node Floating-point Functions, Low-level Functions, Rational Number Functions, Top
        !          1598: @comment  node-name,  next,  previous,  up
        !          1599: @chapter Floating-point Functions
        !          1600: @cindex Floating-point functions
        !          1601: @cindex Float functions
        !          1602:
        !          1603: This is a description of the @emph{preliminary} interface for floating-point
        !          1604: arithmetic in GNU MP 2.
        !          1605:
        !          1606: The floating-point functions expect arguments of type @code{mpf_t}.
        !          1607:
        !          1608: The MP floating-point functions have an interface that is similar to the MP
        !          1609: integer functions.  The function prefix for floating-point operations is
        !          1610: @code{mpf_}.
        !          1611:
        !          1612: There is one significant characteristic of floating-point numbers that has
        !          1613: motivated a difference between this function class and other MP function
        !          1614: classes: the inherent inexactness of floating point arithmetic.  The user has
        !          1615: to specify the precision of each variable.  A computation that assigns a
        !          1616: variable will take place with the precision of the assigned variable; the
        !          1617: precision of variables used as input is ignored.
        !          1618:
        !          1619: @cindex User-defined precision
        !          1620: The precision of a calculation is defined as follows: Compute the requested
        !          1621: operation exactly (with ``infinite precision''), and truncate the result to
        !          1622: the destination variable precision.  Even if the user has asked for a very
        !          1623: high precision, MP will not calculate with superfluous digits.  For example,
        !          1624: if two low-precision numbers of nearly equal magnitude are added, the
        !          1625: precision of the result will be limited to what is required to represent the
        !          1626: result accurately.
        !          1627:
        !          1628: The MP floating-point functions are @emph{not} intended as a smooth extension
        !          1629: to the IEEE P754 arithmetic.  Specifically, the results obtained on one
        !          1630: computer often differs from the results obtained on a computer with a
        !          1631: different word size.
        !          1632:
        !          1633: @menu
        !          1634: * Initializing Floats::
        !          1635: * Assigning Floats::
        !          1636: * Simultaneous Float Init & Assign::
        !          1637: * Converting Floats::
        !          1638: * Float Arithmetic::
        !          1639: * Float Comparison::
        !          1640: * I/O of Floats::
        !          1641: * Miscellaneous Float Functions::
        !          1642: @end menu
        !          1643:
        !          1644: @node Initializing Floats, Assigning Floats, , Floating-point Functions
        !          1645: @comment  node-name,  next,  previous,  up
        !          1646: @section Initialization and Assignment Functions
        !          1647:
        !          1648: @deftypefun void mpf_set_default_prec (unsigned long int @var{prec})
        !          1649: Set the default precision to be @strong{at least} @var{prec} bits.  All
        !          1650: subsequent calls to @code{mpf_init} will use this precision, but previously
        !          1651: initialized variables are unaffected.
        !          1652: @end deftypefun
        !          1653:
        !          1654: An @code{mpf_t} object must be initialized before storing the first value in
        !          1655: it.  The functions @code{mpf_init} and @code{mpf_init2} are used for that
        !          1656: purpose.
        !          1657:
        !          1658: @deftypefun void mpf_init (mpf_t @var{x})
        !          1659: Initialize @var{x} to 0.  Normally, a variable should be initialized once only
        !          1660: or at least be cleared, using @code{mpf_clear}, between initializations.  The
        !          1661: precision of @var{x} is undefined unless a default precision has already been
        !          1662: established by a call to @code{mpf_set_default_prec}.
        !          1663: @end deftypefun
        !          1664:
        !          1665: @deftypefun void mpf_init2 (mpf_t @var{x}, unsigned long int @var{prec})
        !          1666: Initialize @var{x} to 0 and set its precision to be @strong{at least}
        !          1667: @var{prec} bits.  Normally, a variable should be initialized once only or at
        !          1668: least be cleared, using @code{mpf_clear}, between initializations.
        !          1669: @end deftypefun
        !          1670:
        !          1671: @deftypefun void mpf_clear (mpf_t @var{x})
        !          1672: Free the space occupied by @var{x}.  Make sure to call this function for all
        !          1673: @code{mpf_t} variables when you are done with them.
        !          1674: @end deftypefun
        !          1675:
        !          1676: @need 2000
        !          1677: Here is an example on how to initialize floating-point variables:
        !          1678: @example
        !          1679: @{
        !          1680:   mpf_t x, y;
        !          1681:   mpf_init (x);                        /* use default precision */
        !          1682:   mpf_init2 (y, 256);          /* precision @emph{at least} 256 bits */
        !          1683:   @dots{}
        !          1684:   /* Unless the program is about to exit, do ... */
        !          1685:   mpf_clear (x);
        !          1686:   mpf_clear (y);
        !          1687: @}
        !          1688: @end example
        !          1689:
        !          1690: The following three functions are useful for changing the precision during a
        !          1691: calculation.  A typical use would be for adjusting the precision gradually in
        !          1692: iterative algorithms like Newton-Raphson, making the computation precision
        !          1693: closely match the actual accurate part of the numbers.
        !          1694:
        !          1695: @deftypefun void mpf_set_prec (mpf_t @var{rop}, unsigned long int @var{prec})
        !          1696: Set the precision of @var{rop} to be @strong{at least} @var{prec} bits.
        !          1697: Since changing the precision involves calls to @code{realloc}, this routine
        !          1698: should not be called in a tight loop.
        !          1699: @end deftypefun
        !          1700:
        !          1701: @deftypefun {unsigned long int} mpf_get_prec (mpf_t @var{op})
        !          1702: Return the precision actually used for assignments of @var{op}.
        !          1703: @end deftypefun
        !          1704:
        !          1705: @deftypefun void mpf_set_prec_raw (mpf_t @var{rop}, unsigned long int @var{prec})
        !          1706: Set the precision of @var{rop} to be @strong{at least} @var{prec} bits.  This
        !          1707: is a low-level function that does not change the allocation.  The @var{prec}
        !          1708: argument must not be larger that the precision previously returned by
        !          1709: @code{mpf_get_prec}.  It is crucial that the precision of @var{rop} is
        !          1710: ultimately reset to exactly the value returned by @code{mpf_get_prec}.
        !          1711: @end deftypefun
        !          1712:
        !          1713:
        !          1714: @node Assigning Floats, Simultaneous Float Init & Assign, Initializing Floats, Floating-point Functions
        !          1715: @comment  node-name,  next,  previous,  up
        !          1716: @subsection Assignment Functions
        !          1717: @cindex Float assignment functions
        !          1718:
        !          1719: These functions assign new values to already initialized floats
        !          1720: (@pxref{Initializing Floats}).
        !          1721:
        !          1722: @deftypefun void mpf_set (mpf_t @var{rop}, mpf_t @var{op})
        !          1723: @deftypefunx void mpf_set_ui (mpf_t @var{rop}, unsigned long int @var{op})
        !          1724: @deftypefunx void mpf_set_si (mpf_t @var{rop}, signed long int @var{op})
        !          1725: @deftypefunx void mpf_set_d (mpf_t @var{rop}, double @var{op})
        !          1726: @deftypefunx void mpf_set_z (mpf_t @var{rop}, mpz_t @var{op})
        !          1727: @deftypefunx void mpf_set_q (mpf_t @var{rop}, mpq_t @var{op})
        !          1728: Set the value of @var{rop} from @var{op}.
        !          1729: @end deftypefun
        !          1730:
        !          1731: @deftypefun int mpf_set_str (mpf_t @var{rop}, char *@var{str}, int @var{base})
        !          1732: Set the value of @var{rop} from the string in @var{str}.  The string is of the
        !          1733: form @samp{M@@N} or, if the base is 10 or less, alternatively @samp{MeN}.
        !          1734: @samp{M} is the mantissa and @samp{N} is the exponent.  The mantissa is always
        !          1735: in the specified base.  The exponent is either in the specified base or, if
        !          1736: @var{base} is negative, in decimal.
        !          1737:
        !          1738: The argument @var{base} may be in the ranges 2 to 36, or @minus{}36 to
        !          1739: @minus{}2.  Negative values are used to specify that the exponent is in
        !          1740: decimal.
        !          1741:
        !          1742: Unlike the corresponding @code{mpz} function, the base will not be determined
        !          1743: from the leading characters of the string if @var{base} is 0.  This is so that
        !          1744: numbers like @samp{0.23} are not interpreted as octal.
        !          1745:
        !          1746: White space is allowed in the string, and is simply ignored.
        !          1747:
        !          1748: This function returns 0 if the entire string up to the '\0' is a valid number
        !          1749: in base @var{base}.  Otherwise it returns @minus{}1.
        !          1750: @end deftypefun
        !          1751:
        !          1752:
        !          1753: @node Simultaneous Float Init & Assign, Converting Floats, Assigning Floats, Floating-point Functions
        !          1754: @comment  node-name,  next,  previous,  up
        !          1755: @subsection Combined Initialization and Assignment Functions
        !          1756: @cindex Initialization and assignment functions
        !          1757:
        !          1758: For convenience, MP provides a parallel series of initialize-and-set functions
        !          1759: which initialize the output and then store the value there.  These functions'
        !          1760: names have the form @code{mpf_init_set@dots{}}
        !          1761:
        !          1762: Once the float has been initialized by any of the @code{mpf_init_set@dots{}}
        !          1763: functions, it can be used as the source or destination operand for the ordinary
        !          1764: float functions.  Don't use an initialize-and-set function on a variable
        !          1765: already initialized!
        !          1766:
        !          1767: @deftypefun void mpf_init_set (mpf_t @var{rop}, mpf_t @var{op})
        !          1768: @deftypefunx void mpf_init_set_ui (mpf_t @var{rop}, unsigned long int @var{op})
        !          1769: @deftypefunx void mpf_init_set_si (mpf_t @var{rop}, signed long int @var{op})
        !          1770: @deftypefunx void mpf_init_set_d (mpf_t @var{rop}, double @var{op})
        !          1771: Initialize @var{rop} and set its value from @var{op}.
        !          1772:
        !          1773: The precision of @var{rop} will be taken from the active default precision, as
        !          1774: set by @code{mpf_set_default_prec}.
        !          1775: @end deftypefun
        !          1776:
        !          1777: @deftypefun int mpf_init_set_str (mpf_t @var{rop}, char *@var{str}, int @var{base})
        !          1778: Initialize @var{rop} and set its value from the string in @var{str}.  See
        !          1779: @code{mpf_set_str} above for details on the assignment operation.
        !          1780:
        !          1781: Note that @var{rop} is initialized even if an error occurs.  (I.e., you have to
        !          1782: call @code{mpf_clear} for it.)
        !          1783:
        !          1784: The precision of @var{rop} will be taken from the active default precision, as
        !          1785: set by @code{mpf_set_default_prec}.
        !          1786: @end deftypefun
        !          1787:
        !          1788:
        !          1789: @node Converting Floats, Float Arithmetic, Simultaneous Float Init & Assign, Floating-point Functions
        !          1790: @comment  node-name,  next,  previous,  up
        !          1791: @section Conversion Functions
        !          1792: @cindex Conversion functions
        !          1793:
        !          1794: @deftypefun double mpf_get_d (mpf_t @var{op})
        !          1795: Convert @var{op} to a double.
        !          1796: @end deftypefun
        !          1797:
        !          1798: @deftypefun {char *} mpf_get_str (char *@var{str}, mp_exp_t *@var{expptr}, int @var{base}, size_t @var{n_digits}, mpf_t @var{op})
        !          1799: Convert @var{op} to a string of digits in base @var{base}.  The base may vary
        !          1800: from 2 to 36.  Generate at most @var{n_digits} significant digits, or if
        !          1801: @var{n_digits} is 0, the maximum number of digits accurately representable by
        !          1802: @var{op}.
        !          1803:
        !          1804: If @var{str} is NULL, space for the mantissa is allocated using the default
        !          1805: allocation function, and a pointer to the string is returned.
        !          1806:
        !          1807: If @var{str} is not NULL, it should point to a block of storage enough large
        !          1808: for the mantissa, i.e., @var{n_digits} + 2.  The two extra bytes are for a
        !          1809: possible minus sign, and for the terminating null character.
        !          1810:
        !          1811: The exponent is written through the pointer @var{expptr}.
        !          1812:
        !          1813: If @var{n_digits} is 0, the maximum number of digits meaningfully achievable
        !          1814: from the precision of @var{op} will be generated.  Note that the space
        !          1815: requirements for @var{str} in this case will be impossible for the user to
        !          1816: predetermine.  Therefore, you need to pass NULL for the string argument
        !          1817: whenever @var{n_digits} is 0.
        !          1818:
        !          1819: The generated string is a fraction, with an implicit radix point immediately
        !          1820: to the left of the first digit.  For example, the number 3.1416 would be
        !          1821: returned as "31416" in the string and 1 written at @var{expptr}.
        !          1822: @end deftypefun
        !          1823:
        !          1824:
        !          1825: @node Float Arithmetic, Float Comparison, Converting Floats, Floating-point Functions
        !          1826: @comment  node-name,  next,  previous,  up
        !          1827: @section Arithmetic Functions
        !          1828: @cindex Float arithmetic functions
        !          1829: @cindex Arithmetic functions
        !          1830:
        !          1831: @deftypefun void mpf_add (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2})
        !          1832: @deftypefunx void mpf_add_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2})
        !          1833: @ifinfo
        !          1834: Set @var{rop} to @var{op1} + @var{op2}.
        !          1835: @end ifinfo
        !          1836: @iftex
        !          1837: @tex
        !          1838: Set @var{rop} to $@var{op1} + @var{op2}$.
        !          1839: @end tex
        !          1840: @end iftex
        !          1841: @end deftypefun
        !          1842:
        !          1843: @deftypefun void mpf_sub (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2})
        !          1844: @deftypefunx void mpf_ui_sub (mpf_t @var{rop}, unsigned long int @var{op1}, mpf_t @var{op2})
        !          1845: @deftypefunx void mpf_sub_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2})
        !          1846: Set @var{rop} to @var{op1} @minus{} @var{op2}.
        !          1847: @end deftypefun
        !          1848:
        !          1849: @deftypefun void mpf_mul (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2})
        !          1850: @deftypefunx void mpf_mul_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2})
        !          1851: @ifinfo
        !          1852: Set @var{rop} to @var{op1} times @var{op2}.
        !          1853: @end ifinfo
        !          1854: @iftex
        !          1855: @tex
        !          1856: Set @var{rop} to $@var{op1} \times @var{op2}$.
        !          1857: @end tex
        !          1858: @end iftex
        !          1859: @end deftypefun
        !          1860:
        !          1861: Division is undefined if the divisor is zero, and passing a zero divisor to
        !          1862: the divide functions will make these functions intentionally divide by zero.
        !          1863: This gives the user the possibility to handle arithmetic exceptions in these
        !          1864: functions in the same manner as other arithmetic exceptions.
        !          1865:
        !          1866: @deftypefun void mpf_div (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2})
        !          1867: @deftypefunx void mpf_ui_div (mpf_t @var{rop}, unsigned long int @var{op1}, mpf_t @var{op2})
        !          1868: @deftypefunx void mpf_div_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2})
        !          1869: Set @var{rop} to @var{op1}/@var{op2}.
        !          1870: @end deftypefun
        !          1871:
        !          1872: @deftypefun void mpf_sqrt (mpf_t @var{rop}, mpf_t @var{op})
        !          1873: @deftypefunx void mpf_sqrt_ui (mpf_t @var{rop}, unsigned long int @var{op})
        !          1874: @ifinfo
        !          1875: Set @var{rop} to the square root of @var{op}.
        !          1876: @end ifinfo
        !          1877: @iftex
        !          1878: @tex
        !          1879: Set @var{rop} to $\sqrt{@var{op}}$.
        !          1880: @end tex
        !          1881: @end iftex
        !          1882: @end deftypefun
        !          1883:
        !          1884: @c @deftypefun void mpf_pow_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2})
        !          1885: @c Set @var{rop} to @var{op1} raised to @var{op2}.
        !          1886: @c @end deftypefun
        !          1887:
        !          1888: @deftypefun void mpf_neg (mpf_t @var{rop}, mpf_t @var{op})
        !          1889: Set @var{rop} to @minus{}@var{op}.
        !          1890: @end deftypefun
        !          1891:
        !          1892: @deftypefun void mpf_abs (mpf_t @var{rop}, mpf_t @var{op})
        !          1893: Set @var{rop} to the absolute value of @var{op}.
        !          1894: @end deftypefun
        !          1895:
        !          1896: @deftypefun void mpf_mul_2exp (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2})
        !          1897: @ifinfo
        !          1898: Set @var{rop} to @var{op1} times 2 raised to @var{op2}.
        !          1899: @end ifinfo
        !          1900: @iftex
        !          1901: @tex
        !          1902: Set @var{rop} to $@var{op1} \times 2^{op2}$.
        !          1903: @end tex
        !          1904: @end iftex
        !          1905: @end deftypefun
        !          1906:
        !          1907: @deftypefun void mpf_div_2exp (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2})
        !          1908: @ifinfo
        !          1909: Set @var{rop} to @var{op1} divided by 2 raised to @var{op2}.
        !          1910: @end ifinfo
        !          1911: @iftex
        !          1912: @tex
        !          1913: Set @var{rop} to $@var{op1}/2^{op2}$.
        !          1914: @end tex
        !          1915: @end iftex
        !          1916: @end deftypefun
        !          1917:
        !          1918: @node Float Comparison, I/O of Floats, Float Arithmetic, Floating-point Functions
        !          1919: @comment  node-name,  next,  previous,  up
        !          1920: @section Comparison Functions
        !          1921: @cindex Float comparisons functions
        !          1922: @cindex Comparison functions
        !          1923:
        !          1924: @deftypefun int mpf_cmp (mpf_t @var{op1}, mpf_t @var{op2})
        !          1925: @deftypefunx int mpf_cmp_ui (mpf_t @var{op1}, unsigned long int @var{op2})
        !          1926: @deftypefunx int mpf_cmp_si (mpf_t @var{op1}, signed long int @var{op2})
        !          1927: @ifinfo
        !          1928: Compare @var{op1} and @var{op2}.  Return a positive value if @var{op1} >
        !          1929: @var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} <
        !          1930: @var{op2}.
        !          1931: @end ifinfo
        !          1932: @iftex
        !          1933: @tex
        !          1934: Compare @var{op1} and @var{op2}.  Return a positive value if $@var{op1} >
        !          1935: @var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1}
        !          1936: < @var{op2}$.
        !          1937: @end tex
        !          1938: @end iftex
        !          1939: @end deftypefun
        !          1940:
        !          1941: @deftypefun int mpf_eq (mpf_t @var{op1}, mpf_t @var{op2}, unsigned long int op3)
        !          1942: Return non-zero if the first @var{op3} bits of @var{op1} and @var{op2} are
        !          1943: equal, zero otherwise.  I.e., test of @var{op1} and @var{op2} are
        !          1944: approximately equal.
        !          1945: @end deftypefun
        !          1946:
        !          1947: @deftypefun void mpf_reldiff (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2})
        !          1948: Compute the relative difference between @var{op1} and @var{op2} and store the
        !          1949: result in @var{rop}.
        !          1950: @end deftypefun
        !          1951:
        !          1952: @deftypefn Macro int mpf_sgn (mpf_t @var{op})
        !          1953: @ifinfo
        !          1954: Return +1 if @var{op} > 0, 0 if @var{op} = 0, and @minus{}1 if @var{op} < 0.
        !          1955: @end ifinfo
        !          1956: @iftex
        !          1957: @tex
        !          1958: Return $+1$ if $@var{op} > 0$, 0 if $@var{op} = 0$, and $-1$ if $@var{op} < 0$.
        !          1959: @end tex
        !          1960: @end iftex
        !          1961:
        !          1962: This function is actually implemented as a macro.  It evaluates its
        !          1963: arguments multiple times.
        !          1964: @end deftypefn
        !          1965:
        !          1966: @node I/O of Floats, Miscellaneous Float Functions, Float Comparison, Floating-point Functions
        !          1967: @comment  node-name,  next,  previous,  up
        !          1968: @section Input and Output Functions
        !          1969: @cindex Float input and output functions
        !          1970: @cindex Input functions
        !          1971: @cindex Output functions
        !          1972: @cindex I/O functions
        !          1973:
        !          1974: Functions that perform input from a stdio stream, and functions that output to
        !          1975: a stdio stream.  Passing a NULL pointer for a @var{stream} argument to any of
        !          1976: these functions will make them read from @code{stdin} and write to
        !          1977: @code{stdout}, respectively.
        !          1978:
        !          1979: When using any of these functions, it is a good idea to include @file{stdio.h}
        !          1980: before @file{gmp.h}, since that will allow @file{gmp.h} to define prototypes
        !          1981: for these functions.
        !          1982:
        !          1983: @deftypefun size_t mpf_out_str (FILE *@var{stream}, int @var{base}, size_t @var{n_digits}, mpf_t @var{op})
        !          1984: Output @var{op} on stdio stream @var{stream}, as a string of digits in
        !          1985: base @var{base}.  The base may vary from 2 to 36.  Print at most
        !          1986: @var{n_digits} significant digits, or if @var{n_digits} is 0, the maximum
        !          1987: number of digits accurately representable by @var{op}.
        !          1988:
        !          1989: In addition to the significant digits, a leading @samp{0.} and a
        !          1990: trailing exponent, in the form @samp{eNNN}, are printed.  If @var{base}
        !          1991: is greater than 10, @samp{@@} will be used instead of @samp{e} as
        !          1992: exponent delimiter.
        !          1993:
        !          1994: Return the number of bytes written, or if an error occurred, return 0.
        !          1995: @end deftypefun
        !          1996:
        !          1997: @deftypefun size_t mpf_inp_str (mpf_t @var{rop}, FILE *@var{stream}, int @var{base})
        !          1998: Input a string in base @var{base} from stdio stream @var{stream}, and put the
        !          1999: read float in @var{rop}.  The string is of the form @samp{M@@N} or, if the
        !          2000: base is 10 or less, alternatively @samp{MeN}.  @samp{M} is the mantissa and
        !          2001: @samp{N} is the exponent.  The mantissa is always in the specified base.  The
        !          2002: exponent is either in the specified base or, if @var{base} is negative, in
        !          2003: decimal.
        !          2004:
        !          2005: The argument @var{base} may be in the ranges 2 to 36, or @minus{}36 to
        !          2006: @minus{}2.  Negative values are used to specify that the exponent is in
        !          2007: decimal.
        !          2008:
        !          2009: Unlike the corresponding @code{mpz} function, the base will not be determined
        !          2010: from the leading characters of the string if @var{base} is 0.  This is so that
        !          2011: numbers like @samp{0.23} are not interpreted as octal.
        !          2012:
        !          2013: Return the number of bytes read, or if an error occurred, return 0.
        !          2014: @end deftypefun
        !          2015:
        !          2016: @c @deftypefun void mpf_out_raw (FILE *@var{stream}, mpf_t @var{float})
        !          2017: @c Output @var{float} on stdio stream @var{stream}, in raw binary
        !          2018: @c format.  The float is written in a portable format, with 4 bytes of
        !          2019: @c size information, and that many bytes of limbs.  Both the size and the
        !          2020: @c limbs are written in decreasing significance order.
        !          2021: @c @end deftypefun
        !          2022:
        !          2023: @c @deftypefun void mpf_inp_raw (mpf_t @var{float}, FILE *@var{stream})
        !          2024: @c Input from stdio stream @var{stream} in the format written by
        !          2025: @c @code{mpf_out_raw}, and put the result in @var{float}.
        !          2026: @c @end deftypefun
        !          2027:
        !          2028:
        !          2029: @node Miscellaneous Float Functions, , I/O of Floats, Floating-point Functions
        !          2030: @comment  node-name,  next,  previous,  up
        !          2031: @section Miscellaneous Functions
        !          2032: @cindex Miscellaneous float functions
        !          2033:
        !          2034: @deftypefun void mpf_random2 (mpf_t @var{rop}, mp_size_t @var{max_size}, mp_exp_t @var{max_exp})
        !          2035: Generate a random float of at most @var{max_size} limbs, with long strings of
        !          2036: zeros and ones in the binary representation.  The exponent of the number is in
        !          2037: the interval @minus{}@var{exp} to @var{exp}.  This function is useful for
        !          2038: testing functions and algorithms, since this kind of random numbers have
        !          2039: proven to be more likely to trigger corner-case bugs.  Negative random numbers
        !          2040: are generated when @var{max_size} is negative.
        !          2041: @end deftypefun
        !          2042:
        !          2043: @c @deftypefun size_t mpf_size (mpf_t @var{op})
        !          2044: @c Return the size of @var{op} measured in number of limbs.  If @var{op} is
        !          2045: @c zero, the returned value will be zero.  (@xref{Nomenclature}, for an
        !          2046: @c explanation of the concept @dfn{limb}.)
        !          2047: @c
        !          2048: @c @strong{This function is obsolete.  It will disappear from future MP
        !          2049: @c releases.}
        !          2050: @c @end deftypefun
        !          2051:
        !          2052: @node Low-level Functions, BSD Compatible Functions, Floating-point Functions, Top
        !          2053: @comment  node-name,  next,  previous,  up
        !          2054: @chapter Low-level Functions
        !          2055: @cindex Low-level functions
        !          2056:
        !          2057: This chapter describes low-level MP functions, used to implement the high-level
        !          2058: MP functions, but also intended for time-critical user code.
        !          2059:
        !          2060: These functions start with the prefix @code{mpn_}.
        !          2061:
        !          2062: @c 1. Some of these function clobber input operands.
        !          2063: @c
        !          2064:
        !          2065: The @code{mpn} functions are designed to be as fast as possible, @strong{not}
        !          2066: to provide a coherent calling interface.  The different functions have somewhat
        !          2067: similar interfaces, but there are variations that make them hard to use.  These
        !          2068: functions do as little as possible apart from the real multiple precision
        !          2069: computation, so that no time is spent on things that not all callers need.
        !          2070:
        !          2071: A source operand is specified by a pointer to the least significant limb and a
        !          2072: limb count.  A destination operand is specified by just a pointer.  It is the
        !          2073: responsibility of the caller to ensure that the destination has enough space
        !          2074: for storing the result.
        !          2075:
        !          2076: With this way of specifying operands, it is possible to perform computations
        !          2077: on subranges of an argument, and store the result into a subrange of a
        !          2078: destination.
        !          2079:
        !          2080: A common requirement for all functions is that each source area needs at least
        !          2081: one limb.  No size argument may be zero.
        !          2082:
        !          2083: The @code{mpn} functions is the base for the implementation of the @code{mpz_},
        !          2084: @code{mpf_}, and @code{mpq_} functions.
        !          2085:
        !          2086: This example adds the number beginning at @var{src1_ptr} and the number
        !          2087: beginning at @var{src2_ptr} and writes the sum at @var{dest_ptr}.  All areas
        !          2088: have @var{size} limbs.
        !          2089:
        !          2090: @example
        !          2091: cy = mpn_add_n (dest_ptr, src1_ptr, src2_ptr, size)
        !          2092: @end example
        !          2093:
        !          2094: @noindent
        !          2095: In the notation used here, a source operand is identified by the pointer to
        !          2096: the least significant limb, and the limb count in braces.  For example,
        !          2097: @{s1_ptr, s1_size@}.
        !          2098:
        !          2099: @deftypefun mp_limb_t mpn_add_n (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, const mp_limb_t * @var{src2_ptr}, mp_size_t @var{size})
        !          2100: Add @{@var{src1_ptr}, @var{size}@} and @{@var{src2_ptr}, @var{size}@}, and
        !          2101: write the @var{size} least significant limbs of the result to @var{dest_ptr}.
        !          2102: Return carry, either 0 or 1.
        !          2103:
        !          2104: This is the lowest-level function for addition.  It is the preferred function
        !          2105: for addition, since it is written in assembly for most targets.  For addition
        !          2106: of a variable to itself (i.e., @var{src1_ptr} equals @var{src2_ptr}, use
        !          2107: @code{mpn_lshift} with a count of 1 for optimal speed.
        !          2108: @end deftypefun
        !          2109:
        !          2110: @deftypefun mp_limb_t mpn_add_1 (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, mp_size_t @var{size}, mp_limb_t @var{src2_limb})
        !          2111: Add @{@var{src1_ptr}, @var{size}@} and @var{src2_limb}, and write the
        !          2112: @var{size} least significant limbs of the result to @var{dest_ptr}.  Return
        !          2113: carry, either 0 or 1.
        !          2114: @end deftypefun
        !          2115:
        !          2116: @deftypefun mp_limb_t mpn_add (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, mp_size_t @var{src1_size}, const mp_limb_t * @var{src2_ptr}, mp_size_t @var{src2_size})
        !          2117: Add @{@var{src1_ptr}, @var{src1_size}@} and @{@var{src2_ptr},
        !          2118: @var{src2_size}@}, and write the @var{src1_size} least significant limbs of
        !          2119: the result to @var{dest_ptr}.  Return carry, either 0 or 1.
        !          2120:
        !          2121: This function requires that @var{src1_size} is greater than or equal to
        !          2122: @var{src2_size}.
        !          2123: @end deftypefun
        !          2124:
        !          2125: @deftypefun mp_limb_t mpn_sub_n (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, const mp_limb_t * @var{src2_ptr}, mp_size_t @var{size})
        !          2126: Subtract @{@var{src2_ptr}, @var{src2_size}@} from @{@var{src1_ptr},
        !          2127: @var{size}@}, and write the @var{size} least significant limbs of the result
        !          2128: to @var{dest_ptr}.  Return borrow, either 0 or 1.
        !          2129:
        !          2130: This is the lowest-level function for subtraction.  It is the preferred
        !          2131: function for subtraction, since it is written in assembly for most targets.
        !          2132: @end deftypefun
        !          2133:
        !          2134: @deftypefun mp_limb_t mpn_sub_1 (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, mp_size_t @var{size}, mp_limb_t @var{src2_limb})
        !          2135: Subtract @var{src2_limb} from @{@var{src1_ptr}, @var{size}@}, and write the
        !          2136: @var{size} least significant limbs of the result to @var{dest_ptr}.  Return
        !          2137: borrow, either 0 or 1.
        !          2138: @end deftypefun
        !          2139:
        !          2140: @deftypefun mp_limb_t mpn_sub (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, mp_size_t @var{src1_size}, const mp_limb_t * @var{src2_ptr}, mp_size_t @var{src2_size})
        !          2141: Subtract @{@var{src2_ptr}, @var{src2_size}@} from @{@var{src1_ptr},
        !          2142: @var{src1_size}@}, and write the @var{src1_size} least significant limbs of
        !          2143: the result to @var{dest_ptr}.  Return borrow, either 0 or 1.
        !          2144:
        !          2145: This function requires that @var{src1_size} is greater than or equal to
        !          2146: @var{src2_size}.
        !          2147: @end deftypefun
        !          2148:
        !          2149: @deftypefun void mpn_mul_n (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, const mp_limb_t * @var{src2_ptr}, mp_size_t @var{size})
        !          2150: Multiply @{@var{src1_ptr}, @var{size}@} and @{@var{src2_ptr}, @var{size}@},
        !          2151: and write the @strong{entire} result to @var{dest_ptr}.
        !          2152:
        !          2153: The destination has to have space for 2@var{size} limbs, even if the
        !          2154: significant result might be one limb smaller.
        !          2155: @end deftypefun
        !          2156:
        !          2157: @deftypefun mp_limb_t mpn_mul_1 (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, mp_size_t @var{size}, mp_limb_t @var{src2_limb})
        !          2158: Multiply @{@var{src1_ptr}, @var{size}@} and @var{src2_limb}, and write the
        !          2159: @var{size} least significant limbs of the product to @var{dest_ptr}.  Return
        !          2160: the most significant limb of the product.
        !          2161:
        !          2162: This is a low-level function that is a building block for general
        !          2163: multiplication as well as other operations in MP.  It is written in assembly
        !          2164: for most targets.
        !          2165:
        !          2166: Don't call this function if @var{src2_limb} is a power of 2; use
        !          2167: @code{mpn_lshift} with a count equal to the logarithm of @var{src2_limb}
        !          2168: instead, for optimal speed.
        !          2169: @end deftypefun
        !          2170:
        !          2171: @deftypefun mp_limb_t mpn_addmul_1 (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, mp_size_t @var{size}, mp_limb_t @var{src2_limb})
        !          2172: Multiply @{@var{src1_ptr}, @var{size}@} and @var{src2_limb}, and add the
        !          2173: @var{size} least significant limbs of the product to @{@var{dest_ptr},
        !          2174: @var{size}@} and write the result to @var{dest_ptr} @var{dest_ptr}.  Return
        !          2175: the most significant limb of the product, plus carry-out from the addition.
        !          2176:
        !          2177: This is a low-level function that is a building block for general
        !          2178: multiplication as well as other operations in MP.  It is written in assembly
        !          2179: for most targets.
        !          2180: @end deftypefun
        !          2181:
        !          2182: @deftypefun mp_limb_t mpn_submul_1 (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, mp_size_t @var{size}, mp_limb_t @var{src2_limb})
        !          2183: Multiply @{@var{src1_ptr}, @var{size}@} and @var{src2_limb}, and subtract the
        !          2184: @var{size} least significant limbs of the product from @{@var{dest_ptr},
        !          2185: @var{size}@} and write the result to @var{dest_ptr}.  Return the most
        !          2186: significant limb of the product, minus borrow-out from the subtraction.
        !          2187:
        !          2188: This is a low-level function that is a building block for general
        !          2189: multiplication and division as well as other operations in MP.  It is written
        !          2190: in assembly for most targets.
        !          2191: @end deftypefun
        !          2192:
        !          2193: @deftypefun mp_limb_t mpn_mul (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src1_ptr}, mp_size_t @var{src1_size}, const mp_limb_t * @var{src2_ptr}, mp_size_t @var{src2_size})
        !          2194: Multiply @{@var{src1_ptr}, @var{src1_size}@} and @{@var{src2_ptr},
        !          2195: @var{src2_size}@}, and write the result to @var{dest_ptr}.  Return the most
        !          2196: significant limb of the result.
        !          2197:
        !          2198: The destination has to have space for @var{src1_size} + @var{src1_size}
        !          2199: limbs, even if the result might be one limb smaller.
        !          2200:
        !          2201: This function requires that @var{src1_size} is greater than or equal to
        !          2202: @var{src2_size}.  The destination must be distinct from either input operands.
        !          2203: @end deftypefun
        !          2204:
        !          2205: @deftypefun mp_size_t mpn_divrem (mp_limb_t * @var{r1p}, mp_size_t @var{xsize}, mp_limb_t * @var{rs2p}, mp_size_t @var{rs2size}, const mp_limb_t * @var{s3p}, mp_size_t @var{s3size})
        !          2206: Divide @{@var{rs2p}, @var{rs2size}@} by @{@var{s3p}, @var{s3size}@}, and
        !          2207: write the quotient at @var{r1p}, with the exception of the most significant
        !          2208: limb, which is returned.  The remainder replaces the dividend at @var{rs2p}.
        !          2209:
        !          2210: In addition to an integer quotient, @var{xsize} fraction limbs are developed,
        !          2211: and stored after the integral limbs.  For most usages, @var{xsize} will be
        !          2212: zero.
        !          2213:
        !          2214: It is required that @var{rs2size} is greater than or equal to @var{s3size}.
        !          2215: It is required that the most significant bit of the divisor is set.
        !          2216:
        !          2217: If the quotient is not needed, pass @var{rs2p} + @var{s3size} as @var{r1p}.
        !          2218: Aside from that special case, no overlap between arguments is permitted.
        !          2219:
        !          2220: Return the most significant limb of the quotient, either 0 or 1.
        !          2221:
        !          2222: The area at @var{r1p} needs to be @var{rs2size} @minus{} @var{s3size} +
        !          2223: @var{xsize} limbs large.
        !          2224: @end deftypefun
        !          2225:
        !          2226: @deftypefun mp_limb_t mpn_divrem_1 (mp_limb_t * @var{r1p}, mp_size_t @var{xsize}, mp_limb_t * @var{s2p}, mp_size_t @var{s2size}, mp_limb_t @var{s3limb})
        !          2227: Divide @{@var{s2p}, @var{s2size}@} by @var{s3limb}, and write the quotient
        !          2228: at @var{r1p}.  Return the remainder.
        !          2229:
        !          2230: In addition to an integer quotient, @var{xsize} fraction limbs are developed,
        !          2231: and stored after the integral limbs.  For most usages, @var{xsize} will be
        !          2232: zero.
        !          2233:
        !          2234: The areas at @var{r1p} and @var{s2p} have to be identical or completely
        !          2235: separate, not partially overlapping.
        !          2236: @end deftypefun
        !          2237:
        !          2238: @deftypefun mp_size_t mpn_divmod (mp_limb_t * @var{r1p}, mp_limb_t * @var{rs2p}, mp_size_t @var{rs2size}, const mp_limb_t * @var{s3p}, mp_size_t @var{s3size})
        !          2239: @strong{This interface is obsolete.  It will disappear from future releases.
        !          2240: Use @code{mpn_divrem} in its stead.}
        !          2241: @end deftypefun
        !          2242:
        !          2243: @deftypefun mp_limb_t mpn_divmod_1 (mp_limb_t * @var{r1p}, mp_limb_t * @var{s2p}, mp_size_t @var{s2size}, mp_limb_t @var{s3limb})
        !          2244: @strong{This interface is obsolete.  It will disappear from future releases.
        !          2245: Use @code{mpn_divrem_1} in its stead.}
        !          2246: @end deftypefun
        !          2247:
        !          2248: @deftypefun mp_limb_t mpn_mod_1 (mp_limb_t * @var{s1p}, mp_size_t @var{s1size}, mp_limb_t @var{s2limb})
        !          2249: Divide @{@var{s1p}, @var{s1size}@} by @var{s2limb}, and return the remainder.
        !          2250: @end deftypefun
        !          2251:
        !          2252: @deftypefun mp_limb_t mpn_preinv_mod_1 (mp_limb_t * @var{s1p}, mp_size_t @var{s1size}, mp_limb_t @var{s2limb}, mp_limb_t @var{s3limb})
        !          2253: @strong{This interface is obsolete.  It will disappear from future releases.
        !          2254: Use @code{mpn_mod_1} in its stead.}
        !          2255: @end deftypefun
        !          2256:
        !          2257: @deftypefun mp_limb_t mpn_bdivmod (mp_limb_t * @var{dest_ptr}, mp_limb_t * @var{s1p}, mp_size_t @var{s1size}, const mp_limb_t * @var{s2p}, mp_size_t @var{s2size}, unsigned long int @var{d})
        !          2258: The function puts the low [@var{d}/@var{BITS_PER_MP_LIMB}] limbs of
        !          2259: @var{q} =
        !          2260: @{@var{s1p}, @var{s1size}@}/@{@var{s2p}, @var{s2size}@}
        !          2261: mod 2^@var{d}
        !          2262: at @var{dest_ptr},
        !          2263: and returns the high @var{d} mod @var{BITS_PER_MP_LIMB} bits of @var{q}.
        !          2264:
        !          2265: @{@var{s1p}, @var{s1size}@} - @var{q} * @{@var{s2p}, @var{s2size}@}
        !          2266: mod 2^(@var{s1size}*@var{BITS_PER_MP_LIMB})
        !          2267: is placed at @var{s1p}.
        !          2268: Since the low [@var{d}/@var{BITS_PER_MP_LIMB}] limbs of
        !          2269: this difference are zero, it is possible to overwrite the low limbs at
        !          2270: @var{s1p} with this difference,
        !          2271: provided @var{dest_ptr} <= @var{s1p}.
        !          2272:
        !          2273: This function requires that @var{s1size} * @var{BITS_PER_MP_LIMB} >= @var{D},
        !          2274: and that @{@var{s2p}, @var{s2size}@} is odd.
        !          2275:
        !          2276: @strong{This interface is preliminary.  It might change incompatibly in
        !          2277: future revisions.}
        !          2278: @end deftypefun
        !          2279:
        !          2280: @deftypefun mp_limb_t mpn_lshift (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src_ptr}, mp_size_t @var{src_size}, unsigned long int @var{count})
        !          2281: Shift @{@var{src_ptr}, @var{src_size}@} @var{count} bits to the left, and
        !          2282: write the @var{src_size} least significant limbs of the result to
        !          2283: @var{dest_ptr}.  @var{count} might be in the range 1 to n @minus{} 1, on an
        !          2284: n-bit machine. The bits shifted out to the left are returned.
        !          2285:
        !          2286: Overlapping of the destination space and the source space is allowed in this
        !          2287: function, provided @var{dest_ptr} >= @var{src_ptr}.
        !          2288:
        !          2289: This function is written in assembly for most targets.
        !          2290: @end deftypefun
        !          2291:
        !          2292: @deftypefun mp_limp_t mpn_rshift (mp_limb_t * @var{dest_ptr}, const mp_limb_t * @var{src_ptr}, mp_size_t @var{src_size}, unsigned long int @var{count})
        !          2293: Shift @{@var{src_ptr}, @var{src_size}@} @var{count} bits to the right, and
        !          2294: write the @var{src_size} most significant limbs of the result to
        !          2295: @var{dest_ptr}.  @var{count} might be in the range 1 to n @minus{} 1, on an
        !          2296: n-bit machine.  The bits shifted out to the right are returned.
        !          2297:
        !          2298: Overlapping of the destination space and the source space is allowed in this
        !          2299: function, provided @var{dest_ptr} <= @var{src_ptr}.
        !          2300:
        !          2301: This function is written in assembly for most targets.
        !          2302: @end deftypefun
        !          2303:
        !          2304: @deftypefun int mpn_cmp (const mp_limb_t * @var{src1_ptr}, const mp_limb_t * @var{src2_ptr}, mp_size_t @var{size})
        !          2305: Compare @{@var{src1_ptr}, @var{size}@} and @{@var{src2_ptr}, @var{size}@} and
        !          2306: return a positive value if src1 > src2, 0 of they are equal, and a negative
        !          2307: value if src1 < src2.
        !          2308: @end deftypefun
        !          2309:
        !          2310: @deftypefun mp_size_t mpn_gcd (mp_limb_t * @var{dest_ptr}, mp_limb_t * @var{src1_ptr}, mp_size_t @var{src1_size}, mp_limb_t * @var{src2_ptr}, mp_size_t @var{src2_size})
        !          2311: Puts at @var{dest_ptr} the greatest common divisor of @{@var{src1_ptr},
        !          2312: @var{src1_size}@} and @{@var{src2_ptr}, @var{src2_size}@}; both source
        !          2313: operands are destroyed by the operation.  The size in limbs of the greatest
        !          2314: common divisor is returned.
        !          2315:
        !          2316: @{@var{src1_ptr}, @var{src1_size}@} must be odd, and @{@var{src2_ptr},
        !          2317: @var{src2_size}@} must have at least as many bits as @{@var{src1_ptr},
        !          2318: @var{src1_size}@}.
        !          2319:
        !          2320: @strong{This interface is preliminary.  It might change incompatibly in
        !          2321: future revisions.}
        !          2322: @end deftypefun
        !          2323:
        !          2324: @deftypefun mp_limb_t mpn_gcd_1 (const mp_limb_t * @var{src1_ptr}, mp_size_t @var{src1_size}, mp_limb_t @var{src2_limb})
        !          2325: Return the greatest common divisor of @{@var{src1_ptr}, @var{src1_size}@}
        !          2326: and @var{src2_limb}, where @var{src2_limb} (as well as @var{src1_size})
        !          2327: must be different from 0.
        !          2328: @end deftypefun
        !          2329:
        !          2330: @deftypefun mp_size_t mpn_gcdext (mp_limb_t * @var{r1p}, mp_limb_t * @var{r2p}, mp_limb_t * @var{s1p}, mp_size_t @var{s1size}, mp_limb_t * @var{s2p}, mp_size_t @var{s2size})
        !          2331: Puts at @var{r1p} the greatest common divisor of @{@var{s1p}, @var{s1size}@}
        !          2332: and @{@var{s2p}, @var{s2size}@}.  The first cofactor is written at
        !          2333: @var{r2p}.  Both source operands are destroyed by the operation.  The size
        !          2334: in limbs of the greatest common divisor is returned.
        !          2335:
        !          2336: @strong{This interface is preliminary.  It might change incompatibly in
        !          2337: future revisions.}
        !          2338: @end deftypefun
        !          2339:
        !          2340: @deftypefun mp_size_t mpn_sqrtrem (mp_limb_t * @var{r1p}, mp_limb_t * @var{r2p}, const mp_limb_t * @var{sp}, mp_size_t @var{size})
        !          2341: Compute the square root of @{@var{sp}, @var{size}@} and put the result at
        !          2342: @var{r1p}.  Write the remainder at @var{r2p}, unless @var{r2p} is NULL.
        !          2343:
        !          2344: Return the size of the remainder, whether @var{r2p} was NULL or non-NULL.
        !          2345: Iff the operand was a perfect square, the return value will be 0.
        !          2346:
        !          2347: The areas at @var{r1p} and @var{sp} have to be distinct.  The areas at
        !          2348: @var{r2p} and @var{sp} have to be identical or completely separate, not
        !          2349: partially overlapping.
        !          2350:
        !          2351: @ifinfo
        !          2352: The area at @var{r1p} needs to have space for ceil(@var{size}/2) limbs.
        !          2353: @end ifinfo
        !          2354: @iftex
        !          2355: @tex
        !          2356: The area at @var{r1p} needs to have space for $\lceil@var{size}/2\rceil$ limbs.
        !          2357: @end tex
        !          2358: @end iftex
        !          2359: The area at @var{r2p} needs to be @var{size} limbs large.
        !          2360:
        !          2361: @strong{This interface is preliminary.  It might change incompatibly in
        !          2362: future revisions.}
        !          2363: @end deftypefun
        !          2364:
        !          2365: @deftypefun mp_size_t mpn_get_str (unsigned char *@var{str}, int @var{base}, mp_limb_t * @var{s1p}, mp_size_t @var{s1size})
        !          2366: Convert @{@var{s1p}, @var{s1size}@} to a raw unsigned char array in base
        !          2367: @var{base}.  The string is not in ASCII; to convert it to printable format,
        !          2368: add the ASCII codes for @samp{0} or @samp{A}, depending on the base and
        !          2369: range.  There may be leading zeros in the string.
        !          2370:
        !          2371: The area at @var{s1p} is clobbered.
        !          2372:
        !          2373: Return the number of characters in @var{str}.
        !          2374:
        !          2375: The area at @var{str} has to have space for the largest possible number
        !          2376: represented by a @var{s1size} long limb array, plus one extra character.
        !          2377: @end deftypefun
        !          2378:
        !          2379: @deftypefun mp_size_t mpn_set_str (mp_limb_t * @var{r1p}, const char *@var{str}, size_t {strsize}, int @var{base})
        !          2380: Convert the raw unsigned char array at @var{str} of length @var{strsize} to
        !          2381: a limb array @{@var{s1p}, @var{s1size}@}.  The base of @var{str} is
        !          2382: @var{base}.
        !          2383:
        !          2384: Return the number of limbs stored in @var{r1p}.
        !          2385: @end deftypefun
        !          2386:
        !          2387: @deftypefun {unsigned long int} mpn_scan0 (const mp_limb_t * @var{s1p}, unsigned long int @var{bit})
        !          2388: Scan @var{s1p} from bit position @var{bit} for the next clear bit.
        !          2389:
        !          2390: It is required that there be a clear bit within the area at @var{s1p} at or
        !          2391: beyond bit position @var{bit}, so that the function has something to return.
        !          2392:
        !          2393: @strong{This interface is preliminary.  It might change incompatibly in
        !          2394: future revisions.}
        !          2395: @end deftypefun
        !          2396:
        !          2397: @deftypefun {unsigned long int} mpn_scan1 (const mp_limb_t * @var{s1p}, unsigned long int @var{bit})
        !          2398: Scan @var{s1p} from bit position @var{bit} for the next set bit.
        !          2399:
        !          2400: It is required that there be a set bit within the area at @var{s1p} at or
        !          2401: beyond bit position @var{bit}, so that the function has something to return.
        !          2402:
        !          2403: @strong{This interface is preliminary.  It might change incompatibly in
        !          2404: future revisions.}
        !          2405: @end deftypefun
        !          2406:
        !          2407: @deftypefun void mpn_random2 (mp_limb_t * @var{r1p}, mp_size_t @var{r1size})
        !          2408: Generate a random number of length @var{r1size} with long strings of zeros
        !          2409: and ones in the binary representation, and store it at @var{r1p}.
        !          2410:
        !          2411: The generated random numbers are intended for testing the correctness of the
        !          2412: implementation of the @code{mpn} routines.
        !          2413: @end deftypefun
        !          2414:
        !          2415: @deftypefun {unsigned long int} mpn_popcount (const mp_limb_t * @var{s1p}, unsigned long int @var{size})
        !          2416: Count the number of set bits in @{@var{s1p}, @var{size}@}.
        !          2417: @end deftypefun
        !          2418:
        !          2419: @deftypefun {unsigned long int} mpn_hamdist (const mp_limb_t * @var{s1p}, const mp_limb_t * @var{s2p}, unsigned long int @var{size})
        !          2420: Compute the hamming distance between @{@var{s1p}, @var{size}@} and
        !          2421: @{@var{s2p}, @var{size}@}.
        !          2422: @end deftypefun
        !          2423:
        !          2424: @deftypefun int mpn_perfect_square_p (const mp_limb_t * @var{s1p}, mp_size_t @var{size})
        !          2425: Return non-zero iff @{@var{s1p}, @var{size}@} is a perfect square.
        !          2426: @end deftypefun
        !          2427:
        !          2428:
        !          2429: @node BSD Compatible Functions, Custom Allocation, Low-level Functions, Top
        !          2430: @comment  node-name,  next,  previous,  up
        !          2431: @chapter Berkeley MP Compatible Functions
        !          2432: @cindex BSD MP compatible functions
        !          2433:
        !          2434: These functions are intended to be fully compatible with the Berkeley MP
        !          2435: library which is available on many BSD derived U*ix systems.
        !          2436:
        !          2437: The original Berkeley MP library has a usage restriction: you cannot use the
        !          2438: same variable as both source and destination in a single function call.  The
        !          2439: compatible functions in GNU MP do not share this restriction---inputs and
        !          2440: outputs may overlap.
        !          2441:
        !          2442: It is not recommended that new programs are written using these functions.
        !          2443: Apart from the incomplete set of functions, the interface for initializing
        !          2444: @code{MINT} objects is more error prone, and the @code{pow} function collides
        !          2445: with @code{pow} in @file{libm.a}.
        !          2446:
        !          2447: @cindex @file{mp.h}
        !          2448: Include the header @file{mp.h} to get the definition of the necessary types
        !          2449: and functions.  If you are on a BSD derived system, make sure to include GNU
        !          2450: @file{mp.h} if you are going to link the GNU @file{libmp.a} to you program.
        !          2451: This means that you probably need to give the -I<dir> option to the compiler,
        !          2452: where <dir> is the directory where you have GNU @file{mp.h}.
        !          2453:
        !          2454: @deftypefun {MINT *} itom (signed short int @var{initial_value})
        !          2455: Allocate an integer consisting of a @code{MINT} object and dynamic limb space.
        !          2456: Initialize the integer to @var{initial_value}.  Return a pointer to the
        !          2457: @code{MINT} object.
        !          2458: @end deftypefun
        !          2459:
        !          2460: @deftypefun {MINT *} xtom (char *@var{initial_value})
        !          2461: Allocate an integer consisting of a @code{MINT} object and dynamic limb space.
        !          2462: Initialize the integer from @var{initial_value}, a hexadecimal, '\0'-terminate
        !          2463: C string.  Return a pointer to the @code{MINT} object.
        !          2464: @end deftypefun
        !          2465:
        !          2466: @deftypefun void move (MINT *@var{src}, MINT *@var{dest})
        !          2467: Set @var{dest} to @var{src} by copying.  Both variables must be previously
        !          2468: initialized.
        !          2469: @end deftypefun
        !          2470:
        !          2471: @deftypefun void madd (MINT *@var{src_1}, MINT *@var{src_2}, MINT *@var{destination})
        !          2472: Add @var{src_1} and @var{src_2} and put the sum in @var{destination}.
        !          2473: @end deftypefun
        !          2474:
        !          2475: @deftypefun void msub (MINT *@var{src_1}, MINT *@var{src_2}, MINT *@var{destination})
        !          2476: Subtract @var{src_2} from @var{src_1} and put the difference in
        !          2477: @var{destination}.
        !          2478: @end deftypefun
        !          2479:
        !          2480: @deftypefun void mult (MINT *@var{src_1}, MINT *@var{src_2}, MINT *@var{destination})
        !          2481: Multiply @var{src_1} and @var{src_2} and put the product in
        !          2482: @var{destination}.
        !          2483: @end deftypefun
        !          2484:
        !          2485: @deftypefun void mdiv (MINT *@var{dividend}, MINT *@var{divisor}, MINT *@var{quotient}, MINT *@var{remainder})
        !          2486: @deftypefunx void sdiv (MINT *@var{dividend}, signed short int @var{divisor}, MINT *@var{quotient}, signed short int *@var{remainder})
        !          2487: Set @var{quotient} to @var{dividend}/@var{divisor}, and @var{remainder} to
        !          2488: @var{dividend} mod @var{divisor}.  The quotient is rounded towards zero; the
        !          2489: remainder has the same sign as the dividend unless it is zero.
        !          2490:
        !          2491: Some implementations of these functions work differently---or not at all---for
        !          2492: negative arguments.
        !          2493: @end deftypefun
        !          2494:
        !          2495: @deftypefun void msqrt (MINT *@var{operand}, MINT *@var{root}, MINT *@var{remainder})
        !          2496: @ifinfo
        !          2497: Set @var{root} to the truncated integer part of the square root of
        !          2498: @var{operand}.  Set @var{remainder} to
        !          2499: @var{operand}@minus{}@var{root}*@var{root},
        !          2500: @end ifinfo
        !          2501: @iftex
        !          2502: @tex
        !          2503: Set @var{root} to $\lfloor\sqrt{@var{operand}}\rfloor$, like
        !          2504: @code{mpz_sqrt}.  Set @var{remainder} to $(operand - root^2)$,
        !          2505: @end tex
        !          2506: @end iftex
        !          2507: (i.e., zero if @var{operand} is a perfect square).
        !          2508:
        !          2509: If @var{root} and @var{remainder} are the same variable, the results are
        !          2510: undefined.
        !          2511: @end deftypefun
        !          2512:
        !          2513: @deftypefun void pow (MINT *@var{base}, MINT *@var{exp}, MINT *@var{mod}, MINT *@var{dest})
        !          2514: Set @var{dest} to (@var{base} raised to @var{exp}) modulo @var{mod}.
        !          2515: @end deftypefun
        !          2516:
        !          2517: @deftypefun void rpow (MINT *@var{base}, signed short int @var{exp}, MINT *@var{dest})
        !          2518: Set @var{dest} to @var{base} raised to @var{exp}.
        !          2519: @end deftypefun
        !          2520:
        !          2521: @deftypefun void gcd (MINT *@var{operand1}, MINT *@var{operand2}, MINT *@var{res})
        !          2522: Set @var{res} to the greatest common divisor of @var{operand1} and
        !          2523: @var{operand2}.
        !          2524: @end deftypefun
        !          2525:
        !          2526: @deftypefun int mcmp (MINT *@var{operand1}, MINT *@var{operand2})
        !          2527: Compare @var{operand1} and @var{operand2}.  Return a positive value if
        !          2528: @var{operand1} > @var{operand2}, zero if @var{operand1} =
        !          2529: @var{operand2}, and a negative value if @var{operand1} < @var{operand2}.
        !          2530: @end deftypefun
        !          2531:
        !          2532: @deftypefun void min (MINT *@var{dest})
        !          2533: Input a decimal string from @code{stdin}, and put the read integer in
        !          2534: @var{dest}.  SPC and TAB are allowed in the number string, and are ignored.
        !          2535: @end deftypefun
        !          2536:
        !          2537: @deftypefun void mout (MINT *@var{src})
        !          2538: Output @var{src} to @code{stdout}, as a decimal string.  Also output a newline.
        !          2539: @end deftypefun
        !          2540:
        !          2541: @deftypefun {char *} mtox (MINT *@var{operand})
        !          2542: Convert @var{operand} to a hexadecimal string, and return a pointer to the
        !          2543: string.  The returned string is allocated using the default memory allocation
        !          2544: function, @code{malloc} by default.
        !          2545: @end deftypefun
        !          2546:
        !          2547: @deftypefun void mfree (MINT *@var{operand})
        !          2548: De-allocate, the space used by @var{operand}.  @strong{This function should
        !          2549: only be passed a value returned by @code{itom} or @code{xtom}.}
        !          2550: @end deftypefun
        !          2551:
        !          2552: @node Custom Allocation, Contributors, BSD Compatible Functions, Top
        !          2553: @comment  node-name,  next,  previous,  up
        !          2554: @chapter Custom Allocation
        !          2555:
        !          2556: By default, the MP functions use @code{malloc}, @code{realloc}, and
        !          2557: @code{free} for memory allocation.  If @code{malloc} or @code{realloc} fails,
        !          2558: the MP library terminates execution after printing a fatal error message to
        !          2559: standard error.
        !          2560:
        !          2561: For some applications, you may wish to allocate memory in other ways, or you
        !          2562: may not want to have a fatal error when there is no more memory available.  To
        !          2563: accomplish this, you can specify alternative memory allocation functions.
        !          2564:
        !          2565: @deftypefun void mp_set_memory_functions (@* void *(*@var{alloc_func_ptr}) (size_t), @* void *(*@var{realloc_func_ptr}) (void *, size_t, size_t), @* void (*@var{free_func_ptr}) (void *, size_t))
        !          2566: Replace the current allocation functions from the arguments.  If an argument
        !          2567: is NULL, the corresponding default function is retained.
        !          2568:
        !          2569: @strong{Make sure to call this function in such a way that there are no active
        !          2570: MP objects that were allocated using the previously active allocation
        !          2571: function!  Usually, that means that you have to call this function before any
        !          2572: other MP function.}
        !          2573: @end deftypefun
        !          2574:
        !          2575: The functions you supply should fit the following declarations:
        !          2576:
        !          2577: @deftypefun {void *} allocate_function (size_t @var{alloc_size})
        !          2578: This function should return a pointer to newly allocated space with at least
        !          2579: @var{alloc_size} storage units.
        !          2580: @end deftypefun
        !          2581:
        !          2582: @deftypefun {void *} reallocate_function (void *@var{ptr}, size_t @var{old_size}, size_t @var{new_size})
        !          2583: This function should return a pointer to newly allocated space of at least
        !          2584: @var{new_size} storage units, after copying at least the first @var{old_size}
        !          2585: storage units from @var{ptr}.  It should also de-allocate the space at
        !          2586: @var{ptr}.
        !          2587:
        !          2588: You can assume that the space at @var{ptr} was formerly returned from
        !          2589: @code{allocate_function} or @code{reallocate_function}, for a request for
        !          2590: @var{old_size} storage units.
        !          2591: @end deftypefun
        !          2592:
        !          2593: @deftypefun void deallocate_function (void *@var{ptr}, size_t @var{size})
        !          2594: De-allocate the space pointed to by @var{ptr}.
        !          2595:
        !          2596: You can assume that the space at @var{ptr} was formerly returned from
        !          2597: @code{allocate_function} or @code{reallocate_function}, for a request for
        !          2598: @var{size} storage units.
        !          2599: @end deftypefun
        !          2600:
        !          2601: (A @dfn{storage unit} is the unit in which the @code{sizeof} operator returns
        !          2602: the size of an object, normally an 8 bit byte.)
        !          2603:
        !          2604:
        !          2605: @node Contributors, References, Custom Allocation, Top
        !          2606: @comment  node-name,  next,  previous,  up
        !          2607: @unnumbered Contributors
        !          2608:
        !          2609: I would like to thank Gunnar Sjoedin and Hans Riesel for their help with
        !          2610: mathematical problems, Richard Stallman for his help with design issues and
        !          2611: for revising the first version of this manual, Brian Beuning and Doug Lea for
        !          2612: their testing of early versions of the library.
        !          2613:
        !          2614: John Amanatides of York University in Canada contributed the function
        !          2615: @code{mpz_probab_prime_p}.
        !          2616:
        !          2617: Paul Zimmermann of Inria sparked the development of GMP 2, with his
        !          2618: comparisons between bignum packages.
        !          2619:
        !          2620: Ken Weber (Kent State University, Universidade Federal do Rio Grande do Sul)
        !          2621: contributed @code{mpz_gcd}, @code{mpz_divexact}, @code{mpn_gcd}, and
        !          2622: @code{mpn_bdivmod}, partially supported by CNPq (Brazil) grant 301314194-2.
        !          2623:
        !          2624: Per Bothner of Cygnus Support helped to set up MP to use Cygnus' configure.
        !          2625: He has also made valuable suggestions and tested numerous intermediary
        !          2626: releases.
        !          2627:
        !          2628: Joachim Hollman was involved in the design of the @code{mpf} interface, and in
        !          2629: the @code{mpz} design revisions for version 2.
        !          2630:
        !          2631: Bennet Yee contributed the functions @code{mpz_jacobi} and
        !          2632: @code{mpz_legendre}.
        !          2633:
        !          2634: Andreas Schwab contributed the files @file{mpn/m68k/lshift.S} and
        !          2635: @file{mpn/m68k/rshift.S}.
        !          2636:
        !          2637: The development of floating point functions of GNU MP 2, were supported in
        !          2638: part by the ESPRIT-BRA (Basic Research Activities) 6846 project POSSO
        !          2639: (POlynomial System SOlving).
        !          2640:
        !          2641: GNU MP 2 was finished and released by TMG Datakonsult, Sodermannagatan 5, 116
        !          2642: 23 STOCKHOLM, SWEDEN, in cooperation with the IDA Center for Computing
        !          2643: Sciences, USA.
        !          2644:
        !          2645:
        !          2646: @node References, , Contributors, Top
        !          2647: @comment  node-name,  next,  previous,  up
        !          2648: @unnumbered References
        !          2649:
        !          2650: @itemize @bullet
        !          2651:
        !          2652: @item
        !          2653: Donald E. Knuth, "The Art of Computer Programming", vol 2,
        !          2654: "Seminumerical Algorithms", 2nd edition, Addison-Wesley, 1981.
        !          2655:
        !          2656: @item
        !          2657: John D. Lipson, "Elements of Algebra and Algebraic Computing",
        !          2658: The Benjamin Cummings Publishing Company Inc, 1981.
        !          2659:
        !          2660: @item
        !          2661: Richard M. Stallman, "Using and Porting GCC", Free Software Foundation,
        !          2662: 1995.
        !          2663:
        !          2664: @item
        !          2665: Peter L. Montgomery, "Modular Multiplication Without Trial Division", in
        !          2666: Mathematics of Computation, volume 44, number 170, April 1985.
        !          2667:
        !          2668: @item
        !          2669: Torbjorn Granlund and Peter L. Montgomery, "Division by Invariant
        !          2670: Integers using Multiplication", in Proceedings of the SIGPLAN
        !          2671: PLDI'94 Conference, June 1994.
        !          2672:
        !          2673: @item
        !          2674: Tudor Jebelean,
        !          2675: "An algorithm for exact division",
        !          2676: Journal of Symbolic Computation,
        !          2677: v. 15, 1993, pp. 169-180.
        !          2678:
        !          2679: @item
        !          2680: Kenneth Weber, "The accelerated integer GCD algorithm",
        !          2681: ACM Transactions on Mathematical Software,
        !          2682: v. 21 (March), 1995, pp. 111-122.
        !          2683: @end itemize
        !          2684:
        !          2685: @node Concept Index, , , Top
        !          2686: @comment  node-name,  next,  previous,  up
        !          2687: @unnumbered Concept Index
        !          2688: @printindex cp
        !          2689:
        !          2690: @node Function Index, , , Top
        !          2691: @comment  node-name,  next,  previous,  up
        !          2692: @unnumbered Function and Type Index
        !          2693: @printindex fn
        !          2694:
        !          2695:
        !          2696: @contents
        !          2697: @bye

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>