This is ../../gmp/doc/gmp.info, produced by makeinfo version 4.8 from
../../gmp/doc/gmp.texi.

   This manual describes how to install and use the GNU multiple
precision arithmetic library, version 6.1.1.

   Copyright 1991, 1993-2016 Free Software Foundation, Inc.

   Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, Version
1.3 or any later version published by the Free Software Foundation;
with no Invariant Sections, with the Front-Cover Texts being "A GNU
Manual", and with the Back-Cover Texts being "You have freedom to copy
and modify this GNU Manual, like GNU software".  A copy of the license
is included in *Note GNU Free Documentation License::.

INFO-DIR-SECTION GNU libraries
START-INFO-DIR-ENTRY
* gmp: (gmp).                   GNU Multiple Precision Arithmetic Library.
END-INFO-DIR-ENTRY


File: gmp.info,  Node: Top,  Next: Copying,  Prev: (dir),  Up: (dir)

GNU MP
******

   This manual describes how to install and use the GNU multiple
precision arithmetic library, version 6.1.1.

   Copyright 1991, 1993-2016 Free Software Foundation, Inc.

   Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, Version
1.3 or any later version published by the Free Software Foundation;
with no Invariant Sections, with the Front-Cover Texts being "A GNU
Manual", and with the Back-Cover Texts being "You have freedom to copy
and modify this GNU Manual, like GNU software".  A copy of the license
is included in *Note GNU Free Documentation License::.


* Menu:

* Copying::                    GMP Copying Conditions (LGPL).
* Introduction to GMP::        Brief introduction to GNU MP.
* Installing GMP::             How to configure and compile the GMP library.
* GMP Basics::                 What every GMP user should know.
* Reporting Bugs::             How to usefully report bugs.
* Integer Functions::          Functions for arithmetic on signed integers.
* Rational Number Functions::  Functions for arithmetic on rational numbers.
* Floating-point Functions::   Functions for arithmetic on floats.
* Low-level Functions::        Fast functions for natural numbers.
* Random Number Functions::    Functions for generating random numbers.
* Formatted Output::           `printf' style output.
* Formatted Input::            `scanf' style input.
* C++ Class Interface::        Class wrappers around GMP types.
* Custom Allocation::          How to customize the internal allocation.
* Language Bindings::          Using GMP from other languages.
* Algorithms::                 What happens behind the scenes.
* Internals::                  How values are represented behind the scenes.

* Contributors::               Who brings you this library?
* References::                 Some useful papers and books to read.
* GNU Free Documentation License::
* Concept Index::
* Function Index::


File: gmp.info,  Node: Copying,  Next: Introduction to GMP,  Prev: Top,  Up: Top

GNU MP Copying Conditions
*************************

This library is "free"; this means that everyone is free to use it and
free to redistribute it on a free basis.  The library is not in the
public domain; it is copyrighted and there are restrictions on its
distribution, but these restrictions are designed to permit everything
that a good cooperating citizen would want to do.  What is not allowed
is to try to prevent others from further sharing any version of this
library that they might get from you.

   Specifically, we want to make sure that you have the right to give
away copies of the library, that you receive source code or else can
get it if you want it, that you can change this library or use pieces
of it in new free programs, and that you know you can do these things.

   To make sure that everyone has such rights, we have to forbid you to
deprive anyone else of these rights.  For example, if you distribute
copies of the GNU MP library, you must give the recipients all the
rights that you have.  You must make sure that they, too, receive or
can get the source code.  And you must tell them their rights.

   Also, for our own protection, we must make certain that everyone
finds out that there is no warranty for the GNU MP library.  If it is
modified by someone else and passed on, we want their recipients to
know that what they have is not what we distributed, so that any
problems introduced by others will not reflect on our reputation.

   More precisely, the GNU MP library is dual licensed, under the
conditions of the GNU Lesser General Public License version 3 (see
`COPYING.LESSERv3'), or the GNU General Public License version 2 (see
`COPYINGv2'). This is the recipient's choice, and the recipient also has
the additional option of applying later versions of these licenses. (The
reason for this dual licensing is to make it possible to use the
library with programs which are licensed under GPL version 2, but which
for historical or other reasons do not allow use under later versions
of the GPL).

   Programs which are not part of the library itself, such as
demonstration programs and the GMP testsuite, are licensed under the
terms of the GNU General Public License version 3 (see `COPYINGv3'), or
any later version.


File: gmp.info,  Node: Introduction to GMP,  Next: Installing GMP,  Prev: Copying,  Up: Top

1 Introduction to GNU MP
************************

GNU MP is a portable library written in C for arbitrary precision
arithmetic on integers, rational numbers, and floating-point numbers.
It aims to provide the fastest possible arithmetic for all applications
that need higher precision than is directly supported by the basic C
types.

   Many applications use just a few hundred bits of precision; but some
applications may need thousands or even millions of bits.  GMP is
designed to give good performance for both, by choosing algorithms
based on the sizes of the operands, and by carefully keeping the
overhead at a minimum.

   The speed of GMP is achieved by using fullwords as the basic
arithmetic type, by using sophisticated algorithms, by including
carefully optimized assembly code for the most common inner loops for
many different CPUs, and by a general emphasis on speed (as opposed to
simplicity or elegance).

   There is assembly code for these CPUs: ARM Cortex-A9, Cortex-A15,
and generic ARM, DEC Alpha 21064, 21164, and 21264, AMD K8 and K10
(sold under many brands, e.g. Athlon64, Phenom, Opteron) Bulldozer, and
Bobcat, Intel Pentium, Pentium Pro/II/III, Pentium 4, Core2, Nehalem,
Sandy bridge, Haswell, generic x86, Intel IA-64, Motorola/IBM PowerPC
32 and 64 such as POWER970, POWER5, POWER6, and POWER7, MIPS 32-bit and
64-bit, SPARC 32-bit ad 64-bit with special support for all UltraSPARC
models.  There is also assembly code for many obsolete CPUs.

For up-to-date information on GMP, please see the GMP web pages at

     `https://gmplib.org/'

The latest version of the library is available at

     `https://ftp.gnu.org/gnu/gmp/'

   Many sites around the world mirror `ftp.gnu.org', please use a mirror
near you, see `https://www.gnu.org/order/ftp.html' for a full list.

   There are three public mailing lists of interest.  One for release
announcements, one for general questions and discussions about usage of
the GMP library and one for bug reports.  For more information, see

     `https://gmplib.org/mailman/listinfo/'.

   The proper place for bug reports is <gmp-bugs@gmplib.org>.  See
*Note Reporting Bugs:: for information about reporting bugs.


1.1 How to use this Manual
==========================

Everyone should read *Note GMP Basics::.  If you need to install the
library yourself, then read *Note Installing GMP::.  If you have a
system with multiple ABIs, then read *Note ABI and ISA::, for the
compiler options that must be used on applications.

   The rest of the manual can be used for later reference, although it
is probably a good idea to glance through it.


File: gmp.info,  Node: Installing GMP,  Next: GMP Basics,  Prev: Introduction to GMP,  Up: Top

2 Installing GMP
****************

GMP has an autoconf/automake/libtool based configuration system.  On a
Unix-like system a basic build can be done with

     ./configure
     make

Some self-tests can be run with

     make check

And you can install (under `/usr/local' by default) with

     make install

   If you experience problems, please report them to
<gmp-bugs@gmplib.org>.  See *Note Reporting Bugs::, for information on
what to include in useful bug reports.

* Menu:

* Build Options::
* ABI and ISA::
* Notes for Package Builds::
* Notes for Particular Systems::
* Known Build Problems::
* Performance optimization::


File: gmp.info,  Node: Build Options,  Next: ABI and ISA,  Prev: Installing GMP,  Up: Installing GMP

2.1 Build Options
=================

All the usual autoconf configure options are available, run `./configure
--help' for a summary.  The file `INSTALL.autoconf' has some generic
installation information too.

Tools
     `configure' requires various Unix-like tools.  See *Note Notes for
     Particular Systems::, for some options on non-Unix systems.

     It might be possible to build without the help of `configure',
     certainly all the code is there, but unfortunately you'll be on
     your own.

Build Directory
     To compile in a separate build directory, `cd' to that directory,
     and prefix the configure command with the path to the GMP source
     directory.  For example

          cd /my/build/dir
          /my/sources/gmp-6.1.1/configure

     Not all `make' programs have the necessary features (`VPATH') to
     support this.  In particular, SunOS and Slowaris `make' have bugs
     that make them unable to build in a separate directory.  Use GNU
     `make' instead.

`--prefix' and `--exec-prefix'
     The `--prefix' option can be used in the normal way to direct GMP
     to install under a particular tree.  The default is `/usr/local'.

     `--exec-prefix' can be used to direct architecture-dependent files
     like `libgmp.a' to a different location.  This can be used to share
     architecture-independent parts like the documentation, but
     separate the dependent parts.  Note however that `gmp.h' and
     `mp.h' are architecture-dependent since they encode certain
     aspects of `libgmp', so it will be necessary to ensure both
     `$prefix/include' and `$exec_prefix/include' are available to the
     compiler.

`--disable-shared', `--disable-static'
     By default both shared and static libraries are built (where
     possible), but one or other can be disabled.  Shared libraries
     result in smaller executables and permit code sharing between
     separate running processes, but on some CPUs are slightly slower,
     having a small cost on each function call.

Native Compilation, `--build=CPU-VENDOR-OS'
     For normal native compilation, the system can be specified with
     `--build'.  By default `./configure' uses the output from running
     `./config.guess'.  On some systems `./config.guess' can determine
     the exact CPU type, on others it will be necessary to give it
     explicitly.  For example,

          ./configure --build=ultrasparc-sun-solaris2.7

     In all cases the `OS' part is important, since it controls how
     libtool generates shared libraries.  Running `./config.guess' is
     the simplest way to see what it should be, if you don't know
     already.

Cross Compilation, `--host=CPU-VENDOR-OS'
     When cross-compiling, the system used for compiling is given by
     `--build' and the system where the library will run is given by
     `--host'.  For example when using a FreeBSD Athlon system to build
     GNU/Linux m68k binaries,

          ./configure --build=athlon-pc-freebsd3.5 --host=m68k-mac-linux-gnu

     Compiler tools are sought first with the host system type as a
     prefix.  For example `m68k-mac-linux-gnu-ranlib' is tried, then
     plain `ranlib'.  This makes it possible for a set of
     cross-compiling tools to co-exist with native tools.  The prefix
     is the argument to `--host', and this can be an alias, such as
     `m68k-linux'.  But note that tools don't have to be setup this
     way, it's enough to just have a `PATH' with a suitable
     cross-compiling `cc' etc.

     Compiling for a different CPU in the same family as the build
     system is a form of cross-compilation, though very possibly this
     would merely be special options on a native compiler.  In any case
     `./configure' avoids depending on being able to run code on the
     build system, which is important when creating binaries for a
     newer CPU since they very possibly won't run on the build system.

     In all cases the compiler must be able to produce an executable
     (of whatever format) from a standard C `main'.  Although only
     object files will go to make up `libgmp', `./configure' uses
     linking tests for various purposes, such as determining what
     functions are available on the host system.

     Currently a warning is given unless an explicit `--build' is used
     when cross-compiling, because it may not be possible to correctly
     guess the build system type if the `PATH' has only a
     cross-compiling `cc'.

     Note that the `--target' option is not appropriate for GMP.  It's
     for use when building compiler tools, with `--host' being where
     they will run, and `--target' what they'll produce code for.
     Ordinary programs or libraries like GMP are only interested in the
     `--host' part, being where they'll run.  (Some past versions of
     GMP used `--target' incorrectly.)

CPU types
     In general, if you want a library that runs as fast as possible,
     you should configure GMP for the exact CPU type your system uses.
     However, this may mean the binaries won't run on older members of
     the family, and might run slower on other members, older or newer.
     The best idea is always to build GMP for the exact machine type
     you intend to run it on.

     The following CPUs have specific support.  See `configure.ac' for
     details of what code and compiler options they select.

        * Alpha: alpha, alphaev5, alphaev56, alphapca56, alphapca57,
          alphaev6, alphaev67, alphaev68 alphaev7

        * Cray: c90, j90, t90, sv1

        * HPPA: hppa1.0, hppa1.1, hppa2.0, hppa2.0n, hppa2.0w, hppa64

        * IA-64: ia64, itanium, itanium2

        * MIPS: mips, mips3, mips64

        * Motorola: m68k, m68000, m68010, m68020, m68030, m68040,
          m68060, m68302, m68360, m88k, m88110

        * POWER: power, power1, power2, power2sc

        * PowerPC: powerpc, powerpc64, powerpc401, powerpc403,
          powerpc405, powerpc505, powerpc601, powerpc602, powerpc603,
          powerpc603e, powerpc604, powerpc604e, powerpc620, powerpc630,
          powerpc740, powerpc7400, powerpc7450, powerpc750, powerpc801,
          powerpc821, powerpc823, powerpc860, powerpc970

        * SPARC: sparc, sparcv8, microsparc, supersparc, sparcv9,
          ultrasparc, ultrasparc2, ultrasparc2i, ultrasparc3, sparc64

        * x86 family: i386, i486, i586, pentium, pentiummmx, pentiumpro,
          pentium2, pentium3, pentium4, k6, k62, k63, athlon, amd64,
          viac3, viac32

        * Other: arm, sh, sh2, vax,

     CPUs not listed will use generic C code.

Generic C Build
     If some of the assembly code causes problems, or if otherwise
     desired, the generic C code can be selected with the configure
     `--disable-assembly'.

     Note that this will run quite slowly, but it should be portable
     and should at least make it possible to get something running if
     all else fails.

Fat binary, `--enable-fat'
     Using `--enable-fat' selects a "fat binary" build on x86, where
     optimized low level subroutines are chosen at runtime according to
     the CPU detected.  This means more code, but gives good
     performance on all x86 chips.  (This option might become available
     for more architectures in the future.)

`ABI'
     On some systems GMP supports multiple ABIs (application binary
     interfaces), meaning data type sizes and calling conventions.  By
     default GMP chooses the best ABI available, but a particular ABI
     can be selected.  For example

          ./configure --host=mips64-sgi-irix6 ABI=n32

     See *Note ABI and ISA::, for the available choices on relevant
     CPUs, and what applications need to do.

`CC', `CFLAGS'
     By default the C compiler used is chosen from among some likely
     candidates, with `gcc' normally preferred if it's present.  The
     usual `CC=whatever' can be passed to `./configure' to choose
     something different.

     For various systems, default compiler flags are set based on the
     CPU and compiler.  The usual `CFLAGS="-whatever"' can be passed to
     `./configure' to use something different or to set good flags for
     systems GMP doesn't otherwise know.

     The `CC' and `CFLAGS' used are printed during `./configure', and
     can be found in each generated `Makefile'.  This is the easiest way
     to check the defaults when considering changing or adding
     something.

     Note that when `CC' and `CFLAGS' are specified on a system
     supporting multiple ABIs it's important to give an explicit
     `ABI=whatever', since GMP can't determine the ABI just from the
     flags and won't be able to select the correct assembly code.

     If just `CC' is selected then normal default `CFLAGS' for that
     compiler will be used (if GMP recognises it).  For example
     `CC=gcc' can be used to force the use of GCC, with default flags
     (and default ABI).

`CPPFLAGS'
     Any flags like `-D' defines or `-I' includes required by the
     preprocessor should be set in `CPPFLAGS' rather than `CFLAGS'.
     Compiling is done with both `CPPFLAGS' and `CFLAGS', but
     preprocessing uses just `CPPFLAGS'.  This distinction is because
     most preprocessors won't accept all the flags the compiler does.
     Preprocessing is done separately in some configure tests.

`CC_FOR_BUILD'
     Some build-time programs are compiled and run to generate
     host-specific data tables.  `CC_FOR_BUILD' is the compiler used
     for this.  It doesn't need to be in any particular ABI or mode, it
     merely needs to generate executables that can run.  The default is
     to try the selected `CC' and some likely candidates such as `cc'
     and `gcc', looking for something that works.

     No flags are used with `CC_FOR_BUILD' because a simple invocation
     like `cc foo.c' should be enough.  If some particular options are
     required they can be included as for instance `CC_FOR_BUILD="cc
     -whatever"'.

C++ Support, `--enable-cxx'
     C++ support in GMP can be enabled with `--enable-cxx', in which
     case a C++ compiler will be required.  As a convenience
     `--enable-cxx=detect' can be used to enable C++ support only if a
     compiler can be found.  The C++ support consists of a library
     `libgmpxx.la' and header file `gmpxx.h' (*note Headers and
     Libraries::).

     A separate `libgmpxx.la' has been adopted rather than having C++
     objects within `libgmp.la' in order to ensure dynamic linked C
     programs aren't bloated by a dependency on the C++ standard
     library, and to avoid any chance that the C++ compiler could be
     required when linking plain C programs.

     `libgmpxx.la' will use certain internals from `libgmp.la' and can
     only be expected to work with `libgmp.la' from the same GMP
     version.  Future changes to the relevant internals will be
     accompanied by renaming, so a mismatch will cause unresolved
     symbols rather than perhaps mysterious misbehaviour.

     In general `libgmpxx.la' will be usable only with the C++ compiler
     that built it, since name mangling and runtime support are usually
     incompatible between different compilers.

`CXX', `CXXFLAGS'
     When C++ support is enabled, the C++ compiler and its flags can be
     set with variables `CXX' and `CXXFLAGS' in the usual way.  The
     default for `CXX' is the first compiler that works from a list of
     likely candidates, with `g++' normally preferred when available.
     The default for `CXXFLAGS' is to try `CFLAGS', `CFLAGS' without
     `-g', then for `g++' either `-g -O2' or `-O2', or for other
     compilers `-g' or nothing.  Trying `CFLAGS' this way is convenient
     when using `gcc' and `g++' together, since the flags for `gcc' will
     usually suit `g++'.

     It's important that the C and C++ compilers match, meaning their
     startup and runtime support routines are compatible and that they
     generate code in the same ABI (if there's a choice of ABIs on the
     system).  `./configure' isn't currently able to check these things
     very well itself, so for that reason `--disable-cxx' is the
     default, to avoid a build failure due to a compiler mismatch.
     Perhaps this will change in the future.

     Incidentally, it's normally not good enough to set `CXX' to the
     same as `CC'.  Although `gcc' for instance recognises `foo.cc' as
     C++ code, only `g++' will invoke the linker the right way when
     building an executable or shared library from C++ object files.

Temporary Memory, `--enable-alloca=<choice>'
     GMP allocates temporary workspace using one of the following three
     methods, which can be selected with for instance
     `--enable-alloca=malloc-reentrant'.

        * `alloca' - C library or compiler builtin.

        * `malloc-reentrant' - the heap, in a re-entrant fashion.

        * `malloc-notreentrant' - the heap, with global variables.

     For convenience, the following choices are also available.
     `--disable-alloca' is the same as `no'.

        * `yes' - a synonym for `alloca'.

        * `no' - a synonym for `malloc-reentrant'.

        * `reentrant' - `alloca' if available, otherwise
          `malloc-reentrant'.  This is the default.

        * `notreentrant' - `alloca' if available, otherwise
          `malloc-notreentrant'.

     `alloca' is reentrant and fast, and is recommended.  It actually
     allocates just small blocks on the stack; larger ones use
     malloc-reentrant.

     `malloc-reentrant' is, as the name suggests, reentrant and thread
     safe, but `malloc-notreentrant' is faster and should be used if
     reentrancy is not required.

     The two malloc methods in fact use the memory allocation functions
     selected by `mp_set_memory_functions', these being `malloc' and
     friends by default.  *Note Custom Allocation::.

     An additional choice `--enable-alloca=debug' is available, to help
     when debugging memory related problems (*note Debugging::).

FFT Multiplication, `--disable-fft'
     By default multiplications are done using Karatsuba, 3-way Toom,
     higher degree Toom, and Fermat FFT.  The FFT is only used on large
     to very large operands and can be disabled to save code size if
     desired.

Assertion Checking, `--enable-assert'
     This option enables some consistency checking within the library.
     This can be of use while debugging, *note Debugging::.

Execution Profiling, `--enable-profiling=prof/gprof/instrument'
     Enable profiling support, in one of various styles, *note
     Profiling::.

`MPN_PATH'
     Various assembly versions of each mpn subroutines are provided.
     For a given CPU, a search is made though a path to choose a
     version of each.  For example `sparcv8' has

          MPN_PATH="sparc32/v8 sparc32 generic"

     which means look first for v8 code, then plain sparc32 (which is
     v7), and finally fall back on generic C.  Knowledgeable users with
     special requirements can specify a different path.  Normally this
     is completely unnecessary.

Documentation
     The source for the document you're now reading is `doc/gmp.texi',
     in Texinfo format, see *Note Texinfo: (texinfo)Top.

     Info format `doc/gmp.info' is included in the distribution.  The
     usual automake targets are available to make PostScript, DVI, PDF
     and HTML (these will require various TeX and Texinfo tools).

     DocBook and XML can be generated by the Texinfo `makeinfo' program
     too, see *Note Options for `makeinfo': (texinfo)makeinfo options.

     Some supplementary notes can also be found in the `doc'
     subdirectory.



File: gmp.info,  Node: ABI and ISA,  Next: Notes for Package Builds,  Prev: Build Options,  Up: Installing GMP

2.2 ABI and ISA
===============

ABI (Application Binary Interface) refers to the calling conventions
between functions, meaning what registers are used and what sizes the
various C data types are.  ISA (Instruction Set Architecture) refers to
the instructions and registers a CPU has available.

   Some 64-bit ISA CPUs have both a 64-bit ABI and a 32-bit ABI
defined, the latter for compatibility with older CPUs in the family.
GMP supports some CPUs like this in both ABIs.  In fact within GMP
`ABI' means a combination of chip ABI, plus how GMP chooses to use it.
For example in some 32-bit ABIs, GMP may support a limb as either a
32-bit `long' or a 64-bit `long long'.

   By default GMP chooses the best ABI available for a given system,
and this generally gives significantly greater speed.  But an ABI can
be chosen explicitly to make GMP compatible with other libraries, or
particular application requirements.  For example,

     ./configure ABI=32

   In all cases it's vital that all object code used in a given program
is compiled for the same ABI.

   Usually a limb is implemented as a `long'.  When a `long long' limb
is used this is encoded in the generated `gmp.h'.  This is convenient
for applications, but it does mean that `gmp.h' will vary, and can't be
just copied around.  `gmp.h' remains compiler independent though, since
all compilers for a particular ABI will be expected to use the same
limb type.

   Currently no attempt is made to follow whatever conventions a system
has for installing library or header files built for a particular ABI.
This will probably only matter when installing multiple builds of GMP,
and it might be as simple as configuring with a special `libdir', or it
might require more than that.  Note that builds for different ABIs need
to done separately, with a fresh `./configure' and `make' each.


AMD64 (`x86_64')
     On AMD64 systems supporting both 32-bit and 64-bit modes for
     applications, the following ABI choices are available.

    `ABI=64'
          The 64-bit ABI uses 64-bit limbs and pointers and makes full
          use of the chip architecture.  This is the default.
          Applications will usually not need special compiler flags,
          but for reference the option is

               gcc  -m64

    `ABI=32'
          The 32-bit ABI is the usual i386 conventions.  This will be
          slower, and is not recommended except for inter-operating
          with other code not yet 64-bit capable.  Applications must be
          compiled with

               gcc  -m32

          (In GCC 2.95 and earlier there's no `-m32' option, it's the
          only mode.)

    `ABI=x32'
          The x32 ABI uses 64-bit limbs but 32-bit pointers.  Like the
          64-bit ABI, it makes full use of the chip's arithmetic
          capabilities.  This ABI is not supported by all operating
          systems.

               gcc  -mx32



HPPA 2.0 (`hppa2.0*', `hppa64')

    `ABI=2.0w'
          The 2.0w ABI uses 64-bit limbs and pointers and is available
          on HP-UX 11 or up.  Applications must be compiled with

               gcc [built for 2.0w]
               cc  +DD64

    `ABI=2.0n'
          The 2.0n ABI means the 32-bit HPPA 1.0 ABI and all its normal
          calling conventions, but with 64-bit instructions permitted
          within functions.  GMP uses a 64-bit `long long' for a limb.
          This ABI is available on hppa64 GNU/Linux and on HP-UX 10 or
          higher.  Applications must be compiled with

               gcc [built for 2.0n]
               cc  +DA2.0 +e

          Note that current versions of GCC (eg. 3.2) don't generate
          64-bit instructions for `long long' operations and so may be
          slower than for 2.0w.  (The GMP assembly code is the same
          though.)

    `ABI=1.0'
          HPPA 2.0 CPUs can run all HPPA 1.0 and 1.1 code in the 32-bit
          HPPA 1.0 ABI.  No special compiler options are needed for
          applications.

     All three ABIs are available for CPU types `hppa2.0w', `hppa2.0'
     and `hppa64', but for CPU type `hppa2.0n' only 2.0n or 1.0 are
     considered.

     Note that GCC on HP-UX has no options to choose between 2.0n and
     2.0w modes, unlike HP `cc'.  Instead it must be built for one or
     the other ABI.  GMP will detect how it was built, and skip to the
     corresponding `ABI'.


IA-64 under HP-UX (`ia64*-*-hpux*', `itanium*-*-hpux*')
     HP-UX supports two ABIs for IA-64.  GMP performance is the same in
     both.

    `ABI=32'
          In the 32-bit ABI, pointers, `int's and `long's are 32 bits
          and GMP uses a 64 bit `long long' for a limb.  Applications
          can be compiled without any special flags since this ABI is
          the default in both HP C and GCC, but for reference the flags
          are

               gcc  -milp32
               cc   +DD32

    `ABI=64'
          In the 64-bit ABI, `long's and pointers are 64 bits and GMP
          uses a `long' for a limb.  Applications must be compiled with

               gcc  -mlp64
               cc   +DD64

     On other IA-64 systems, GNU/Linux for instance, `ABI=64' is the
     only choice.


MIPS under IRIX 6 (`mips*-*-irix[6789]')
     IRIX 6 always has a 64-bit MIPS 3 or better CPU, and supports ABIs
     o32, n32, and 64.  n32 or 64 are recommended, and GMP performance
     will be the same in each.  The default is n32.

    `ABI=o32'
          The o32 ABI is 32-bit pointers and integers, and no 64-bit
          operations.  GMP will be slower than in n32 or 64, this
          option only exists to support old compilers, eg. GCC 2.7.2.
          Applications can be compiled with no special flags on an old
          compiler, or on a newer compiler with

               gcc  -mabi=32
               cc   -32

    `ABI=n32'
          The n32 ABI is 32-bit pointers and integers, but with a
          64-bit limb using a `long long'.  Applications must be
          compiled with

               gcc  -mabi=n32
               cc   -n32

    `ABI=64'
          The 64-bit ABI is 64-bit pointers and integers.  Applications
          must be compiled with

               gcc  -mabi=64
               cc   -64

     Note that MIPS GNU/Linux, as of kernel version 2.2, doesn't have
     the necessary support for n32 or 64 and so only gets a 32-bit limb
     and the MIPS 2 code.


PowerPC 64 (`powerpc64', `powerpc620', `powerpc630', `powerpc970', `power4', `power5')

    `ABI=mode64'
          The AIX 64 ABI uses 64-bit limbs and pointers and is the
          default on PowerPC 64 `*-*-aix*' systems.  Applications must
          be compiled with

               gcc  -maix64
               xlc  -q64

          On 64-bit GNU/Linux, BSD, and Mac OS X/Darwin systems, the
          applications must be compiled with

               gcc  -m64

    `ABI=mode32'
          The `mode32' ABI uses a 64-bit `long long' limb but with the
          chip still in 32-bit mode and using 32-bit calling
          conventions.  This is the default for systems where the true
          64-bit ABI is unavailable.  No special compiler options are
          typically needed for applications.  This ABI is not available
          under AIX.

    `ABI=32'
          This is the basic 32-bit PowerPC ABI, with a 32-bit limb.  No
          special compiler options are needed for applications.

     GMP's speed is greatest for the `mode64' ABI, the `mode32' ABI is
     2nd best.  In `ABI=32' only the 32-bit ISA is used and this
     doesn't make full use of a 64-bit chip.


Sparc V9 (`sparc64', `sparcv9', `ultrasparc*')

    `ABI=64'
          The 64-bit V9 ABI is available on the various BSD sparc64
          ports, recent versions of Sparc64 GNU/Linux, and Solaris 2.7
          and up (when the kernel is in 64-bit mode).  GCC 3.2 or
          higher, or Sun `cc' is required.  On GNU/Linux, depending on
          the default `gcc' mode, applications must be compiled with

               gcc  -m64

          On Solaris applications must be compiled with

               gcc  -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9
               cc   -xarch=v9

          On the BSD sparc64 systems no special options are required,
          since 64-bits is the only ABI available.

    `ABI=32'
          For the basic 32-bit ABI, GMP still uses as much of the V9
          ISA as it can.  In the Sun documentation this combination is
          known as "v8plus".  On GNU/Linux, depending on the default
          `gcc' mode, applications may need to be compiled with

               gcc  -m32

          On Solaris, no special compiler options are required for
          applications, though using something like the following is
          recommended.  (`gcc' 2.8 and earlier only support `-mv8'
          though.)

               gcc  -mv8plus
               cc   -xarch=v8plus

     GMP speed is greatest in `ABI=64', so it's the default where
     available.  The speed is partly because there are extra registers
     available and partly because 64-bits is considered the more
     important case and has therefore had better code written for it.

     Don't be confused by the names of the `-m' and `-x' compiler
     options, they're called `arch' but effectively control both ABI
     and ISA.

     On Solaris 2.6 and earlier, only `ABI=32' is available since the
     kernel doesn't save all registers.

     On Solaris 2.7 with the kernel in 32-bit mode, a normal native
     build will reject `ABI=64' because the resulting executables won't
     run.  `ABI=64' can still be built if desired by making it look
     like a cross-compile, for example

          ./configure --build=none --host=sparcv9-sun-solaris2.7 ABI=64


File: gmp.info,  Node: Notes for Package Builds,  Next: Notes for Particular Systems,  Prev: ABI and ISA,  Up: Installing GMP

2.3 Notes for Package Builds
============================

GMP should present no great difficulties for packaging in a binary
distribution.

   Libtool is used to build the library and `-version-info' is set
appropriately, having started from `3:0:0' in GMP 3.0 (*note Library
interface versions: (libtool)Versioning.).

   The GMP 4 series will be upwardly binary compatible in each release
and will be upwardly binary compatible with all of the GMP 3 series.
Additional function interfaces may be added in each release, so on
systems where libtool versioning is not fully checked by the loader an
auxiliary mechanism may be needed to express that a dynamic linked
application depends on a new enough GMP.

   An auxiliary mechanism may also be needed to express that
`libgmpxx.la' (from `--enable-cxx', *note Build Options::) requires
`libgmp.la' from the same GMP version, since this is not done by the
libtool versioning, nor otherwise.  A mismatch will result in
unresolved symbols from the linker, or perhaps the loader.

   When building a package for a CPU family, care should be taken to use
`--host' (or `--build') to choose the least common denominator among
the CPUs which might use the package.  For example this might mean plain
`sparc' (meaning V7) for SPARCs.

   For x86s, `--enable-fat' sets things up for a fat binary build,
making a runtime selection of optimized low level routines.  This is a
good choice for packaging to run on a range of x86 chips.

   Users who care about speed will want GMP built for their exact CPU
type, to make best use of the available optimizations.  Providing a way
to suitably rebuild a package may be useful.  This could be as simple
as making it possible for a user to omit `--build' (and `--host') so
`./config.guess' will detect the CPU.  But a way to manually specify a
`--build' will be wanted for systems where `./config.guess' is inexact.

   On systems with multiple ABIs, a packaged build will need to decide
which among the choices is to be provided, see *Note ABI and ISA::.  A
given run of `./configure' etc will only build one ABI.  If a second
ABI is also required then a second run of `./configure' etc must be
made, starting from a clean directory tree (`make distclean').

   As noted under "ABI and ISA", currently no attempt is made to follow
system conventions for install locations that vary with ABI, such as
`/usr/lib/sparcv9' for `ABI=64' as opposed to `/usr/lib' for `ABI=32'.
A package build can override `libdir' and other standard variables as
necessary.

   Note that `gmp.h' is a generated file, and will be architecture and
ABI dependent.  When attempting to install two ABIs simultaneously it
will be important that an application compile gets the correct `gmp.h'
for its desired ABI.  If compiler include paths don't vary with ABI
options then it might be necessary to create a `/usr/include/gmp.h'
which tests preprocessor symbols and chooses the correct actual `gmp.h'.


File: gmp.info,  Node: Notes for Particular Systems,  Next: Known Build Problems,  Prev: Notes for Package Builds,  Up: Installing GMP

2.4 Notes for Particular Systems
================================

AIX 3 and 4
     On systems `*-*-aix[34]*' shared libraries are disabled by
     default, since some versions of the native `ar' fail on the
     convenience libraries used.  A shared build can be attempted with

          ./configure --enable-shared --disable-static

     Note that the `--disable-static' is necessary because in a shared
     build libtool makes `libgmp.a' a symlink to `libgmp.so',
     apparently for the benefit of old versions of `ld' which only
     recognise `.a', but unfortunately this is done even if a fully
     functional `ld' is available.

ARM
     On systems `arm*-*-*', versions of GCC up to and including 2.95.3
     have a bug in unsigned division, giving wrong results for some
     operands.  GMP `./configure' will demand GCC 2.95.4 or later.

Compaq C++
     Compaq C++ on OSF 5.1 has two flavours of `iostream', a standard
     one and an old pre-standard one (see `man iostream_intro').  GMP
     can only use the standard one, which unfortunately is not the
     default but must be selected by defining `__USE_STD_IOSTREAM'.
     Configure with for instance

          ./configure --enable-cxx CPPFLAGS=-D__USE_STD_IOSTREAM

Floating Point Mode
     On some systems, the hardware floating point has a control mode
     which can set all operations to be done in a particular precision,
     for instance single, double or extended on x86 systems (x87
     floating point).  The GMP functions involving a `double' cannot be
     expected to operate to their full precision when the hardware is
     in single precision mode.  Of course this affects all code,
     including application code, not just GMP.

FreeBSD 7.x, 8.x, 9.0, 9.1, 9.2
     `m4' in these releases of FreeBSD has an eval function which
     ignores its 2nd and 3rd arguments, which makes it unsuitable for
     `.asm' file processing.  `./configure' will detect the problem and
     either abort or choose another m4 in the `PATH'.  The bug is fixed
     in FreeBSD 9.3 and 10.0, so either upgrade or use GNU m4.  Note
     that the FreeBSD package system installs GNU m4 under the name
     `gm4', which GMP cannot guess.

FreeBSD 7.x, 8.x, 9.x
     GMP releases starting with 6.0 do not support `ABI=32' on
     FreeBSD/amd64 prior to release 10.0 of the system.  The cause is a
     broken `limits.h', which GMP no longer works around.

MS-DOS and MS Windows
     On an MS-DOS system DJGPP can be used to build GMP, and on an MS
     Windows system Cygwin, DJGPP and MINGW can be used.  All three are
     excellent ports of GCC and the various GNU tools.

          `http://www.cygwin.com/'
          `http://www.delorie.com/djgpp/'
          `http://www.mingw.org/'

     Microsoft also publishes an Interix "Services for Unix" which can
     be used to build GMP on Windows (with a normal `./configure'), but
     it's not free software.

MS Windows DLLs
     On systems `*-*-cygwin*', `*-*-mingw*' and `*-*-pw32*' by default
     GMP builds only a static library, but a DLL can be built instead
     using

          ./configure --disable-static --enable-shared

     Static and DLL libraries can't both be built, since certain export
     directives in `gmp.h' must be different.

     A MINGW DLL build of GMP can be used with Microsoft C.  Libtool
     doesn't install a `.lib' format import library, but it can be
     created with MS `lib' as follows, and copied to the install
     directory.  Similarly for `libmp' and `libgmpxx'.

          cd .libs
          lib /def:libgmp-3.dll.def /out:libgmp-3.lib

     MINGW uses the C runtime library `msvcrt.dll' for I/O, so
     applications wanting to use the GMP I/O routines must be compiled
     with `cl /MD' to do the same.  If one of the other C runtime
     library choices provided by MS C is desired then the suggestion is
     to use the GMP string functions and confine I/O to the application.

Motorola 68k CPU Types
     `m68k' is taken to mean 68000.  `m68020' or higher will give a
     performance boost on applicable CPUs.  `m68360' can be used for
     CPU32 series chips.  `m68302' can be used for "Dragonball" series
     chips, though this is merely a synonym for `m68000'.

NetBSD 5.x
     `m4' in these releases of NetBSD has an eval function which
     ignores its 2nd and 3rd arguments, which makes it unsuitable for
     `.asm' file processing.  `./configure' will detect the problem and
     either abort or choose another m4 in the `PATH'.  The bug is fixed
     in NetBSD 6, so either upgrade or use GNU m4.  Note that the
     NetBSD package system installs GNU m4 under the name `gm4', which
     GMP cannot guess.

OpenBSD 2.6
     `m4' in this release of OpenBSD has a bug in `eval' that makes it
     unsuitable for `.asm' file processing.  `./configure' will detect
     the problem and either abort or choose another m4 in the `PATH'.
     The bug is fixed in OpenBSD 2.7, so either upgrade or use GNU m4.

Power CPU Types
     In GMP, CPU types `power*' and `powerpc*' will each use
     instructions not available on the other, so it's important to
     choose the right one for the CPU that will be used.  Currently GMP
     has no assembly code support for using just the common instruction
     subset.  To get executables that run on both, the current
     suggestion is to use the generic C code (`--disable-assembly'),
     possibly with appropriate compiler options (like `-mcpu=common' for
     `gcc').  CPU `rs6000' (which is not a CPU but a family of
     workstations) is accepted by `config.sub', but is currently
     equivalent to `--disable-assembly'.

Sparc CPU Types
     `sparcv8' or `supersparc' on relevant systems will give a
     significant performance increase over the V7 code selected by plain
     `sparc'.

Sparc App Regs
     The GMP assembly code for both 32-bit and 64-bit Sparc clobbers the
     "application registers" `g2', `g3' and `g4', the same way that the
     GCC default `-mapp-regs' does (*note SPARC Options: (gcc)SPARC
     Options.).

     This makes that code unsuitable for use with the special V9
     `-mcmodel=embmedany' (which uses `g4' as a data segment pointer),
     and for applications wanting to use those registers for special
     purposes.  In these cases the only suggestion currently is to
     build GMP with `--disable-assembly' to avoid the assembly code.

SunOS 4
     `/usr/bin/m4' lacks various features needed to process `.asm'
     files, and instead `./configure' will automatically use
     `/usr/5bin/m4', which we believe is always available (if not then
     use GNU m4).

x86 CPU Types
     `i586', `pentium' or `pentiummmx' code is good for its intended P5
     Pentium chips, but quite slow when run on Intel P6 class chips
     (PPro, P-II, P-III).  `i386' is a better choice when making
     binaries that must run on both.

x86 MMX and SSE2 Code
     If the CPU selected has MMX code but the assembler doesn't support
     it, a warning is given and non-MMX code is used instead.  This
     will be an inferior build, since the MMX code that's present is
     there because it's faster than the corresponding plain integer
     code.  The same applies to SSE2.

     Old versions of `gas' don't support MMX instructions, in particular
     version 1.92.3 that comes with FreeBSD 2.2.8 or the more recent
     OpenBSD 3.1 doesn't.

     Solaris 2.6 and 2.7 `as' generate incorrect object code for
     register to register `movq' instructions, and so can't be used for
     MMX code.  Install a recent `gas' if MMX code is wanted on these
     systems.


File: gmp.info,  Node: Known Build Problems,  Next: Performance optimization,  Prev: Notes for Particular Systems,  Up: Installing GMP

2.5 Known Build Problems
========================

You might find more up-to-date information at `https://gmplib.org/'.

Compiler link options
     The version of libtool currently in use rather aggressively strips
     compiler options when linking a shared library.  This will
     hopefully be relaxed in the future, but for now if this is a
     problem the suggestion is to create a little script to hide them,
     and for instance configure with

          ./configure CC=gcc-with-my-options

DJGPP (`*-*-msdosdjgpp*')
     The DJGPP port of `bash' 2.03 is unable to run the `configure'
     script, it exits silently, having died writing a preamble to
     `config.log'.  Use `bash' 2.04 or higher.

     `make all' was found to run out of memory during the final
     `libgmp.la' link on one system tested, despite having 64Mb
     available.  Running `make libgmp.la' directly helped, perhaps
     recursing into the various subdirectories uses up memory.

GNU binutils `strip' prior to 2.12
     `strip' from GNU binutils 2.11 and earlier should not be used on
     the static libraries `libgmp.a' and `libmp.a' since it will
     discard all but the last of multiple archive members with the same
     name, like the three versions of `init.o' in `libgmp.a'.  Binutils
     2.12 or higher can be used successfully.

     The shared libraries `libgmp.so' and `libmp.so' are not affected by
     this and any version of `strip' can be used on them.

`make' syntax error
     On certain versions of SCO OpenServer 5 and IRIX 6.5 the native
     `make' is unable to handle the long dependencies list for
     `libgmp.la'.  The symptom is a "syntax error" on the following
     line of the top-level `Makefile'.

          libgmp.la: $(libgmp_la_OBJECTS) $(libgmp_la_DEPENDENCIES)

     Either use GNU Make, or as a workaround remove
     `$(libgmp_la_DEPENDENCIES)' from that line (which will make the
     initial build work, but if any recompiling is done `libgmp.la'
     might not be rebuilt).

MacOS X (`*-*-darwin*')
     Libtool currently only knows how to create shared libraries on
     MacOS X using the native `cc' (which is a modified GCC), not a
     plain GCC.  A static-only build should work though
     (`--disable-shared').

NeXT prior to 3.3
     The system compiler on old versions of NeXT was a massacred and
     old GCC, even if it called itself `cc'.  This compiler cannot be
     used to build GMP, you need to get a real GCC, and install that.
     (NeXT may have fixed this in release 3.3 of their system.)

POWER and PowerPC
     Bugs in GCC 2.7.2 (and 2.6.3) mean it can't be used to compile GMP
     on POWER or PowerPC.  If you want to use GCC for these machines,
     get GCC 2.7.2.1 (or later).

Sequent Symmetry
     Use the GNU assembler instead of the system assembler, since the
     latter has serious bugs.

Solaris 2.6
     The system `sed' prints an error "Output line too long" when
     libtool builds `libgmp.la'.  This doesn't seem to cause any
     obvious ill effects, but GNU `sed' is recommended, to avoid any
     doubt.

Sparc Solaris 2.7 with gcc 2.95.2 in `ABI=32'
     A shared library build of GMP seems to fail in this combination,
     it builds but then fails the tests, apparently due to some
     incorrect data relocations within `gmp_randinit_lc_2exp_size'.
     The exact cause is unknown, `--disable-shared' is recommended.


File: gmp.info,  Node: Performance optimization,  Prev: Known Build Problems,  Up: Installing GMP

2.6 Performance optimization
============================

For optimal performance, build GMP for the exact CPU type of the target
computer, see *Note Build Options::.

   Unlike what is the case for most other programs, the compiler
typically doesn't matter much, since GMP uses assembly language for the
most critical operation.

   In particular for long-running GMP applications, and applications
demanding extremely large numbers, building and running the `tuneup'
program in the `tune' subdirectory, can be important.  For example,

     cd tune
     make tuneup
     ./tuneup

   will generate better contents for the `gmp-mparam.h' parameter file.

   To use the results, put the output in the file indicated in the
`Parameters for ...' header.  Then recompile from scratch.

   The `tuneup' program takes one useful parameter, `-f NNN', which
instructs the program how long to check FFT multiply parameters.  If
you're going to use GMP for extremely large numbers, you may want to
run `tuneup' with a large NNN value.


File: gmp.info,  Node: GMP Basics,  Next: Reporting Bugs,  Prev: Installing GMP,  Up: Top

3 GMP Basics
************

*Using functions, macros, data types, etc. not documented in this
manual is strongly discouraged.  If you do so your application is
guaranteed to be incompatible with future versions of GMP.*

* Menu:

* Headers and Libraries::
* Nomenclature and Types::
* Function Classes::
* Variable Conventions::
* Parameter Conventions::
* Memory Management::
* Reentrancy::
* Useful Macros and Constants::
* Compatibility with older versions::
* Demonstration Programs::
* Efficiency::
* Debugging::
* Profiling::
* Autoconf::
* Emacs::


File: gmp.info,  Node: Headers and Libraries,  Next: Nomenclature and Types,  Prev: GMP Basics,  Up: GMP Basics

3.1 Headers and Libraries
=========================

All declarations needed to use GMP are collected in the include file
`gmp.h'.  It is designed to work with both C and C++ compilers.

     #include <gmp.h>

   Note however that prototypes for GMP functions with `FILE *'
parameters are only provided if `<stdio.h>' is included too.

     #include <stdio.h>
     #include <gmp.h>

   Likewise `<stdarg.h>' is required for prototypes with `va_list'
parameters, such as `gmp_vprintf'.  And `<obstack.h>' for prototypes
with `struct obstack' parameters, such as `gmp_obstack_printf', when
available.

   All programs using GMP must link against the `libgmp' library.  On a
typical Unix-like system this can be done with `-lgmp', for example

     gcc myprogram.c -lgmp

   GMP C++ functions are in a separate `libgmpxx' library.  This is
built and installed if C++ support has been enabled (*note Build
Options::).  For example,

     g++ mycxxprog.cc -lgmpxx -lgmp

   GMP is built using Libtool and an application can use that to link
if desired, *note GNU Libtool: (libtool)Top.

   If GMP has been installed to a non-standard location then it may be
necessary to use `-I' and `-L' compiler options to point to the right
directories, and some sort of run-time path for a shared library.


File: gmp.info,  Node: Nomenclature and Types,  Next: Function Classes,  Prev: Headers and Libraries,  Up: GMP Basics

3.2 Nomenclature and Types
==========================

In this manual, "integer" usually means a multiple precision integer, as
defined by the GMP library.  The C data type for such integers is
`mpz_t'.  Here are some examples of how to declare such integers:

     mpz_t sum;

     struct foo { mpz_t x, y; };

     mpz_t vec[20];

   "Rational number" means a multiple precision fraction.  The C data
type for these fractions is `mpq_t'.  For example:

     mpq_t quotient;

   "Floating point number" or "Float" for short, is an arbitrary
precision mantissa with a limited precision exponent.  The C data type
for such objects is `mpf_t'.  For example:

     mpf_t fp;

   The floating point functions accept and return exponents in the C
type `mp_exp_t'.  Currently this is usually a `long', but on some
systems it's an `int' for efficiency.

   A "limb" means the part of a multi-precision number that fits in a
single machine word.  (We chose this word because a limb of the human
body is analogous to a digit, only larger, and containing several
digits.)  Normally a limb is 32 or 64 bits.  The C data type for a limb
is `mp_limb_t'.

   Counts of limbs of a multi-precision number represented in the C type
`mp_size_t'.  Currently this is normally a `long', but on some systems
it's an `int' for efficiency, and on some systems it will be `long
long' in the future.

   Counts of bits of a multi-precision number are represented in the C
type `mp_bitcnt_t'.  Currently this is always an `unsigned long', but on
some systems it will be an `unsigned long long' in the future.

   "Random state" means an algorithm selection and current state data.
The C data type for such objects is `gmp_randstate_t'.  For example:

     gmp_randstate_t rstate;

   Also, in general `mp_bitcnt_t' is used for bit counts and ranges, and
`size_t' is used for byte or character counts.


File: gmp.info,  Node: Function Classes,  Next: Variable Conventions,  Prev: Nomenclature and Types,  Up: GMP Basics

3.3 Function Classes
====================

There are six classes of functions in the GMP library:

  1. Functions for signed integer arithmetic, with names beginning with
     `mpz_'.  The associated type is `mpz_t'.  There are about 150
     functions in this class.  (*note Integer Functions::)

  2. Functions for rational number arithmetic, with names beginning with
     `mpq_'.  The associated type is `mpq_t'.  There are about 35
     functions in this class, but the integer functions can be used for
     arithmetic on the numerator and denominator separately.  (*note
     Rational Number Functions::)

  3. Functions for floating-point arithmetic, with names beginning with
     `mpf_'.  The associated type is `mpf_t'.  There are about 70
     functions is this class.  (*note Floating-point Functions::)

  4. Fast low-level functions that operate on natural numbers.  These
     are used by the functions in the preceding groups, and you can
     also call them directly from very time-critical user programs.
     These functions' names begin with `mpn_'.  The associated type is
     array of `mp_limb_t'.  There are about 60 (hard-to-use) functions
     in this class.  (*note Low-level Functions::)

  5. Miscellaneous functions.  Functions for setting up custom
     allocation and functions for generating random numbers.  (*note
     Custom Allocation::, and *note Random Number Functions::)


File: gmp.info,  Node: Variable Conventions,  Next: Parameter Conventions,  Prev: Function Classes,  Up: GMP Basics

3.4 Variable Conventions
========================

GMP functions generally have output arguments before input arguments.
This notation is by analogy with the assignment operator.  The BSD MP
compatibility functions are exceptions, having the output arguments
last.

   GMP lets you use the same variable for both input and output in one
call.  For example, the main function for integer multiplication,
`mpz_mul', can be used to square `x' and put the result back in `x' with

     mpz_mul (x, x, x);

   Before you can assign to a GMP variable, you need to initialize it
by calling one of the special initialization functions.  When you're
done with a variable, you need to clear it out, using one of the
functions for that purpose.  Which function to use depends on the type
of variable.  See the chapters on integer functions, rational number
functions, and floating-point functions for details.

   A variable should only be initialized once, or at least cleared
between each initialization.  After a variable has been initialized, it
may be assigned to any number of times.

   For efficiency reasons, avoid excessive initializing and clearing.
In general, initialize near the start of a function and clear near the
end.  For example,

     void
     foo (void)
     {
       mpz_t  n;
       int    i;
       mpz_init (n);
       for (i = 1; i < 100; i++)
         {
           mpz_mul (n, ...);
           mpz_fdiv_q (n, ...);
           ...
         }
       mpz_clear (n);
     }


File: gmp.info,  Node: Parameter Conventions,  Next: Memory Management,  Prev: Variable Conventions,  Up: GMP Basics

3.5 Parameter Conventions
=========================

When a GMP variable is used as a function parameter, it's effectively a
call-by-reference, meaning if the function stores a value there it will
change the original in the caller.  Parameters which are input-only can
be designated `const' to provoke a compiler error or warning on
attempting to modify them.

   When a function is going to return a GMP result, it should designate
a parameter that it sets, like the library functions do.  More than one
value can be returned by having more than one output parameter, again
like the library functions.  A `return' of an `mpz_t' etc doesn't
return the object, only a pointer, and this is almost certainly not
what's wanted.

   Here's an example accepting an `mpz_t' parameter, doing a
calculation, and storing the result to the indicated parameter.

     void
     foo (mpz_t result, const mpz_t param, unsigned long n)
     {
       unsigned long  i;
       mpz_mul_ui (result, param, n);
       for (i = 1; i < n; i++)
         mpz_add_ui (result, result, i*7);
     }

     int
     main (void)
     {
       mpz_t  r, n;
       mpz_init (r);
       mpz_init_set_str (n, "123456", 0);
       foo (r, n, 20L);
       gmp_printf ("%Zd\n", r);
       return 0;
     }

   `foo' works even if the mainline passes the same variable for
`param' and `result', just like the library functions.  But sometimes
it's tricky to make that work, and an application might not want to
bother supporting that sort of thing.

   For interest, the GMP types `mpz_t' etc are implemented as
one-element arrays of certain structures.  This is why declaring a
variable creates an object with the fields GMP needs, but then using it
as a parameter passes a pointer to the object.  Note that the actual
fields in each `mpz_t' etc are for internal use only and should not be
accessed directly by code that expects to be compatible with future GMP
releases.


File: gmp.info,  Node: Memory Management,  Next: Reentrancy,  Prev: Parameter Conventions,  Up: GMP Basics

3.6 Memory Management
=====================

The GMP types like `mpz_t' are small, containing only a couple of sizes,
and pointers to allocated data.  Once a variable is initialized, GMP
takes care of all space allocation.  Additional space is allocated
whenever a variable doesn't have enough.

   `mpz_t' and `mpq_t' variables never reduce their allocated space.
Normally this is the best policy, since it avoids frequent reallocation.
Applications that need to return memory to the heap at some particular
point can use `mpz_realloc2', or clear variables no longer needed.

   `mpf_t' variables, in the current implementation, use a fixed amount
of space, determined by the chosen precision and allocated at
initialization, so their size doesn't change.

   All memory is allocated using `malloc' and friends by default, but
this can be changed, see *Note Custom Allocation::.  Temporary memory
on the stack is also used (via `alloca'), but this can be changed at
build-time if desired, see *Note Build Options::.


File: gmp.info,  Node: Reentrancy,  Next: Useful Macros and Constants,  Prev: Memory Management,  Up: GMP Basics

3.7 Reentrancy
==============

GMP is reentrant and thread-safe, with some exceptions:

   * If configured with `--enable-alloca=malloc-notreentrant' (or with
     `--enable-alloca=notreentrant' when `alloca' is not available),
     then naturally GMP is not reentrant.

   * `mpf_set_default_prec' and `mpf_init' use a global variable for the
     selected precision.  `mpf_init2' can be used instead, and in the
     C++ interface an explicit precision to the `mpf_class' constructor.

   * `mpz_random' and the other old random number functions use a global
     random state and are hence not reentrant.  The newer random number
     functions that accept a `gmp_randstate_t' parameter can be used
     instead.

   * `gmp_randinit' (obsolete) returns an error indication through a
     global variable, which is not thread safe.  Applications are
     advised to use `gmp_randinit_default' or `gmp_randinit_lc_2exp'
     instead.

   * `mp_set_memory_functions' uses global variables to store the
     selected memory allocation functions.

   * If the memory allocation functions set by a call to
     `mp_set_memory_functions' (or `malloc' and friends by default) are
     not reentrant, then GMP will not be reentrant either.

   * If the standard I/O functions such as `fwrite' are not reentrant
     then the GMP I/O functions using them will not be reentrant either.

   * It's safe for two threads to read from the same GMP variable
     simultaneously, but it's not safe for one to read while another
     might be writing, nor for two threads to write simultaneously.
     It's not safe for two threads to generate a random number from the
     same `gmp_randstate_t' simultaneously, since this involves an
     update of that variable.


File: gmp.info,  Node: Useful Macros and Constants,  Next: Compatibility with older versions,  Prev: Reentrancy,  Up: GMP Basics

3.8 Useful Macros and Constants
===============================

 -- Global Constant: const int mp_bits_per_limb
     The number of bits per limb.

 -- Macro: __GNU_MP_VERSION
 -- Macro: __GNU_MP_VERSION_MINOR
 -- Macro: __GNU_MP_VERSION_PATCHLEVEL
     The major and minor GMP version, and patch level, respectively, as
     integers.  For GMP i.j, these numbers will be i, j, and 0,
     respectively.  For GMP i.j.k, these numbers will be i, j, and k,
     respectively.

 -- Global Constant: const char * const gmp_version
     The GMP version number, as a null-terminated string, in the form
     "i.j.k".  This release is "6.1.1".  Note that the format "i.j" was
     used, before version 4.3.0, when k was zero.

 -- Macro: __GMP_CC
 -- Macro: __GMP_CFLAGS
     The compiler and compiler flags, respectively, used when compiling
     GMP, as strings.


File: gmp.info,  Node: Compatibility with older versions,  Next: Demonstration Programs,  Prev: Useful Macros and Constants,  Up: GMP Basics

3.9 Compatibility with older versions
=====================================

This version of GMP is upwardly binary compatible with all 5.x, 4.x,
and 3.x versions, and upwardly compatible at the source level with all
2.x versions, with the following exceptions.

   * `mpn_gcd' had its source arguments swapped as of GMP 3.0, for
     consistency with other `mpn' functions.

   * `mpf_get_prec' counted precision slightly differently in GMP 3.0
     and 3.0.1, but in 3.1 reverted to the 2.x style.

   * `mpn_bdivmod', documented as preliminary in GMP 4, has been
     removed.

   There are a number of compatibility issues between GMP 1 and GMP 2
that of course also apply when porting applications from GMP 1 to GMP
5.  Please see the GMP 2 manual for details.


File: gmp.info,  Node: Demonstration Programs,  Next: Efficiency,  Prev: Compatibility with older versions,  Up: GMP Basics

3.10 Demonstration programs
===========================

The `demos' subdirectory has some sample programs using GMP.  These
aren't built or installed, but there's a `Makefile' with rules for them.
For instance,

     make pexpr
     ./pexpr 68^975+10

The following programs are provided

   * `pexpr' is an expression evaluator, the program used on the GMP
     web page.

   * The `calc' subdirectory has a similar but simpler evaluator using
     `lex' and `yacc'.

   * The `expr' subdirectory is yet another expression evaluator, a
     library designed for ease of use within a C program.  See
     `demos/expr/README' for more information.

   * `factorize' is a Pollard-Rho factorization program.

   * `isprime' is a command-line interface to the `mpz_probab_prime_p'
     function.

   * `primes' counts or lists primes in an interval, using a sieve.

   * `qcn' is an example use of `mpz_kronecker_ui' to estimate quadratic
     class numbers.

   * The `perl' subdirectory is a comprehensive perl interface to GMP.
     See `demos/perl/INSTALL' for more information.  Documentation is
     in POD format in `demos/perl/GMP.pm'.

   As an aside, consideration has been given at various times to some
sort of expression evaluation within the main GMP library.  Going
beyond something minimal quickly leads to matters like user-defined
functions, looping, fixnums for control variables, etc, which are
considered outside the scope of GMP (much closer to language
interpreters or compilers, *Note Language Bindings::.)  Something
simple for program input convenience may yet be a possibility, a
combination of the `expr' demo and the `pexpr' tree back-end perhaps.
But for now the above evaluators are offered as illustrations.


File: gmp.info,  Node: Efficiency,  Next: Debugging,  Prev: Demonstration Programs,  Up: GMP Basics

3.11 Efficiency
===============

Small Operands
     On small operands, the time for function call overheads and memory
     allocation can be significant in comparison to actual calculation.
     This is unavoidable in a general purpose variable precision
     library, although GMP attempts to be as efficient as it can on
     both large and small operands.

Static Linking
     On some CPUs, in particular the x86s, the static `libgmp.a' should
     be used for maximum speed, since the PIC code in the shared
     `libgmp.so' will have a small overhead on each function call and
     global data address.  For many programs this will be
     insignificant, but for long calculations there's a gain to be had.

Initializing and Clearing
     Avoid excessive initializing and clearing of variables, since this
     can be quite time consuming, especially in comparison to otherwise
     fast operations like addition.

     A language interpreter might want to keep a free list or stack of
     initialized variables ready for use.  It should be possible to
     integrate something like that with a garbage collector too.

Reallocations
     An `mpz_t' or `mpq_t' variable used to hold successively increasing
     values will have its memory repeatedly `realloc'ed, which could be
     quite slow or could fragment memory, depending on the C library.
     If an application can estimate the final size then `mpz_init2' or
     `mpz_realloc2' can be called to allocate the necessary space from
     the beginning (*note Initializing Integers::).

     It doesn't matter if a size set with `mpz_init2' or `mpz_realloc2'
     is too small, since all functions will do a further reallocation
     if necessary.  Badly overestimating memory required will waste
     space though.

`2exp' Functions
     It's up to an application to call functions like `mpz_mul_2exp'
     when appropriate.  General purpose functions like `mpz_mul' make
     no attempt to identify powers of two or other special forms,
     because such inputs will usually be very rare and testing every
     time would be wasteful.

`ui' and `si' Functions
     The `ui' functions and the small number of `si' functions exist for
     convenience and should be used where applicable.  But if for
     example an `mpz_t' contains a value that fits in an `unsigned
     long' there's no need extract it and call a `ui' function, just
     use the regular `mpz' function.

In-Place Operations
     `mpz_abs', `mpq_abs', `mpf_abs', `mpz_neg', `mpq_neg' and
     `mpf_neg' are fast when used for in-place operations like
     `mpz_abs(x,x)', since in the current implementation only a single
     field of `x' needs changing.  On suitable compilers (GCC for
     instance) this is inlined too.

     `mpz_add_ui', `mpz_sub_ui', `mpf_add_ui' and `mpf_sub_ui' benefit
     from an in-place operation like `mpz_add_ui(x,x,y)', since usually
     only one or two limbs of `x' will need to be changed.  The same
     applies to the full precision `mpz_add' etc if `y' is small.  If
     `y' is big then cache locality may be helped, but that's all.

     `mpz_mul' is currently the opposite, a separate destination is
     slightly better.  A call like `mpz_mul(x,x,y)' will, unless `y' is
     only one limb, make a temporary copy of `x' before forming the
     result.  Normally that copying will only be a tiny fraction of the
     time for the multiply, so this is not a particularly important
     consideration.

     `mpz_set', `mpq_set', `mpq_set_num', `mpf_set', etc, make no
     attempt to recognise a copy of something to itself, so a call like
     `mpz_set(x,x)' will be wasteful.  Naturally that would never be
     written deliberately, but if it might arise from two pointers to
     the same object then a test to avoid it might be desirable.

          if (x != y)
            mpz_set (x, y);

     Note that it's never worth introducing extra `mpz_set' calls just
     to get in-place operations.  If a result should go to a particular
     variable then just direct it there and let GMP take care of data
     movement.

Divisibility Testing (Small Integers)
     `mpz_divisible_ui_p' and `mpz_congruent_ui_p' are the best
     functions for testing whether an `mpz_t' is divisible by an
     individual small integer.  They use an algorithm which is faster
     than `mpz_tdiv_ui', but which gives no useful information about
     the actual remainder, only whether it's zero (or a particular
     value).

     However when testing divisibility by several small integers, it's
     best to take a remainder modulo their product, to save
     multi-precision operations.  For instance to test whether a number
     is divisible by any of 23, 29 or 31 take a remainder modulo
     23*29*31 = 20677 and then test that.

     The division functions like `mpz_tdiv_q_ui' which give a quotient
     as well as a remainder are generally a little slower than the
     remainder-only functions like `mpz_tdiv_ui'.  If the quotient is
     only rarely wanted then it's probably best to just take a
     remainder and then go back and calculate the quotient if and when
     it's wanted (`mpz_divexact_ui' can be used if the remainder is
     zero).

Rational Arithmetic
     The `mpq' functions operate on `mpq_t' values with no common
     factors in the numerator and denominator.  Common factors are
     checked-for and cast out as necessary.  In general, cancelling
     factors every time is the best approach since it minimizes the
     sizes for subsequent operations.

     However, applications that know something about the factorization
     of the values they're working with might be able to avoid some of
     the GCDs used for canonicalization, or swap them for divisions.
     For example when multiplying by a prime it's enough to check for
     factors of it in the denominator instead of doing a full GCD.  Or
     when forming a big product it might be known that very little
     cancellation will be possible, and so canonicalization can be left
     to the end.

     The `mpq_numref' and `mpq_denref' macros give access to the
     numerator and denominator to do things outside the scope of the
     supplied `mpq' functions.  *Note Applying Integer Functions::.

     The canonical form for rationals allows mixed-type `mpq_t' and
     integer additions or subtractions to be done directly with
     multiples of the denominator.  This will be somewhat faster than
     `mpq_add'.  For example,

          /* mpq increment */
          mpz_add (mpq_numref(q), mpq_numref(q), mpq_denref(q));

          /* mpq += unsigned long */
          mpz_addmul_ui (mpq_numref(q), mpq_denref(q), 123UL);

          /* mpq -= mpz */
          mpz_submul (mpq_numref(q), mpq_denref(q), z);

Number Sequences
     Functions like `mpz_fac_ui', `mpz_fib_ui' and `mpz_bin_uiui' are
     designed for calculating isolated values.  If a range of values is
     wanted it's probably best to call to get a starting point and
     iterate from there.

Text Input/Output
     Hexadecimal or octal are suggested for input or output in text
     form.  Power-of-2 bases like these can be converted much more
     efficiently than other bases, like decimal.  For big numbers
     there's usually nothing of particular interest to be seen in the
     digits, so the base doesn't matter much.

     Maybe we can hope octal will one day become the normal base for
     everyday use, as proposed by King Charles XII of Sweden and later
     reformers.


File: gmp.info,  Node: Debugging,  Next: Profiling,  Prev: Efficiency,  Up: GMP Basics

3.12 Debugging
==============

Stack Overflow
     Depending on the system, a segmentation violation or bus error
     might be the only indication of stack overflow.  See
     `--enable-alloca' choices in *Note Build Options::, for how to
     address this.

     In new enough versions of GCC, `-fstack-check' may be able to
     ensure an overflow is recognised by the system before too much
     damage is done, or `-fstack-limit-symbol' or
     `-fstack-limit-register' may be able to add checking if the system
     itself doesn't do any (*note Options for Code Generation:
     (gcc)Code Gen Options.).  These options must be added to the
     `CFLAGS' used in the GMP build (*note Build Options::), adding
     them just to an application will have no effect.  Note also
     they're a slowdown, adding overhead to each function call and each
     stack allocation.

Heap Problems
     The most likely cause of application problems with GMP is heap
     corruption.  Failing to `init' GMP variables will have
     unpredictable effects, and corruption arising elsewhere in a
     program may well affect GMP.  Initializing GMP variables more than
     once or failing to clear them will cause memory leaks.

     In all such cases a `malloc' debugger is recommended.  On a GNU or
     BSD system the standard C library `malloc' has some diagnostic
     facilities, see *Note Allocation Debugging: (libc)Allocation
     Debugging, or `man 3 malloc'.  Other possibilities, in no
     particular order, include

          `http://www.inf.ethz.ch/personal/biere/projects/ccmalloc/'
          `http://dmalloc.com/'
          `http://www.perens.com/FreeSoftware/'  (electric fence)
          `http://packages.debian.org/stable/devel/fda'
          `http://www.gnupdate.org/components/leakbug/'
          `http://people.redhat.com/~otaylor/memprof/'
          `http://www.cbmamiga.demon.co.uk/mpatrol/'

     The GMP default allocation routines in `memory.c' also have a
     simple sentinel scheme which can be enabled with `#define DEBUG'
     in that file.  This is mainly designed for detecting buffer
     overruns during GMP development, but might find other uses.

Stack Backtraces
     On some systems the compiler options GMP uses by default can
     interfere with debugging.  In particular on x86 and 68k systems
     `-fomit-frame-pointer' is used and this generally inhibits stack
     backtracing.  Recompiling without such options may help while
     debugging, though the usual caveats about it potentially moving a
     memory problem or hiding a compiler bug will apply.

GDB, the GNU Debugger
     A sample `.gdbinit' is included in the distribution, showing how
     to call some undocumented dump functions to print GMP variables
     from within GDB.  Note that these functions shouldn't be used in
     final application code since they're undocumented and may be
     subject to incompatible changes in future versions of GMP.

Source File Paths
     GMP has multiple source files with the same name, in different
     directories.  For example `mpz', `mpq' and `mpf' each have an
     `init.c'.  If the debugger can't already determine the right one
     it may help to build with absolute paths on each C file.  One way
     to do that is to use a separate object directory with an absolute
     path to the source directory.

          cd /my/build/dir
          /my/source/dir/gmp-6.1.1/configure

     This works via `VPATH', and might require GNU `make'.  Alternately
     it might be possible to change the `.c.lo' rules appropriately.

Assertion Checking
     The build option `--enable-assert' is available to add some
     consistency checks to the library (see *Note Build Options::).
     These are likely to be of limited value to most applications.
     Assertion failures are just as likely to indicate memory
     corruption as a library or compiler bug.

     Applications using the low-level `mpn' functions, however, will
     benefit from `--enable-assert' since it adds checks on the
     parameters of most such functions, many of which have subtle
     restrictions on their usage.  Note however that only the generic C
     code has checks, not the assembly code, so `--disable-assembly'
     should be used for maximum checking.

Temporary Memory Checking
     The build option `--enable-alloca=debug' arranges that each block
     of temporary memory in GMP is allocated with a separate call to
     `malloc' (or the allocation function set with
     `mp_set_memory_functions').

     This can help a malloc debugger detect accesses outside the
     intended bounds, or detect memory not released.  In a normal
     build, on the other hand, temporary memory is allocated in blocks
     which GMP divides up for its own use, or may be allocated with a
     compiler builtin `alloca' which will go nowhere near any malloc
     debugger hooks.

Maximum Debuggability
     To summarize the above, a GMP build for maximum debuggability
     would be

          ./configure --disable-shared --enable-assert \
            --enable-alloca=debug --disable-assembly CFLAGS=-g

     For C++, add `--enable-cxx CXXFLAGS=-g'.

Checker
     The GCC checker (`https://savannah.nongnu.org/projects/checker/')
     can be used with GMP.  It contains a stub library which means GMP
     applications compiled with checker can use a normal GMP build.

     A build of GMP with checking within GMP itself can be made.  This
     will run very very slowly.  On GNU/Linux for example,

          ./configure --disable-assembly CC=checkergcc

     `--disable-assembly' must be used, since the GMP assembly code
     doesn't support the checking scheme.  The GMP C++ features cannot
     be used, since current versions of checker (0.9.9.1) don't yet
     support the standard C++ library.

Valgrind
     Valgrind (`http://valgrind.org/') is a memory checker for x86,
     ARM, MIPS, PowerPC, and S/390.  It translates and emulates machine
     instructions to do strong checks for uninitialized data (at the
     level of individual bits), memory accesses through bad pointers,
     and memory leaks.

     Valgrind does not always support every possible instruction, in
     particular ones recently added to an ISA.  Valgrind might
     therefore be incompatible with a recent GMP or even a less recent
     GMP which is compiled using a recent GCC.

     GMP's assembly code sometimes promotes a read of the limbs to some
     larger size, for efficiency.  GMP will do this even at the start
     and end of a multilimb operand, using naturally aligned operations
     on the larger type.  This may lead to benign reads outside of
     allocated areas, triggering complaints from Valgrind.  Valgrind's
     option `--partial-loads-ok=yes' should help.

Other Problems
     Any suspected bug in GMP itself should be isolated to make sure
     it's not an application problem, see *Note Reporting Bugs::.


File: gmp.info,  Node: Profiling,  Next: Autoconf,  Prev: Debugging,  Up: GMP Basics

3.13 Profiling
==============

Running a program under a profiler is a good way to find where it's
spending most time and where improvements can be best sought.  The
profiling choices for a GMP build are as follows.

`--disable-profiling'
     The default is to add nothing special for profiling.

     It should be possible to just compile the mainline of a program
     with `-p' and use `prof' to get a profile consisting of
     timer-based sampling of the program counter.  Most of the GMP
     assembly code has the necessary symbol information.

     This approach has the advantage of minimizing interference with
     normal program operation, but on most systems the resolution of
     the sampling is quite low (10 milliseconds for instance),
     requiring long runs to get accurate information.

`--enable-profiling=prof'
     Build with support for the system `prof', which means `-p' added
     to the `CFLAGS'.

     This provides call counting in addition to program counter
     sampling, which allows the most frequently called routines to be
     identified, and an average time spent in each routine to be
     determined.

     The x86 assembly code has support for this option, but on other
     processors the assembly routines will be as if compiled without
     `-p' and therefore won't appear in the call counts.

     On some systems, such as GNU/Linux, `-p' in fact means `-pg' and in
     this case `--enable-profiling=gprof' described below should be used
     instead.

`--enable-profiling=gprof'
     Build with support for `gprof', which means `-pg' added to the
     `CFLAGS'.

     This provides call graph construction in addition to call counting
     and program counter sampling, which makes it possible to count
     calls coming from different locations.  For example the number of
     calls to `mpn_mul' from `mpz_mul' versus the number from
     `mpf_mul'.  The program counter sampling is still flat though, so
     only a total time in `mpn_mul' would be accumulated, not a
     separate amount for each call site.

     The x86 assembly code has support for this option, but on other
     processors the assembly routines will be as if compiled without
     `-pg' and therefore not be included in the call counts.

     On x86 and m68k systems `-pg' and `-fomit-frame-pointer' are
     incompatible, so the latter is omitted from the default flags in
     that case, which might result in poorer code generation.

     Incidentally, it should be possible to use the `gprof' program
     with a plain `--enable-profiling=prof' build.  But in that case
     only the `gprof -p' flat profile and call counts can be expected
     to be valid, not the `gprof -q' call graph.

`--enable-profiling=instrument'
     Build with the GCC option `-finstrument-functions' added to the
     `CFLAGS' (*note Options for Code Generation: (gcc)Code Gen
     Options.).

     This inserts special instrumenting calls at the start and end of
     each function, allowing exact timing and full call graph
     construction.

     This instrumenting is not normally a standard system feature and
     will require support from an external library, such as

          `http://sourceforge.net/projects/fnccheck/'

     This should be included in `LIBS' during the GMP configure so that
     test programs will link.  For example,

          ./configure --enable-profiling=instrument LIBS=-lfc

     On a GNU system the C library provides dummy instrumenting
     functions, so programs compiled with this option will link.  In
     this case it's only necessary to ensure the correct library is
     added when linking an application.

     The x86 assembly code supports this option, but on other
     processors the assembly routines will be as if compiled without
     `-finstrument-functions' meaning time spent in them will
     effectively be attributed to their caller.


File: gmp.info,  Node: Autoconf,  Next: Emacs,  Prev: Profiling,  Up: GMP Basics

3.14 Autoconf
=============

Autoconf based applications can easily check whether GMP is installed.
The only thing to be noted is that GMP library symbols from version 3
onwards have prefixes like `__gmpz'.  The following therefore would be
a simple test,

     AC_CHECK_LIB(gmp, __gmpz_init)

   This just uses the default `AC_CHECK_LIB' actions for found or not
found, but an application that must have GMP would want to generate an
error if not found.  For example,

     AC_CHECK_LIB(gmp, __gmpz_init, ,
       [AC_MSG_ERROR([GNU MP not found, see https://gmplib.org/])])

   If functions added in some particular version of GMP are required,
then one of those can be used when checking.  For example `mpz_mul_si'
was added in GMP 3.1,

     AC_CHECK_LIB(gmp, __gmpz_mul_si, ,
       [AC_MSG_ERROR(
       [GNU MP not found, or not 3.1 or up, see https://gmplib.org/])])

   An alternative would be to test the version number in `gmp.h' using
say `AC_EGREP_CPP'.  That would make it possible to test the exact
version, if some particular sub-minor release is known to be necessary.

   In general it's recommended that applications should simply demand a
new enough GMP rather than trying to provide supplements for features
not available in past versions.

   Occasionally an application will need or want to know the size of a
type at configuration or preprocessing time, not just with `sizeof' in
the code.  This can be done in the normal way with `mp_limb_t' etc, but
GMP 4.0 or up is best for this, since prior versions needed certain
`-D' defines on systems using a `long long' limb.  The following would
suit Autoconf 2.50 or up,

     AC_CHECK_SIZEOF(mp_limb_t, , [#include <gmp.h>])


File: gmp.info,  Node: Emacs,  Prev: Autoconf,  Up: GMP Basics

3.15 Emacs
==========

<C-h C-i> (`info-lookup-symbol') is a good way to find documentation on
C functions while editing (*note Info Documentation Lookup: (emacs)Info
Lookup.).

   The GMP manual can be included in such lookups by putting the
following in your `.emacs',

     (eval-after-load "info-look"
       '(let ((mode-value (assoc 'c-mode (assoc 'symbol info-lookup-alist))))
          (setcar (nthcdr 3 mode-value)
                  (cons '("(gmp)Function Index" nil "^ -.* " "\\>")
                        (nth 3 mode-value)))))


File: gmp.info,  Node: Reporting Bugs,  Next: Integer Functions,  Prev: GMP Basics,  Up: Top

4 Reporting Bugs
****************

If you think you have found a bug in the GMP library, please
investigate it and report it.  We have made this library available to
you, and it is not too much to ask you to report the bugs you find.

   Before you report a bug, check it's not already addressed in *Note
Known Build Problems::, or perhaps *Note Notes for Particular
Systems::.  You may also want to check `https://gmplib.org/' for
patches for this release.

   Please include the following in any report,

   * The GMP version number, and if pre-packaged or patched then say so.

   * A test program that makes it possible for us to reproduce the bug.
     Include instructions on how to run the program.

   * A description of what is wrong.  If the results are incorrect, in
     what way.  If you get a crash, say so.

   * If you get a crash, include a stack backtrace from the debugger if
     it's informative (`where' in `gdb', or `$C' in `adb').

   * Please do not send core dumps, executables or `strace's.

   * The `configure' options you used when building GMP, if any.

   * The output from `configure', as printed to stdout, with any
     options used.

   * The name of the compiler and its version.  For `gcc', get the
     version with `gcc -v', otherwise perhaps `what `which cc`', or
     similar.

   * The output from running `uname -a'.

   * The output from running `./config.guess', and from running
     `./configfsf.guess' (might be the same).

   * If the bug is related to `configure', then the compressed contents
     of `config.log'.

   * If the bug is related to an `asm' file not assembling, then the
     contents of `config.m4' and the offending line or lines from the
     temporary `mpn/tmp-<file>.s'.

   Please make an effort to produce a self-contained report, with
something definite that can be tested or debugged.  Vague queries or
piecemeal messages are difficult to act on and don't help the
development effort.

   It is not uncommon that an observed problem is actually due to a bug
in the compiler; the GMP code tends to explore interesting corners in
compilers.

   If your bug report is good, we will do our best to help you get a
corrected version of the library; if the bug report is poor, we won't
do anything about it (except maybe ask you to send a better report).

   Send your report to: <gmp-bugs@gmplib.org>.

   If you think something in this manual is unclear, or downright
incorrect, or if the language needs to be improved, please send a note
to the same address.


File: gmp.info,  Node: Integer Functions,  Next: Rational Number Functions,  Prev: Reporting Bugs,  Up: Top

5 Integer Functions
*******************

This chapter describes the GMP functions for performing integer
arithmetic.  These functions start with the prefix `mpz_'.

   GMP integers are stored in objects of type `mpz_t'.

* Menu:

* Initializing Integers::
* Assigning Integers::
* Simultaneous Integer Init & Assign::
* Converting Integers::
* Integer Arithmetic::
* Integer Division::
* Integer Exponentiation::
* Integer Roots::
* Number Theoretic Functions::
* Integer Comparisons::
* Integer Logic and Bit Fiddling::
* I/O of Integers::
* Integer Random Numbers::
* Integer Import and Export::
* Miscellaneous Integer Functions::
* Integer Special Functions::


File: gmp.info,  Node: Initializing Integers,  Next: Assigning Integers,  Prev: Integer Functions,  Up: Integer Functions

5.1 Initialization Functions
============================

The functions for integer arithmetic assume that all integer objects are
initialized.  You do that by calling the function `mpz_init'.  For
example,

     {
       mpz_t integ;
       mpz_init (integ);
       ...
       mpz_add (integ, ...);
       ...
       mpz_sub (integ, ...);

       /* Unless the program is about to exit, do ... */
       mpz_clear (integ);
     }

   As you can see, you can store new values any number of times, once an
object is initialized.

 -- Function: void mpz_init (mpz_t X)
     Initialize X, and set its value to 0.

 -- Function: void mpz_inits (mpz_t X, ...)
     Initialize a NULL-terminated list of `mpz_t' variables, and set
     their values to 0.

 -- Function: void mpz_init2 (mpz_t X, mp_bitcnt_t N)
     Initialize X, with space for N-bit numbers, and set its value to 0.
     Calling this function instead of `mpz_init' or `mpz_inits' is never
     necessary; reallocation is handled automatically by GMP when
     needed.

     While N defines the initial space, X will grow automatically in the
     normal way, if necessary, for subsequent values stored.
     `mpz_init2' makes it possible to avoid such reallocations if a
     maximum size is known in advance.

     In preparation for an operation, GMP often allocates one limb more
     than ultimately needed.  To make sure GMP will not perform
     reallocation for X, you need to add the number of bits in
     `mp_limb_t' to N.

 -- Function: void mpz_clear (mpz_t X)
     Free the space occupied by X.  Call this function for all `mpz_t'
     variables when you are done with them.

 -- Function: void mpz_clears (mpz_t X, ...)
     Free the space occupied by a NULL-terminated list of `mpz_t'
     variables.

 -- Function: void mpz_realloc2 (mpz_t X, mp_bitcnt_t N)
     Change the space allocated for X to N bits.  The value in X is
     preserved if it fits, or is set to 0 if not.

     Calling this function is never necessary; reallocation is handled
     automatically by GMP when needed.  But this function can be used
     to increase the space for a variable in order to avoid repeated
     automatic reallocations, or to decrease it to give memory back to
     the heap.


File: gmp.info,  Node: Assigning Integers,  Next: Simultaneous Integer Init & Assign,  Prev: Initializing Integers,  Up: Integer Functions

5.2 Assignment Functions
========================

These functions assign new values to already initialized integers
(*note Initializing Integers::).

 -- Function: void mpz_set (mpz_t ROP, const mpz_t OP)
 -- Function: void mpz_set_ui (mpz_t ROP, unsigned long int OP)
 -- Function: void mpz_set_si (mpz_t ROP, signed long int OP)
 -- Function: void mpz_set_d (mpz_t ROP, double OP)
 -- Function: void mpz_set_q (mpz_t ROP, const mpq_t OP)
 -- Function: void mpz_set_f (mpz_t ROP, const mpf_t OP)
     Set the value of ROP from OP.

     `mpz_set_d', `mpz_set_q' and `mpz_set_f' truncate OP to make it an
     integer.

 -- Function: int mpz_set_str (mpz_t ROP, const char *STR, int BASE)
     Set the value of ROP from STR, a null-terminated C string in base
     BASE.  White space is allowed in the string, and is simply ignored.

     The BASE may vary from 2 to 62, or if BASE is 0, then the leading
     characters are used: `0x' and `0X' for hexadecimal, `0b' and `0B'
     for binary, `0' for octal, or decimal otherwise.

     For bases up to 36, case is ignored; upper-case and lower-case
     letters have the same value.  For bases 37 to 62, upper-case
     letter represent the usual 10..35 while lower-case letter
     represent 36..61.

     This function returns 0 if the entire string is a valid number in
     base BASE.  Otherwise it returns -1.

 -- Function: void mpz_swap (mpz_t ROP1, mpz_t ROP2)
     Swap the values ROP1 and ROP2 efficiently.


File: gmp.info,  Node: Simultaneous Integer Init & Assign,  Next: Converting Integers,  Prev: Assigning Integers,  Up: Integer Functions

5.3 Combined Initialization and Assignment Functions
====================================================

For convenience, GMP provides a parallel series of initialize-and-set
functions which initialize the output and then store the value there.
These functions' names have the form `mpz_init_set...'

   Here is an example of using one:

     {
       mpz_t pie;
       mpz_init_set_str (pie, "3141592653589793238462643383279502884", 10);
       ...
       mpz_sub (pie, ...);
       ...
       mpz_clear (pie);
     }

Once the integer has been initialized by any of the `mpz_init_set...'
functions, it can be used as the source or destination operand for the
ordinary integer functions.  Don't use an initialize-and-set function
on a variable already initialized!

 -- Function: void mpz_init_set (mpz_t ROP, const mpz_t OP)
 -- Function: void mpz_init_set_ui (mpz_t ROP, unsigned long int OP)
 -- Function: void mpz_init_set_si (mpz_t ROP, signed long int OP)
 -- Function: void mpz_init_set_d (mpz_t ROP, double OP)
     Initialize ROP with limb space and set the initial numeric value
     from OP.

 -- Function: int mpz_init_set_str (mpz_t ROP, const char *STR, int
          BASE)
     Initialize ROP and set its value like `mpz_set_str' (see its
     documentation above for details).

     If the string is a correct base BASE number, the function returns
     0; if an error occurs it returns -1.  ROP is initialized even if
     an error occurs.  (I.e., you have to call `mpz_clear' for it.)


File: gmp.info,  Node: Converting Integers,  Next: Integer Arithmetic,  Prev: Simultaneous Integer Init & Assign,  Up: Integer Functions

5.4 Conversion Functions
========================

This section describes functions for converting GMP integers to
standard C types.  Functions for converting _to_ GMP integers are
described in *Note Assigning Integers:: and *Note I/O of Integers::.

 -- Function: unsigned long int mpz_get_ui (const mpz_t OP)
     Return the value of OP as an `unsigned long'.

     If OP is too big to fit an `unsigned long' then just the least
     significant bits that do fit are returned.  The sign of OP is
     ignored, only the absolute value is used.

 -- Function: signed long int mpz_get_si (const mpz_t OP)
     If OP fits into a `signed long int' return the value of OP.
     Otherwise return the least significant part of OP, with the same
     sign as OP.

     If OP is too big to fit in a `signed long int', the returned
     result is probably not very useful.  To find out if the value will
     fit, use the function `mpz_fits_slong_p'.

 -- Function: double mpz_get_d (const mpz_t OP)
     Convert OP to a `double', truncating if necessary (i.e. rounding
     towards zero).

     If the exponent from the conversion is too big, the result is
     system dependent.  An infinity is returned where available.  A
     hardware overflow trap may or may not occur.

 -- Function: double mpz_get_d_2exp (signed long int *EXP, const mpz_t
          OP)
     Convert OP to a `double', truncating if necessary (i.e. rounding
     towards zero), and returning the exponent separately.

     The return value is in the range 0.5<=abs(D)<1 and the exponent is
     stored to `*EXP'.  D * 2^EXP is the (truncated) OP value.  If OP
     is zero, the return is 0.0 and 0 is stored to `*EXP'.

     This is similar to the standard C `frexp' function (*note
     Normalization Functions: (libc)Normalization Functions.).

 -- Function: char * mpz_get_str (char *STR, int BASE, const mpz_t OP)
     Convert OP to a string of digits in base BASE.  The base argument
     may vary from 2 to 62 or from -2 to -36.

     For BASE in the range 2..36, digits and lower-case letters are
     used; for -2..-36, digits and upper-case letters are used; for
     37..62, digits, upper-case letters, and lower-case letters (in
     that significance order) are used.

     If STR is `NULL', the result string is allocated using the current
     allocation function (*note Custom Allocation::).  The block will be
     `strlen(str)+1' bytes, that being exactly enough for the string and
     null-terminator.

     If STR is not `NULL', it should point to a block of storage large
     enough for the result, that being `mpz_sizeinbase (OP, BASE) + 2'.
     The two extra bytes are for a possible minus sign, and the
     null-terminator.

     A pointer to the result string is returned, being either the
     allocated block, or the given STR.


File: gmp.info,  Node: Integer Arithmetic,  Next: Integer Division,  Prev: Converting Integers,  Up: Integer Functions

5.5 Arithmetic Functions
========================

 -- Function: void mpz_add (mpz_t ROP, const mpz_t OP1, const mpz_t OP2)
 -- Function: void mpz_add_ui (mpz_t ROP, const mpz_t OP1, unsigned
          long int OP2)
     Set ROP to OP1 + OP2.

 -- Function: void mpz_sub (mpz_t ROP, const mpz_t OP1, const mpz_t OP2)
 -- Function: void mpz_sub_ui (mpz_t ROP, const mpz_t OP1, unsigned
          long int OP2)
 -- Function: void mpz_ui_sub (mpz_t ROP, unsigned long int OP1, const
          mpz_t OP2)
     Set ROP to OP1 - OP2.

 -- Function: void mpz_mul (mpz_t ROP, const mpz_t OP1, const mpz_t OP2)
 -- Function: void mpz_mul_si (mpz_t ROP, const mpz_t OP1, long int OP2)
 -- Function: void mpz_mul_ui (mpz_t ROP, const mpz_t OP1, unsigned
          long int OP2)
     Set ROP to OP1 times OP2.

 -- Function: void mpz_addmul (mpz_t ROP, const mpz_t OP1, const mpz_t
          OP2)
 -- Function: void mpz_addmul_ui (mpz_t ROP, const mpz_t OP1, unsigned
          long int OP2)
     Set ROP to ROP + OP1 times OP2.

 -- Function: void mpz_submul (mpz_t ROP, const mpz_t OP1, const mpz_t
          OP2)
 -- Function: void mpz_submul_ui (mpz_t ROP, const mpz_t OP1, unsigned
          long int OP2)
     Set ROP to ROP - OP1 times OP2.

 -- Function: void mpz_mul_2exp (mpz_t ROP, const mpz_t OP1,
          mp_bitcnt_t OP2)
     Set ROP to OP1 times 2 raised to OP2.  This operation can also be
     defined as a left shift by OP2 bits.

 -- Function: void mpz_neg (mpz_t ROP, const mpz_t OP)
     Set ROP to -OP.

 -- Function: void mpz_abs (mpz_t ROP, const mpz_t OP)
     Set ROP to the absolute value of OP.


File: gmp.info,  Node: Integer Division,  Next: Integer Exponentiation,  Prev: Integer Arithmetic,  Up: Integer Functions

5.6 Division Functions
======================

Division is undefined if the divisor is zero.  Passing a zero divisor
to the division or modulo functions (including the modular powering
functions `mpz_powm' and `mpz_powm_ui'), will cause an intentional
division by zero.  This lets a program handle arithmetic exceptions in
these functions the same way as for normal C `int' arithmetic.

 -- Function: void mpz_cdiv_q (mpz_t Q, const mpz_t N, const mpz_t D)
 -- Function: void mpz_cdiv_r (mpz_t R, const mpz_t N, const mpz_t D)
 -- Function: void mpz_cdiv_qr (mpz_t Q, mpz_t R, const mpz_t N, const
          mpz_t D)
 -- Function: unsigned long int mpz_cdiv_q_ui (mpz_t Q, const mpz_t N,
          unsigned long int D)
 -- Function: unsigned long int mpz_cdiv_r_ui (mpz_t R, const mpz_t N,
          unsigned long int D)
 -- Function: unsigned long int mpz_cdiv_qr_ui (mpz_t Q, mpz_t R,
          const mpz_t N, unsigned long int D)
 -- Function: unsigned long int mpz_cdiv_ui (const mpz_t N,
          unsigned long int D)
 -- Function: void mpz_cdiv_q_2exp (mpz_t Q, const mpz_t N,
          mp_bitcnt_t B)
 -- Function: void mpz_cdiv_r_2exp (mpz_t R, const mpz_t N,
          mp_bitcnt_t B)

 -- Function: void mpz_fdiv_q (mpz_t Q, const mpz_t N, const mpz_t D)
 -- Function: void mpz_fdiv_r (mpz_t R, const mpz_t N, const mpz_t D)
 -- Function: void mpz_fdiv_qr (mpz_t Q, mpz_t R, const mpz_t N, const
          mpz_t D)
 -- Function: unsigned long int mpz_fdiv_q_ui (mpz_t Q, const mpz_t N,
          unsigned long int D)
 -- Function: unsigned long int mpz_fdiv_r_ui (mpz_t R, const mpz_t N,
          unsigned long int D)
 -- Function: unsigned long int mpz_fdiv_qr_ui (mpz_t Q, mpz_t R,
          const mpz_t N, unsigned long int D)
 -- Function: unsigned long int mpz_fdiv_ui (const mpz_t N,
          unsigned long int D)
 -- Function: void mpz_fdiv_q_2exp (mpz_t Q, const mpz_t N,
          mp_bitcnt_t B)
 -- Function: void mpz_fdiv_r_2exp (mpz_t R, const mpz_t N,
          mp_bitcnt_t B)

 -- Function: void mpz_tdiv_q (mpz_t Q, const mpz_t N, const mpz_t D)
 -- Function: void mpz_tdiv_r (mpz_t R, const mpz_t N, const mpz_t D)
 -- Function: void mpz_tdiv_qr (mpz_t Q, mpz_t R, const mpz_t N, const
          mpz_t D)
 -- Function: unsigned long int mpz_tdiv_q_ui (mpz_t Q, const mpz_t N,
          unsigned long int D)
 -- Function: unsigned long int mpz_tdiv_r_ui (mpz_t R, const mpz_t N,
          unsigned long int D)
 -- Function: unsigned long int mpz_tdiv_qr_ui (mpz_t Q, mpz_t R,
          const mpz_t N, unsigned long int D)
 -- Function: unsigned long int mpz_tdiv_ui (const mpz_t N,
          unsigned long int D)
 -- Function: void mpz_tdiv_q_2exp (mpz_t Q, const mpz_t N,
          mp_bitcnt_t B)
 -- Function: void mpz_tdiv_r_2exp (mpz_t R, const mpz_t N,
          mp_bitcnt_t B)

     Divide N by D, forming a quotient Q and/or remainder R.  For the
     `2exp' functions, D=2^B.  The rounding is in three styles, each
     suiting different applications.

        * `cdiv' rounds Q up towards +infinity, and R will have the
          opposite sign to D.  The `c' stands for "ceil".

        * `fdiv' rounds Q down towards -infinity, and R will have the
          same sign as D.  The `f' stands for "floor".

        * `tdiv' rounds Q towards zero, and R will have the same sign
          as N.  The `t' stands for "truncate".

     In all cases Q and R will satisfy N=Q*D+R, and R will satisfy
     0<=abs(R)<abs(D).

     The `q' functions calculate only the quotient, the `r' functions
     only the remainder, and the `qr' functions calculate both.  Note
     that for `qr' the same variable cannot be passed for both Q and R,
     or results will be unpredictable.

     For the `ui' variants the return value is the remainder, and in
     fact returning the remainder is all the `div_ui' functions do.  For
     `tdiv' and `cdiv' the remainder can be negative, so for those the
     return value is the absolute value of the remainder.

     For the `2exp' variants the divisor is 2^B.  These functions are
     implemented as right shifts and bit masks, but of course they
     round the same as the other functions.

     For positive N both `mpz_fdiv_q_2exp' and `mpz_tdiv_q_2exp' are
     simple bitwise right shifts.  For negative N, `mpz_fdiv_q_2exp' is
     effectively an arithmetic right shift treating N as twos complement
     the same as the bitwise logical functions do, whereas
     `mpz_tdiv_q_2exp' effectively treats N as sign and magnitude.

 -- Function: void mpz_mod (mpz_t R, const mpz_t N, const mpz_t D)
 -- Function: unsigned long int mpz_mod_ui (mpz_t R, const mpz_t N,
          unsigned long int D)
     Set R to N `mod' D.  The sign of the divisor is ignored; the
     result is always non-negative.

     `mpz_mod_ui' is identical to `mpz_fdiv_r_ui' above, returning the
     remainder as well as setting R.  See `mpz_fdiv_ui' above if only
     the return value is wanted.

 -- Function: void mpz_divexact (mpz_t Q, const mpz_t N, const mpz_t D)
 -- Function: void mpz_divexact_ui (mpz_t Q, const mpz_t N, unsigned
          long D)
     Set Q to N/D.  These functions produce correct results only when
     it is known in advance that D divides N.

     These routines are much faster than the other division functions,
     and are the best choice when exact division is known to occur, for
     example reducing a rational to lowest terms.

 -- Function: int mpz_divisible_p (const mpz_t N, const mpz_t D)
 -- Function: int mpz_divisible_ui_p (const mpz_t N, unsigned long int
          D)
 -- Function: int mpz_divisible_2exp_p (const mpz_t N, mp_bitcnt_t B)
     Return non-zero if N is exactly divisible by D, or in the case of
     `mpz_divisible_2exp_p' by 2^B.

     N is divisible by D if there exists an integer Q satisfying N =
     Q*D.  Unlike the other division functions, D=0 is accepted and
     following the rule it can be seen that only 0 is considered
     divisible by 0.

 -- Function: int mpz_congruent_p (const mpz_t N, const mpz_t C, const
          mpz_t D)
 -- Function: int mpz_congruent_ui_p (const mpz_t N, unsigned long int
          C, unsigned long int D)
 -- Function: int mpz_congruent_2exp_p (const mpz_t N, const mpz_t C,
          mp_bitcnt_t B)
     Return non-zero if N is congruent to C modulo D, or in the case of
     `mpz_congruent_2exp_p' modulo 2^B.

     N is congruent to C mod D if there exists an integer Q satisfying
     N = C + Q*D.  Unlike the other division functions, D=0 is accepted
     and following the rule it can be seen that N and C are considered
     congruent mod 0 only when exactly equal.


File: gmp.info,  Node: Integer Exponentiation,  Next: Integer Roots,  Prev: Integer Division,  Up: Integer Functions

5.7 Exponentiation Functions
============================

 -- Function: void mpz_powm (mpz_t ROP, const mpz_t BASE, const mpz_t
          EXP, const mpz_t MOD)
 -- Function: void mpz_powm_ui (mpz_t ROP, const mpz_t BASE, unsigned
          long int EXP, const mpz_t MOD)
     Set ROP to (BASE raised to EXP) modulo MOD.

     Negative EXP is supported if an inverse BASE^-1 mod MOD exists
     (see `mpz_invert' in *Note Number Theoretic Functions::).  If an
     inverse doesn't exist then a divide by zero is raised.

 -- Function: void mpz_powm_sec (mpz_t ROP, const mpz_t BASE, const
          mpz_t EXP, const mpz_t MOD)
     Set ROP to (BASE raised to EXP) modulo MOD.

     It is required that EXP > 0 and that MOD is odd.

     This function is designed to take the same time and have the same
     cache access patterns for any two same-size arguments, assuming
     that function arguments are placed at the same position and that
     the machine state is identical upon function entry.  This function
     is intended for cryptographic purposes, where resilience to
     side-channel attacks is desired.

 -- Function: void mpz_pow_ui (mpz_t ROP, const mpz_t BASE, unsigned
          long int EXP)
 -- Function: void mpz_ui_pow_ui (mpz_t ROP, unsigned long int BASE,
          unsigned long int EXP)
     Set ROP to BASE raised to EXP.  The case 0^0 yields 1.


File: gmp.info,  Node: Integer Roots,  Next: Number Theoretic Functions,  Prev: Integer Exponentiation,  Up: Integer Functions

5.8 Root Extraction Functions
=============================

 -- Function: int mpz_root (mpz_t ROP, const mpz_t OP, unsigned long
          int N)
     Set ROP to  the truncated integer part of the Nth root of OP.
     Return non-zero if the computation was exact, i.e., if OP is ROP
     to the Nth power.

 -- Function: void mpz_rootrem (mpz_t ROOT, mpz_t REM, const mpz_t U,
          unsigned long int N)
     Set ROOT to  the truncated integer part of the Nth root of U.  Set
     REM to the remainder, U-ROOT**N.

 -- Function: void mpz_sqrt (mpz_t ROP, const mpz_t OP)
     Set ROP to  the truncated integer part of the square root of OP.

 -- Function: void mpz_sqrtrem (mpz_t ROP1, mpz_t ROP2, const mpz_t OP)
     Set ROP1 to the truncated integer part of the square root of OP,
     like `mpz_sqrt'.  Set ROP2 to the remainder OP-ROP1*ROP1, which
     will be zero if OP is a perfect square.

     If ROP1 and ROP2 are the same variable, the results are undefined.

 -- Function: int mpz_perfect_power_p (const mpz_t OP)
     Return non-zero if OP is a perfect power, i.e., if there exist
     integers A and B, with B>1, such that OP equals A raised to the
     power B.

     Under this definition both 0 and 1 are considered to be perfect
     powers.  Negative values of OP are accepted, but of course can
     only be odd perfect powers.

 -- Function: int mpz_perfect_square_p (const mpz_t OP)
     Return non-zero if OP is a perfect square, i.e., if the square
     root of OP is an integer.  Under this definition both 0 and 1 are
     considered to be perfect squares.


File: gmp.info,  Node: Number Theoretic Functions,  Next: Integer Comparisons,  Prev: Integer Roots,  Up: Integer Functions

5.9 Number Theoretic Functions
==============================

 -- Function: int mpz_probab_prime_p (const mpz_t N, int REPS)
     Determine whether N is prime.  Return 2 if N is definitely prime,
     return 1 if N is probably prime (without being certain), or return
     0 if N is definitely non-prime.

     This function performs some trial divisions, then REPS Miller-Rabin
     probabilistic primality tests.  A higher REPS value will reduce the
     chances of a non-prime being identified as "probably prime".  A
     composite number will be identified as a prime with a probability
     of less than 4^(-REPS).  Reasonable values of REPS are between 15
     and 50.

 -- Function: void mpz_nextprime (mpz_t ROP, const mpz_t OP)
     Set ROP to the next prime greater than OP.

     This function uses a probabilistic algorithm to identify primes.
     For practical purposes it's adequate, the chance of a composite
     passing will be extremely small.

 -- Function: void mpz_gcd (mpz_t ROP, const mpz_t OP1, const mpz_t OP2)
     Set ROP to the greatest common divisor of OP1 and OP2.  The result
     is always positive even if one or both input operands are negative.
     Except if both inputs are zero; then this function defines
     gcd(0,0) = 0.

 -- Function: unsigned long int mpz_gcd_ui (mpz_t ROP, const mpz_t OP1,
          unsigned long int OP2)
     Compute the greatest common divisor of OP1 and OP2.  If ROP is not
     `NULL', store the result there.

     If the result is small enough to fit in an `unsigned long int', it
     is returned.  If the result does not fit, 0 is returned, and the
     result is equal to the argument OP1.  Note that the result will
     always fit if OP2 is non-zero.

 -- Function: void mpz_gcdext (mpz_t G, mpz_t S, mpz_t T, const mpz_t
          A, const mpz_t B)
     Set G to the greatest common divisor of A and B, and in addition
     set S and T to coefficients satisfying A*S + B*T = G.  The value
     in G is always positive, even if one or both of A and B are
     negative (or zero if both inputs are zero).  The values in S and T
     are chosen such that normally, abs(S) < abs(B) / (2 G) and abs(T)
     < abs(A) / (2 G), and these relations define S and T uniquely.
     There are a few exceptional cases:

     If abs(A) = abs(B), then S = 0, T = sgn(B).

     Otherwise, S = sgn(A) if B = 0 or abs(B) = 2 G, and T = sgn(B) if
     A = 0 or abs(A) = 2 G.

     In all cases, S = 0 if and only if G = abs(B), i.e., if B divides
     A or A = B = 0.

     If T is `NULL' then that value is not computed.

 -- Function: void mpz_lcm (mpz_t ROP, const mpz_t OP1, const mpz_t OP2)
 -- Function: void mpz_lcm_ui (mpz_t ROP, const mpz_t OP1, unsigned
          long OP2)
     Set ROP to the least common multiple of OP1 and OP2.  ROP is
     always positive, irrespective of the signs of OP1 and OP2.  ROP
     will be zero if either OP1 or OP2 is zero.

 -- Function: int mpz_invert (mpz_t ROP, const mpz_t OP1, const mpz_t
          OP2)
     Compute the inverse of OP1 modulo OP2 and put the result in ROP.
     If the inverse exists, the return value is non-zero and ROP will
     satisfy 0 <= ROP < abs(OP2) (with ROP = 0 possible only when
     abs(OP2) = 1, i.e., in the somewhat degenerate zero ring).  If an
     inverse doesn't exist the return value is zero and ROP is
     undefined.  The behaviour of this function is undefined when OP2
     is zero.

 -- Function: int mpz_jacobi (const mpz_t A, const mpz_t B)
     Calculate the Jacobi symbol (A/B).  This is defined only for B odd.

 -- Function: int mpz_legendre (const mpz_t A, const mpz_t P)
     Calculate the Legendre symbol (A/P).  This is defined only for P
     an odd positive prime, and for such P it's identical to the Jacobi
     symbol.

 -- Function: int mpz_kronecker (const mpz_t A, const mpz_t B)
 -- Function: int mpz_kronecker_si (const mpz_t A, long B)
 -- Function: int mpz_kronecker_ui (const mpz_t A, unsigned long B)
 -- Function: int mpz_si_kronecker (long A, const mpz_t B)
 -- Function: int mpz_ui_kronecker (unsigned long A, const mpz_t B)
     Calculate the Jacobi symbol (A/B) with the Kronecker extension
     (a/2)=(2/a) when a odd, or (a/2)=0 when a even.

     When B is odd the Jacobi symbol and Kronecker symbol are
     identical, so `mpz_kronecker_ui' etc can be used for mixed
     precision Jacobi symbols too.

     For more information see Henri Cohen section 1.4.2 (*note
     References::), or any number theory textbook.  See also the
     example program `demos/qcn.c' which uses `mpz_kronecker_ui'.

 -- Function: mp_bitcnt_t mpz_remove (mpz_t ROP, const mpz_t OP, const
          mpz_t F)
     Remove all occurrences of the factor F from OP and store the
     result in ROP.  The return value is how many such occurrences were
     removed.

 -- Function: void mpz_fac_ui (mpz_t ROP, unsigned long int N)
 -- Function: void mpz_2fac_ui (mpz_t ROP, unsigned long int N)
 -- Function: void mpz_mfac_uiui (mpz_t ROP, unsigned long int N,
          unsigned long int M)
     Set ROP to the factorial of N: `mpz_fac_ui' computes the plain
     factorial N!, `mpz_2fac_ui' computes the double-factorial N!!, and
     `mpz_mfac_uiui' the M-multi-factorial N!^(M).

 -- Function: void mpz_primorial_ui (mpz_t ROP, unsigned long int N)
     Set ROP to the primorial of N, i.e. the product of all positive
     prime numbers <=N.

 -- Function: void mpz_bin_ui (mpz_t ROP, const mpz_t N, unsigned long
          int K)
 -- Function: void mpz_bin_uiui (mpz_t ROP, unsigned long int N,
          unsigned long int K)
     Compute the binomial coefficient N over K and store the result in
     ROP.  Negative values of N are supported by `mpz_bin_ui', using
     the identity bin(-n,k) = (-1)^k * bin(n+k-1,k), see Knuth volume 1
     section 1.2.6 part G.

 -- Function: void mpz_fib_ui (mpz_t FN, unsigned long int N)
 -- Function: void mpz_fib2_ui (mpz_t FN, mpz_t FNSUB1, unsigned long
          int N)
     `mpz_fib_ui' sets FN to to F[n], the N'th Fibonacci number.
     `mpz_fib2_ui' sets FN to F[n], and FNSUB1 to F[n-1].

     These functions are designed for calculating isolated Fibonacci
     numbers.  When a sequence of values is wanted it's best to start
     with `mpz_fib2_ui' and iterate the defining F[n+1]=F[n]+F[n-1] or
     similar.

 -- Function: void mpz_lucnum_ui (mpz_t LN, unsigned long int N)
 -- Function: void mpz_lucnum2_ui (mpz_t LN, mpz_t LNSUB1, unsigned
          long int N)
     `mpz_lucnum_ui' sets LN to to L[n], the N'th Lucas number.
     `mpz_lucnum2_ui' sets LN to L[n], and LNSUB1 to L[n-1].

     These functions are designed for calculating isolated Lucas
     numbers.  When a sequence of values is wanted it's best to start
     with `mpz_lucnum2_ui' and iterate the defining L[n+1]=L[n]+L[n-1]
     or similar.

     The Fibonacci numbers and Lucas numbers are related sequences, so
     it's never necessary to call both `mpz_fib2_ui' and
     `mpz_lucnum2_ui'.  The formulas for going from Fibonacci to Lucas
     can be found in *Note Lucas Numbers Algorithm::, the reverse is
     straightforward too.


File: gmp.info,  Node: Integer Comparisons,  Next: Integer Logic and Bit Fiddling,  Prev: Number Theoretic Functions,  Up: Integer Functions

5.10 Comparison Functions
=========================

 -- Function: int mpz_cmp (const mpz_t OP1, const mpz_t OP2)
 -- Function: int mpz_cmp_d (const mpz_t OP1, double OP2)
 -- Macro: int mpz_cmp_si (const mpz_t OP1, signed long int OP2)
 -- Macro: int mpz_cmp_ui (const mpz_t OP1, unsigned long int OP2)
     Compare OP1 and OP2.  Return a positive value if OP1 > OP2, zero
     if OP1 = OP2, or a negative value if OP1 < OP2.

     `mpz_cmp_ui' and `mpz_cmp_si' are macros and will evaluate their
     arguments more than once.  `mpz_cmp_d' can be called with an
     infinity, but results are undefined for a NaN.

 -- Function: int mpz_cmpabs (const mpz_t OP1, const mpz_t OP2)
 -- Function: int mpz_cmpabs_d (const mpz_t OP1, double OP2)
 -- Function: int mpz_cmpabs_ui (const mpz_t OP1, unsigned long int OP2)
     Compare the absolute values of OP1 and OP2.  Return a positive
     value if abs(OP1) > abs(OP2), zero if abs(OP1) = abs(OP2), or a
     negative value if abs(OP1) < abs(OP2).

     `mpz_cmpabs_d' can be called with an infinity, but results are
     undefined for a NaN.

 -- Macro: int mpz_sgn (const mpz_t OP)
     Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0.

     This function is actually implemented as a macro.  It evaluates
     its argument multiple times.


File: gmp.info,  Node: Integer Logic and Bit Fiddling,  Next: I/O of Integers,  Prev: Integer Comparisons,  Up: Integer Functions

5.11 Logical and Bit Manipulation Functions
===========================================

These functions behave as if twos complement arithmetic were used
(although sign-magnitude is the actual implementation).  The least
significant bit is number 0.

 -- Function: void mpz_and (mpz_t ROP, const mpz_t OP1, const mpz_t OP2)
     Set ROP to OP1 bitwise-and OP2.

 -- Function: void mpz_ior (mpz_t ROP, const mpz_t OP1, const mpz_t OP2)
     Set ROP to OP1 bitwise inclusive-or OP2.

 -- Function: void mpz_xor (mpz_t ROP, const mpz_t OP1, const mpz_t OP2)
     Set ROP to OP1 bitwise exclusive-or OP2.

 -- Function: void mpz_com (mpz_t ROP, const mpz_t OP)
     Set ROP to the one's complement of OP.

 -- Function: mp_bitcnt_t mpz_popcount (const mpz_t OP)
     If OP>=0, return the population count of OP, which is the number
     of 1 bits in the binary representation.  If OP<0, the number of 1s
     is infinite, and the return value is the largest possible
     `mp_bitcnt_t'.

 -- Function: mp_bitcnt_t mpz_hamdist (const mpz_t OP1, const mpz_t OP2)
     If OP1 and OP2 are both >=0 or both <0, return the hamming
     distance between the two operands, which is the number of bit
     positions where OP1 and OP2 have different bit values.  If one
     operand is >=0 and the other <0 then the number of bits different
     is infinite, and the return value is the largest possible
     `mp_bitcnt_t'.

 -- Function: mp_bitcnt_t mpz_scan0 (const mpz_t OP, mp_bitcnt_t
          STARTING_BIT)
 -- Function: mp_bitcnt_t mpz_scan1 (const mpz_t OP, mp_bitcnt_t
          STARTING_BIT)
     Scan OP, starting from bit STARTING_BIT, towards more significant
     bits, until the first 0 or 1 bit (respectively) is found.  Return
     the index of the found bit.

     If the bit at STARTING_BIT is already what's sought, then
     STARTING_BIT is returned.

     If there's no bit found, then the largest possible `mp_bitcnt_t' is
     returned.  This will happen in `mpz_scan0' past the end of a
     negative number, or `mpz_scan1' past the end of a nonnegative
     number.

 -- Function: void mpz_setbit (mpz_t ROP, mp_bitcnt_t BIT_INDEX)
     Set bit BIT_INDEX in ROP.

 -- Function: void mpz_clrbit (mpz_t ROP, mp_bitcnt_t BIT_INDEX)
     Clear bit BIT_INDEX in ROP.

 -- Function: void mpz_combit (mpz_t ROP, mp_bitcnt_t BIT_INDEX)
     Complement bit BIT_INDEX in ROP.

 -- Function: int mpz_tstbit (const mpz_t OP, mp_bitcnt_t BIT_INDEX)
     Test bit BIT_INDEX in OP and return 0 or 1 accordingly.


File: gmp.info,  Node: I/O of Integers,  Next: Integer Random Numbers,  Prev: Integer Logic and Bit Fiddling,  Up: Integer Functions

5.12 Input and Output Functions
===============================

Functions that perform input from a stdio stream, and functions that
output to a stdio stream, of `mpz' numbers.  Passing a `NULL' pointer
for a STREAM argument to any of these functions will make them read from
`stdin' and write to `stdout', respectively.

   When using any of these functions, it is a good idea to include
`stdio.h' before `gmp.h', since that will allow `gmp.h' to define
prototypes for these functions.

   See also *Note Formatted Output:: and *Note Formatted Input::.

 -- Function: size_t mpz_out_str (FILE *STREAM, int BASE, const mpz_t
          OP)
     Output OP on stdio stream STREAM, as a string of digits in base
     BASE.  The base argument may vary from 2 to 62 or from -2 to -36.

     For BASE in the range 2..36, digits and lower-case letters are
     used; for -2..-36, digits and upper-case letters are used; for
     37..62, digits, upper-case letters, and lower-case letters (in
     that significance order) are used.

     Return the number of bytes written, or if an error occurred,
     return 0.

 -- Function: size_t mpz_inp_str (mpz_t ROP, FILE *STREAM, int BASE)
     Input a possibly white-space preceded string in base BASE from
     stdio stream STREAM, and put the read integer in ROP.

     The BASE may vary from 2 to 62, or if BASE is 0, then the leading
     characters are used: `0x' and `0X' for hexadecimal, `0b' and `0B'
     for binary, `0' for octal, or decimal otherwise.

     For bases up to 36, case is ignored; upper-case and lower-case
     letters have the same value.  For bases 37 to 62, upper-case
     letter represent the usual 10..35 while lower-case letter
     represent 36..61.

     Return the number of bytes read, or if an error occurred, return 0.

 -- Function: size_t mpz_out_raw (FILE *STREAM, const mpz_t OP)
     Output OP on stdio stream STREAM, in raw binary format.  The
     integer is written in a portable format, with 4 bytes of size
     information, and that many bytes of limbs.  Both the size and the
     limbs are written in decreasing significance order (i.e., in
     big-endian).

     The output can be read with `mpz_inp_raw'.

     Return the number of bytes written, or if an error occurred,
     return 0.

     The output of this can not be read by `mpz_inp_raw' from GMP 1,
     because of changes necessary for compatibility between 32-bit and
     64-bit machines.

 -- Function: size_t mpz_inp_raw (mpz_t ROP, FILE *STREAM)
     Input from stdio stream STREAM in the format written by
     `mpz_out_raw', and put the result in ROP.  Return the number of
     bytes read, or if an error occurred, return 0.

     This routine can read the output from `mpz_out_raw' also from GMP
     1, in spite of changes necessary for compatibility between 32-bit
     and 64-bit machines.


File: gmp.info,  Node: Integer Random Numbers,  Next: Integer Import and Export,  Prev: I/O of Integers,  Up: Integer Functions

5.13 Random Number Functions
============================

The random number functions of GMP come in two groups; older function
that rely on a global state, and newer functions that accept a state
parameter that is read and modified.  Please see the *Note Random
Number Functions:: for more information on how to use and not to use
random number functions.

 -- Function: void mpz_urandomb (mpz_t ROP, gmp_randstate_t STATE,
          mp_bitcnt_t N)
     Generate a uniformly distributed random integer in the range 0 to
     2^N-1, inclusive.

     The variable STATE must be initialized by calling one of the
     `gmp_randinit' functions (*Note Random State Initialization::)
     before invoking this function.

 -- Function: void mpz_urandomm (mpz_t ROP, gmp_randstate_t STATE,
          const mpz_t N)
     Generate a uniform random integer in the range 0 to N-1, inclusive.

     The variable STATE must be initialized by calling one of the
     `gmp_randinit' functions (*Note Random State Initialization::)
     before invoking this function.

 -- Function: void mpz_rrandomb (mpz_t ROP, gmp_randstate_t STATE,
          mp_bitcnt_t N)
     Generate a random integer with long strings of zeros and ones in
     the binary representation.  Useful for testing functions and
     algorithms, since this kind of random numbers have proven to be
     more likely to trigger corner-case bugs.  The random number will
     be in the range 2^N-1 to 2^N-1, inclusive.

     The variable STATE must be initialized by calling one of the
     `gmp_randinit' functions (*Note Random State Initialization::)
     before invoking this function.

 -- Function: void mpz_random (mpz_t ROP, mp_size_t MAX_SIZE)
     Generate a random integer of at most MAX_SIZE limbs.  The generated
     random number doesn't satisfy any particular requirements of
     randomness.  Negative random numbers are generated when MAX_SIZE
     is negative.

     This function is obsolete.  Use `mpz_urandomb' or `mpz_urandomm'
     instead.

 -- Function: void mpz_random2 (mpz_t ROP, mp_size_t MAX_SIZE)
     Generate a random integer of at most MAX_SIZE limbs, with long
     strings of zeros and ones in the binary representation.  Useful
     for testing functions and algorithms, since this kind of random
     numbers have proven to be more likely to trigger corner-case bugs.
     Negative random numbers are generated when MAX_SIZE is negative.

     This function is obsolete.  Use `mpz_rrandomb' instead.


File: gmp.info,  Node: Integer Import and Export,  Next: Miscellaneous Integer Functions,  Prev: Integer Random Numbers,  Up: Integer Functions

5.14 Integer Import and Export
==============================

`mpz_t' variables can be converted to and from arbitrary words of binary
data with the following functions.

 -- Function: void mpz_import (mpz_t ROP, size_t COUNT, int ORDER,
          size_t SIZE, int ENDIAN, size_t NAILS, const void *OP)
     Set ROP from an array of word data at OP.

     The parameters specify the format of the data.  COUNT many words
     are read, each SIZE bytes.  ORDER can be 1 for most significant
     word first or -1 for least significant first.  Within each word
     ENDIAN can be 1 for most significant byte first, -1 for least
     significant first, or 0 for the native endianness of the host CPU.
     The most significant NAILS bits of each word are skipped, this
     can be 0 to use the full words.

     There is no sign taken from the data, ROP will simply be a positive
     integer.  An application can handle any sign itself, and apply it
     for instance with `mpz_neg'.

     There are no data alignment restrictions on OP, any address is
     allowed.

     Here's an example converting an array of `unsigned long' data, most
     significant element first, and host byte order within each value.

          unsigned long  a[20];
          /* Initialize Z and A */
          mpz_import (z, 20, 1, sizeof(a[0]), 0, 0, a);

     This example assumes the full `sizeof' bytes are used for data in
     the given type, which is usually true, and certainly true for
     `unsigned long' everywhere we know of.  However on Cray vector
     systems it may be noted that `short' and `int' are always stored
     in 8 bytes (and with `sizeof' indicating that) but use only 32 or
     46 bits.  The NAILS feature can account for this, by passing for
     instance `8*sizeof(int)-INT_BIT'.

 -- Function: void * mpz_export (void *ROP, size_t *COUNTP, int ORDER,
          size_t SIZE, int ENDIAN, size_t NAILS, const mpz_t OP)
     Fill ROP with word data from OP.

     The parameters specify the format of the data produced.  Each word
     will be SIZE bytes and ORDER can be 1 for most significant word
     first or -1 for least significant first.  Within each word ENDIAN
     can be 1 for most significant byte first, -1 for least significant
     first, or 0 for the native endianness of the host CPU.  The most
     significant NAILS bits of each word are unused and set to zero,
     this can be 0 to produce full words.

     The number of words produced is written to `*COUNTP', or COUNTP
     can be `NULL' to discard the count.  ROP must have enough space
     for the data, or if ROP is `NULL' then a result array of the
     necessary size is allocated using the current GMP allocation
     function (*note Custom Allocation::).  In either case the return
     value is the destination used, either ROP or the allocated block.

     If OP is non-zero then the most significant word produced will be
     non-zero.  If OP is zero then the count returned will be zero and
     nothing written to ROP.  If ROP is `NULL' in this case, no block
     is allocated, just `NULL' is returned.

     The sign of OP is ignored, just the absolute value is exported.  An
     application can use `mpz_sgn' to get the sign and handle it as
     desired.  (*note Integer Comparisons::)

     There are no data alignment restrictions on ROP, any address is
     allowed.

     When an application is allocating space itself the required size
     can be determined with a calculation like the following.  Since
     `mpz_sizeinbase' always returns at least 1, `count' here will be
     at least one, which avoids any portability problems with
     `malloc(0)', though if `z' is zero no space at all is actually
     needed (or written).

          numb = 8*size - nail;
          count = (mpz_sizeinbase (z, 2) + numb-1) / numb;
          p = malloc (count * size);


File: gmp.info,  Node: Miscellaneous Integer Functions,  Next: Integer Special Functions,  Prev: Integer Import and Export,  Up: Integer Functions

5.15 Miscellaneous Functions
============================

 -- Function: int mpz_fits_ulong_p (const mpz_t OP)
 -- Function: int mpz_fits_slong_p (const mpz_t OP)
 -- Function: int mpz_fits_uint_p (const mpz_t OP)
 -- Function: int mpz_fits_sint_p (const mpz_t OP)
 -- Function: int mpz_fits_ushort_p (const mpz_t OP)
 -- Function: int mpz_fits_sshort_p (const mpz_t OP)
     Return non-zero iff the value of OP fits in an `unsigned long int',
     `signed long int', `unsigned int', `signed int', `unsigned short
     int', or `signed short int', respectively.  Otherwise, return zero.

 -- Macro: int mpz_odd_p (const mpz_t OP)
 -- Macro: int mpz_even_p (const mpz_t OP)
     Determine whether OP is odd or even, respectively.  Return
     non-zero if yes, zero if no.  These macros evaluate their argument
     more than once.

 -- Function: size_t mpz_sizeinbase (const mpz_t OP, int BASE)
     Return the size of OP measured in number of digits in the given
     BASE.  BASE can vary from 2 to 62.  The sign of OP is ignored,
     just the absolute value is used.  The result will be either exact
     or 1 too big.  If BASE is a power of 2, the result is always
     exact.  If OP is zero the return value is always 1.

     This function can be used to determine the space required when
     converting OP to a string.  The right amount of allocation is
     normally two more than the value returned by `mpz_sizeinbase', one
     extra for a minus sign and one for the null-terminator.

     It will be noted that `mpz_sizeinbase(OP,2)' can be used to locate
     the most significant 1 bit in OP, counting from 1.  (Unlike the
     bitwise functions which start from 0, *Note Logical and Bit
     Manipulation Functions: Integer Logic and Bit Fiddling.)


File: gmp.info,  Node: Integer Special Functions,  Prev: Miscellaneous Integer Functions,  Up: Integer Functions

5.16 Special Functions
======================

The functions in this section are for various special purposes.  Most
applications will not need them.

 -- Function: void mpz_array_init (mpz_t INTEGER_ARRAY, mp_size_t
          ARRAY_SIZE, mp_size_t FIXED_NUM_BITS)
     *This is an obsolete function.  Do not use it.*

 -- Function: void * _mpz_realloc (mpz_t INTEGER, mp_size_t NEW_ALLOC)
     Change the space for INTEGER to NEW_ALLOC limbs.  The value in
     INTEGER is preserved if it fits, or is set to 0 if not.  The return
     value is not useful to applications and should be ignored.

     `mpz_realloc2' is the preferred way to accomplish allocation
     changes like this.  `mpz_realloc2' and `_mpz_realloc' are the same
     except that `_mpz_realloc' takes its size in limbs.

 -- Function: mp_limb_t mpz_getlimbn (const mpz_t OP, mp_size_t N)
     Return limb number N from OP.  The sign of OP is ignored, just the
     absolute value is used.  The least significant limb is number 0.

     `mpz_size' can be used to find how many limbs make up OP.
     `mpz_getlimbn' returns zero if N is outside the range 0 to
     `mpz_size(OP)-1'.

 -- Function: size_t mpz_size (const mpz_t OP)
     Return the size of OP measured in number of limbs.  If OP is zero,
     the returned value will be zero.

 -- Function: const mp_limb_t * mpz_limbs_read (const mpz_t X)
     Return a pointer to the limb array representing the absolute value
     of X.  The size of the array is `mpz_size(X)'. Intended for read
     access only.

 -- Function: mp_limb_t * mpz_limbs_write (mpz_t X, mp_size_t N)
 -- Function: mp_limb_t * mpz_limbs_modify (mpz_t X, mp_size_t N)
     Return a pointer to the limb array, intended for write access. The
     array is reallocated as needed, to make room for N limbs. Requires
     N > 0. The `mpz_limbs_modify' function returns an array that holds
     the old absolute value of X, while `mpz_limbs_write' may destroy
     the old value and return an array with unspecified contents.

 -- Function: void mpz_limbs_finish (mpz_t X, mp_size_t S)
     Updates the internal size field of X. Used after writing to the
     limb array pointer returned by `mpz_limbs_write' or
     `mpz_limbs_modify' is completed. The array should contain abs(S)
     valid limbs, representing the new absolute value for X, and the
     sign of X is taken from the sign of S. This function never
     reallocates X, so the limb pointer remains valid.

     void foo (mpz_t x)
     {
       mp_size_t n, i;
       mp_limb_t *xp;

       n = mpz_size (x);
       xp = mpz_limbs_modify (x, 2*n);
       for (i = 0; i < n; i++)
         xp[n+i] = xp[n-1-i];
       mpz_limbs_finish (x, mpz_sgn (x) < 0 ? - 2*n : 2*n);
     }

 -- Function: mpz_srcptr mpz_roinit_n (mpz_t X, const mp_limb_t *XP,
          mp_size_t XS)
     Special initialization of X, using the given limb array and size.
     X should be treated as read-only: it can be passed safely as input
     to any mpz function, but not as an output. The array XP must point
     to at least a readable limb, its size is abs(XS), and the sign of
     X is the sign of XS. For convenience, the function returns X, but
     cast to a const pointer type.

     void foo (mpz_t x)
     {
       static const mp_limb_t y[3] = { 0x1, 0x2, 0x3 };
       mpz_t tmp;
       mpz_add (x, x, mpz_roinit_n (tmp, y, 3));
     }

 -- Macro: mpz_t MPZ_ROINIT_N (mp_limb_t *XP, mp_size_t XS)
     This macro expands to an initializer which can be assigned to an
     mpz_t variable. The limb array XP must point to at least a
     readable limb, moreover, unlike the `mpz_roinit_n' function, the
     array must be normalized: if XS is non-zero, then `XP[abs(XS)-1]'
     must be non-zero. Intended primarily for constant values. Using it
     for non-constant values requires a C compiler supporting C99.

     void foo (mpz_t x)
     {
       static const mp_limb_t ya[3] = { 0x1, 0x2, 0x3 };
       static const mpz_t y = MPZ_ROINIT_N ((mp_limb_t *) ya, 3);

       mpz_add (x, x, y);
     }


File: gmp.info,  Node: Rational Number Functions,  Next: Floating-point Functions,  Prev: Integer Functions,  Up: Top

6 Rational Number Functions
***************************

This chapter describes the GMP functions for performing arithmetic on
rational numbers.  These functions start with the prefix `mpq_'.

   Rational numbers are stored in objects of type `mpq_t'.

   All rational arithmetic functions assume operands have a canonical
form, and canonicalize their result.  The canonical form means that the
denominator and the numerator have no common factors, and that the
denominator is positive.  Zero has the unique representation 0/1.

   Pure assignment functions do not canonicalize the assigned variable.
It is the responsibility of the user to canonicalize the assigned
variable before any arithmetic operations are performed on that
variable.

 -- Function: void mpq_canonicalize (mpq_t OP)
     Remove any factors that are common to the numerator and
     denominator of OP, and make the denominator positive.

* Menu:

* Initializing Rationals::
* Rational Conversions::
* Rational Arithmetic::
* Comparing Rationals::
* Applying Integer Functions::
* I/O of Rationals::


File: gmp.info,  Node: Initializing Rationals,  Next: Rational Conversions,  Prev: Rational Number Functions,  Up: Rational Number Functions

6.1 Initialization and Assignment Functions
===========================================

 -- Function: void mpq_init (mpq_t X)
     Initialize X and set it to 0/1.  Each variable should normally
     only be initialized once, or at least cleared out (using the
     function `mpq_clear') between each initialization.

 -- Function: void mpq_inits (mpq_t X, ...)
     Initialize a NULL-terminated list of `mpq_t' variables, and set
     their values to 0/1.

 -- Function: void mpq_clear (mpq_t X)
     Free the space occupied by X.  Make sure to call this function for
     all `mpq_t' variables when you are done with them.

 -- Function: void mpq_clears (mpq_t X, ...)
     Free the space occupied by a NULL-terminated list of `mpq_t'
     variables.

 -- Function: void mpq_set (mpq_t ROP, const mpq_t OP)
 -- Function: void mpq_set_z (mpq_t ROP, const mpz_t OP)
     Assign ROP from OP.

 -- Function: void mpq_set_ui (mpq_t ROP, unsigned long int OP1,
          unsigned long int OP2)
 -- Function: void mpq_set_si (mpq_t ROP, signed long int OP1, unsigned
          long int OP2)
     Set the value of ROP to OP1/OP2.  Note that if OP1 and OP2 have
     common factors, ROP has to be passed to `mpq_canonicalize' before
     any operations are performed on ROP.

 -- Function: int mpq_set_str (mpq_t ROP, const char *STR, int BASE)
     Set ROP from a null-terminated string STR in the given BASE.

     The string can be an integer like "41" or a fraction like
     "41/152".  The fraction must be in canonical form (*note Rational
     Number Functions::), or if not then `mpq_canonicalize' must be
     called.

     The numerator and optional denominator are parsed the same as in
     `mpz_set_str' (*note Assigning Integers::).  White space is
     allowed in the string, and is simply ignored.  The BASE can vary
     from 2 to 62, or if BASE is 0 then the leading characters are
     used: `0x' or `0X' for hex, `0b' or `0B' for binary, `0' for
     octal, or decimal otherwise.  Note that this is done separately
     for the numerator and denominator, so for instance `0xEF/100' is
     239/100, whereas `0xEF/0x100' is 239/256.

     The return value is 0 if the entire string is a valid number, or
     -1 if not.

 -- Function: void mpq_swap (mpq_t ROP1, mpq_t ROP2)
     Swap the values ROP1 and ROP2 efficiently.


File: gmp.info,  Node: Rational Conversions,  Next: Rational Arithmetic,  Prev: Initializing Rationals,  Up: Rational Number Functions

6.2 Conversion Functions
========================

 -- Function: double mpq_get_d (const mpq_t OP)
     Convert OP to a `double', truncating if necessary (i.e. rounding
     towards zero).

     If the exponent from the conversion is too big or too small to fit
     a `double' then the result is system dependent.  For too big an
     infinity is returned when available.  For too small 0.0 is
     normally returned.  Hardware overflow, underflow and denorm traps
     may or may not occur.

 -- Function: void mpq_set_d (mpq_t ROP, double OP)
 -- Function: void mpq_set_f (mpq_t ROP, const mpf_t OP)
     Set ROP to the value of OP.  There is no rounding, this conversion
     is exact.

 -- Function: char * mpq_get_str (char *STR, int BASE, const mpq_t OP)
     Convert OP to a string of digits in base BASE.  The base may vary
     from 2 to 36.  The string will be of the form `num/den', or if the
     denominator is 1 then just `num'.

     If STR is `NULL', the result string is allocated using the current
     allocation function (*note Custom Allocation::).  The block will be
     `strlen(str)+1' bytes, that being exactly enough for the string and
     null-terminator.

     If STR is not `NULL', it should point to a block of storage large
     enough for the result, that being

          mpz_sizeinbase (mpq_numref(OP), BASE)
          + mpz_sizeinbase (mpq_denref(OP), BASE) + 3

     The three extra bytes are for a possible minus sign, possible
     slash, and the null-terminator.

     A pointer to the result string is returned, being either the
     allocated block, or the given STR.


File: gmp.info,  Node: Rational Arithmetic,  Next: Comparing Rationals,  Prev: Rational Conversions,  Up: Rational Number Functions

6.3 Arithmetic Functions
========================

 -- Function: void mpq_add (mpq_t SUM, const mpq_t ADDEND1, const mpq_t
          ADDEND2)
     Set SUM to ADDEND1 + ADDEND2.

 -- Function: void mpq_sub (mpq_t DIFFERENCE, const mpq_t MINUEND,
          const mpq_t SUBTRAHEND)
     Set DIFFERENCE to MINUEND - SUBTRAHEND.

 -- Function: void mpq_mul (mpq_t PRODUCT, const mpq_t MULTIPLIER,
          const mpq_t MULTIPLICAND)
     Set PRODUCT to MULTIPLIER times MULTIPLICAND.

 -- Function: void mpq_mul_2exp (mpq_t ROP, const mpq_t OP1,
          mp_bitcnt_t OP2)
     Set ROP to OP1 times 2 raised to OP2.

 -- Function: void mpq_div (mpq_t QUOTIENT, const mpq_t DIVIDEND, const
          mpq_t DIVISOR)
     Set QUOTIENT to DIVIDEND/DIVISOR.

 -- Function: void mpq_div_2exp (mpq_t ROP, const mpq_t OP1,
          mp_bitcnt_t OP2)
     Set ROP to OP1 divided by 2 raised to OP2.

 -- Function: void mpq_neg (mpq_t NEGATED_OPERAND, const mpq_t OPERAND)
     Set NEGATED_OPERAND to -OPERAND.

 -- Function: void mpq_abs (mpq_t ROP, const mpq_t OP)
     Set ROP to the absolute value of OP.

 -- Function: void mpq_inv (mpq_t INVERTED_NUMBER, const mpq_t NUMBER)
     Set INVERTED_NUMBER to 1/NUMBER.  If the new denominator is zero,
     this routine will divide by zero.


File: gmp.info,  Node: Comparing Rationals,  Next: Applying Integer Functions,  Prev: Rational Arithmetic,  Up: Rational Number Functions

6.4 Comparison Functions
========================

 -- Function: int mpq_cmp (const mpq_t OP1, const mpq_t OP2)
 -- Function: int mpq_cmp_z (const mpq_t OP1, const mpz_t OP2)
     Compare OP1 and OP2.  Return a positive value if OP1 > OP2, zero
     if OP1 = OP2, and a negative value if OP1 < OP2.

     To determine if two rationals are equal, `mpq_equal' is faster than
     `mpq_cmp'.

 -- Macro: int mpq_cmp_ui (const mpq_t OP1, unsigned long int NUM2,
          unsigned long int DEN2)
 -- Macro: int mpq_cmp_si (const mpq_t OP1, long int NUM2, unsigned
          long int DEN2)
     Compare OP1 and NUM2/DEN2.  Return a positive value if OP1 >
     NUM2/DEN2, zero if OP1 = NUM2/DEN2, and a negative value if OP1 <
     NUM2/DEN2.

     NUM2 and DEN2 are allowed to have common factors.

     These functions are implemented as a macros and evaluate their
     arguments multiple times.

 -- Macro: int mpq_sgn (const mpq_t OP)
     Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0.

     This function is actually implemented as a macro.  It evaluates its
     argument multiple times.

 -- Function: int mpq_equal (const mpq_t OP1, const mpq_t OP2)
     Return non-zero if OP1 and OP2 are equal, zero if they are
     non-equal.  Although `mpq_cmp' can be used for the same purpose,
     this function is much faster.


File: gmp.info,  Node: Applying Integer Functions,  Next: I/O of Rationals,  Prev: Comparing Rationals,  Up: Rational Number Functions

6.5 Applying Integer Functions to Rationals
===========================================

The set of `mpq' functions is quite small.  In particular, there are few
functions for either input or output.  The following functions give
direct access to the numerator and denominator of an `mpq_t'.

   Note that if an assignment to the numerator and/or denominator could
take an `mpq_t' out of the canonical form described at the start of
this chapter (*note Rational Number Functions::) then
`mpq_canonicalize' must be called before any other `mpq' functions are
applied to that `mpq_t'.

 -- Macro: mpz_t mpq_numref (const mpq_t OP)
 -- Macro: mpz_t mpq_denref (const mpq_t OP)
     Return a reference to the numerator and denominator of OP,
     respectively.  The `mpz' functions can be used on the result of
     these macros.

 -- Function: void mpq_get_num (mpz_t NUMERATOR, const mpq_t RATIONAL)
 -- Function: void mpq_get_den (mpz_t DENOMINATOR, const mpq_t RATIONAL)
 -- Function: void mpq_set_num (mpq_t RATIONAL, const mpz_t NUMERATOR)
 -- Function: void mpq_set_den (mpq_t RATIONAL, const mpz_t DENOMINATOR)
     Get or set the numerator or denominator of a rational.  These
     functions are equivalent to calling `mpz_set' with an appropriate
     `mpq_numref' or `mpq_denref'.  Direct use of `mpq_numref' or
     `mpq_denref' is recommended instead of these functions.


File: gmp.info,  Node: I/O of Rationals,  Prev: Applying Integer Functions,  Up: Rational Number Functions

6.6 Input and Output Functions
==============================

Functions that perform input from a stdio stream, and functions that
output to a stdio stream, of `mpq' numbers.  Passing a `NULL' pointer
for a STREAM argument to any of these functions will make them read from
`stdin' and write to `stdout', respectively.

   When using any of these functions, it is a good idea to include
`stdio.h' before `gmp.h', since that will allow `gmp.h' to define
prototypes for these functions.

   See also *Note Formatted Output:: and *Note Formatted Input::.

 -- Function: size_t mpq_out_str (FILE *STREAM, int BASE, const mpq_t
          OP)
     Output OP on stdio stream STREAM, as a string of digits in base
     BASE.  The base may vary from 2 to 36.  Output is in the form
     `num/den' or if the denominator is 1 then just `num'.

     Return the number of bytes written, or if an error occurred,
     return 0.

 -- Function: size_t mpq_inp_str (mpq_t ROP, FILE *STREAM, int BASE)
     Read a string of digits from STREAM and convert them to a rational
     in ROP.  Any initial white-space characters are read and
     discarded.  Return the number of characters read (including white
     space), or 0 if a rational could not be read.

     The input can be a fraction like `17/63' or just an integer like
     `123'.  Reading stops at the first character not in this form, and
     white space is not permitted within the string.  If the input
     might not be in canonical form, then `mpq_canonicalize' must be
     called (*note Rational Number Functions::).

     The BASE can be between 2 and 36, or can be 0 in which case the
     leading characters of the string determine the base, `0x' or `0X'
     for hexadecimal, `0' for octal, or decimal otherwise.  The leading
     characters are examined separately for the numerator and
     denominator of a fraction, so for instance `0x10/11' is 16/11,
     whereas `0x10/0x11' is 16/17.


File: gmp.info,  Node: Floating-point Functions,  Next: Low-level Functions,  Prev: Rational Number Functions,  Up: Top

7 Floating-point Functions
**************************

GMP floating point numbers are stored in objects of type `mpf_t' and
functions operating on them have an `mpf_' prefix.

   The mantissa of each float has a user-selectable precision, in
practice only limited by available memory.  Each variable has its own
precision, and that can be increased or decreased at any time.  This
selectable precision is a minimum value, GMP rounds it up to a whole
limb.

   The accuracy of a calculation is determined by the priorly set
precision of the destination variable and the numeric values of the
input variables.  Input variables' set precisions do not affect
calculations (except indirectly as their values might have been
affected when they were assigned).

   The exponent of each float has fixed precision, one machine word on
most systems.  In the current implementation the exponent is a count of
limbs, so for example on a 32-bit system this means a range of roughly
2^-68719476768 to 2^68719476736, or on a 64-bit system this will be
much greater.  Note however that `mpf_get_str' can only return an
exponent which fits an `mp_exp_t' and currently `mpf_set_str' doesn't
accept exponents bigger than a `long'.

   Each variable keeps track of the mantissa data actually in use.
This means that if a float is exactly represented in only a few bits
then only those bits will be used in a calculation, even if the
variable's selected precision is high.  This is a performance
optimization; it does not affect the numeric results.

   Internally, GMP sometimes calculates with higher precision than that
of the destination variable in order to limit errors.  Final results
are always truncated to the destination variable's precision.

   The mantissa is stored in binary.  One consequence of this is that
decimal fractions like 0.1 cannot be represented exactly.  The same is
true of plain IEEE `double' floats.  This makes both highly unsuitable
for calculations involving money or other values that should be exact
decimal fractions.  (Suitably scaled integers, or perhaps rationals,
are better choices.)

   The `mpf' functions and variables have no special notion of infinity
or not-a-number, and applications must take care not to overflow the
exponent or results will be unpredictable.

   Note that the `mpf' functions are _not_ intended as a smooth
extension to IEEE P754 arithmetic.  In particular results obtained on
one computer often differ from the results on a computer with a
different word size.

   New projects should consider using the GMP extension library MPFR
(`http://mpfr.org') instead.  MPFR provides well-defined precision and
accurate rounding, and thereby naturally extends IEEE P754.

* Menu:

* Initializing Floats::
* Assigning Floats::
* Simultaneous Float Init & Assign::
* Converting Floats::
* Float Arithmetic::
* Float Comparison::
* I/O of Floats::
* Miscellaneous Float Functions::


File: gmp.info,  Node: Initializing Floats,  Next: Assigning Floats,  Prev: Floating-point Functions,  Up: Floating-point Functions

7.1 Initialization Functions
============================

 -- Function: void mpf_set_default_prec (mp_bitcnt_t PREC)
     Set the default precision to be *at least* PREC bits.  All
     subsequent calls to `mpf_init' will use this precision, but
     previously initialized variables are unaffected.

 -- Function: mp_bitcnt_t mpf_get_default_prec (void)
     Return the default precision actually used.

   An `mpf_t' object must be initialized before storing the first value
in it.  The functions `mpf_init' and `mpf_init2' are used for that
purpose.

 -- Function: void mpf_init (mpf_t X)
     Initialize X to 0.  Normally, a variable should be initialized
     once only or at least be cleared, using `mpf_clear', between
     initializations.  The precision of X is undefined unless a default
     precision has already been established by a call to
     `mpf_set_default_prec'.

 -- Function: void mpf_init2 (mpf_t X, mp_bitcnt_t PREC)
     Initialize X to 0 and set its precision to be *at least* PREC
     bits.  Normally, a variable should be initialized once only or at
     least be cleared, using `mpf_clear', between initializations.

 -- Function: void mpf_inits (mpf_t X, ...)
     Initialize a NULL-terminated list of `mpf_t' variables, and set
     their values to 0.  The precision of the initialized variables is
     undefined unless a default precision has already been established
     by a call to `mpf_set_default_prec'.

 -- Function: void mpf_clear (mpf_t X)
     Free the space occupied by X.  Make sure to call this function for
     all `mpf_t' variables when you are done with them.

 -- Function: void mpf_clears (mpf_t X, ...)
     Free the space occupied by a NULL-terminated list of `mpf_t'
     variables.

   Here is an example on how to initialize floating-point variables:
     {
       mpf_t x, y;
       mpf_init (x);           /* use default precision */
       mpf_init2 (y, 256);     /* precision _at least_ 256 bits */
       ...
       /* Unless the program is about to exit, do ... */
       mpf_clear (x);
       mpf_clear (y);
     }

   The following three functions are useful for changing the precision
during a calculation.  A typical use would be for adjusting the
precision gradually in iterative algorithms like Newton-Raphson, making
the computation precision closely match the actual accurate part of the
numbers.

 -- Function: mp_bitcnt_t mpf_get_prec (const mpf_t OP)
     Return the current precision of OP, in bits.

 -- Function: void mpf_set_prec (mpf_t ROP, mp_bitcnt_t PREC)
     Set the precision of ROP to be *at least* PREC bits.  The value in
     ROP will be truncated to the new precision.

     This function requires a call to `realloc', and so should not be
     used in a tight loop.

 -- Function: void mpf_set_prec_raw (mpf_t ROP, mp_bitcnt_t PREC)
     Set the precision of ROP to be *at least* PREC bits, without
     changing the memory allocated.

     PREC must be no more than the allocated precision for ROP, that
     being the precision when ROP was initialized, or in the most recent
     `mpf_set_prec'.

     The value in ROP is unchanged, and in particular if it had a higher
     precision than PREC it will retain that higher precision.  New
     values written to ROP will use the new PREC.

     Before calling `mpf_clear' or the full `mpf_set_prec', another
     `mpf_set_prec_raw' call must be made to restore ROP to its original
     allocated precision.  Failing to do so will have unpredictable
     results.

     `mpf_get_prec' can be used before `mpf_set_prec_raw' to get the
     original allocated precision.  After `mpf_set_prec_raw' it
     reflects the PREC value set.

     `mpf_set_prec_raw' is an efficient way to use an `mpf_t' variable
     at different precisions during a calculation, perhaps to gradually
     increase precision in an iteration, or just to use various
     different precisions for different purposes during a calculation.


File: gmp.info,  Node: Assigning Floats,  Next: Simultaneous Float Init & Assign,  Prev: Initializing Floats,  Up: Floating-point Functions

7.2 Assignment Functions
========================

These functions assign new values to already initialized floats (*note
Initializing Floats::).

 -- Function: void mpf_set (mpf_t ROP, const mpf_t OP)
 -- Function: void mpf_set_ui (mpf_t ROP, unsigned long int OP)
 -- Function: void mpf_set_si (mpf_t ROP, signed long int OP)
 -- Function: void mpf_set_d (mpf_t ROP, double OP)
 -- Function: void mpf_set_z (mpf_t ROP, const mpz_t OP)
 -- Function: void mpf_set_q (mpf_t ROP, const mpq_t OP)
     Set the value of ROP from OP.

 -- Function: int mpf_set_str (mpf_t ROP, const char *STR, int BASE)
     Set the value of ROP from the string in STR.  The string is of the
     form `M@N' or, if the base is 10 or less, alternatively `MeN'.
     `M' is the mantissa and `N' is the exponent.  The mantissa is
     always in the specified base.  The exponent is either in the
     specified base or, if BASE is negative, in decimal.  The decimal
     point expected is taken from the current locale, on systems
     providing `localeconv'.

     The argument BASE may be in the ranges 2 to 62, or -62 to -2.
     Negative values are used to specify that the exponent is in
     decimal.

     For bases up to 36, case is ignored; upper-case and lower-case
     letters have the same value; for bases 37 to 62, upper-case letter
     represent the usual 10..35 while lower-case letter represent
     36..61.

     Unlike the corresponding `mpz' function, the base will not be
     determined from the leading characters of the string if BASE is 0.
     This is so that numbers like `0.23' are not interpreted as octal.

     White space is allowed in the string, and is simply ignored.
     [This is not really true; white-space is ignored in the beginning
     of the string and within the mantissa, but not in other places,
     such as after a minus sign or in the exponent.  We are considering
     changing the definition of this function, making it fail when
     there is any white-space in the input, since that makes a lot of
     sense.  Please tell us your opinion about this change.  Do you
     really want it to accept "3 14" as meaning 314 as it does now?]

     This function returns 0 if the entire string is a valid number in
     base BASE.  Otherwise it returns -1.

 -- Function: void mpf_swap (mpf_t ROP1, mpf_t ROP2)
     Swap ROP1 and ROP2 efficiently.  Both the values and the
     precisions of the two variables are swapped.


File: gmp.info,  Node: Simultaneous Float Init & Assign,  Next: Converting Floats,  Prev: Assigning Floats,  Up: Floating-point Functions

7.3 Combined Initialization and Assignment Functions
====================================================

For convenience, GMP provides a parallel series of initialize-and-set
functions which initialize the output and then store the value there.
These functions' names have the form `mpf_init_set...'

   Once the float has been initialized by any of the `mpf_init_set...'
functions, it can be used as the source or destination operand for the
ordinary float functions.  Don't use an initialize-and-set function on
a variable already initialized!

 -- Function: void mpf_init_set (mpf_t ROP, const mpf_t OP)
 -- Function: void mpf_init_set_ui (mpf_t ROP, unsigned long int OP)
 -- Function: void mpf_init_set_si (mpf_t ROP, signed long int OP)
 -- Function: void mpf_init_set_d (mpf_t ROP, double OP)
     Initialize ROP and set its value from OP.

     The precision of ROP will be taken from the active default
     precision, as set by `mpf_set_default_prec'.

 -- Function: int mpf_init_set_str (mpf_t ROP, const char *STR, int
          BASE)
     Initialize ROP and set its value from the string in STR.  See
     `mpf_set_str' above for details on the assignment operation.

     Note that ROP is initialized even if an error occurs.  (I.e., you
     have to call `mpf_clear' for it.)

     The precision of ROP will be taken from the active default
     precision, as set by `mpf_set_default_prec'.


File: gmp.info,  Node: Converting Floats,  Next: Float Arithmetic,  Prev: Simultaneous Float Init & Assign,  Up: Floating-point Functions

7.4 Conversion Functions
========================

 -- Function: double mpf_get_d (const mpf_t OP)
     Convert OP to a `double', truncating if necessary (i.e. rounding
     towards zero).

     If the exponent in OP is too big or too small to fit a `double'
     then the result is system dependent.  For too big an infinity is
     returned when available.  For too small 0.0 is normally returned.
     Hardware overflow, underflow and denorm traps may or may not occur.

 -- Function: double mpf_get_d_2exp (signed long int *EXP, const mpf_t
          OP)
     Convert OP to a `double', truncating if necessary (i.e. rounding
     towards zero), and with an exponent returned separately.

     The return value is in the range 0.5<=abs(D)<1 and the exponent is
     stored to `*EXP'.  D * 2^EXP is the (truncated) OP value.  If OP
     is zero, the return is 0.0 and 0 is stored to `*EXP'.

     This is similar to the standard C `frexp' function (*note
     Normalization Functions: (libc)Normalization Functions.).

 -- Function: long mpf_get_si (const mpf_t OP)
 -- Function: unsigned long mpf_get_ui (const mpf_t OP)
     Convert OP to a `long' or `unsigned long', truncating any fraction
     part.  If OP is too big for the return type, the result is
     undefined.

     See also `mpf_fits_slong_p' and `mpf_fits_ulong_p' (*note
     Miscellaneous Float Functions::).

 -- Function: char * mpf_get_str (char *STR, mp_exp_t *EXPPTR, int
          BASE, size_t N_DIGITS, const mpf_t OP)
     Convert OP to a string of digits in base BASE.  The base argument
     may vary from 2 to 62 or from -2 to -36.  Up to N_DIGITS digits
     will be generated.  Trailing zeros are not returned.  No more
     digits than can be accurately represented by OP are ever
     generated.  If N_DIGITS is 0 then that accurate maximum number of
     digits are generated.

     For BASE in the range 2..36, digits and lower-case letters are
     used; for -2..-36, digits and upper-case letters are used; for
     37..62, digits, upper-case letters, and lower-case letters (in
     that significance order) are used.

     If STR is `NULL', the result string is allocated using the current
     allocation function (*note Custom Allocation::).  The block will be
     `strlen(str)+1' bytes, that being exactly enough for the string and
     null-terminator.

     If STR is not `NULL', it should point to a block of N_DIGITS + 2
     bytes, that being enough for the mantissa, a possible minus sign,
     and a null-terminator.  When N_DIGITS is 0 to get all significant
     digits, an application won't be able to know the space required,
     and STR should be `NULL' in that case.

     The generated string is a fraction, with an implicit radix point
     immediately to the left of the first digit.  The applicable
     exponent is written through the EXPPTR pointer.  For example, the
     number 3.1416 would be returned as string "31416" and exponent 1.

     When OP is zero, an empty string is produced and the exponent
     returned is 0.

     A pointer to the result string is returned, being either the
     allocated block or the given STR.


File: gmp.info,  Node: Float Arithmetic,  Next: Float Comparison,  Prev: Converting Floats,  Up: Floating-point Functions

7.5 Arithmetic Functions
========================

 -- Function: void mpf_add (mpf_t ROP, const mpf_t OP1, const mpf_t OP2)
 -- Function: void mpf_add_ui (mpf_t ROP, const mpf_t OP1, unsigned
          long int OP2)
     Set ROP to OP1 + OP2.

 -- Function: void mpf_sub (mpf_t ROP, const mpf_t OP1, const mpf_t OP2)
 -- Function: void mpf_ui_sub (mpf_t ROP, unsigned long int OP1, const
          mpf_t OP2)
 -- Function: void mpf_sub_ui (mpf_t ROP, const mpf_t OP1, unsigned
          long int OP2)
     Set ROP to OP1 - OP2.

 -- Function: void mpf_mul (mpf_t ROP, const mpf_t OP1, const mpf_t OP2)
 -- Function: void mpf_mul_ui (mpf_t ROP, const mpf_t OP1, unsigned
          long int OP2)
     Set ROP to OP1 times OP2.

   Division is undefined if the divisor is zero, and passing a zero
divisor to the divide functions will make these functions intentionally
divide by zero.  This lets the user handle arithmetic exceptions in
these functions in the same manner as other arithmetic exceptions.

 -- Function: void mpf_div (mpf_t ROP, const mpf_t OP1, const mpf_t OP2)
 -- Function: void mpf_ui_div (mpf_t ROP, unsigned long int OP1, const
          mpf_t OP2)
 -- Function: void mpf_div_ui (mpf_t ROP, const mpf_t OP1, unsigned
          long int OP2)
     Set ROP to OP1/OP2.

 -- Function: void mpf_sqrt (mpf_t ROP, const mpf_t OP)
 -- Function: void mpf_sqrt_ui (mpf_t ROP, unsigned long int OP)
     Set ROP to the square root of OP.

 -- Function: void mpf_pow_ui (mpf_t ROP, const mpf_t OP1, unsigned
          long int OP2)
     Set ROP to OP1 raised to the power OP2.

 -- Function: void mpf_neg (mpf_t ROP, const mpf_t OP)
     Set ROP to -OP.

 -- Function: void mpf_abs (mpf_t ROP, const mpf_t OP)
     Set ROP to the absolute value of OP.

 -- Function: void mpf_mul_2exp (mpf_t ROP, const mpf_t OP1,
          mp_bitcnt_t OP2)
     Set ROP to OP1 times 2 raised to OP2.

 -- Function: void mpf_div_2exp (mpf_t ROP, const mpf_t OP1,
          mp_bitcnt_t OP2)
     Set ROP to OP1 divided by 2 raised to OP2.


File: gmp.info,  Node: Float Comparison,  Next: I/O of Floats,  Prev: Float Arithmetic,  Up: Floating-point Functions

7.6 Comparison Functions
========================

 -- Function: int mpf_cmp (const mpf_t OP1, const mpf_t OP2)
 -- Function: int mpf_cmp_z (const mpf_t OP1, const mpz_t OP2)
 -- Function: int mpf_cmp_d (const mpf_t OP1, double OP2)
 -- Function: int mpf_cmp_ui (const mpf_t OP1, unsigned long int OP2)
 -- Function: int mpf_cmp_si (const mpf_t OP1, signed long int OP2)
     Compare OP1 and OP2.  Return a positive value if OP1 > OP2, zero
     if OP1 = OP2, and a negative value if OP1 < OP2.

     `mpf_cmp_d' can be called with an infinity, but results are
     undefined for a NaN.

 -- Function: int mpf_eq (const mpf_t OP1, const mpf_t OP2, mp_bitcnt_t
          op3)
     *This function is mathematically ill-defined and should not be
     used.*

     Return non-zero if the first OP3 bits of OP1 and OP2 are equal,
     zero otherwise.  Note that numbers like e.g., 256 (binary
     100000000) and 255 (binary 11111111) will never be equal by this
     function's measure, and furthermore that 0 will only be equal to
     itself.

 -- Function: void mpf_reldiff (mpf_t ROP, const mpf_t OP1, const mpf_t
          OP2)
     Compute the relative difference between OP1 and OP2 and store the
     result in ROP.  This is abs(OP1-OP2)/OP1.

 -- Macro: int mpf_sgn (const mpf_t OP)
     Return +1 if OP > 0, 0 if OP = 0, and -1 if OP < 0.

     This function is actually implemented as a macro.  It evaluates
     its argument multiple times.


File: gmp.info,  Node: I/O of Floats,  Next: Miscellaneous Float Functions,  Prev: Float Comparison,  Up: Floating-point Functions

7.7 Input and Output Functions
==============================

Functions that perform input from a stdio stream, and functions that
output to a stdio stream, of `mpf' numbers.  Passing a `NULL' pointer
for a STREAM argument to any of these functions will make them read from
`stdin' and write to `stdout', respectively.

   When using any of these functions, it is a good idea to include
`stdio.h' before `gmp.h', since that will allow `gmp.h' to define
prototypes for these functions.

   See also *Note Formatted Output:: and *Note Formatted Input::.

 -- Function: size_t mpf_out_str (FILE *STREAM, int BASE, size_t
          N_DIGITS, const mpf_t OP)
     Print OP to STREAM, as a string of digits.  Return the number of
     bytes written, or if an error occurred, return 0.

     The mantissa is prefixed with an `0.' and is in the given BASE,
     which may vary from 2 to 62 or from -2 to -36.  An exponent is
     then printed, separated by an `e', or if the base is greater than
     10 then by an `@'.  The exponent is always in decimal.  The
     decimal point follows the current locale, on systems providing
     `localeconv'.

     For BASE in the range 2..36, digits and lower-case letters are
     used; for -2..-36, digits and upper-case letters are used; for
     37..62, digits, upper-case letters, and lower-case letters (in
     that significance order) are used.

     Up to N_DIGITS will be printed from the mantissa, except that no
     more digits than are accurately representable by OP will be
     printed.  N_DIGITS can be 0 to select that accurate maximum.

 -- Function: size_t mpf_inp_str (mpf_t ROP, FILE *STREAM, int BASE)
     Read a string in base BASE from STREAM, and put the read float in
     ROP.  The string is of the form `M@N' or, if the base is 10 or
     less, alternatively `MeN'.  `M' is the mantissa and `N' is the
     exponent.  The mantissa is always in the specified base.  The
     exponent is either in the specified base or, if BASE is negative,
     in decimal.  The decimal point expected is taken from the current
     locale, on systems providing `localeconv'.

     The argument BASE may be in the ranges 2 to 36, or -36 to -2.
     Negative values are used to specify that the exponent is in
     decimal.

     Unlike the corresponding `mpz' function, the base will not be
     determined from the leading characters of the string if BASE is 0.
     This is so that numbers like `0.23' are not interpreted as octal.

     Return the number of bytes read, or if an error occurred, return 0.


File: gmp.info,  Node: Miscellaneous Float Functions,  Prev: I/O of Floats,  Up: Floating-point Functions

7.8 Miscellaneous Functions
===========================

 -- Function: void mpf_ceil (mpf_t ROP, const mpf_t OP)
 -- Function: void mpf_floor (mpf_t ROP, const mpf_t OP)
 -- Function: void mpf_trunc (mpf_t ROP, const mpf_t OP)
     Set ROP to OP rounded to an integer.  `mpf_ceil' rounds to the
     next higher integer, `mpf_floor' to the next lower, and `mpf_trunc'
     to the integer towards zero.

 -- Function: int mpf_integer_p (const mpf_t OP)
     Return non-zero if OP is an integer.

 -- Function: int mpf_fits_ulong_p (const mpf_t OP)
 -- Function: int mpf_fits_slong_p (const mpf_t OP)
 -- Function: int mpf_fits_uint_p (const mpf_t OP)
 -- Function: int mpf_fits_sint_p (const mpf_t OP)
 -- Function: int mpf_fits_ushort_p (const mpf_t OP)
 -- Function: int mpf_fits_sshort_p (const mpf_t OP)
     Return non-zero if OP would fit in the respective C data type, when
     truncated to an integer.

 -- Function: void mpf_urandomb (mpf_t ROP, gmp_randstate_t STATE,
          mp_bitcnt_t NBITS)
     Generate a uniformly distributed random float in ROP, such that 0
     <= ROP < 1, with NBITS significant bits in the mantissa or less if
     the precision of ROP is smaller.

     The variable STATE must be initialized by calling one of the
     `gmp_randinit' functions (*Note Random State Initialization::)
     before invoking this function.

 -- Function: void mpf_random2 (mpf_t ROP, mp_size_t MAX_SIZE, mp_exp_t
          EXP)
     Generate a random float of at most MAX_SIZE limbs, with long
     strings of zeros and ones in the binary representation.  The
     exponent of the number is in the interval -EXP to EXP (in limbs).
     This function is useful for testing functions and algorithms,
     since these kind of random numbers have proven to be more likely
     to trigger corner-case bugs.  Negative random numbers are
     generated when MAX_SIZE is negative.


File: gmp.info,  Node: Low-level Functions,  Next: Random Number Functions,  Prev: Floating-point Functions,  Up: Top

8 Low-level Functions
*********************

This chapter describes low-level GMP functions, used to implement the
high-level GMP functions, but also intended for time-critical user code.

   These functions start with the prefix `mpn_'.

   The `mpn' functions are designed to be as fast as possible, *not* to
provide a coherent calling interface.  The different functions have
somewhat similar interfaces, but there are variations that make them
hard to use.  These functions do as little as possible apart from the
real multiple precision computation, so that no time is spent on things
that not all callers need.

   A source operand is specified by a pointer to the least significant
limb and a limb count.  A destination operand is specified by just a
pointer.  It is the responsibility of the caller to ensure that the
destination has enough space for storing the result.

   With this way of specifying operands, it is possible to perform
computations on subranges of an argument, and store the result into a
subrange of a destination.

   A common requirement for all functions is that each source area
needs at least one limb.  No size argument may be zero.  Unless
otherwise stated, in-place operations are allowed where source and
destination are the same, but not where they only partly overlap.

   The `mpn' functions are the base for the implementation of the
`mpz_', `mpf_', and `mpq_' functions.

   This example adds the number beginning at S1P and the number
beginning at S2P and writes the sum at DESTP.  All areas have N limbs.

     cy = mpn_add_n (destp, s1p, s2p, n)

   It should be noted that the `mpn' functions make no attempt to
identify high or low zero limbs on their operands, or other special
forms.  On random data such cases will be unlikely and it'd be wasteful
for every function to check every time.  An application knowing
something about its data can take steps to trim or perhaps split its
calculations.


In the notation used below, a source operand is identified by the
pointer to the least significant limb, and the limb count in braces.
For example, {S1P, S1N}.

 -- Function: mp_limb_t mpn_add_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Add {S1P, N} and {S2P, N}, and write the N least significant limbs
     of the result to RP.  Return carry, either 0 or 1.

     This is the lowest-level function for addition.  It is the
     preferred function for addition, since it is written in assembly
     for most CPUs.  For addition of a variable to itself (i.e., S1P
     equals S2P) use `mpn_lshift' with a count of 1 for optimal speed.

 -- Function: mp_limb_t mpn_add_1 (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t N, mp_limb_t S2LIMB)
     Add {S1P, N} and S2LIMB, and write the N least significant limbs
     of the result to RP.  Return carry, either 0 or 1.

 -- Function: mp_limb_t mpn_add (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N)
     Add {S1P, S1N} and {S2P, S2N}, and write the S1N least significant
     limbs of the result to RP.  Return carry, either 0 or 1.

     This function requires that S1N is greater than or equal to S2N.

 -- Function: mp_limb_t mpn_sub_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Subtract {S2P, N} from {S1P, N}, and write the N least significant
     limbs of the result to RP.  Return borrow, either 0 or 1.

     This is the lowest-level function for subtraction.  It is the
     preferred function for subtraction, since it is written in
     assembly for most CPUs.

 -- Function: mp_limb_t mpn_sub_1 (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t N, mp_limb_t S2LIMB)
     Subtract S2LIMB from {S1P, N}, and write the N least significant
     limbs of the result to RP.  Return borrow, either 0 or 1.

 -- Function: mp_limb_t mpn_sub (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N)
     Subtract {S2P, S2N} from {S1P, S1N}, and write the S1N least
     significant limbs of the result to RP.  Return borrow, either 0 or
     1.

     This function requires that S1N is greater than or equal to S2N.

 -- Function: mp_limb_t mpn_neg (mp_limb_t *RP, const mp_limb_t *SP,
          mp_size_t N)
     Perform the negation of {SP, N}, and write the result to {RP, N}.
     This is equivalent to calling `mpn_sub_n' with a N-limb zero
     minuend and passing {SP, N} as subtrahend.  Return borrow, either
     0 or 1.

 -- Function: void mpn_mul_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Multiply {S1P, N} and {S2P, N}, and write the 2*N-limb result to
     RP.

     The destination has to have space for 2*N limbs, even if the
     product's most significant limb is zero.  No overlap is permitted
     between the destination and either source.

     If the two input operands are the same, use `mpn_sqr'.

 -- Function: mp_limb_t mpn_mul (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t S1N, const mp_limb_t *S2P, mp_size_t S2N)
     Multiply {S1P, S1N} and {S2P, S2N}, and write the (S1N+S2N)-limb
     result to RP.  Return the most significant limb of the result.

     The destination has to have space for S1N + S2N limbs, even if the
     product's most significant limb is zero.  No overlap is permitted
     between the destination and either source.

     This function requires that S1N is greater than or equal to S2N.

 -- Function: void mpn_sqr (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t N)
     Compute the square of {S1P, N} and write the 2*N-limb result to RP.

     The destination has to have space for 2N limbs, even if the
     result's most significant limb is zero.  No overlap is permitted
     between the destination and the source.

 -- Function: mp_limb_t mpn_mul_1 (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t N, mp_limb_t S2LIMB)
     Multiply {S1P, N} by S2LIMB, and write the N least significant
     limbs of the product to RP.  Return the most significant limb of
     the product.  {S1P, N} and {RP, N} are allowed to overlap provided
     RP <= S1P.

     This is a low-level function that is a building block for general
     multiplication as well as other operations in GMP.  It is written
     in assembly for most CPUs.

     Don't call this function if S2LIMB is a power of 2; use
     `mpn_lshift' with a count equal to the logarithm of S2LIMB
     instead, for optimal speed.

 -- Function: mp_limb_t mpn_addmul_1 (mp_limb_t *RP, const mp_limb_t
          *S1P, mp_size_t N, mp_limb_t S2LIMB)
     Multiply {S1P, N} and S2LIMB, and add the N least significant
     limbs of the product to {RP, N} and write the result to RP.
     Return the most significant limb of the product, plus carry-out
     from the addition.  {S1P, N} and {RP, N} are allowed to overlap
     provided RP <= S1P.

     This is a low-level function that is a building block for general
     multiplication as well as other operations in GMP.  It is written
     in assembly for most CPUs.

 -- Function: mp_limb_t mpn_submul_1 (mp_limb_t *RP, const mp_limb_t
          *S1P, mp_size_t N, mp_limb_t S2LIMB)
     Multiply {S1P, N} and S2LIMB, and subtract the N least significant
     limbs of the product from {RP, N} and write the result to RP.
     Return the most significant limb of the product, plus borrow-out
     from the subtraction.  {S1P, N} and {RP, N} are allowed to overlap
     provided RP <= S1P.

     This is a low-level function that is a building block for general
     multiplication and division as well as other operations in GMP.
     It is written in assembly for most CPUs.

 -- Function: void mpn_tdiv_qr (mp_limb_t *QP, mp_limb_t *RP, mp_size_t
          QXN, const mp_limb_t *NP, mp_size_t NN, const mp_limb_t *DP,
          mp_size_t DN)
     Divide {NP, NN} by {DP, DN} and put the quotient at {QP, NN-DN+1}
     and the remainder at {RP, DN}.  The quotient is rounded towards 0.

     No overlap is permitted between arguments, except that NP might
     equal RP.  The dividend size NN must be greater than or equal to
     divisor size DN.  The most significant limb of the divisor must be
     non-zero.  The QXN operand must be zero.

 -- Function: mp_limb_t mpn_divrem (mp_limb_t *R1P, mp_size_t QXN,
          mp_limb_t *RS2P, mp_size_t RS2N, const mp_limb_t *S3P,
          mp_size_t S3N)
     [This function is obsolete.  Please call `mpn_tdiv_qr' instead for
     best performance.]

     Divide {RS2P, RS2N} by {S3P, S3N}, and write the quotient at R1P,
     with the exception of the most significant limb, which is
     returned.  The remainder replaces the dividend at RS2P; it will be
     S3N limbs long (i.e., as many limbs as the divisor).

     In addition to an integer quotient, QXN fraction limbs are
     developed, and stored after the integral limbs.  For most usages,
     QXN will be zero.

     It is required that RS2N is greater than or equal to S3N.  It is
     required that the most significant bit of the divisor is set.

     If the quotient is not needed, pass RS2P + S3N as R1P.  Aside from
     that special case, no overlap between arguments is permitted.

     Return the most significant limb of the quotient, either 0 or 1.

     The area at R1P needs to be RS2N - S3N + QXN limbs large.

 -- Function: mp_limb_t mpn_divrem_1 (mp_limb_t *R1P, mp_size_t QXN,
          mp_limb_t *S2P, mp_size_t S2N, mp_limb_t S3LIMB)
 -- Macro: mp_limb_t mpn_divmod_1 (mp_limb_t *R1P, mp_limb_t *S2P,
          mp_size_t S2N, mp_limb_t S3LIMB)
     Divide {S2P, S2N} by S3LIMB, and write the quotient at R1P.
     Return the remainder.

     The integer quotient is written to {R1P+QXN, S2N} and in addition
     QXN fraction limbs are developed and written to {R1P, QXN}.
     Either or both S2N and QXN can be zero.  For most usages, QXN will
     be zero.

     `mpn_divmod_1' exists for upward source compatibility and is
     simply a macro calling `mpn_divrem_1' with a QXN of 0.

     The areas at R1P and S2P have to be identical or completely
     separate, not partially overlapping.

 -- Function: mp_limb_t mpn_divmod (mp_limb_t *R1P, mp_limb_t *RS2P,
          mp_size_t RS2N, const mp_limb_t *S3P, mp_size_t S3N)
     [This function is obsolete.  Please call `mpn_tdiv_qr' instead for
     best performance.]

 -- Function: void mpn_divexact_1 (mp_limb_t * RP, const mp_limb_t *
          SP, mp_size_t N, mp_limb_t D)
     Divide {SP, N} by D, expecting it to divide exactly, and writing
     the result to {RP, N}. If D doesn't divide exactly, the value
     written to {RP, N} is undefined. The areas at RP and SP have to be
     identical or completely separate, not partially overlapping.

 -- Macro: mp_limb_t mpn_divexact_by3 (mp_limb_t *RP, mp_limb_t *SP,
          mp_size_t N)
 -- Function: mp_limb_t mpn_divexact_by3c (mp_limb_t *RP, mp_limb_t
          *SP, mp_size_t N, mp_limb_t CARRY)
     Divide {SP, N} by 3, expecting it to divide exactly, and writing
     the result to {RP, N}.  If 3 divides exactly, the return value is
     zero and the result is the quotient.  If not, the return value is
     non-zero and the result won't be anything useful.

     `mpn_divexact_by3c' takes an initial carry parameter, which can be
     the return value from a previous call, so a large calculation can
     be done piece by piece from low to high.  `mpn_divexact_by3' is
     simply a macro calling `mpn_divexact_by3c' with a 0 carry
     parameter.

     These routines use a multiply-by-inverse and will be faster than
     `mpn_divrem_1' on CPUs with fast multiplication but slow division.

     The source a, result q, size n, initial carry i, and return value
     c satisfy c*b^n + a-i = 3*q, where b=2^GMP_NUMB_BITS.  The return
     c is always 0, 1 or 2, and the initial carry i must also be 0, 1
     or 2 (these are both borrows really).  When c=0 clearly q=(a-i)/3.
     When c!=0, the remainder (a-i) mod 3 is given by 3-c, because b
     == 1 mod 3 (when `mp_bits_per_limb' is even, which is always so
     currently).

 -- Function: mp_limb_t mpn_mod_1 (const mp_limb_t *S1P, mp_size_t S1N,
          mp_limb_t S2LIMB)
     Divide {S1P, S1N} by S2LIMB, and return the remainder.  S1N can be
     zero.

 -- Function: mp_limb_t mpn_lshift (mp_limb_t *RP, const mp_limb_t *SP,
          mp_size_t N, unsigned int COUNT)
     Shift {SP, N} left by COUNT bits, and write the result to {RP, N}.
     The bits shifted out at the left are returned in the least
     significant COUNT bits of the return value (the rest of the return
     value is zero).

     COUNT must be in the range 1 to mp_bits_per_limb-1.  The regions
     {SP, N} and {RP, N} may overlap, provided RP >= SP.

     This function is written in assembly for most CPUs.

 -- Function: mp_limb_t mpn_rshift (mp_limb_t *RP, const mp_limb_t *SP,
          mp_size_t N, unsigned int COUNT)
     Shift {SP, N} right by COUNT bits, and write the result to {RP,
     N}.  The bits shifted out at the right are returned in the most
     significant COUNT bits of the return value (the rest of the return
     value is zero).

     COUNT must be in the range 1 to mp_bits_per_limb-1.  The regions
     {SP, N} and {RP, N} may overlap, provided RP <= SP.

     This function is written in assembly for most CPUs.

 -- Function: int mpn_cmp (const mp_limb_t *S1P, const mp_limb_t *S2P,
          mp_size_t N)
     Compare {S1P, N} and {S2P, N} and return a positive value if S1 >
     S2, 0 if they are equal, or a negative value if S1 < S2.

 -- Function: int mpn_zero_p (const mp_limb_t *SP, mp_size_t N)
     Test {SP, N} and return 1 if the operand is zero, 0 otherwise.

 -- Function: mp_size_t mpn_gcd (mp_limb_t *RP, mp_limb_t *XP,
          mp_size_t XN, mp_limb_t *YP, mp_size_t YN)
     Set {RP, RETVAL} to the greatest common divisor of {XP, XN} and
     {YP, YN}.  The result can be up to YN limbs, the return value is
     the actual number produced.  Both source operands are destroyed.

     It is required that XN >= YN > 0, and the most significant limb of
     {YP, YN} must be non-zero.  No overlap is permitted between {XP,
     XN} and {YP, YN}.

 -- Function: mp_limb_t mpn_gcd_1 (const mp_limb_t *XP, mp_size_t XN,
          mp_limb_t YLIMB)
     Return the greatest common divisor of {XP, XN} and YLIMB.  Both
     operands must be non-zero.

 -- Function: mp_size_t mpn_gcdext (mp_limb_t *GP, mp_limb_t *SP,
          mp_size_t *SN, mp_limb_t *UP, mp_size_t UN, mp_limb_t *VP,
          mp_size_t VN)
     Let U be defined by {UP, UN} and let V be defined by {VP, VN}.

     Compute the greatest common divisor G of U and V.  Compute a
     cofactor S such that G = US + VT.  The second cofactor T is not
     computed but can easily be obtained from (G - U*S) / V (the
     division will be exact).  It is required that UN >= VN > 0, and
     the most significant limb of {VP, VN} must be non-zero.

     S satisfies S = 1 or abs(S) < V / (2 G). S = 0 if and only if V
     divides U (i.e., G = V).

     Store G at GP and let the return value define its limb count.
     Store S at SP and let |*SN| define its limb count.  S can be
     negative; when this happens *SN will be negative.  The area at GP
     should have room for VN limbs and the area at SP should have room
     for VN+1 limbs.

     Both source operands are destroyed.

     Compatibility notes: GMP 4.3.0 and 4.3.1 defined S less strictly.
     Earlier as well as later GMP releases define S as described here.
     GMP releases before GMP 4.3.0 required additional space for both
     input and output areas. More precisely, the areas {UP, UN+1} and
     {VP, VN+1} were destroyed (i.e. the operands plus an extra limb
     past the end of each), and the areas pointed to by GP and SP
     should each have room for UN+1 limbs.

 -- Function: mp_size_t mpn_sqrtrem (mp_limb_t *R1P, mp_limb_t *R2P,
          const mp_limb_t *SP, mp_size_t N)
     Compute the square root of {SP, N} and put the result at {R1P,
     ceil(N/2)} and the remainder at {R2P, RETVAL}.  R2P needs space
     for N limbs, but the return value indicates how many are produced.

     The most significant limb of {SP, N} must be non-zero.  The areas
     {R1P, ceil(N/2)} and {SP, N} must be completely separate.  The
     areas {R2P, N} and {SP, N} must be either identical or completely
     separate.

     If the remainder is not wanted then R2P can be `NULL', and in this
     case the return value is zero or non-zero according to whether the
     remainder would have been zero or non-zero.

     A return value of zero indicates a perfect square.  See also
     `mpn_perfect_square_p'.

 -- Function: size_t mpn_sizeinbase (const mp_limb_t *XP, mp_size_t N,
          int BASE)
     Return the size of {XP,N} measured in number of digits in the
     given BASE.  BASE can vary from 2 to 62.  Requires N > 0 and
     XP[N-1] > 0.  The result will be either exact or 1 too big.  If
     BASE is a power of 2, the result is always exact.

 -- Function: mp_size_t mpn_get_str (unsigned char *STR, int BASE,
          mp_limb_t *S1P, mp_size_t S1N)
     Convert {S1P, S1N} to a raw unsigned char array at STR in base
     BASE, and return the number of characters produced.  There may be
     leading zeros in the string.  The string is not in ASCII; to
     convert it to printable format, add the ASCII codes for `0' or
     `A', depending on the base and range.  BASE can vary from 2 to 256.

     The most significant limb of the input {S1P, S1N} must be
     non-zero.  The input {S1P, S1N} is clobbered, except when BASE is
     a power of 2, in which case it's unchanged.

     The area at STR has to have space for the largest possible number
     represented by a S1N long limb array, plus one extra character.

 -- Function: mp_size_t mpn_set_str (mp_limb_t *RP, const unsigned char
          *STR, size_t STRSIZE, int BASE)
     Convert bytes {STR,STRSIZE} in the given BASE to limbs at RP.

     STR[0] is the most significant input byte and STR[STRSIZE-1] is
     the least significant input byte.  Each byte should be a value in
     the range 0 to BASE-1, not an ASCII character.  BASE can vary from
     2 to 256.

     The converted value is {RP,RN} where RN is the return value.  If
     the most significant input byte STR[0] is non-zero, then RP[RN-1]
     will be non-zero, else RP[RN-1] and some number of subsequent
     limbs may be zero.

     The area at RP has to have space for the largest possible number
     with STRSIZE digits in the chosen base, plus one extra limb.

     The input must have at least one byte, and no overlap is permitted
     between {STR,STRSIZE} and the result at RP.

 -- Function: mp_bitcnt_t mpn_scan0 (const mp_limb_t *S1P, mp_bitcnt_t
          BIT)
     Scan S1P from bit position BIT for the next clear bit.

     It is required that there be a clear bit within the area at S1P at
     or beyond bit position BIT, so that the function has something to
     return.

 -- Function: mp_bitcnt_t mpn_scan1 (const mp_limb_t *S1P, mp_bitcnt_t
          BIT)
     Scan S1P from bit position BIT for the next set bit.

     It is required that there be a set bit within the area at S1P at or
     beyond bit position BIT, so that the function has something to
     return.

 -- Function: void mpn_random (mp_limb_t *R1P, mp_size_t R1N)
 -- Function: void mpn_random2 (mp_limb_t *R1P, mp_size_t R1N)
     Generate a random number of length R1N and store it at R1P.  The
     most significant limb is always non-zero.  `mpn_random' generates
     uniformly distributed limb data, `mpn_random2' generates long
     strings of zeros and ones in the binary representation.

     `mpn_random2' is intended for testing the correctness of the `mpn'
     routines.

 -- Function: mp_bitcnt_t mpn_popcount (const mp_limb_t *S1P, mp_size_t
          N)
     Count the number of set bits in {S1P, N}.

 -- Function: mp_bitcnt_t mpn_hamdist (const mp_limb_t *S1P, const
          mp_limb_t *S2P, mp_size_t N)
     Compute the hamming distance between {S1P, N} and {S2P, N}, which
     is the number of bit positions where the two operands have
     different bit values.

 -- Function: int mpn_perfect_square_p (const mp_limb_t *S1P, mp_size_t
          N)
     Return non-zero iff {S1P, N} is a perfect square.  The most
     significant limb of the input {S1P, N} must be non-zero.

 -- Function: void mpn_and_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Perform the bitwise logical and of {S1P, N} and {S2P, N}, and
     write the result to {RP, N}.

 -- Function: void mpn_ior_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Perform the bitwise logical inclusive or of {S1P, N} and {S2P, N},
     and write the result to {RP, N}.

 -- Function: void mpn_xor_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Perform the bitwise logical exclusive or of {S1P, N} and {S2P, N},
     and write the result to {RP, N}.

 -- Function: void mpn_andn_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Perform the bitwise logical and of {S1P, N} and the bitwise
     complement of {S2P, N}, and write the result to {RP, N}.

 -- Function: void mpn_iorn_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Perform the bitwise logical inclusive or of {S1P, N} and the
     bitwise complement of {S2P, N}, and write the result to {RP, N}.

 -- Function: void mpn_nand_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Perform the bitwise logical and of {S1P, N} and {S2P, N}, and
     write the bitwise complement of the result to {RP, N}.

 -- Function: void mpn_nior_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Perform the bitwise logical inclusive or of {S1P, N} and {S2P, N},
     and write the bitwise complement of the result to {RP, N}.

 -- Function: void mpn_xnor_n (mp_limb_t *RP, const mp_limb_t *S1P,
          const mp_limb_t *S2P, mp_size_t N)
     Perform the bitwise logical exclusive or of {S1P, N} and {S2P, N},
     and write the bitwise complement of the result to {RP, N}.

 -- Function: void mpn_com (mp_limb_t *RP, const mp_limb_t *SP,
          mp_size_t N)
     Perform the bitwise complement of {SP, N}, and write the result to
     {RP, N}.

 -- Function: void mpn_copyi (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t N)
     Copy from {S1P, N} to {RP, N}, increasingly.

 -- Function: void mpn_copyd (mp_limb_t *RP, const mp_limb_t *S1P,
          mp_size_t N)
     Copy from {S1P, N} to {RP, N}, decreasingly.

 -- Function: void mpn_zero (mp_limb_t *RP, mp_size_t N)
     Zero {RP, N}.


8.1 Low-level functions for cryptography
========================================

The functions prefixed with `mpn_sec_' and `mpn_cnd_' are designed to
perform the exact same low-level operations and have the same cache
access patterns for any two same-size arguments, assuming that function
arguments are placed at the same position and that the machine state is
identical upon function entry.  These functions are intended for
cryptographic purposes, where resilience to side-channel attacks is
desired.

   These functions are less efficient than their "leaky" counterparts;
their performance for operands of the sizes typically used for
cryptographic applications is between 15% and 100% worse.  For larger
operands, these functions might be inadequate, since they rely on
asymptotically elementary algorithms.

   These functions do not make any explicit allocations.  Those of
these functions that need scratch space accept a scratch space operand.
This convention allows callers to keep sensitive data in designated
memory areas.  Note however that compilers may choose to spill scalar
values used within these functions to their stack frame and that such
scalars may contain sensitive data.

   In addition to these specially crafted functions, the following `mpn'
functions are naturally side-channel resistant: `mpn_add_n',
`mpn_sub_n', `mpn_lshift', `mpn_rshift', `mpn_zero', `mpn_copyi',
`mpn_copyd', `mpn_com', and the logical function (`mpn_and_n', etc).

   There are some exceptions from the side-channel resilience: (1) Some
assembly implementations of `mpn_lshift' identify shift-by-one as a
special case.  This is a problem iff the shift count is a function of
sensitive data.  (2) Alpha ev6 and Pentium4 using 64-bit limbs have
leaky `mpn_add_n' and `mpn_sub_n'.  (3) Alpha ev6 has a leaky
`mpn_mul_1' which also makes `mpn_sec_mul' on those systems unsafe.

 -- Function: mp_limb_t mpn_cnd_add_n (mp_limb_t CND, mp_limb_t *RP,
          const mp_limb_t *S1P, const mp_limb_t *S2P, mp_size_t N)
 -- Function: mp_limb_t mpn_cnd_sub_n (mp_limb_t CND, mp_limb_t *RP,
          const mp_limb_t *S1P, const mp_limb_t *S2P, mp_size_t N)
     These functions do conditional addition and subtraction.  If CND is
     non-zero, they produce the same result as a regular `mpn_add_n' or
     `mpn_sub_n', and if CND is zero, they copy {S1P,N} to the result
     area and return zero.  The functions are designed to have timing
     and memory access patterns depending only on size and location of
     the data areas, but independent of the condition CND.  Like for
     `mpn_add_n' and `mpn_sub_n', on most machines, the timing will
     also be independent of the actual limb values.

 -- Function: mp_limb_t mpn_sec_add_1 (mp_limb_t *RP, const mp_limb_t
          *AP, mp_size_t N, mp_limb_t B, mp_limb_t *TP)
 -- Function: mp_limb_t mpn_sec_sub_1 (mp_limb_t *RP, const mp_limb_t
          *AP, mp_size_t N, mp_limb_t B, mp_limb_t *TP)
     Set R to A + B or A - B, respectively, where R = {RP,N}, A =
     {AP,N}, and B is a single limb. Returns carry.

     These functions take O(N) time, unlike the leaky functions
     `mpn_add_1' which are O(1) on average. They require scratch space
     of `mpn_sec_add_1_itch(N)' and `mpn_sec_sub_1_itch(N)' limbs,
     respectively, to be passed in the TP parameter. The scratch space
     requirements are guaranteed to be at most N limbs, and increase
     monotonously in the operand size.

 -- Function: void mpn_cnd_swap (mp_limb_t CND, volatile mp_limb_t *AP,
          volatile mp_limb_t *BP, mp_size_t N)
     If CND is non-zero, swaps the contents of the areas {AP,N} and
     {BP,N}. Otherwise, the areas are left unmodified.  Implemented
     using logical operations on the limbs, with the same memory
     accesses independent of the value of CND.

 -- Function: void mpn_sec_mul (mp_limb_t *RP, const mp_limb_t *AP,
          mp_size_t AN, const mp_limb_t *BP, mp_size_t BN, mp_limb_t
          *TP)
 -- Function: mp_size_t mpn_sec_mul_itch (mp_size_t AN, mp_size_t BN)
     Set R to A * B, where A = {AP,AN}, B = {BP,BN}, and R = {RP,AN+BN}.

     It is required that AN >= BN > 0.

     No overlapping between R and the input operands is allowed.  For A
     = B, use `mpn_sec_sqr' for optimal performance.

     This function requires scratch space of `mpn_sec_mul_itch(AN, BN)'
     limbs to be passed in the TP parameter.  The scratch space
     requirements are guaranteed to increase monotonously in the
     operand sizes.

 -- Function: void mpn_sec_sqr (mp_limb_t *RP, const mp_limb_t *AP,
          mp_size_t AN, mp_limb_t *TP)
 -- Function: mp_size_t mpn_sec_sqr_itch (mp_size_t AN)
     Set R to A^2, where A = {AP,AN}, and R = {RP,2AN}.

     It is required that AN > 0.

     No overlapping between R and the input operands is allowed.

     This function requires scratch space of `mpn_sec_sqr_itch(AN)'
     limbs to be passed in the TP parameter.  The scratch space
     requirements are guaranteed to increase monotonously in the
     operand size.

 -- Function: void mpn_sec_powm (mp_limb_t *RP, const mp_limb_t *BP,
          mp_size_t BN, const mp_limb_t *EP, mp_bitcnt_t ENB, const
          mp_limb_t *MP, mp_size_t N, mp_limb_t *TP)
 -- Function: mp_size_t mpn_sec_powm_itch (mp_size_t BN, mp_bitcnt_t
          ENB, size_t N)
     Set R to (B raised to E) modulo M, where R = {RP,N}, M = {MP,N},
     and E = {EP,ceil(ENB / `GMP_NUMB_BITS')}.

     It is required that B > 0, that M > 0 is odd, and that E < 2^ENB.

     No overlapping between R and the input operands is allowed.

     This function requires scratch space of `mpn_sec_powm_itch(BN,
     ENB, N)' limbs to be passed in the TP parameter.  The scratch
     space requirements are guaranteed to increase monotonously in the
     operand sizes.

 -- Function: void mpn_sec_tabselect (mp_limb_t *RP, const mp_limb_t
          *TAB, mp_size_t N, mp_size_t NENTS, mp_size_t WHICH)
     Select entry WHICH from table TAB, which has NENTS entries, each N
     limbs.  Store the selected entry at RP.

     This function reads the entire table to avoid side-channel
     information leaks.

 -- Function: mp_limb_t mpn_sec_div_qr (mp_limb_t *QP, mp_limb_t *NP,
          mp_size_t NN, const mp_limb_t *DP, mp_size_t DN, mp_limb_t
          *TP)
 -- Function: mp_size_t mpn_sec_div_qr_itch (mp_size_t NN, mp_size_t DN)
     Set Q to the truncated quotient N / D and R to N modulo D, where N
     = {NP,NN}, D = {DP,DN}, Q's most significant limb is the function
     return value and the remaining limbs are {QP,NN-DN}, and R =
     {NP,DN}.

     It is required that NN >= DN >= 1, and that DP[DN-1] != 0.  This
     does not imply that N >= D since N might be zero-padded.

     Note the overlapping between N and R.  No other operand overlapping
     is allowed.  The entire space occupied by N is overwritten.

     This function requires scratch space of `mpn_sec_div_qr_itch(NN,
     DN)' limbs to be passed in the TP parameter.

 -- Function: void mpn_sec_div_r (mp_limb_t *NP, mp_size_t NN, const
          mp_limb_t *DP, mp_size_t DN, mp_limb_t *TP)
 -- Function: mp_size_t mpn_sec_div_r_itch (mp_size_t NN, mp_size_t DN)
     Set R to N modulo D, where N = {NP,NN}, D = {DP,DN}, and R =
     {NP,DN}.

     It is required that NN >= DN >= 1, and that DP[DN-1] != 0.  This
     does not imply that N >= D since N might be zero-padded.

     Note the overlapping between N and R.  No other operand overlapping
     is allowed.  The entire space occupied by N is overwritten.

     This function requires scratch space of `mpn_sec_div_r_itch(NN,
     DN)' limbs to be passed in the TP parameter.

 -- Function: int mpn_sec_invert (mp_limb_t *RP, mp_limb_t *AP, const
          mp_limb_t *MP, mp_size_t N, mp_bitcnt_t NBCNT, mp_limb_t *TP)
 -- Function: mp_size_t mpn_sec_invert_itch (mp_size_t N)
     Set R to the inverse of A modulo M, where R = {RP,N}, A = {AP,N},
     and M = {MP,N}.  *This function's interface is preliminary.*

     If an inverse exists, return 1, otherwise return 0 and leave R
     undefined. In either case, the input A is destroyed.

     It is required that M is odd, and that NBCNT >= ceil(log(A+1)) +
     ceil(log(M+1)).  A safe choice is NBCNT = 2 * N * GMP_NUMB_BITS,
     but a smaller value might improve performance if M or A are known
     to have leading zero bits.

     This function requires scratch space of `mpn_sec_invert_itch(N)'
     limbs to be passed in the TP parameter.


8.2 Nails
=========

*Everything in this section is highly experimental and may disappear or
be subject to incompatible changes in a future version of GMP.*

   Nails are an experimental feature whereby a few bits are left unused
at the top of each `mp_limb_t'.  This can significantly improve carry
handling on some processors.

   All the `mpn' functions accepting limb data will expect the nail
bits to be zero on entry, and will return data with the nails similarly
all zero.  This applies both to limb vectors and to single limb
arguments.

   Nails can be enabled by configuring with `--enable-nails'.  By
default the number of bits will be chosen according to what suits the
host processor, but a particular number can be selected with
`--enable-nails=N'.

   At the mpn level, a nail build is neither source nor binary
compatible with a non-nail build, strictly speaking.  But programs
acting on limbs only through the mpn functions are likely to work
equally well with either build, and judicious use of the definitions
below should make any program compatible with either build, at the
source level.

   For the higher level routines, meaning `mpz' etc, a nail build
should be fully source and binary compatible with a non-nail build.

 -- Macro: GMP_NAIL_BITS
 -- Macro: GMP_NUMB_BITS
 -- Macro: GMP_LIMB_BITS
     `GMP_NAIL_BITS' is the number of nail bits, or 0 when nails are
     not in use.  `GMP_NUMB_BITS' is the number of data bits in a limb.
     `GMP_LIMB_BITS' is the total number of bits in an `mp_limb_t'.  In
     all cases

          GMP_LIMB_BITS == GMP_NAIL_BITS + GMP_NUMB_BITS

 -- Macro: GMP_NAIL_MASK
 -- Macro: GMP_NUMB_MASK
     Bit masks for the nail and number parts of a limb.
     `GMP_NAIL_MASK' is 0 when nails are not in use.

     `GMP_NAIL_MASK' is not often needed, since the nail part can be
     obtained with `x >> GMP_NUMB_BITS', and that means one less large
     constant, which can help various RISC chips.

 -- Macro: GMP_NUMB_MAX
     The maximum value that can be stored in the number part of a limb.
     This is the same as `GMP_NUMB_MASK', but can be used for clarity
     when doing comparisons rather than bit-wise operations.

   The term "nails" comes from finger or toe nails, which are at the
ends of a limb (arm or leg).  "numb" is short for number, but is also
how the developers felt after trying for a long time to come up with
sensible names for these things.

   In the future (the distant future most likely) a non-zero nail might
be permitted, giving non-unique representations for numbers in a limb
vector.  This would help vector processors since carries would only
ever need to propagate one or two limbs.


File: gmp.info,  Node: Random Number Functions,  Next: Formatted Output,  Prev: Low-level Functions,  Up: Top

9 Random Number Functions
*************************

Sequences of pseudo-random numbers in GMP are generated using a
variable of type `gmp_randstate_t', which holds an algorithm selection
and a current state.  Such a variable must be initialized by a call to
one of the `gmp_randinit' functions, and can be seeded with one of the
`gmp_randseed' functions.

   The functions actually generating random numbers are described in
*Note Integer Random Numbers::, and *Note Miscellaneous Float
Functions::.

   The older style random number functions don't accept a
`gmp_randstate_t' parameter but instead share a global variable of that
type.  They use a default algorithm and are currently not seeded
(though perhaps that will change in the future).  The new functions
accepting a `gmp_randstate_t' are recommended for applications that
care about randomness.

* Menu:

* Random State Initialization::
* Random State Seeding::
* Random State Miscellaneous::


File: gmp.info,  Node: Random State Initialization,  Next: Random State Seeding,  Prev: Random Number Functions,  Up: Random Number Functions

9.1 Random State Initialization
===============================

 -- Function: void gmp_randinit_default (gmp_randstate_t STATE)
     Initialize STATE with a default algorithm.  This will be a
     compromise between speed and randomness, and is recommended for
     applications with no special requirements.  Currently this is
     `gmp_randinit_mt'.

 -- Function: void gmp_randinit_mt (gmp_randstate_t STATE)
     Initialize STATE for a Mersenne Twister algorithm.  This algorithm
     is fast and has good randomness properties.

 -- Function: void gmp_randinit_lc_2exp (gmp_randstate_t STATE, const
          mpz_t A, unsigned long C, mp_bitcnt_t M2EXP)
     Initialize STATE with a linear congruential algorithm X = (A*X +
     C) mod 2^M2EXP.

     The low bits of X in this algorithm are not very random.  The least
     significant bit will have a period no more than 2, and the second
     bit no more than 4, etc.  For this reason only the high half of
     each X is actually used.

     When a random number of more than M2EXP/2 bits is to be generated,
     multiple iterations of the recurrence are used and the results
     concatenated.

 -- Function: int gmp_randinit_lc_2exp_size (gmp_randstate_t STATE,
          mp_bitcnt_t SIZE)
     Initialize STATE for a linear congruential algorithm as per
     `gmp_randinit_lc_2exp'.  A, C and M2EXP are selected from a table,
     chosen so that SIZE bits (or more) of each X will be used, i.e.
     M2EXP/2 >= SIZE.

     If successful the return value is non-zero.  If SIZE is bigger
     than the table data provides then the return value is zero.  The
     maximum SIZE currently supported is 128.

 -- Function: void gmp_randinit_set (gmp_randstate_t ROP,
          gmp_randstate_t OP)
     Initialize ROP with a copy of the algorithm and state from OP.

 -- Function: void gmp_randinit (gmp_randstate_t STATE,
          gmp_randalg_t ALG, ...)
     *This function is obsolete.*

     Initialize STATE with an algorithm selected by ALG.  The only
     choice is `GMP_RAND_ALG_LC', which is `gmp_randinit_lc_2exp_size'
     described above.  A third parameter of type `unsigned long' is
     required, this is the SIZE for that function.
     `GMP_RAND_ALG_DEFAULT' or 0 are the same as `GMP_RAND_ALG_LC'.

     `gmp_randinit' sets bits in the global variable `gmp_errno' to
     indicate an error.  `GMP_ERROR_UNSUPPORTED_ARGUMENT' if ALG is
     unsupported, or `GMP_ERROR_INVALID_ARGUMENT' if the SIZE parameter
     is too big.  It may be noted this error reporting is not thread
     safe (a good reason to use `gmp_randinit_lc_2exp_size' instead).

 -- Function: void gmp_randclear (gmp_randstate_t STATE)
     Free all memory occupied by STATE.


File: gmp.info,  Node: Random State Seeding,  Next: Random State Miscellaneous,  Prev: Random State Initialization,  Up: Random Number Functions

9.2 Random State Seeding
========================

 -- Function: void gmp_randseed (gmp_randstate_t STATE, const mpz_t
          SEED)
 -- Function: void gmp_randseed_ui (gmp_randstate_t STATE,
          unsigned long int SEED)
     Set an initial seed value into STATE.

     The size of a seed determines how many different sequences of
     random numbers that it's possible to generate.  The "quality" of
     the seed is the randomness of a given seed compared to the
     previous seed used, and this affects the randomness of separate
     number sequences.  The method for choosing a seed is critical if
     the generated numbers are to be used for important applications,
     such as generating cryptographic keys.

     Traditionally the system time has been used to seed, but care
     needs to be taken with this.  If an application seeds often and
     the resolution of the system clock is low, then the same sequence
     of numbers might be repeated.  Also, the system time is quite easy
     to guess, so if unpredictability is required then it should
     definitely not be the only source for the seed value.  On some
     systems there's a special device `/dev/random' which provides
     random data better suited for use as a seed.


File: gmp.info,  Node: Random State Miscellaneous,  Prev: Random State Seeding,  Up: Random Number Functions

9.3 Random State Miscellaneous
==============================

 -- Function: unsigned long gmp_urandomb_ui (gmp_randstate_t STATE,
          unsigned long N)
     Return a uniformly distributed random number of N bits, i.e. in the
     range 0 to 2^N-1 inclusive.  N must be less than or equal to the
     number of bits in an `unsigned long'.

 -- Function: unsigned long gmp_urandomm_ui (gmp_randstate_t STATE,
          unsigned long N)
     Return a uniformly distributed random number in the range 0 to
     N-1, inclusive.


File: gmp.info,  Node: Formatted Output,  Next: Formatted Input,  Prev: Random Number Functions,  Up: Top

10 Formatted Output
*******************

* Menu:

* Formatted Output Strings::
* Formatted Output Functions::
* C++ Formatted Output::


File: gmp.info,  Node: Formatted Output Strings,  Next: Formatted Output Functions,  Prev: Formatted Output,  Up: Formatted Output

10.1 Format Strings
===================

`gmp_printf' and friends accept format strings similar to the standard C
`printf' (*note Formatted Output: (libc)Formatted Output.).  A format
specification is of the form

     % [flags] [width] [.[precision]] [type] conv

   GMP adds types `Z', `Q' and `F' for `mpz_t', `mpq_t' and `mpf_t'
respectively, `M' for `mp_limb_t', and `N' for an `mp_limb_t' array.
`Z', `Q', `M' and `N' behave like integers.  `Q' will print a `/' and a
denominator, if needed.  `F' behaves like a float.  For example,

     mpz_t z;
     gmp_printf ("%s is an mpz %Zd\n", "here", z);

     mpq_t q;
     gmp_printf ("a hex rational: %#40Qx\n", q);

     mpf_t f;
     int   n;
     gmp_printf ("fixed point mpf %.*Ff with %d digits\n", n, f, n);

     mp_limb_t l;
     gmp_printf ("limb %Mu\n", l);

     const mp_limb_t *ptr;
     mp_size_t       size;
     gmp_printf ("limb array %Nx\n", ptr, size);

   For `N' the limbs are expected least significant first, as per the
`mpn' functions (*note Low-level Functions::).  A negative size can be
given to print the value as a negative.

   All the standard C `printf' types behave the same as the C library
`printf', and can be freely intermixed with the GMP extensions.  In the
current implementation the standard parts of the format string are
simply handed to `printf' and only the GMP extensions handled directly.

   The flags accepted are as follows.  GLIBC style ' is only for the
standard C types (not the GMP types), and only if the C library
supports it.

     0         pad with zeros (rather than spaces)
     #         show the base with `0x', `0X' or `0'
     +         always show a sign
     (space)   show a space or a `-' sign
     '         group digits, GLIBC style (not GMP types)

   The optional width and precision can be given as a number within the
format string, or as a `*' to take an extra parameter of type `int', the
same as the standard `printf'.

   The standard types accepted are as follows.  `h' and `l' are
portable, the rest will depend on the compiler (or include files) for
the type and the C library for the output.

     h         short
     hh        char
     j         intmax_t or uintmax_t
     l         long or wchar_t
     ll        long long
     L         long double
     q         quad_t or u_quad_t
     t         ptrdiff_t
     z         size_t

The GMP types are

     F         mpf_t, float conversions
     Q         mpq_t, integer conversions
     M         mp_limb_t, integer conversions
     N         mp_limb_t array, integer conversions
     Z         mpz_t, integer conversions

   The conversions accepted are as follows.  `a' and `A' are always
supported for `mpf_t' but depend on the C library for standard C float
types.  `m' and `p' depend on the C library.

     a A       hex floats, C99 style
     c         character
     d         decimal integer
     e E       scientific format float
     f         fixed point float
     i         same as d
     g G       fixed or scientific float
     m         `strerror' string, GLIBC style
     n         store characters written so far
     o         octal integer
     p         pointer
     s         string
     u         unsigned integer
     x X       hex integer

   `o', `x' and `X' are unsigned for the standard C types, but for
types `Z', `Q' and `N' they are signed.  `u' is not meaningful for `Z',
`Q' and `N'.

   `M' is a proxy for the C library `l' or `L', according to the size
of `mp_limb_t'.  Unsigned conversions will be usual, but a signed
conversion can be used and will interpret the value as a twos complement
negative.

   `n' can be used with any type, even the GMP types.

   Other types or conversions that might be accepted by the C library
`printf' cannot be used through `gmp_printf', this includes for
instance extensions registered with GLIBC `register_printf_function'.
Also currently there's no support for POSIX `$' style numbered arguments
(perhaps this will be added in the future).

   The precision field has its usual meaning for integer `Z' and float
`F' types, but is currently undefined for `Q' and should not be used
with that.

   `mpf_t' conversions only ever generate as many digits as can be
accurately represented by the operand, the same as `mpf_get_str' does.
Zeros will be used if necessary to pad to the requested precision.  This
happens even for an `f' conversion of an `mpf_t' which is an integer,
for instance 2^1024 in an `mpf_t' of 128 bits precision will only
produce about 40 digits, then pad with zeros to the decimal point.  An
empty precision field like `%.Fe' or `%.Ff' can be used to specifically
request just the significant digits.  Without any dot and thus no
precision field, a precision value of 6 will be used.  Note that these
rules mean that `%Ff', `%.Ff', and `%.0Ff' will all be different.

   The decimal point character (or string) is taken from the current
locale settings on systems which provide `localeconv' (*note Locales
and Internationalization: (libc)Locales.).  The C library will normally
do the same for standard float output.

   The format string is only interpreted as plain `char's, multibyte
characters are not recognised.  Perhaps this will change in the future.


File: gmp.info,  Node: Formatted Output Functions,  Next: C++ Formatted Output,  Prev: Formatted Output Strings,  Up: Formatted Output

10.2 Functions
==============

Each of the following functions is similar to the corresponding C
library function.  The basic `printf' forms take a variable argument
list.  The `vprintf' forms take an argument pointer, see *Note Variadic
Functions: (libc)Variadic Functions, or `man 3 va_start'.

   It should be emphasised that if a format string is invalid, or the
arguments don't match what the format specifies, then the behaviour of
any of these functions will be unpredictable.  GCC format string
checking is not available, since it doesn't recognise the GMP
extensions.

   The file based functions `gmp_printf' and `gmp_fprintf' will return
-1 to indicate a write error.  Output is not "atomic", so partial
output may be produced if a write error occurs.  All the functions can
return -1 if the C library `printf' variant in use returns -1, but this
shouldn't normally occur.

 -- Function: int gmp_printf (const char *FMT, ...)
 -- Function: int gmp_vprintf (const char *FMT, va_list AP)
     Print to the standard output `stdout'.  Return the number of
     characters written, or -1 if an error occurred.

 -- Function: int gmp_fprintf (FILE *FP, const char *FMT, ...)
 -- Function: int gmp_vfprintf (FILE *FP, const char *FMT, va_list AP)
     Print to the stream FP.  Return the number of characters written,
     or -1 if an error occurred.

 -- Function: int gmp_sprintf (char *BUF, const char *FMT, ...)
 -- Function: int gmp_vsprintf (char *BUF, const char *FMT, va_list AP)
     Form a null-terminated string in BUF.  Return the number of
     characters written, excluding the terminating null.

     No overlap is permitted between the space at BUF and the string
     FMT.

     These functions are not recommended, since there's no protection
     against exceeding the space available at BUF.

 -- Function: int gmp_snprintf (char *BUF, size_t SIZE, const char
          *FMT, ...)
 -- Function: int gmp_vsnprintf (char *BUF, size_t SIZE, const char
          *FMT, va_list AP)
     Form a null-terminated string in BUF.  No more than SIZE bytes
     will be written.  To get the full output, SIZE must be enough for
     the string and null-terminator.

     The return value is the total number of characters which ought to
     have been produced, excluding the terminating null.  If RETVAL >=
     SIZE then the actual output has been truncated to the first SIZE-1
     characters, and a null appended.

     No overlap is permitted between the region {BUF,SIZE} and the FMT
     string.

     Notice the return value is in ISO C99 `snprintf' style.  This is
     so even if the C library `vsnprintf' is the older GLIBC 2.0.x
     style.

 -- Function: int gmp_asprintf (char **PP, const char *FMT, ...)
 -- Function: int gmp_vasprintf (char **PP, const char *FMT, va_list AP)
     Form a null-terminated string in a block of memory obtained from
     the current memory allocation function (*note Custom
     Allocation::).  The block will be the size of the string and
     null-terminator.  The address of the block in stored to *PP.  The
     return value is the number of characters produced, excluding the
     null-terminator.

     Unlike the C library `asprintf', `gmp_asprintf' doesn't return -1
     if there's no more memory available, it lets the current allocation
     function handle that.

 -- Function: int gmp_obstack_printf (struct obstack *OB, const char
          *FMT, ...)
 -- Function: int gmp_obstack_vprintf (struct obstack *OB, const char
          *FMT, va_list AP)
     Append to the current object in OB.  The return value is the
     number of characters written.  A null-terminator is not written.

     FMT cannot be within the current object in OB, since that object
     might move as it grows.

     These functions are available only when the C library provides the
     obstack feature, which probably means only on GNU systems, see
     *Note Obstacks: (libc)Obstacks.


File: gmp.info,  Node: C++ Formatted Output,  Prev: Formatted Output Functions,  Up: Formatted Output

10.3 C++ Formatted Output
=========================

The following functions are provided in `libgmpxx' (*note Headers and
Libraries::), which is built if C++ support is enabled (*note Build
Options::).  Prototypes are available from `<gmp.h>'.

 -- Function: ostream& operator<< (ostream& STREAM, const mpz_t OP)
     Print OP to STREAM, using its `ios' formatting settings.
     `ios::width' is reset to 0 after output, the same as the standard
     `ostream operator<<' routines do.

     In hex or octal, OP is printed as a signed number, the same as for
     decimal.  This is unlike the standard `operator<<' routines on
     `int' etc, which instead give twos complement.

 -- Function: ostream& operator<< (ostream& STREAM, const mpq_t OP)
     Print OP to STREAM, using its `ios' formatting settings.
     `ios::width' is reset to 0 after output, the same as the standard
     `ostream operator<<' routines do.

     Output will be a fraction like `5/9', or if the denominator is 1
     then just a plain integer like `123'.

     In hex or octal, OP is printed as a signed value, the same as for
     decimal.  If `ios::showbase' is set then a base indicator is shown
     on both the numerator and denominator (if the denominator is
     required).

 -- Function: ostream& operator<< (ostream& STREAM, const mpf_t OP)
     Print OP to STREAM, using its `ios' formatting settings.
     `ios::width' is reset to 0 after output, the same as the standard
     `ostream operator<<' routines do.

     The decimal point follows the standard library float `operator<<',
     which on recent systems means the `std::locale' imbued on STREAM.

     Hex and octal are supported, unlike the standard `operator<<' on
     `double'.  The mantissa will be in hex or octal, the exponent will
     be in decimal.  For hex the exponent delimiter is an `@'.  This is
     as per `mpf_out_str'.

     `ios::showbase' is supported, and will put a base on the mantissa,
     for example hex `0x1.8' or `0x0.8', or octal `01.4' or `00.4'.
     This last form is slightly strange, but at least differentiates
     itself from decimal.

   These operators mean that GMP types can be printed in the usual C++
way, for example,

     mpz_t  z;
     int    n;
     ...
     cout << "iteration " << n << " value " << z << "\n";

   But note that `ostream' output (and `istream' input, *note C++
Formatted Input::) is the only overloading available for the GMP types
and that for instance using `+' with an `mpz_t' will have unpredictable
results.  For classes with overloading, see *Note C++ Class Interface::.


File: gmp.info,  Node: Formatted Input,  Next: C++ Class Interface,  Prev: Formatted Output,  Up: Top

11 Formatted Input
******************

* Menu:

* Formatted Input Strings::
* Formatted Input Functions::
* C++ Formatted Input::


File: gmp.info,  Node: Formatted Input Strings,  Next: Formatted Input Functions,  Prev: Formatted Input,  Up: Formatted Input

11.1 Formatted Input Strings
============================

`gmp_scanf' and friends accept format strings similar to the standard C
`scanf' (*note Formatted Input: (libc)Formatted Input.).  A format
specification is of the form

     % [flags] [width] [type] conv

   GMP adds types `Z', `Q' and `F' for `mpz_t', `mpq_t' and `mpf_t'
respectively.  `Z' and `Q' behave like integers.  `Q' will read a `/'
and a denominator, if present.  `F' behaves like a float.

   GMP variables don't require an `&' when passed to `gmp_scanf', since
they're already "call-by-reference".  For example,

     /* to read say "a(5) = 1234" */
     int   n;
     mpz_t z;
     gmp_scanf ("a(%d) = %Zd\n", &n, z);

     mpq_t q1, q2;
     gmp_sscanf ("0377 + 0x10/0x11", "%Qi + %Qi", q1, q2);

     /* to read say "topleft (1.55,-2.66)" */
     mpf_t x, y;
     char  buf[32];
     gmp_scanf ("%31s (%Ff,%Ff)", buf, x, y);

   All the standard C `scanf' types behave the same as in the C library
`scanf', and can be freely intermixed with the GMP extensions.  In the
current implementation the standard parts of the format string are
simply handed to `scanf' and only the GMP extensions handled directly.

   The flags accepted are as follows.  `a' and `'' will depend on
support from the C library, and `'' cannot be used with GMP types.

     *         read but don't store
     a         allocate a buffer (string conversions)
     '         grouped digits, GLIBC style (not GMP
               types)

   The standard types accepted are as follows.  `h' and `l' are
portable, the rest will depend on the compiler (or include files) for
the type and the C library for the input.

     h         short
     hh        char
     j         intmax_t or uintmax_t
     l         long int, double or wchar_t
     ll        long long
     L         long double
     q         quad_t or u_quad_t
     t         ptrdiff_t
     z         size_t

The GMP types are

     F         mpf_t, float conversions
     Q         mpq_t, integer conversions
     Z         mpz_t, integer conversions

   The conversions accepted are as follows.  `p' and `[' will depend on
support from the C library, the rest are standard.

     c         character or characters
     d         decimal integer
     e E f g G float
     i         integer with base indicator
     n         characters read so far
     o         octal integer
     p         pointer
     s         string of non-whitespace characters
     u         decimal integer
     x X       hex integer
     [         string of characters in a set

   `e', `E', `f', `g' and `G' are identical, they all read either fixed
point or scientific format, and either upper or lower case `e' for the
exponent in scientific format.

   C99 style hex float format (`printf %a', *note Formatted Output
Strings::) is always accepted for `mpf_t', but for the standard float
types it will depend on the C library.

   `x' and `X' are identical, both accept both upper and lower case
hexadecimal.

   `o', `u', `x' and `X' all read positive or negative values.  For the
standard C types these are described as "unsigned" conversions, but
that merely affects certain overflow handling, negatives are still
allowed (per `strtoul', *note Parsing of Integers: (libc)Parsing of
Integers.).  For GMP types there are no overflows, so `d' and `u' are
identical.

   `Q' type reads the numerator and (optional) denominator as given.
If the value might not be in canonical form then `mpq_canonicalize'
must be called before using it in any calculations (*note Rational
Number Functions::).

   `Qi' will read a base specification separately for the numerator and
denominator.  For example `0x10/11' would be 16/11, whereas `0x10/0x11'
would be 16/17.

   `n' can be used with any of the types above, even the GMP types.
`*' to suppress assignment is allowed, though in that case it would do
nothing at all.

   Other conversions or types that might be accepted by the C library
`scanf' cannot be used through `gmp_scanf'.

   Whitespace is read and discarded before a field, except for `c' and
`[' conversions.

   For float conversions, the decimal point character (or string)
expected is taken from the current locale settings on systems which
provide `localeconv' (*note Locales and Internationalization:
(libc)Locales.).  The C library will normally do the same for standard
float input.

   The format string is only interpreted as plain `char's, multibyte
characters are not recognised.  Perhaps this will change in the future.


File: gmp.info,  Node: Formatted Input Functions,  Next: C++ Formatted Input,  Prev: Formatted Input Strings,  Up: Formatted Input

11.2 Formatted Input Functions
==============================

Each of the following functions is similar to the corresponding C
library function.  The plain `scanf' forms take a variable argument
list.  The `vscanf' forms take an argument pointer, see *Note Variadic
Functions: (libc)Variadic Functions, or `man 3 va_start'.

   It should be emphasised that if a format string is invalid, or the
arguments don't match what the format specifies, then the behaviour of
any of these functions will be unpredictable.  GCC format string
checking is not available, since it doesn't recognise the GMP
extensions.

   No overlap is permitted between the FMT string and any of the results
produced.

 -- Function: int gmp_scanf (const char *FMT, ...)
 -- Function: int gmp_vscanf (const char *FMT, va_list AP)
     Read from the standard input `stdin'.

 -- Function: int gmp_fscanf (FILE *FP, const char *FMT, ...)
 -- Function: int gmp_vfscanf (FILE *FP, const char *FMT, va_list AP)
     Read from the stream FP.

 -- Function: int gmp_sscanf (const char *S, const char *FMT, ...)
 -- Function: int gmp_vsscanf (const char *S, const char *FMT, va_list
          AP)
     Read from a null-terminated string S.

   The return value from each of these functions is the same as the
standard C99 `scanf', namely the number of fields successfully parsed
and stored.  `%n' fields and fields read but suppressed by `*' don't
count towards the return value.

   If end of input (or a file error) is reached before a character for
a field or a literal, and if no previous non-suppressed fields have
matched, then the return value is `EOF' instead of 0.  A whitespace
character in the format string is only an optional match and doesn't
induce an `EOF' in this fashion.  Leading whitespace read and discarded
for a field don't count as characters for that field.

   For the GMP types, input parsing follows C99 rules, namely one
character of lookahead is used and characters are read while they
continue to meet the format requirements.  If this doesn't provide a
complete number then the function terminates, with that field not
stored nor counted towards the return value.  For instance with `mpf_t'
an input `1.23e-XYZ' would be read up to the `X' and that character
pushed back since it's not a digit.  The string `1.23e-' would then be
considered invalid since an `e' must be followed by at least one digit.

   For the standard C types, in the current implementation GMP calls
the C library `scanf' functions, which might have looser rules about
what constitutes a valid input.

   Note that `gmp_sscanf' is the same as `gmp_fscanf' and only does one
character of lookahead when parsing.  Although clearly it could look at
its entire input, it is deliberately made identical to `gmp_fscanf',
the same way C99 `sscanf' is the same as `fscanf'.


File: gmp.info,  Node: C++ Formatted Input,  Prev: Formatted Input Functions,  Up: Formatted Input

11.3 C++ Formatted Input
========================

The following functions are provided in `libgmpxx' (*note Headers and
Libraries::), which is built only if C++ support is enabled (*note
Build Options::).  Prototypes are available from `<gmp.h>'.

 -- Function: istream& operator>> (istream& STREAM, mpz_t ROP)
     Read ROP from STREAM, using its `ios' formatting settings.

 -- Function: istream& operator>> (istream& STREAM, mpq_t ROP)
     An integer like `123' will be read, or a fraction like `5/9'.  No
     whitespace is allowed around the `/'.  If the fraction is not in
     canonical form then `mpq_canonicalize' must be called (*note
     Rational Number Functions::) before operating on it.

     As per integer input, an `0' or `0x' base indicator is read when
     none of `ios::dec', `ios::oct' or `ios::hex' are set.  This is
     done separately for numerator and denominator, so that for instance
     `0x10/11' is 16/11 and `0x10/0x11' is 16/17.

 -- Function: istream& operator>> (istream& STREAM, mpf_t ROP)
     Read ROP from STREAM, using its `ios' formatting settings.

     Hex or octal floats are not supported, but might be in the future,
     or perhaps it's best to accept only what the standard float
     `operator>>' does.

   Note that digit grouping specified by the `istream' locale is
currently not accepted.  Perhaps this will change in the future.


   These operators mean that GMP types can be read in the usual C++
way, for example,

     mpz_t  z;
     ...
     cin >> z;

   But note that `istream' input (and `ostream' output, *note C++
Formatted Output::) is the only overloading available for the GMP types
and that for instance using `+' with an `mpz_t' will have unpredictable
results.  For classes with overloading, see *Note C++ Class Interface::.


File: gmp.info,  Node: C++ Class Interface,  Next: Custom Allocation,  Prev: Formatted Input,  Up: Top

12 C++ Class Interface
**********************

This chapter describes the C++ class based interface to GMP.

   All GMP C language types and functions can be used in C++ programs,
since `gmp.h' has `extern "C"' qualifiers, but the class interface
offers overloaded functions and operators which may be more convenient.

   Due to the implementation of this interface, a reasonably recent C++
compiler is required, one supporting namespaces, partial specialization
of templates and member templates.

   *Everything described in this chapter is to be considered preliminary
and might be subject to incompatible changes if some unforeseen
difficulty reveals itself.*

* Menu:

* C++ Interface General::
* C++ Interface Integers::
* C++ Interface Rationals::
* C++ Interface Floats::
* C++ Interface Random Numbers::
* C++ Interface Limitations::


File: gmp.info,  Node: C++ Interface General,  Next: C++ Interface Integers,  Prev: C++ Class Interface,  Up: C++ Class Interface

12.1 C++ Interface General
==========================

All the C++ classes and functions are available with

     #include <gmpxx.h>

   Programs should be linked with the `libgmpxx' and `libgmp'
libraries.  For example,

     g++ mycxxprog.cc -lgmpxx -lgmp

The classes defined are

 -- Class: mpz_class
 -- Class: mpq_class
 -- Class: mpf_class

   The standard operators and various standard functions are overloaded
to allow arithmetic with these classes.  For example,

     int
     main (void)
     {
       mpz_class a, b, c;

       a = 1234;
       b = "-5678";
       c = a+b;
       cout << "sum is " << c << "\n";
       cout << "absolute value is " << abs(c) << "\n";

       return 0;
     }

   An important feature of the implementation is that an expression like
`a=b+c' results in a single call to the corresponding `mpz_add',
without using a temporary for the `b+c' part.  Expressions which by
their nature imply intermediate values, like `a=b*c+d*e', still use
temporaries though.

   The classes can be freely intermixed in expressions, as can the
classes and the standard types `long', `unsigned long' and `double'.
Smaller types like `int' or `float' can also be intermixed, since C++
will promote them.

   Note that `bool' is not accepted directly, but must be explicitly
cast to an `int' first.  This is because C++ will automatically convert
any pointer to a `bool', so if GMP accepted `bool' it would make all
sorts of invalid class and pointer combinations compile but almost
certainly not do anything sensible.

   Conversions back from the classes to standard C++ types aren't done
automatically, instead member functions like `get_si' are provided (see
the following sections for details).

   Also there are no automatic conversions from the classes to the
corresponding GMP C types, instead a reference to the underlying C
object can be obtained with the following functions,

 -- Function: mpz_t mpz_class::get_mpz_t ()
 -- Function: mpq_t mpq_class::get_mpq_t ()
 -- Function: mpf_t mpf_class::get_mpf_t ()

   These can be used to call a C function which doesn't have a C++ class
interface.  For example to set `a' to the GCD of `b' and `c',

     mpz_class a, b, c;
     ...
     mpz_gcd (a.get_mpz_t(), b.get_mpz_t(), c.get_mpz_t());

   In the other direction, a class can be initialized from the
corresponding GMP C type, or assigned to if an explicit constructor is
used.  In both cases this makes a copy of the value, it doesn't create
any sort of association.  For example,

     mpz_t z;
     // ... init and calculate z ...
     mpz_class x(z);
     mpz_class y;
     y = mpz_class (z);

   There are no namespace setups in `gmpxx.h', all types and functions
are simply put into the global namespace.  This is what `gmp.h' has
done in the past, and continues to do for compatibility.  The extras
provided by `gmpxx.h' follow GMP naming conventions and are unlikely to
clash with anything.


File: gmp.info,  Node: C++ Interface Integers,  Next: C++ Interface Rationals,  Prev: C++ Interface General,  Up: C++ Class Interface

12.2 C++ Interface Integers
===========================

 -- Function:  mpz_class::mpz_class (type N)
     Construct an `mpz_class'.  All the standard C++ types may be used,
     except `long long' and `long double', and all the GMP C++ classes
     can be used, although conversions from `mpq_class' and `mpf_class'
     are `explicit'.  Any necessary conversion follows the
     corresponding C function, for example `double' follows `mpz_set_d'
     (*note Assigning Integers::).

 -- Function: explicit mpz_class::mpz_class (const mpz_t Z)
     Construct an `mpz_class' from an `mpz_t'.  The value in Z is
     copied into the new `mpz_class', there won't be any permanent
     association between it and Z.

 -- Function: explicit mpz_class::mpz_class (const char *S, int BASE =
          0)
 -- Function: explicit mpz_class::mpz_class (const string& S, int BASE
          = 0)
     Construct an `mpz_class' converted from a string using
     `mpz_set_str' (*note Assigning Integers::).

     If the string is not a valid integer, an `std::invalid_argument'
     exception is thrown.  The same applies to `operator='.

 -- Function: mpz_class operator"" _mpz (const char *STR)
     With C++11 compilers, integers can be constructed with the syntax
     `123_mpz' which is equivalent to `mpz_class("123")'.

 -- Function: mpz_class operator/ (mpz_class A, mpz_class D)
 -- Function: mpz_class operator% (mpz_class A, mpz_class D)
     Divisions involving `mpz_class' round towards zero, as per the
     `mpz_tdiv_q' and `mpz_tdiv_r' functions (*note Integer Division::).
     This is the same as the C99 `/' and `%' operators.

     The `mpz_fdiv...' or `mpz_cdiv...' functions can always be called
     directly if desired.  For example,

          mpz_class q, a, d;
          ...
          mpz_fdiv_q (q.get_mpz_t(), a.get_mpz_t(), d.get_mpz_t());

 -- Function: mpz_class abs (mpz_class OP)
 -- Function: int cmp (mpz_class OP1, type OP2)
 -- Function: int cmp (type OP1, mpz_class OP2)
 -- Function: bool mpz_class::fits_sint_p (void)
 -- Function: bool mpz_class::fits_slong_p (void)
 -- Function: bool mpz_class::fits_sshort_p (void)
 -- Function: bool mpz_class::fits_uint_p (void)
 -- Function: bool mpz_class::fits_ulong_p (void)
 -- Function: bool mpz_class::fits_ushort_p (void)
 -- Function: double mpz_class::get_d (void)
 -- Function: long mpz_class::get_si (void)
 -- Function: string mpz_class::get_str (int BASE = 10)
 -- Function: unsigned long mpz_class::get_ui (void)
 -- Function: int mpz_class::set_str (const char *STR, int BASE)
 -- Function: int mpz_class::set_str (const string& STR, int BASE)
 -- Function: int sgn (mpz_class OP)
 -- Function: mpz_class sqrt (mpz_class OP)
 -- Function: mpz_class gcd (mpz_class OP1, mpz_class OP2)
 -- Function: mpz_class lcm (mpz_class OP1, mpz_class OP2)
 -- Function: void mpz_class::swap (mpz_class& OP)
 -- Function: void swap (mpz_class& OP1, mpz_class& OP2)
     These functions provide a C++ class interface to the corresponding
     GMP C routines.

     `cmp' can be used with any of the classes or the standard C++
     types, except `long long' and `long double'.


   Overloaded operators for combinations of `mpz_class' and `double'
are provided for completeness, but it should be noted that if the given
`double' is not an integer then the way any rounding is done is
currently unspecified.  The rounding might take place at the start, in
the middle, or at the end of the operation, and it might change in the
future.

   Conversions between `mpz_class' and `double', however, are defined
to follow the corresponding C functions `mpz_get_d' and `mpz_set_d'.
And comparisons are always made exactly, as per `mpz_cmp_d'.


File: gmp.info,  Node: C++ Interface Rationals,  Next: C++ Interface Floats,  Prev: C++ Interface Integers,  Up: C++ Class Interface

12.3 C++ Interface Rationals
============================

In all the following constructors, if a fraction is given then it
should be in canonical form, or if not then `mpq_class::canonicalize'
called.

 -- Function:  mpq_class::mpq_class (type OP)
 -- Function:  mpq_class::mpq_class (integer NUM, integer DEN)
     Construct an `mpq_class'.  The initial value can be a single value
     of any type (conversion from `mpf_class' is `explicit'), or a pair
     of integers (`mpz_class' or standard C++ integer types)
     representing a fraction, except that `long long' and `long double'
     are not supported.  For example,

          mpq_class q (99);
          mpq_class q (1.75);
          mpq_class q (1, 3);

 -- Function: explicit mpq_class::mpq_class (const mpq_t Q)
     Construct an `mpq_class' from an `mpq_t'.  The value in Q is
     copied into the new `mpq_class', there won't be any permanent
     association between it and Q.

 -- Function: explicit mpq_class::mpq_class (const char *S, int BASE =
          0)
 -- Function: explicit mpq_class::mpq_class (const string& S, int BASE
          = 0)
     Construct an `mpq_class' converted from a string using
     `mpq_set_str' (*note Initializing Rationals::).

     If the string is not a valid rational, an `std::invalid_argument'
     exception is thrown.  The same applies to `operator='.

 -- Function: mpq_class operator"" _mpq (const char *STR)
     With C++11 compilers, integral rationals can be constructed with
     the syntax `123_mpq' which is equivalent to `mpq_class(123_mpz)'.
     Other rationals can be built as `-1_mpq/2' or `0xb_mpq/123456_mpz'.

 -- Function: void mpq_class::canonicalize ()
     Put an `mpq_class' into canonical form, as per *Note Rational
     Number Functions::.  All arithmetic operators require their
     operands in canonical form, and will return results in canonical
     form.

 -- Function: mpq_class abs (mpq_class OP)
 -- Function: int cmp (mpq_class OP1, type OP2)
 -- Function: int cmp (type OP1, mpq_class OP2)
 -- Function: double mpq_class::get_d (void)
 -- Function: string mpq_class::get_str (int BASE = 10)
 -- Function: int mpq_class::set_str (const char *STR, int BASE)
 -- Function: int mpq_class::set_str (const string& STR, int BASE)
 -- Function: int sgn (mpq_class OP)
 -- Function: void mpq_class::swap (mpq_class& OP)
 -- Function: void swap (mpq_class& OP1, mpq_class& OP2)
     These functions provide a C++ class interface to the corresponding
     GMP C routines.

     `cmp' can be used with any of the classes or the standard C++
     types, except `long long' and `long double'.

 -- Function: mpz_class& mpq_class::get_num ()
 -- Function: mpz_class& mpq_class::get_den ()
     Get a reference to an `mpz_class' which is the numerator or
     denominator of an `mpq_class'.  This can be used both for read and
     write access.  If the object returned is modified, it modifies the
     original `mpq_class'.

     If direct manipulation might produce a non-canonical value, then
     `mpq_class::canonicalize' must be called before further operations.

 -- Function: mpz_t mpq_class::get_num_mpz_t ()
 -- Function: mpz_t mpq_class::get_den_mpz_t ()
     Get a reference to the underlying `mpz_t' numerator or denominator
     of an `mpq_class'.  This can be passed to C functions expecting an
     `mpz_t'.  Any modifications made to the `mpz_t' will modify the
     original `mpq_class'.

     If direct manipulation might produce a non-canonical value, then
     `mpq_class::canonicalize' must be called before further operations.

 -- Function: istream& operator>> (istream& STREAM, mpq_class& ROP);
     Read ROP from STREAM, using its `ios' formatting settings, the
     same as `mpq_t operator>>' (*note C++ Formatted Input::).

     If the ROP read might not be in canonical form then
     `mpq_class::canonicalize' must be called.


File: gmp.info,  Node: C++ Interface Floats,  Next: C++ Interface Random Numbers,  Prev: C++ Interface Rationals,  Up: C++ Class Interface

12.4 C++ Interface Floats
=========================

When an expression requires the use of temporary intermediate
`mpf_class' values, like `f=g*h+x*y', those temporaries will have the
same precision as the destination `f'.  Explicit constructors can be
used if this doesn't suit.

 -- Function:  mpf_class::mpf_class (type OP)
 -- Function:  mpf_class::mpf_class (type OP, mp_bitcnt_t PREC)
     Construct an `mpf_class'.  Any standard C++ type can be used,
     except `long long' and `long double', and any of the GMP C++
     classes can be used.

     If PREC is given, the initial precision is that value, in bits.  If
     PREC is not given, then the initial precision is determined by the
     type of OP given.  An `mpz_class', `mpq_class', or C++ builtin
     type will give the default `mpf' precision (*note Initializing
     Floats::).  An `mpf_class' or expression will give the precision
     of that value.  The precision of a binary expression is the higher
     of the two operands.

          mpf_class f(1.5);        // default precision
          mpf_class f(1.5, 500);   // 500 bits (at least)
          mpf_class f(x);          // precision of x
          mpf_class f(abs(x));     // precision of x
          mpf_class f(-g, 1000);   // 1000 bits (at least)
          mpf_class f(x+y);        // greater of precisions of x and y

 -- Function: explicit mpf_class::mpf_class (const mpf_t F)
 -- Function:  mpf_class::mpf_class (const mpf_t F, mp_bitcnt_t PREC)
     Construct an `mpf_class' from an `mpf_t'.  The value in F is
     copied into the new `mpf_class', there won't be any permanent
     association between it and F.

     If PREC is given, the initial precision is that value, in bits.  If
     PREC is not given, then the initial precision is that of F.

 -- Function: explicit mpf_class::mpf_class (const char *S)
 -- Function:  mpf_class::mpf_class (const char *S, mp_bitcnt_t PREC,
          int BASE = 0)
 -- Function: explicit mpf_class::mpf_class (const string& S)
 -- Function:  mpf_class::mpf_class (const string& S, mp_bitcnt_t PREC,
          int BASE = 0)
     Construct an `mpf_class' converted from a string using
     `mpf_set_str' (*note Assigning Floats::).  If PREC is given, the
     initial precision is that value, in bits.  If not, the default
     `mpf' precision (*note Initializing Floats::) is used.

     If the string is not a valid float, an `std::invalid_argument'
     exception is thrown.  The same applies to `operator='.

 -- Function: mpf_class operator"" _mpf (const char *STR)
     With C++11 compilers, floats can be constructed with the syntax
     `1.23e-1_mpf' which is equivalent to `mpf_class("1.23e-1")'.

 -- Function: mpf_class& mpf_class::operator= (type OP)
     Convert and store the given OP value to an `mpf_class' object.  The
     same types are accepted as for the constructors above.

     Note that `operator=' only stores a new value, it doesn't copy or
     change the precision of the destination, instead the value is
     truncated if necessary.  This is the same as `mpf_set' etc.  Note
     in particular this means for `mpf_class' a copy constructor is not
     the same as a default constructor plus assignment.

          mpf_class x (y);   // x created with precision of y

          mpf_class x;       // x created with default precision
          x = y;             // value truncated to that precision

     Applications using templated code may need to be careful about the
     assumptions the code makes in this area, when working with
     `mpf_class' values of various different or non-default precisions.
     For instance implementations of the standard `complex' template
     have been seen in both styles above, though of course `complex' is
     normally only actually specified for use with the builtin float
     types.

 -- Function: mpf_class abs (mpf_class OP)
 -- Function: mpf_class ceil (mpf_class OP)
 -- Function: int cmp (mpf_class OP1, type OP2)
 -- Function: int cmp (type OP1, mpf_class OP2)
 -- Function: bool mpf_class::fits_sint_p (void)
 -- Function: bool mpf_class::fits_slong_p (void)
 -- Function: bool mpf_class::fits_sshort_p (void)
 -- Function: bool mpf_class::fits_uint_p (void)
 -- Function: bool mpf_class::fits_ulong_p (void)
 -- Function: bool mpf_class::fits_ushort_p (void)
 -- Function: mpf_class floor (mpf_class OP)
 -- Function: mpf_class hypot (mpf_class OP1, mpf_class OP2)
 -- Function: double mpf_class::get_d (void)
 -- Function: long mpf_class::get_si (void)
 -- Function: string mpf_class::get_str (mp_exp_t& EXP, int BASE = 10,
          size_t DIGITS = 0)
 -- Function: unsigned long mpf_class::get_ui (void)
 -- Function: int mpf_class::set_str (const char *STR, int BASE)
 -- Function: int mpf_class::set_str (const string& STR, int BASE)
 -- Function: int sgn (mpf_class OP)
 -- Function: mpf_class sqrt (mpf_class OP)
 -- Function: void mpf_class::swap (mpf_class& OP)
 -- Function: void swap (mpf_class& OP1, mpf_class& OP2)
 -- Function: mpf_class trunc (mpf_class OP)
     These functions provide a C++ class interface to the corresponding
     GMP C routines.

     `cmp' can be used with any of the classes or the standard C++
     types, except `long long' and `long double'.

     The accuracy provided by `hypot' is not currently guaranteed.

 -- Function: mp_bitcnt_t mpf_class::get_prec ()
 -- Function: void mpf_class::set_prec (mp_bitcnt_t PREC)
 -- Function: void mpf_class::set_prec_raw (mp_bitcnt_t PREC)
     Get or set the current precision of an `mpf_class'.

     The restrictions described for `mpf_set_prec_raw' (*note
     Initializing Floats::) apply to `mpf_class::set_prec_raw'.  Note
     in particular that the `mpf_class' must be restored to it's
     allocated precision before being destroyed.  This must be done by
     application code, there's no automatic mechanism for it.


File: gmp.info,  Node: C++ Interface Random Numbers,  Next: C++ Interface Limitations,  Prev: C++ Interface Floats,  Up: C++ Class Interface

12.5 C++ Interface Random Numbers
=================================

 -- Class: gmp_randclass
     The C++ class interface to the GMP random number functions uses
     `gmp_randclass' to hold an algorithm selection and current state,
     as per `gmp_randstate_t'.

 -- Function:  gmp_randclass::gmp_randclass (void (*RANDINIT)
          (gmp_randstate_t, ...), ...)
     Construct a `gmp_randclass', using a call to the given RANDINIT
     function (*note Random State Initialization::).  The arguments
     expected are the same as RANDINIT, but with `mpz_class' instead of
     `mpz_t'.  For example,

          gmp_randclass r1 (gmp_randinit_default);
          gmp_randclass r2 (gmp_randinit_lc_2exp_size, 32);
          gmp_randclass r3 (gmp_randinit_lc_2exp, a, c, m2exp);
          gmp_randclass r4 (gmp_randinit_mt);

     `gmp_randinit_lc_2exp_size' will fail if the size requested is too
     big, an `std::length_error' exception is thrown in that case.

 -- Function:  gmp_randclass::gmp_randclass (gmp_randalg_t ALG, ...)
     Construct a `gmp_randclass' using the same parameters as
     `gmp_randinit' (*note Random State Initialization::).  This
     function is obsolete and the above RANDINIT style should be
     preferred.

 -- Function: void gmp_randclass::seed (unsigned long int S)
 -- Function: void gmp_randclass::seed (mpz_class S)
     Seed a random number generator.  See *note Random Number
     Functions::, for how to choose a good seed.

 -- Function: mpz_class gmp_randclass::get_z_bits (mp_bitcnt_t BITS)
 -- Function: mpz_class gmp_randclass::get_z_bits (mpz_class BITS)
     Generate a random integer with a specified number of bits.

 -- Function: mpz_class gmp_randclass::get_z_range (mpz_class N)
     Generate a random integer in the range 0 to N-1 inclusive.

 -- Function: mpf_class gmp_randclass::get_f ()
 -- Function: mpf_class gmp_randclass::get_f (mp_bitcnt_t PREC)
     Generate a random float F in the range 0 <= F < 1.  F will be to
     PREC bits precision, or if PREC is not given then to the precision
     of the destination.  For example,

          gmp_randclass  r;
          ...
          mpf_class  f (0, 512);   // 512 bits precision
          f = r.get_f();           // random number, 512 bits


File: gmp.info,  Node: C++ Interface Limitations,  Prev: C++ Interface Random Numbers,  Up: C++ Class Interface

12.6 C++ Interface Limitations
==============================

`mpq_class' and Templated Reading
     A generic piece of template code probably won't know that
     `mpq_class' requires a `canonicalize' call if inputs read with
     `operator>>' might be non-canonical.  This can lead to incorrect
     results.

     `operator>>' behaves as it does for reasons of efficiency.  A
     canonicalize can be quite time consuming on large operands, and is
     best avoided if it's not necessary.

     But this potential difficulty reduces the usefulness of
     `mpq_class'.  Perhaps a mechanism to tell `operator>>' what to do
     will be adopted in the future, maybe a preprocessor define, a
     global flag, or an `ios' flag pressed into service.  Or maybe, at
     the risk of inconsistency, the `mpq_class' `operator>>' could
     canonicalize and leave `mpq_t' `operator>>' not doing so, for use
     on those occasions when that's acceptable.  Send feedback or
     alternate ideas to <gmp-bugs@gmplib.org>.

Subclassing
     Subclassing the GMP C++ classes works, but is not currently
     recommended.

     Expressions involving subclasses resolve correctly (or seem to),
     but in normal C++ fashion the subclass doesn't inherit
     constructors and assignments.  There's many of those in the GMP
     classes, and a good way to reestablish them in a subclass is not
     yet provided.

Templated Expressions
     A subtle difficulty exists when using expressions together with
     application-defined template functions.  Consider the following,
     with `T' intended to be some numeric type,

          template <class T>
          T fun (const T &, const T &);

     When used with, say, plain `mpz_class' variables, it works fine:
     `T' is resolved as `mpz_class'.

          mpz_class f(1), g(2);
          fun (f, g);    // Good

     But when one of the arguments is an expression, it doesn't work.

          mpz_class f(1), g(2), h(3);
          fun (f, g+h);  // Bad

     This is because `g+h' ends up being a certain expression template
     type internal to `gmpxx.h', which the C++ template resolution
     rules are unable to automatically convert to `mpz_class'.  The
     workaround is simply to add an explicit cast.

          mpz_class f(1), g(2), h(3);
          fun (f, mpz_class(g+h));  // Good

     Similarly, within `fun' it may be necessary to cast an expression
     to type `T' when calling a templated `fun2'.

          template <class T>
          void fun (T f, T g)
          {
            fun2 (f, f+g);     // Bad
          }

          template <class T>
          void fun (T f, T g)
          {
            fun2 (f, T(f+g));  // Good
          }

C++11
     C++11 provides several new ways in which types can be inferred:
     `auto', `decltype', etc. While they can be very convenient, they
     don't mix well with expression templates. In this example, the
     addition is performed twice, as if we had defined `sum' as a macro.

          mpz_class z = 33;
          auto sum = z + z;
          mpz_class prod = sum * sum;

     This other example may crash, though some compilers might make it
     look like it is working, because the expression `z+z' goes out of
     scope before it is evaluated.

          mpz_class z = 33;
          auto sum = z + z + z;
          mpz_class prod = sum * 2;

     It is thus strongly recommended to avoid `auto' anywhere a GMP C++
     expression may appear.


File: gmp.info,  Node: Custom Allocation,  Next: Language Bindings,  Prev: C++ Class Interface,  Up: Top

13 Custom Allocation
********************

By default GMP uses `malloc', `realloc' and `free' for memory
allocation, and if they fail GMP prints a message to the standard error
output and terminates the program.

   Alternate functions can be specified, to allocate memory in a
different way or to have a different error action on running out of
memory.

 -- Function: void mp_set_memory_functions (
          void *(*ALLOC_FUNC_PTR) (size_t),
          void *(*REALLOC_FUNC_PTR) (void *, size_t, size_t),
          void (*FREE_FUNC_PTR) (void *, size_t))
     Replace the current allocation functions from the arguments.  If
     an argument is `NULL', the corresponding default function is used.

     These functions will be used for all memory allocation done by
     GMP, apart from temporary space from `alloca' if that function is
     available and GMP is configured to use it (*note Build Options::).

     *Be sure to call `mp_set_memory_functions' only when there are no
     active GMP objects allocated using the previous memory functions!
     Usually that means calling it before any other GMP function.*

   The functions supplied should fit the following declarations:

 -- Function: void * allocate_function (size_t ALLOC_SIZE)
     Return a pointer to newly allocated space with at least ALLOC_SIZE
     bytes.

 -- Function: void * reallocate_function (void *PTR, size_t OLD_SIZE,
          size_t NEW_SIZE)
     Resize a previously allocated block PTR of OLD_SIZE bytes to be
     NEW_SIZE bytes.

     The block may be moved if necessary or if desired, and in that
     case the smaller of OLD_SIZE and NEW_SIZE bytes must be copied to
     the new location.  The return value is a pointer to the resized
     block, that being the new location if moved or just PTR if not.

     PTR is never `NULL', it's always a previously allocated block.
     NEW_SIZE may be bigger or smaller than OLD_SIZE.

 -- Function: void free_function (void *PTR, size_t SIZE)
     De-allocate the space pointed to by PTR.

     PTR is never `NULL', it's always a previously allocated block of
     SIZE bytes.

   A "byte" here means the unit used by the `sizeof' operator.

   The REALLOCATE_FUNCTION parameter OLD_SIZE and the FREE_FUNCTION
parameter SIZE are passed for convenience, but of course they can be
ignored if not needed by an implementation.  The default functions
using `malloc' and friends for instance don't use them.

   No error return is allowed from any of these functions, if they
return then they must have performed the specified operation.  In
particular note that ALLOCATE_FUNCTION or REALLOCATE_FUNCTION mustn't
return `NULL'.

   Getting a different fatal error action is a good use for custom
allocation functions, for example giving a graphical dialog rather than
the default print to `stderr'.  How much is possible when genuinely out
of memory is another question though.

   There's currently no defined way for the allocation functions to
recover from an error such as out of memory, they must terminate
program execution.  A `longjmp' or throwing a C++ exception will have
undefined results.  This may change in the future.

   GMP may use allocated blocks to hold pointers to other allocated
blocks.  This will limit the assumptions a conservative garbage
collection scheme can make.

   Since the default GMP allocation uses `malloc' and friends, those
functions will be linked in even if the first thing a program does is an
`mp_set_memory_functions'.  It's necessary to change the GMP sources if
this is a problem.


 -- Function: void mp_get_memory_functions (
          void *(**ALLOC_FUNC_PTR) (size_t),
          void *(**REALLOC_FUNC_PTR) (void *, size_t, size_t),
          void (**FREE_FUNC_PTR) (void *, size_t))
     Get the current allocation functions, storing function pointers to
     the locations given by the arguments.  If an argument is `NULL',
     that function pointer is not stored.

     For example, to get just the current free function,

          void (*freefunc) (void *, size_t);

          mp_get_memory_functions (NULL, NULL, &freefunc);


File: gmp.info,  Node: Language Bindings,  Next: Algorithms,  Prev: Custom Allocation,  Up: Top

14 Language Bindings
********************

The following packages and projects offer access to GMP from languages
other than C, though perhaps with varying levels of functionality and
efficiency.


C++
        * GMP C++ class interface, *note C++ Class Interface::
          Straightforward interface, expression templates to eliminate
          temporaries.

        * ALP `https://www-sop.inria.fr/saga/logiciels/ALP/'
          Linear algebra and polynomials using templates.

        * Arithmos `http://cant.ua.ac.be/old/arithmos/'
          Rationals with infinities and square roots.

        * CLN `http://www.ginac.de/CLN/'
          High level classes for arithmetic.

        * Linbox `http://www.linalg.org/'
          Sparse vectors and matrices.

        * NTL `http://www.shoup.net/ntl/'
          A C++ number theory library.

Eiffel
        * Eiffelroom `http://www.eiffelroom.org/node/442'

Haskell
        * Glasgow Haskell Compiler `https://www.haskell.org/ghc/'

Java
        * Kaffe `https://github.com/kaffe/kaffe'

Lisp
        * GNU Common Lisp `https://www.gnu.org/software/gcl/gcl.html'

        * Librep `http://librep.sourceforge.net/'

        * XEmacs (21.5.18 beta and up) `http://www.xemacs.org'
          Optional big integers, rationals and floats using GMP.

M4
        * GNU m4 betas `http://www.seindal.dk/rene/gnu/'
          Optionally provides an arbitrary precision `mpeval'.

ML
        * MLton compiler `http://mlton.org/'

Objective Caml
        * MLGMP `http://opam.ocamlpro.com/pkg/mlgmp.20120224.html'

        * Numerix `http://pauillac.inria.fr/~quercia/'
          Optionally using GMP.

Oz
        * Mozart `http://mozart.github.io/'

Pascal
        * GNU Pascal Compiler `http://www.gnu-pascal.de/'
          GMP unit.

        * Numerix `http://pauillac.inria.fr/~quercia/'
          For Free Pascal, optionally using GMP.

Perl
        * GMP module, see `demos/perl' in the GMP sources (*note
          Demonstration Programs::).

        * Math::GMP `http://www.cpan.org/'
          Compatible with Math::BigInt, but not as many functions as
          the GMP module above.

        * Math::BigInt::GMP `http://www.cpan.org/'
          Plug Math::GMP into normal Math::BigInt operations.

Pike
        * mpz module in the standard distribution,
          `http://pike.ida.liu.se/'

Prolog
        * SWI Prolog `http://www.swi-prolog.org/'
          Arbitrary precision floats.

Python
        * GMPY `https://code.google.com/p/gmpy/'

Ruby
        * http://rubygems.org/gems/gmp

Scheme
        * GNU Guile `https://www.gnu.org/software/guile/guile.html'

        * RScheme `http://www.rscheme.org/'

        * STklos `http://www.stklos.net/'

Smalltalk
        * GNU Smalltalk
          `http://www.smalltalk.org/versions/GNUSmalltalk.html'

Other
        * Axiom `https://savannah.nongnu.org/projects/axiom'
          Computer algebra using GCL.

        * DrGenius `http://drgenius.seul.org/'
          Geometry system and mathematical programming language.

        * GiNaC `http://www.ginac.de/'
          C++ computer algebra using CLN.

        * GOO `https://www.eecs.berkeley.edu/~jrb/goo/'
          Dynamic object oriented language.

        * Maxima `https://www.ma.utexas.edu/users/wfs/maxima.html'
          Macsyma computer algebra using GCL.

        * Regina `http://regina.sourceforge.net/'
          Topological calculator.

        * Yacas `http://yacas.sourceforge.net'
          Yet another computer algebra system.



File: gmp.info,  Node: Algorithms,  Next: Internals,  Prev: Language Bindings,  Up: Top

15 Algorithms
*************

This chapter is an introduction to some of the algorithms used for
various GMP operations.  The code is likely to be hard to understand
without knowing something about the algorithms.

   Some GMP internals are mentioned, but applications that expect to be
compatible with future GMP releases should take care to use only the
documented functions.

* Menu:

* Multiplication Algorithms::
* Division Algorithms::
* Greatest Common Divisor Algorithms::
* Powering Algorithms::
* Root Extraction Algorithms::
* Radix Conversion Algorithms::
* Other Algorithms::
* Assembly Coding::


File: gmp.info,  Node: Multiplication Algorithms,  Next: Division Algorithms,  Prev: Algorithms,  Up: Algorithms

15.1 Multiplication
===================

NxN limb multiplications and squares are done using one of seven
algorithms, as the size N increases.

     Algorithm      Threshold
     Basecase       (none)
     Karatsuba      `MUL_TOOM22_THRESHOLD'
     Toom-3         `MUL_TOOM33_THRESHOLD'
     Toom-4         `MUL_TOOM44_THRESHOLD'
     Toom-6.5       `MUL_TOOM6H_THRESHOLD'
     Toom-8.5       `MUL_TOOM8H_THRESHOLD'
     FFT            `MUL_FFT_THRESHOLD'

   Similarly for squaring, with the `SQR' thresholds.

   NxM multiplications of operands with different sizes above
`MUL_TOOM22_THRESHOLD' are currently done by special Toom-inspired
algorithms or directly with FFT, depending on operand size (*note
Unbalanced Multiplication::).

* Menu:

* Basecase Multiplication::
* Karatsuba Multiplication::
* Toom 3-Way Multiplication::
* Toom 4-Way Multiplication::
* Higher degree Toom'n'half::
* FFT Multiplication::
* Other Multiplication::
* Unbalanced Multiplication::


File: gmp.info,  Node: Basecase Multiplication,  Next: Karatsuba Multiplication,  Prev: Multiplication Algorithms,  Up: Multiplication Algorithms

15.1.1 Basecase Multiplication
------------------------------

Basecase NxM multiplication is a straightforward rectangular set of
cross-products, the same as long multiplication done by hand and for
that reason sometimes known as the schoolbook or grammar school method.
This is an O(N*M) algorithm.  See Knuth section 4.3.1 algorithm M
(*note References::), and the `mpn/generic/mul_basecase.c' code.

   Assembly implementations of `mpn_mul_basecase' are essentially the
same as the generic C code, but have all the usual assembly tricks and
obscurities introduced for speed.

   A square can be done in roughly half the time of a multiply, by
using the fact that the cross products above and below the diagonal are
the same.  A triangle of products below the diagonal is formed, doubled
(left shift by one bit), and then the products on the diagonal added.
This can be seen in `mpn/generic/sqr_basecase.c'.  Again the assembly
implementations take essentially the same approach.

          u0  u1  u2  u3  u4
        +---+---+---+---+---+
     u0 | d |   |   |   |   |
        +---+---+---+---+---+
     u1 |   | d |   |   |   |
        +---+---+---+---+---+
     u2 |   |   | d |   |   |
        +---+---+---+---+---+
     u3 |   |   |   | d |   |
        +---+---+---+---+---+
     u4 |   |   |   |   | d |
        +---+---+---+---+---+

   In practice squaring isn't a full 2x faster than multiplying, it's
usually around 1.5x.  Less than 1.5x probably indicates
`mpn_sqr_basecase' wants improving on that CPU.

   On some CPUs `mpn_mul_basecase' can be faster than the generic C
`mpn_sqr_basecase' on some small sizes.  `SQR_BASECASE_THRESHOLD' is
the size at which to use `mpn_sqr_basecase', this will be zero if that
routine should be used always.


File: gmp.info,  Node: Karatsuba Multiplication,  Next: Toom 3-Way Multiplication,  Prev: Basecase Multiplication,  Up: Multiplication Algorithms

15.1.2 Karatsuba Multiplication
-------------------------------

The Karatsuba multiplication algorithm is described in Knuth section
4.3.3 part A, and various other textbooks.  A brief description is
given here.

   The inputs x and y are treated as each split into two parts of equal
length (or the most significant part one limb shorter if N is odd).

      high              low
     +----------+----------+
     |    x1    |    x0    |
     +----------+----------+

     +----------+----------+
     |    y1    |    y0    |
     +----------+----------+

   Let b be the power of 2 where the split occurs, i.e. if x0 is k
limbs (y0 the same) then b=2^(k*mp_bits_per_limb).  With that x=x1*b+x0
and y=y1*b+y0, and the following holds,

     x*y = (b^2+b)*x1*y1 - b*(x1-x0)*(y1-y0) + (b+1)*x0*y0

   This formula means doing only three multiplies of (N/2)x(N/2) limbs,
whereas a basecase multiply of NxN limbs is equivalent to four
multiplies of (N/2)x(N/2).  The factors (b^2+b) etc represent the
positions where the three products must be added.

      high                              low
     +--------+--------+ +--------+--------+
     |      x1*y1      | |      x0*y0      |
     +--------+--------+ +--------+--------+
               +--------+--------+
           add |      x1*y1      |
               +--------+--------+
               +--------+--------+
           add |      x0*y0      |
               +--------+--------+
               +--------+--------+
           sub | (x1-x0)*(y1-y0) |
               +--------+--------+

   The term (x1-x0)*(y1-y0) is best calculated as an absolute value,
and the sign used to choose to add or subtract.  Notice the sum
high(x0*y0)+low(x1*y1) occurs twice, so it's possible to do 5*k limb
additions, rather than 6*k, but in GMP extra function call overheads
outweigh the saving.

   Squaring is similar to multiplying, but with x=y the formula reduces
to an equivalent with three squares,

     x^2 = (b^2+b)*x1^2 - b*(x1-x0)^2 + (b+1)*x0^2

   The final result is accumulated from those three squares the same
way as for the three multiplies above.  The middle term (x1-x0)^2 is now
always positive.

   A similar formula for both multiplying and squaring can be
constructed with a middle term (x1+x0)*(y1+y0).  But those sums can
exceed k limbs, leading to more carry handling and additions than the
form above.

   Karatsuba multiplication is asymptotically an O(N^1.585) algorithm,
the exponent being log(3)/log(2), representing 3 multiplies each 1/2
the size of the inputs.  This is a big improvement over the basecase
multiply at O(N^2) and the advantage soon overcomes the extra additions
Karatsuba performs.  `MUL_TOOM22_THRESHOLD' can be as little as 10
limbs.  The `SQR' threshold is usually about twice the `MUL'.

   The basecase algorithm will take a time of the form M(N) = a*N^2 +
b*N + c and the Karatsuba algorithm K(N) = 3*M(N/2) + d*N + e, which
expands to K(N) = 3/4*a*N^2 + 3/2*b*N + 3*c + d*N + e.  The factor 3/4
for a means per-crossproduct speedups in the basecase code will
increase the threshold since they benefit M(N) more than K(N).  And
conversely the 3/2 for b means linear style speedups of b will increase
the threshold since they benefit K(N) more than M(N).  The latter can
be seen for instance when adding an optimized `mpn_sqr_diagonal' to
`mpn_sqr_basecase'.  Of course all speedups reduce total time, and in
that sense the algorithm thresholds are merely of academic interest.


File: gmp.info,  Node: Toom 3-Way Multiplication,  Next: Toom 4-Way Multiplication,  Prev: Karatsuba Multiplication,  Up: Multiplication Algorithms

15.1.3 Toom 3-Way Multiplication
--------------------------------

The Karatsuba formula is the simplest case of a general approach to
splitting inputs that leads to both Toom and FFT algorithms.  A
description of Toom can be found in Knuth section 4.3.3, with an
example 3-way calculation after Theorem A.  The 3-way form used in GMP
is described here.

   The operands are each considered split into 3 pieces of equal length
(or the most significant part 1 or 2 limbs shorter than the other two).

      high                         low
     +----------+----------+----------+
     |    x2    |    x1    |    x0    |
     +----------+----------+----------+

     +----------+----------+----------+
     |    y2    |    y1    |    y0    |
     +----------+----------+----------+

These parts are treated as the coefficients of two polynomials

     X(t) = x2*t^2 + x1*t + x0
     Y(t) = y2*t^2 + y1*t + y0

   Let b equal the power of 2 which is the size of the x0, x1, y0 and
y1 pieces, i.e. if they're k limbs each then b=2^(k*mp_bits_per_limb).
With this x=X(b) and y=Y(b).

   Let a polynomial W(t)=X(t)*Y(t) and suppose its coefficients are

     W(t) = w4*t^4 + w3*t^3 + w2*t^2 + w1*t + w0

   The w[i] are going to be determined, and when they are they'll give
the final result using w=W(b), since x*y=X(b)*Y(b)=W(b).  The
coefficients will be roughly b^2 each, and the final W(b) will be an
addition like,

      high                                        low
     +-------+-------+
     |       w4      |
     +-------+-------+
            +--------+-------+
            |        w3      |
            +--------+-------+
                    +--------+-------+
                    |        w2      |
                    +--------+-------+
                            +--------+-------+
                            |        w1      |
                            +--------+-------+
                                     +-------+-------+
                                     |       w0      |
                                     +-------+-------+

   The w[i] coefficients could be formed by a simple set of cross
products, like w4=x2*y2, w3=x2*y1+x1*y2, w2=x2*y0+x1*y1+x0*y2 etc, but
this would need all nine x[i]*y[j] for i,j=0,1,2, and would be
equivalent merely to a basecase multiply.  Instead the following
approach is used.

   X(t) and Y(t) are evaluated and multiplied at 5 points, giving
values of W(t) at those points.  In GMP the following points are used,

     Point    Value
     t=0      x0 * y0, which gives w0 immediately
     t=1      (x2+x1+x0) * (y2+y1+y0)
     t=-1     (x2-x1+x0) * (y2-y1+y0)
     t=2      (4*x2+2*x1+x0) * (4*y2+2*y1+y0)
     t=inf    x2 * y2, which gives w4 immediately

   At t=-1 the values can be negative and that's handled using the
absolute values and tracking the sign separately.  At t=inf the value
is actually X(t)*Y(t)/t^4 in the limit as t approaches infinity, but
it's much easier to think of as simply x2*y2 giving w4 immediately
(much like x0*y0 at t=0 gives w0 immediately).

   Each of the points substituted into W(t)=w4*t^4+...+w0 gives a
linear combination of the w[i] coefficients, and the value of those
combinations has just been calculated.

     W(0)   =                              w0
     W(1)   =    w4 +   w3 +   w2 +   w1 + w0
     W(-1)  =    w4 -   w3 +   w2 -   w1 + w0
     W(2)   = 16*w4 + 8*w3 + 4*w2 + 2*w1 + w0
     W(inf) =    w4

   This is a set of five equations in five unknowns, and some
elementary linear algebra quickly isolates each w[i].  This involves
adding or subtracting one W(t) value from another, and a couple of
divisions by powers of 2 and one division by 3, the latter using the
special `mpn_divexact_by3' (*note Exact Division::).

   The conversion of W(t) values to the coefficients is interpolation.
A polynomial of degree 4 like W(t) is uniquely determined by values
known at 5 different points.  The points are arbitrary and can be
chosen to make the linear equations come out with a convenient set of
steps for quickly isolating the w[i].

   Squaring follows the same procedure as multiplication, but there's
only one X(t) and it's evaluated at the 5 points, and those values
squared to give values of W(t).  The interpolation is then identical,
and in fact the same `toom_interpolate_5pts' subroutine is used for
both squaring and multiplying.

   Toom-3 is asymptotically O(N^1.465), the exponent being
log(5)/log(3), representing 5 recursive multiplies of 1/3 the original
size each.  This is an improvement over Karatsuba at O(N^1.585), though
Toom does more work in the evaluation and interpolation and so it only
realizes its advantage above a certain size.

   Near the crossover between Toom-3 and Karatsuba there's generally a
range of sizes where the difference between the two is small.
`MUL_TOOM33_THRESHOLD' is a somewhat arbitrary point in that range and
successive runs of the tune program can give different values due to
small variations in measuring.  A graph of time versus size for the two
shows the effect, see `tune/README'.

   At the fairly small sizes where the Toom-3 thresholds occur it's
worth remembering that the asymptotic behaviour for Karatsuba and
Toom-3 can't be expected to make accurate predictions, due of course to
the big influence of all sorts of overheads, and the fact that only a
few recursions of each are being performed.  Even at large sizes
there's a good chance machine dependent effects like cache architecture
will mean actual performance deviates from what might be predicted.

   The formula given for the Karatsuba algorithm (*note Karatsuba
Multiplication::) has an equivalent for Toom-3 involving only five
multiplies, but this would be complicated and unenlightening.

   An alternate view of Toom-3 can be found in Zuras (*note
References::), using a vector to represent the x and y splits and a
matrix multiplication for the evaluation and interpolation stages.  The
matrix inverses are not meant to be actually used, and they have
elements with values much greater than in fact arise in the
interpolation steps.  The diagram shown for the 3-way is attractive,
but again doesn't have to be implemented that way and for example with
a bit of rearrangement just one division by 6 can be done.


File: gmp.info,  Node: Toom 4-Way Multiplication,  Next: Higher degree Toom'n'half,  Prev: Toom 3-Way Multiplication,  Up: Multiplication Algorithms

15.1.4 Toom 4-Way Multiplication
--------------------------------

Karatsuba and Toom-3 split the operands into 2 and 3 coefficients,
respectively.  Toom-4 analogously splits the operands into 4
coefficients.  Using the notation from the section on Toom-3
multiplication, we form two polynomials:

     X(t) = x3*t^3 + x2*t^2 + x1*t + x0
     Y(t) = y3*t^3 + y2*t^2 + y1*t + y0

   X(t) and Y(t) are evaluated and multiplied at 7 points, giving
values of W(t) at those points.  In GMP the following points are used,

     Point    Value
     t=0      x0 * y0, which gives w0 immediately
     t=1/2    (x3+2*x2+4*x1+8*x0) * (y3+2*y2+4*y1+8*y0)
     t=-1/2   (-x3+2*x2-4*x1+8*x0) * (-y3+2*y2-4*y1+8*y0)
     t=1      (x3+x2+x1+x0) * (y3+y2+y1+y0)
     t=-1     (-x3+x2-x1+x0) * (-y3+y2-y1+y0)
     t=2      (8*x3+4*x2+2*x1+x0) * (8*y3+4*y2+2*y1+y0)
     t=inf    x3 * y3, which gives w6 immediately

   The number of additions and subtractions for Toom-4 is much larger
than for Toom-3.  But several subexpressions occur multiple times, for
example x2+x0, occurs for both t=1 and t=-1.

   Toom-4 is asymptotically O(N^1.404), the exponent being
log(7)/log(4), representing 7 recursive multiplies of 1/4 the original
size each.


File: gmp.info,  Node: Higher degree Toom'n'half,  Next: FFT Multiplication,  Prev: Toom 4-Way Multiplication,  Up: Multiplication Algorithms

15.1.5 Higher degree Toom'n'half
--------------------------------

The Toom algorithms described above (*note Toom 3-Way Multiplication::,
*note Toom 4-Way Multiplication::) generalizes to split into an
arbitrary number of pieces. In general a split of two equally long
operands into r pieces leads to evaluations and pointwise
multiplications done at 2*r-1 points. To fully exploit symmetries it
would be better to have a multiple of 4 points, that's why for higher
degree Toom'n'half is used.

   Toom'n'half means that the existence of one more piece is considered
for a single operand. It can be virtual, i.e. zero, or real, when the
two operand are not exactly balanced. By choosing an even r, Toom-r+1/2
requires 2r points, a multiple of four.

   The four-plets of points include 0, inf, +1, -1 and +-2^i, +-2^-i .
Each of them giving shortcuts for the evaluation phase and for some
steps in the interpolation phase. Further tricks are used to reduce the
memory footprint of the whole multiplication algorithm to a memory
buffer equanl in size to the result of the product.

   Current GMP uses both Toom-6'n'half and Toom-8'n'half.


File: gmp.info,  Node: FFT Multiplication,  Next: Other Multiplication,  Prev: Higher degree Toom'n'half,  Up: Multiplication Algorithms

15.1.6 FFT Multiplication
-------------------------

At large to very large sizes a Fermat style FFT multiplication is used,
following Scho"nhage and Strassen (*note References::).  Descriptions
of FFTs in various forms can be found in many textbooks, for instance
Knuth section 4.3.3 part C or Lipson chapter IX.  A brief description
of the form used in GMP is given here.

   The multiplication done is x*y mod 2^N+1, for a given N.  A full
product x*y is obtained by choosing N>=bits(x)+bits(y) and padding x
and y with high zero limbs.  The modular product is the native form for
the algorithm, so padding to get a full product is unavoidable.

   The algorithm follows a split, evaluate, pointwise multiply,
interpolate and combine similar to that described above for Karatsuba
and Toom-3.  A k parameter controls the split, with an FFT-k splitting
into 2^k pieces of M=N/2^k bits each.  N must be a multiple of
(2^k)*mp_bits_per_limb so the split falls on limb boundaries, avoiding
bit shifts in the split and combine stages.

   The evaluations, pointwise multiplications, and interpolation, are
all done modulo 2^N'+1 where N' is 2M+k+3 rounded up to a multiple of
2^k and of `mp_bits_per_limb'.  The results of interpolation will be
the following negacyclic convolution of the input pieces, and the
choice of N' ensures these sums aren't truncated.

                ---
                \         b
     w[n] =     /     (-1) * x[i] * y[j]
                ---
            i+j==b*2^k+n
               b=0,1

   The points used for the evaluation are g^i for i=0 to 2^k-1 where
g=2^(2N'/2^k).  g is a 2^k'th root of unity mod 2^N'+1, which produces
necessary cancellations at the interpolation stage, and it's also a
power of 2 so the fast Fourier transforms used for the evaluation and
interpolation do only shifts, adds and negations.

   The pointwise multiplications are done modulo 2^N'+1 and either
recurse into a further FFT or use a plain multiplication (Toom-3,
Karatsuba or basecase), whichever is optimal at the size N'.  The
interpolation is an inverse fast Fourier transform.  The resulting set
of sums of x[i]*y[j] are added at appropriate offsets to give the final
result.

   Squaring is the same, but x is the only input so it's one transform
at the evaluate stage and the pointwise multiplies are squares.  The
interpolation is the same.

   For a mod 2^N+1 product, an FFT-k is an O(N^(k/(k-1))) algorithm,
the exponent representing 2^k recursed modular multiplies each
1/2^(k-1) the size of the original.  Each successive k is an asymptotic
improvement, but overheads mean each is only faster at bigger and
bigger sizes.  In the code, `MUL_FFT_TABLE' and `SQR_FFT_TABLE' are the
thresholds where each k is used.  Each new k effectively swaps some
multiplying for some shifts, adds and overheads.

   A mod 2^N+1 product can be formed with a normal NxN->2N bit multiply
plus a subtraction, so an FFT and Toom-3 etc can be compared directly.
A k=4 FFT at O(N^1.333) can be expected to be the first faster than
Toom-3 at O(N^1.465).  In practice this is what's found, with
`MUL_FFT_MODF_THRESHOLD' and `SQR_FFT_MODF_THRESHOLD' being between 300
and 1000 limbs, depending on the CPU.  So far it's been found that only
very large FFTs recurse into pointwise multiplies above these sizes.

   When an FFT is to give a full product, the change of N to 2N doesn't
alter the theoretical complexity for a given k, but for the purposes of
considering where an FFT might be first used it can be assumed that the
FFT is recursing into a normal multiply and that on that basis it's
doing 2^k recursed multiplies each 1/2^(k-2) the size of the inputs,
making it O(N^(k/(k-2))).  This would mean k=7 at O(N^1.4) would be the
first FFT faster than Toom-3.  In practice `MUL_FFT_THRESHOLD' and
`SQR_FFT_THRESHOLD' have been found to be in the k=8 range, somewhere
between 3000 and 10000 limbs.

   The way N is split into 2^k pieces and then 2M+k+3 is rounded up to
a multiple of 2^k and `mp_bits_per_limb' means that when
2^k>=mp_bits_per_limb the effective N is a multiple of 2^(2k-1) bits.
The +k+3 means some values of N just under such a multiple will be
rounded to the next.  The complexity calculations above assume that a
favourable size is used, meaning one which isn't padded through
rounding, and it's also assumed that the extra +k+3 bits are negligible
at typical FFT sizes.

   The practical effect of the 2^(2k-1) constraint is to introduce a
step-effect into measured speeds.  For example k=8 will round N up to a
multiple of 32768 bits, so for a 32-bit limb there'll be 512 limb
groups of sizes for which `mpn_mul_n' runs at the same speed.  Or for
k=9 groups of 2048 limbs, k=10 groups of 8192 limbs, etc.  In practice
it's been found each k is used at quite small multiples of its size
constraint and so the step effect is quite noticeable in a time versus
size graph.

   The threshold determinations currently measure at the mid-points of
size steps, but this is sub-optimal since at the start of a new step it
can happen that it's better to go back to the previous k for a while.
Something more sophisticated for `MUL_FFT_TABLE' and `SQR_FFT_TABLE'
will be needed.


File: gmp.info,  Node: Other Multiplication,  Next: Unbalanced Multiplication,  Prev: FFT Multiplication,  Up: Multiplication Algorithms

15.1.7 Other Multiplication
---------------------------

The Toom algorithms described above (*note Toom 3-Way Multiplication::,
*note Toom 4-Way Multiplication::) generalizes to split into an
arbitrary number of pieces, as per Knuth section 4.3.3 algorithm C.
This is not currently used.  The notes here are merely for interest.

   In general a split into r+1 pieces is made, and evaluations and
pointwise multiplications done at 2*r+1 points.  A 4-way split does 7
pointwise multiplies, 5-way does 9, etc.  Asymptotically an (r+1)-way
algorithm is O(N^(log(2*r+1)/log(r+1))).  Only the pointwise
multiplications count towards big-O complexity, but the time spent in
the evaluate and interpolate stages grows with r and has a significant
practical impact, with the asymptotic advantage of each r realized only
at bigger and bigger sizes.  The overheads grow as O(N*r), whereas in
an r=2^k FFT they grow only as O(N*log(r)).

   Knuth algorithm C evaluates at points 0,1,2,...,2*r, but exercise 4
uses -r,...,0,...,r and the latter saves some small multiplies in the
evaluate stage (or rather trades them for additions), and has a further
saving of nearly half the interpolate steps.  The idea is to separate
odd and even final coefficients and then perform algorithm C steps C7
and C8 on them separately.  The divisors at step C7 become j^2 and the
multipliers at C8 become 2*t*j-j^2.

   Splitting odd and even parts through positive and negative points
can be thought of as using -1 as a square root of unity.  If a 4th root
of unity was available then a further split and speedup would be
possible, but no such root exists for plain integers.  Going to complex
integers with i=sqrt(-1) doesn't help, essentially because in Cartesian
form it takes three real multiplies to do a complex multiply.  The
existence of 2^k'th roots of unity in a suitable ring or field lets the
fast Fourier transform keep splitting and get to O(N*log(r)).

   Floating point FFTs use complex numbers approximating Nth roots of
unity.  Some processors have special support for such FFTs.  But these
are not used in GMP since it's very difficult to guarantee an exact
result (to some number of bits).  An occasional difference of 1 in the
last bit might not matter to a typical signal processing algorithm, but
is of course of vital importance to GMP.


File: gmp.info,  Node: Unbalanced Multiplication,  Prev: Other Multiplication,  Up: Multiplication Algorithms

15.1.8 Unbalanced Multiplication
--------------------------------

Multiplication of operands with different sizes, both below
`MUL_TOOM22_THRESHOLD' are done with plain schoolbook multiplication
(*note Basecase Multiplication::).

   For really large operands, we invoke FFT directly.

   For operands between these sizes, we use Toom inspired algorithms
suggested by Alberto Zanoni and Marco Bodrato.  The idea is to split
the operands into polynomials of different degree.  GMP currently
splits the smaller operand onto 2 coefficients, i.e., a polynomial of
degree 1, but the larger operand can be split into 2, 3, or 4
coefficients, i.e., a polynomial of degree 1 to 3.


File: gmp.info,  Node: Division Algorithms,  Next: Greatest Common Divisor Algorithms,  Prev: Multiplication Algorithms,  Up: Algorithms

15.2 Division Algorithms
========================

* Menu:

* Single Limb Division::
* Basecase Division::
* Divide and Conquer Division::
* Block-Wise Barrett Division::
* Exact Division::
* Exact Remainder::
* Small Quotient Division::


File: gmp.info,  Node: Single Limb Division,  Next: Basecase Division,  Prev: Division Algorithms,  Up: Division Algorithms

15.2.1 Single Limb Division
---------------------------

Nx1 division is implemented using repeated 2x1 divisions from high to
low, either with a hardware divide instruction or a multiplication by
inverse, whichever is best on a given CPU.

   The multiply by inverse follows "Improved division by invariant
integers" by Mo"ller and Granlund (*note References::) and is
implemented as `udiv_qrnnd_preinv' in `gmp-impl.h'.  The idea is to
have a fixed-point approximation to 1/d (see `invert_limb') and then
multiply by the high limb (plus one bit) of the dividend to get a
quotient q.  With d normalized (high bit set), q is no more than 1 too
small.  Subtracting q*d from the dividend gives a remainder, and
reveals whether q or q-1 is correct.

   The result is a division done with two multiplications and four or
five arithmetic operations.  On CPUs with low latency multipliers this
can be much faster than a hardware divide, though the cost of
calculating the inverse at the start may mean it's only better on
inputs bigger than say 4 or 5 limbs.

   When a divisor must be normalized, either for the generic C
`__udiv_qrnnd_c' or the multiply by inverse, the division performed is
actually a*2^k by d*2^k where a is the dividend and k is the power
necessary to have the high bit of d*2^k set.  The bit shifts for the
dividend are usually accomplished "on the fly" meaning by extracting
the appropriate bits at each step.  Done this way the quotient limbs
come out aligned ready to store.  When only the remainder is wanted, an
alternative is to take the dividend limbs unshifted and calculate r = a
mod d*2^k followed by an extra final step r*2^k mod d*2^k.  This can
help on CPUs with poor bit shifts or few registers.

   The multiply by inverse can be done two limbs at a time.  The
calculation is basically the same, but the inverse is two limbs and the
divisor treated as if padded with a low zero limb.  This means more
work, since the inverse will need a 2x2 multiply, but the four 1x1s to
do that are independent and can therefore be done partly or wholly in
parallel.  Likewise for a 2x1 calculating q*d.  The net effect is to
process two limbs with roughly the same two multiplies worth of latency
that one limb at a time gives.  This extends to 3 or 4 limbs at a time,
though the extra work to apply the inverse will almost certainly soon
reach the limits of multiplier throughput.

   A similar approach in reverse can be taken to process just half a
limb at a time if the divisor is only a half limb.  In this case the
1x1 multiply for the inverse effectively becomes two (1/2)x1 for each
limb, which can be a saving on CPUs with a fast half limb multiply, or
in fact if the only multiply is a half limb, and especially if it's not
pipelined.


File: gmp.info,  Node: Basecase Division,  Next: Divide and Conquer Division,  Prev: Single Limb Division,  Up: Division Algorithms

15.2.2 Basecase Division
------------------------

Basecase NxM division is like long division done by hand, but in base
2^mp_bits_per_limb.  See Knuth section 4.3.1 algorithm D, and
`mpn/generic/sb_divrem_mn.c'.

   Briefly stated, while the dividend remains larger than the divisor,
a high quotient limb is formed and the Nx1 product q*d subtracted at
the top end of the dividend.  With a normalized divisor (most
significant bit set), each quotient limb can be formed with a 2x1
division and a 1x1 multiplication plus some subtractions.  The 2x1
division is by the high limb of the divisor and is done either with a
hardware divide or a multiply by inverse (the same as in *Note Single
Limb Division::) whichever is faster.  Such a quotient is sometimes one
too big, requiring an addback of the divisor, but that happens rarely.

   With Q=N-M being the number of quotient limbs, this is an O(Q*M)
algorithm and will run at a speed similar to a basecase QxM
multiplication, differing in fact only in the extra multiply and divide
for each of the Q quotient limbs.


File: gmp.info,  Node: Divide and Conquer Division,  Next: Block-Wise Barrett Division,  Prev: Basecase Division,  Up: Division Algorithms

15.2.3 Divide and Conquer Division
----------------------------------

For divisors larger than `DC_DIV_QR_THRESHOLD', division is done by
dividing.  Or to be precise by a recursive divide and conquer algorithm
based on work by Moenck and Borodin, Jebelean, and Burnikel and Ziegler
(*note References::).

   The algorithm consists essentially of recognising that a 2NxN
division can be done with the basecase division algorithm (*note
Basecase Division::), but using N/2 limbs as a base, not just a single
limb.  This way the multiplications that arise are (N/2)x(N/2) and can
take advantage of Karatsuba and higher multiplication algorithms (*note
Multiplication Algorithms::).  The two "digits" of the quotient are
formed by recursive Nx(N/2) divisions.

   If the (N/2)x(N/2) multiplies are done with a basecase multiplication
then the work is about the same as a basecase division, but with more
function call overheads and with some subtractions separated from the
multiplies.  These overheads mean that it's only when N/2 is above
`MUL_TOOM22_THRESHOLD' that divide and conquer is of use.

   `DC_DIV_QR_THRESHOLD' is based on the divisor size N, so it will be
somewhere above twice `MUL_TOOM22_THRESHOLD', but how much above
depends on the CPU.  An optimized `mpn_mul_basecase' can lower
`DC_DIV_QR_THRESHOLD' a little by offering a ready-made advantage over
repeated `mpn_submul_1' calls.

   Divide and conquer is asymptotically O(M(N)*log(N)) where M(N) is
the time for an NxN multiplication done with FFTs.  The actual time is
a sum over multiplications of the recursed sizes, as can be seen near
the end of section 2.2 of Burnikel and Ziegler.  For example, within
the Toom-3 range, divide and conquer is 2.63*M(N).  With higher
algorithms the M(N) term improves and the multiplier tends to log(N).
In practice, at moderate to large sizes, a 2NxN division is about 2 to
4 times slower than an NxN multiplication.


File: gmp.info,  Node: Block-Wise Barrett Division,  Next: Exact Division,  Prev: Divide and Conquer Division,  Up: Division Algorithms

15.2.4 Block-Wise Barrett Division
----------------------------------

For the largest divisions, a block-wise Barrett division algorithm is
used.  Here, the divisor is inverted to a precision determined by the
relative size of the dividend and divisor.  Blocks of quotient limbs
are then generated by multiplying blocks from the dividend by the
inverse.

   Our block-wise algorithm computes a smaller inverse than in the
plain Barrett algorithm.  For a 2n/n division, the inverse will be just
ceil(n/2) limbs.

