version 1.1.1.3, 2000/12/01 05:44:44 |
version 1.1.1.4, 2003/08/25 16:06:01 |
|
|
@end iftex |
@end iftex |
@comment %**end of header |
@comment %**end of header |
|
|
@dircategory GNU libraries |
@copying |
@direntry |
This manual describes how to install and use the GNU multiple precision |
* gmp: (gmp). GNU Multiple Precision Arithmetic Library. |
arithmetic library, version @value{VERSION}. |
@end direntry |
|
|
|
@c smallbook |
Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 |
|
Free Software Foundation, Inc. |
|
|
@iftex |
Permission is granted to copy, distribute and/or modify this document under |
@finalout |
the terms of the GNU Free Documentation License, Version 1.1 or any later |
@end iftex |
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 @ref{GNU Free Documentation |
|
License}. |
|
@end copying |
|
|
@c Texinfo version 4 or up will be needed to process this into .info files. |
|
|
@c Texinfo version 4.2 or up will be needed to process this into .info files. |
@c |
@c |
@c The edition number is in three places and the month/year in one, all |
@c The supplied texinfo.tex (or newer) should be used when processing into |
@c taken from version.texi. version.texi is created when you configure with |
@c .dvi etc. |
@c --enable-maintainer-mode, and is included in a distribution made with |
@c |
@c "make dist". |
@c The version number and edition number are taken from version.texi provided |
|
@c by automake (note it's regenerated only if you configure with |
|
@c --enable-maintainer-mode). |
|
@c |
|
@c Discussions about this version in relation to previous ones (for instance |
|
@c in the "Compatibility" section) obviously must be looked at manually |
|
@c though. |
|
@c |
|
@c "cindex" entries have been made for function categories and programming |
|
@c topics. Minutiae like particular systems and processors mentioned in |
|
@c various places have been left out so as not to bury important topics under |
|
@c a lot of junk. "mpn" functions aren't in the concept index because a |
|
@c beginner looking for "GCD" or something is only going to be confused by |
|
@c pointers to low level routines. |
|
|
|
|
@ifnottex |
@dircategory GNU libraries |
This file documents GNU MP, a library for arbitrary-precision arithmetic. |
@direntry |
|
* gmp: (gmp). GNU Multiple Precision Arithmetic Library. |
|
@end direntry |
|
|
Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 Free |
@c html <meta name=description content="..."> |
Software Foundation, Inc. |
@documentdescription |
|
How to install and use the GNU multiple precision arithmetic library, version @value{VERSION}. |
|
@end documentdescription |
|
|
Permission is granted to make and distribute verbatim copies of |
@c smallbook |
this manual provided the copyright notice and this permission notice |
@finalout |
are preserved on all copies. |
@setchapternewpage on |
|
|
@ignore |
@ifnottex |
Permission is granted to process this file through TeX and print the |
@node Top, Copying, (dir), (dir) |
results, provided the printed document carries copying permission |
@top GNU MP |
notice identical to this one except for the removal of this paragraph |
|
(this paragraph not being relevant to the printed manual). |
|
@end ignore |
|
|
|
Permission is granted to copy and distribute modified versions of this |
|
manual under the conditions for verbatim copying, provided that the entire |
|
resulting derived work is distributed under the terms of a permission |
|
notice identical to this one. |
|
|
|
Permission is granted to copy and distribute translations of this manual |
|
into another language, under the above conditions for modified versions, |
|
except that this permission notice may be stated in a translation approved |
|
by the Foundation. |
|
@end ifnottex |
@end ifnottex |
|
|
@setchapternewpage on |
@iftex |
@titlepage |
@titlepage |
@c use the new format for titles |
|
|
|
@title GNU MP |
@title GNU MP |
@subtitle The GNU Multiple Precision Arithmetic Library |
@subtitle The GNU Multiple Precision Arithmetic Library |
@subtitle Edition @value{EDITION} |
@subtitle Edition @value{EDITION} |
Line 79 by the Foundation. |
|
Line 87 by the Foundation. |
|
|
|
@page |
@page |
@vskip 0pt plus 1filll |
@vskip 0pt plus 1filll |
Copyright @copyright{} 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 |
@end iftex |
Free Software Foundation, Inc. |
|
|
|
@sp 2 |
@insertcopying |
|
@ifnottex |
|
@sp 1 |
|
@end ifnottex |
|
|
Published by the Free Software Foundation @* |
@iftex |
59 Temple Place - Suite 330 @* |
|
Boston, MA 02111-1307, USA @* |
|
|
|
Permission is granted to make and distribute verbatim copies of |
|
this manual provided the copyright notice and this permission notice |
|
are preserved on all copies. |
|
|
|
Permission is granted to copy and distribute modified versions of this |
|
manual under the conditions for verbatim copying, provided that the entire |
|
resulting derived work is distributed under the terms of a permission |
|
notice identical to this one. |
|
|
|
Permission is granted to copy and distribute translations of this manual |
|
into another language, under the above conditions for modified versions, |
|
except that this permission notice may be stated in a translation approved |
|
by the Foundation. |
|
@end titlepage |
@end titlepage |
@headings double |
@headings double |
|
@end iftex |
|
|
@ifnottex |
@c Don't bother with contents for html, the menus seem adequate. |
@node Top, Copying, (dir), (dir) |
@ifnothtml |
|
@contents |
|
@end ifnothtml |
|
|
@top GNU MP |
|
|
|
This manual documents how to install and use the GNU multiple precision |
|
arithmetic library, version @value{VERSION}. |
|
|
|
@end ifnottex |
|
|
|
@menu |
@menu |
* Copying:: GMP Copying Conditions (LGPL). |
* Copying:: GMP Copying Conditions (LGPL). |
* Introduction to GMP:: Brief introduction to GNU MP. |
* Introduction to GMP:: Brief introduction to GNU MP. |
* Installing GMP:: How to configure and compile the GMP library. |
* Installing GMP:: How to configure and compile the GMP library. |
* GMP Basics:: What every GMP user should now. |
* GMP Basics:: What every GMP user should know. |
* Reporting Bugs:: How to usefully report bugs. |
* Reporting Bugs:: How to usefully report bugs. |
* Integer Functions:: Functions for arithmetic on signed integers. |
* Integer Functions:: Functions for arithmetic on signed integers. |
* Rational Number Functions:: Functions for arithmetic on rational numbers. |
* Rational Number Functions:: Functions for arithmetic on rational numbers. |
* Floating-point Functions:: Functions for arithmetic on floats. |
* Floating-point Functions:: Functions for arithmetic on floats. |
* Low-level Functions:: Fast functions for natural numbers. |
* Low-level Functions:: Fast functions for natural numbers. |
* Random Number Functions:: Functions for generating random numbers. |
* Random Number Functions:: Functions for generating random numbers. |
|
* Formatted Output:: @code{printf} style output. |
|
* Formatted Input:: @code{scanf} style input. |
|
* C++ Class Interface:: Class wrappers around GMP types. |
* BSD Compatible Functions:: All functions found in BSD MP. |
* BSD Compatible Functions:: All functions found in BSD MP. |
* Custom Allocation:: How to customize the internal allocation. |
* 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 your this library? |
* Contributors:: Who brings your this library? |
* References:: Some useful papers and books to read. |
* References:: Some useful papers and books to read. |
|
* GNU Free Documentation License:: |
* Concept Index:: |
* Concept Index:: |
* Function Index:: |
* Function Index:: |
@end menu |
@end menu |
|
|
|
|
|
@c @m{T,N} is $T$ in tex or @math{N} otherwise. This is an easy way to give |
|
@c different forms for math in tex and info. Commas in N or T don't work, |
|
@c but @C{} can be used instead. \, works in info but not in tex. |
|
@iftex |
|
@macro m {T,N} |
|
@tex$\T\$@end tex |
|
@end macro |
|
@end iftex |
|
@ifnottex |
|
@macro m {T,N} |
|
@math{\N\} |
|
@end macro |
|
@end ifnottex |
|
|
|
@macro C {} |
|
, |
|
@end macro |
|
|
|
@c @ms{V,N} is $V_N$ in tex or just vn otherwise. This suits simple |
|
@c subscripts like @ms{x,0}. |
|
@iftex |
|
@macro ms {V,N} |
|
@tex$\V\_{\N\}$@end tex |
|
@end macro |
|
@end iftex |
|
@ifnottex |
|
@macro ms {V,N} |
|
\V\\N\ |
|
@end macro |
|
@end ifnottex |
|
|
|
@c @nicode{S} is plain S in info, or @code{S} elsewhere. This can be used |
|
@c when the quotes that @code{} gives in info aren't wanted, but the |
|
@c fontification in tex or html is wanted. Doesn't work as @nicode{'\\0'} |
|
@c though (gives two backslashes in tex). |
|
@ifinfo |
|
@macro nicode {S} |
|
\S\ |
|
@end macro |
|
@end ifinfo |
|
@ifnotinfo |
|
@macro nicode {S} |
|
@code{\S\} |
|
@end macro |
|
@end ifnotinfo |
|
|
|
@c @nisamp{S} is plain S in info, or @samp{S} elsewhere. This can be used |
|
@c when the quotes that @samp{} gives in info aren't wanted, but the |
|
@c fontification in tex or html is wanted. |
|
@ifinfo |
|
@macro nisamp {S} |
|
\S\ |
|
@end macro |
|
@end ifinfo |
|
@ifnotinfo |
|
@macro nisamp {S} |
|
@samp{\S\} |
|
@end macro |
|
@end ifnotinfo |
|
|
|
@c Usage: @GMPtimes{} |
|
@c Give either \times or the word "times". |
|
@tex |
|
\gdef\GMPtimes{\times} |
|
@end tex |
|
@ifnottex |
|
@macro GMPtimes |
|
times |
|
@end macro |
|
@end ifnottex |
|
|
|
@c Usage: @GMPmultiply{} |
|
@c Give * in info, or nothing in tex. |
|
@tex |
|
\gdef\GMPmultiply{} |
|
@end tex |
|
@ifnottex |
|
@macro GMPmultiply |
|
* |
|
@end macro |
|
@end ifnottex |
|
|
|
@c Usage: @GMPabs{x} |
|
@c Give either |x| in tex, or abs(x) in info or html. |
|
@tex |
|
\gdef\GMPabs#1{|#1|} |
|
@end tex |
|
@ifnottex |
|
@macro GMPabs {X} |
|
@abs{}(\X\) |
|
@end macro |
|
@end ifnottex |
|
|
|
@c Usage: @GMPfloor{x} |
|
@c Give either \lfloor x\rfloor in tex, or floor(x) in info or html. |
|
@tex |
|
\gdef\GMPfloor#1{\lfloor #1\rfloor} |
|
@end tex |
|
@ifnottex |
|
@macro GMPfloor {X} |
|
floor(\X\) |
|
@end macro |
|
@end ifnottex |
|
|
|
@c Usage: @GMPceil{x} |
|
@c Give either \lceil x\rceil in tex, or ceil(x) in info or html. |
|
@tex |
|
\gdef\GMPceil#1{\lceil #1 \rceil} |
|
@end tex |
|
@ifnottex |
|
@macro GMPceil {X} |
|
ceil(\X\) |
|
@end macro |
|
@end ifnottex |
|
|
|
@c Math operators already available in tex, made available in info too. |
|
@c For example @bmod{} can be used in both tex and info. |
|
@ifnottex |
|
@macro bmod |
|
mod |
|
@end macro |
|
@macro gcd |
|
gcd |
|
@end macro |
|
@macro ge |
|
>= |
|
@end macro |
|
@macro le |
|
<= |
|
@end macro |
|
@macro log |
|
log |
|
@end macro |
|
@macro min |
|
min |
|
@end macro |
|
@macro rightarrow |
|
-> |
|
@end macro |
|
@end ifnottex |
|
|
|
@c New math operators. |
|
@c @abs{} can be used in both tex and info, or just \abs in tex. |
|
@tex |
|
\gdef\abs{\mathop{\rm abs}} |
|
@end tex |
|
@ifnottex |
|
@macro abs |
|
abs |
|
@end macro |
|
@end ifnottex |
|
|
|
@c @cross{} is a \times symbol in tex, or an "x" in info. In tex it works |
|
@c inside or outside $ $. |
|
@tex |
|
\gdef\cross{\ifmmode\times\else$\times$\fi} |
|
@end tex |
|
@ifnottex |
|
@macro cross |
|
x |
|
@end macro |
|
@end ifnottex |
|
|
|
@c @times{} made available as a "*" in info and html (already works in tex). |
|
@ifnottex |
|
@macro times |
|
* |
|
@end macro |
|
@end ifnottex |
|
|
|
@c Usage: @W{text} |
|
@c Like @w{} but working in math mode too. |
|
@tex |
|
\gdef\W#1{\ifmmode{#1}\else\w{#1}\fi} |
|
@end tex |
|
@ifnottex |
|
@macro W {S} |
|
@w{\S\} |
|
@end macro |
|
@end ifnottex |
|
|
|
@c Usage: \GMPdisplay{text} |
|
@c Put the given text in an @display style indent, but without turning off |
|
@c paragraph reflow etc. |
|
@tex |
|
\gdef\GMPdisplay#1{% |
|
\noindent |
|
\advance\leftskip by \lispnarrowing |
|
#1\par} |
|
@end tex |
|
|
|
@c Usage: \GMPhat |
|
@c A new \hat that will work in math mode, unlike the texinfo redefined |
|
@c version. |
|
@tex |
|
\gdef\GMPhat{\mathaccent"705E} |
|
@end tex |
|
|
|
@c Usage: \GMPraise{text} |
|
@c For use in a $ $ math expression as an alternative to "^". This is good |
|
@c for @code{} in an exponent, since there seems to be no superscript font |
|
@c for that. |
|
@tex |
|
\gdef\GMPraise#1{\mskip0.5\thinmuskip\hbox{\raise0.8ex\hbox{#1}}} |
|
@end tex |
|
|
|
@c Usage: @texlinebreak{} |
|
@c A line break as per @*, but only in tex. |
|
@iftex |
|
@macro texlinebreak |
|
@* |
|
@end macro |
|
@end iftex |
|
@ifnottex |
|
@macro texlinebreak |
|
@end macro |
|
@end ifnottex |
|
|
|
@c Usage: @maybepagebreak |
|
@c Allow tex to insert a page break, if it feels the urge. |
|
@c Normally blocks of @deftypefun/funx are kept together, which can lead to |
|
@c some poor page break positioning if it's a big block, like the sets of |
|
@c division functions etc. |
|
@tex |
|
\gdef\maybepagebreak{\penalty0} |
|
@end tex |
|
@ifnottex |
|
@macro maybepagebreak |
|
@end macro |
|
@end ifnottex |
|
|
|
|
@node Copying, Introduction to GMP, Top, Top |
@node Copying, Introduction to GMP, Top, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@unnumbered GNU MP Copying Conditions |
@unnumbered GNU MP Copying Conditions |
@cindex Copying conditions |
@cindex Copying conditions |
@cindex Conditions for copying GNU MP |
@cindex Conditions for copying GNU MP |
|
@cindex License conditions |
|
|
This library is @dfn{free}; this means that everyone is free to use it and |
This library is @dfn{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 |
free to redistribute it on a free basis. The library is not in the public |
Line 166 have is not what we distributed, so that any problems |
|
Line 397 have is not what we distributed, so that any problems |
|
will not reflect on our reputation.@refill |
will not reflect on our reputation.@refill |
|
|
The precise conditions of the license for the GNU MP library are found in the |
The precise conditions of the license for the GNU MP library are found in the |
Lesser General Public License that accompany the source code.@refill |
Lesser General Public License version 2.1 that accompanies the source code, |
|
see @file{COPYING.LIB}. Certain demonstration programs are provided under the |
|
terms of the plain General Public License version 2, see @file{COPYING}. |
|
|
|
|
@node Introduction to GMP, Installing GMP, Copying, Top |
@node Introduction to GMP, Installing GMP, Copying, Top |
Line 194 There is carefully optimized assembly code for these C |
|
Line 427 There is carefully optimized assembly code for these C |
|
ARM, |
ARM, |
DEC Alpha 21064, 21164, and 21264, |
DEC Alpha 21064, 21164, and 21264, |
AMD 29000, |
AMD 29000, |
AMD K6 and Athlon, |
AMD K6, K6-2 and Athlon, |
Hitachi SuperH and SH-2, |
Hitachi SuperH and SH-2, |
HPPA 1.0, 1.1 and 2.0, |
HPPA 1.0, 1.1 and 2.0, |
Intel Pentium, Pentium Pro/Pentium II, generic x86, |
Intel Pentium, Pentium Pro/II/III, Pentium 4, generic x86, |
Intel i960, |
Intel IA-64, i960, |
Motorola MC68000, MC68020, MC88100, and MC88110, |
Motorola MC68000, MC68020, MC88100, and MC88110, |
Motorola/IBM PowerPC 32 and 64, |
Motorola/IBM PowerPC 32 and 64, |
National NS32000, |
National NS32000, |
|
|
MIPS R3000, R4000, |
MIPS R3000, R4000, |
SPARCv7, SuperSPARC, generic SPARCv8, UltraSPARC, |
SPARCv7, SuperSPARC, generic SPARCv8, UltraSPARC, |
DEC VAX, |
DEC VAX, |
and Zilog Z8000. |
and |
Some optimizations also for Clipper, IBM ROMP (RT), and Pyramid AP/XP. |
Zilog Z8000. |
|
Some optimizations also for |
|
Cray vector systems, |
|
Clipper, |
|
IBM ROMP (RT), |
|
and |
|
Pyramid AP/XP. |
|
|
@cindex Mailing list |
@cindex Mailing lists |
There is a mailing list for GMP users. To join it, send a mail to |
There are two public mailing lists of interest. One for general questions and |
@email{gmp-request@@swox.com} with the word @samp{subscribe} in the message |
discussions about usage of the GMP library and one for discussions about |
@strong{body} (not in the subject line). |
development of GMP. There's more information about the mailing lists at |
|
@uref{http://swox.com/mailman/listinfo/}. These lists are @strong{not} for |
|
bug reports. |
|
|
|
The proper place for bug reports is @email{bug-gmp@@gnu.org}. See |
|
@ref{Reporting Bugs} for info about reporting bugs. |
|
|
@cindex Home page |
@cindex Home page |
@cindex Web page |
@cindex Web page |
For up-to-date information on GMP, please see the GMP Home Pages at |
For up-to-date information on GMP, please see the GMP web pages at |
@uref{http://www.swox.com/gmp/}. |
|
|
|
|
@display |
|
@uref{http://swox.com/gmp/} |
|
@end display |
|
|
|
@cindex Latest version of GMP |
|
@cindex Anonymous FTP of latest version |
|
@cindex FTP of latest version |
|
The latest version of the library is available at |
|
|
|
@display |
|
@uref{ftp://ftp.gnu.org/gnu/gmp} |
|
@end display |
|
|
|
Many sites around the world mirror @samp{ftp.gnu.org}, please use a mirror |
|
near you, see @uref{http://www.gnu.org/order/ftp.html} for a full list. |
|
|
|
|
@section How to use this Manual |
@section How to use this Manual |
@cindex About this manual |
@cindex About this manual |
|
|
Everyone should read @ref{GMP Basics}. If you need to install the library |
Everyone should read @ref{GMP Basics}. If you need to install the library |
yourself, you need to read @ref{Installing GMP}, too. |
yourself, then read @ref{Installing GMP}. If you have a system with multiple |
|
ABIs, then read @ref{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 |
The rest of the manual can be used for later reference, although it is |
probably a good idea to glance through it. |
probably a good idea to glance through it. |
Line 235 probably a good idea to glance through it. |
|
Line 496 probably a good idea to glance through it. |
|
@chapter Installing GMP |
@chapter Installing GMP |
@cindex Installing GMP |
@cindex Installing GMP |
@cindex Configuring GMP |
@cindex Configuring GMP |
|
@cindex Building GMP |
|
|
@noindent |
|
GMP has an autoconf/automake/libtool based configuration system. On a |
GMP has an autoconf/automake/libtool based configuration system. On a |
Unix-like system a basic build can be done with |
Unix-like system a basic build can be done with |
|
|
Line 259 And you can install (under @file{/usr/local} by defaul |
|
Line 520 And you can install (under @file{/usr/local} by defaul |
|
make install |
make install |
@end example |
@end example |
|
|
@noindent |
|
If you experience problems, please report them to @email{bug-gmp@@gnu.org}. |
If you experience problems, please report them to @email{bug-gmp@@gnu.org}. |
(@xref{Reporting Bugs}, for information on what to include in useful bug |
See @ref{Reporting Bugs}, for information on what to include in useful bug |
reports.) |
reports. |
|
|
@menu |
@menu |
* Build Options:: |
* Build Options:: |
|
|
@section Build Options |
@section Build Options |
@cindex Build options |
@cindex Build options |
|
|
@noindent |
|
All the usual autoconf configure options are available, run @samp{./configure |
All the usual autoconf configure options are available, run @samp{./configure |
--help} for a summary. |
--help} for a summary. The file @file{INSTALL.autoconf} has some generic |
|
installation information too. |
|
|
@table @asis |
@table @asis |
@item Non-Unix Systems |
@item Non-Unix Systems |
|
|
@samp{configure} needs various Unix-like tools installed. On an MS-DOS system |
@samp{configure} requires various Unix-like tools. On an MS-DOS system DJGPP |
cygwin or djgpp should work. It might be possible to build without the help |
can be used, and on MS Windows Cygwin or MINGW can be used, |
of @samp{configure}, certainly all the code is there, but unfortunately you'll |
|
be on your own. |
|
|
|
@item Object Directory |
@display |
|
@uref{http://www.cygnus.com/cygwin} |
|
@uref{http://www.delorie.com/djgpp} |
|
@uref{http://www.mingw.org} |
|
@end display |
|
|
To compile in a separate object directory, @command{cd} to that directory, and |
Microsoft also publishes an Interix ``Services for Unix'' which can be used to |
|
build GMP on Windows (with a normal @samp{./configure}), but it's not free |
|
software. |
|
|
|
The @file{macos} directory contains an unsupported port to MacOS 9 on Power |
|
Macintosh, see @file{macos/README}. Note that MacOS X ``Darwin'' should use |
|
the normal Unix-style @samp{./configure}. |
|
|
|
It might be possible to build without the help of @samp{configure}, certainly |
|
all the code is there, but unfortunately you'll be on your own. |
|
|
|
@item Build Directory |
|
|
|
To compile in a separate build directory, @command{cd} to that directory, and |
prefix the configure command with the path to the GMP source directory. For |
prefix the configure command with the path to the GMP source directory. For |
example @samp{../src/gmp/configure}. Not all @samp{make} programs have the |
example |
necessary features (@code{VPATH}) to support this. In particular, SunOS and |
|
Slowaris @command{make} have bugs that make them unable to build from a |
|
separate object directory. Use GNU @command{make} instead. |
|
|
|
|
@example |
|
cd /my/build/dir |
|
/my/sources/gmp-@value{VERSION}/configure |
|
@end example |
|
|
|
Not all @samp{make} programs have the necessary features (@code{VPATH}) to |
|
support this. In particular, SunOS and Slowaris @command{make} have bugs that |
|
make them unable to build in a separate directory. Use GNU @command{make} |
|
instead. |
|
|
@item @option{--disable-shared}, @option{--disable-static} |
@item @option{--disable-shared}, @option{--disable-static} |
|
|
By default both shared and static libraries are built (where possible), but |
By default both shared and static libraries are built (where possible), but |
one or other can be disabled. Shared libraries are very slightly slower, |
one or other can be disabled. Shared libraries result in smaller executables |
having a small cost on each function call, but result in smaller executables |
and permit code sharing between separate running processes, but on some CPUs |
and permit code sharing between separate running processes. |
are slightly slower, having a small cost on each function call. |
|
|
@item @option{--target=CPU-VENDOR-OS} |
@item Native Compilation, @option{--build=CPU-VENDOR-OS} |
|
|
The build target can be specified in the usual way, for either native or cross |
For normal native compilation, the system can be specified with |
compilation. |
@samp{--build}. By default @samp{./configure} uses the output from running |
|
@samp{./config.guess}. On some systems @samp{./config.guess} can determine |
|
the exact CPU type, on others it will be necessary to give it explicitly. For |
|
example, |
|
|
If @option{--target} isn't given, @samp{./configure} builds for the host |
@example |
system as determined by @samp{./config.guess}. On some systems this can't |
./configure --build=ultrasparc-sun-solaris2.7 |
distinguish between different CPUs in a family, and you should check the |
@end example |
guess. Running @samp{./config.guess} on the target system will also show the |
|
relevant @samp{VENDOR-OS}, if you don't already know what it should be. |
|
|
|
|
In all cases the @samp{OS} part is important, since it controls how libtool |
|
generates shared libraries. Running @samp{./config.guess} is the simplest way |
|
to see what it should be, if you don't know already. |
|
|
|
@item Cross Compilation, @option{--host=CPU-VENDOR-OS} |
|
|
|
When cross-compiling, the system used for compiling is given by @samp{--build} |
|
and the system where the library will run is given by @samp{--host}. For |
|
example when using a FreeBSD Athlon system to build GNU/Linux m68k binaries, |
|
|
|
@example |
|
./configure --build=athlon-pc-freebsd3.5 --host=m68k-mac-linux-gnu |
|
@end example |
|
|
|
Compiler tools are sought first with the host system type as a prefix. For |
|
example @command{m68k-mac-linux-gnu-ranlib} is tried, then plain |
|
@command{ranlib}. This makes it possible for a set of cross-compiling tools |
|
to co-exist with native tools. The prefix is the argument to @samp{--host}, |
|
and this can be an alias, such as @samp{m68k-linux}. But note that tools |
|
don't have to be setup this way, it's enough to just have a @env{PATH} with a |
|
suitable cross-compiling @command{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 @samp{./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 @code{main}. Although only object files will go to |
|
make up @file{libgmp}, @samp{./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 @samp{--build} is used when |
|
cross-compiling, because it may not be possible to correctly guess the build |
|
system type if the @env{PATH} has only a cross-compiling @command{cc}. |
|
|
|
Note that the @samp{--target} option is not appropriate for GMP. It's for use |
|
when building compiler tools, with @samp{--host} being where they will run, |
|
and @samp{--target} what they'll produce code for. Ordinary programs or |
|
libraries like GMP are only interested in the @samp{--host} part, being where |
|
they'll run. (Some past versions of GMP used @samp{--target} incorrectly.) |
|
|
|
@item CPU types |
|
|
In general, if you want a library that runs as fast as possible, you should |
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 |
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 |
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 |
other members, older or newer. The best idea is always to build GMP for the |
exact machine type you intend to run it on. |
exact machine type you intend to run it on. |
|
|
The following CPU targets have specific assembly code support. See |
The following CPUs have specific support. See @file{configure.in} for details |
@file{configure.in} for which @file{mpn} subdirectories get used by each. |
of what code and compiler options they select. |
|
|
@itemize @bullet |
@itemize @bullet |
|
|
@c Keep this formatting, it's easy to read and it can be grepped to |
@c Keep this formatting, it's easy to read and it can be grepped to |
@c automatically test that targets listed get through ./config.sub |
@c automatically test that CPUs listed get through ./config.sub |
|
|
@item |
@item |
Alpha: |
Alpha: |
@samp{alpha}, |
@nisamp{alpha}, |
@samp{alphaev5}, |
@nisamp{alphaev5}, |
@samp{alphaev6} |
@nisamp{alphaev56}, |
|
@nisamp{alphapca56}, |
|
@nisamp{alphapca57}, |
|
@nisamp{alphaev6}, |
|
@nisamp{alphaev67}, |
|
@nisamp{alphaev68} |
|
|
@item |
@item |
Hitachi: |
Cray: |
@samp{sh}, |
@nisamp{c90}, |
@samp{sh2} |
@nisamp{j90}, |
|
@nisamp{t90}, |
|
@nisamp{sv1} |
|
|
@item |
@item |
HPPA: |
HPPA: |
@samp{hppa1.0}, |
@nisamp{hppa1.0}, |
@samp{hppa1.1}, |
@nisamp{hppa1.1}, |
@samp{hppa2.0}, |
@nisamp{hppa2.0}, |
@samp{hppa2.0w} |
@nisamp{hppa2.0n}, |
|
@nisamp{hppa2.0w} |
|
|
@item |
@item |
MIPS: |
MIPS: |
@samp{mips}, |
@nisamp{mips}, |
@samp{mips3}, |
@nisamp{mips3}, |
|
@nisamp{mips64} |
|
|
@item |
@item |
Motorola: |
Motorola: |
@samp{m68000}, |
@nisamp{m68k}, |
@samp{m68k}, |
@nisamp{m68000}, |
@samp{m88k}, |
@nisamp{m68010}, |
@samp{m88110} |
@nisamp{m68020}, |
|
@nisamp{m68030}, |
|
@nisamp{m68040}, |
|
@nisamp{m68060}, |
|
@nisamp{m68302}, |
|
@nisamp{m68360}, |
|
@nisamp{m88k}, |
|
@nisamp{m88110} |
|
|
@item |
@item |
POWER: |
POWER: |
@samp{power1}, |
@nisamp{power}, |
@samp{power2}, |
@nisamp{power1}, |
@samp{power2sc}, |
@nisamp{power2}, |
@samp{powerpc}, |
@nisamp{power2sc} |
@samp{powerpc64} |
|
|
|
@item |
@item |
|
PowerPC: |
|
@nisamp{powerpc}, |
|
@nisamp{powerpc64}, |
|
@nisamp{powerpc401}, |
|
@nisamp{powerpc403}, |
|
@nisamp{powerpc405}, |
|
@nisamp{powerpc505}, |
|
@nisamp{powerpc601}, |
|
@nisamp{powerpc602}, |
|
@nisamp{powerpc603}, |
|
@nisamp{powerpc603e}, |
|
@nisamp{powerpc604}, |
|
@nisamp{powerpc604e}, |
|
@nisamp{powerpc620}, |
|
@nisamp{powerpc630}, |
|
@nisamp{powerpc740}, |
|
@nisamp{powerpc7400}, |
|
@nisamp{powerpc7450}, |
|
@nisamp{powerpc750}, |
|
@nisamp{powerpc801}, |
|
@nisamp{powerpc821}, |
|
@nisamp{powerpc823}, |
|
@nisamp{powerpc860}, |
|
|
|
@item |
SPARC: |
SPARC: |
@samp{sparc}, |
@nisamp{sparc}, |
@samp{sparcv8}, |
@nisamp{sparcv8}, |
@samp{microsparc}, |
@nisamp{microsparc}, |
@samp{supersparc}, |
@nisamp{supersparc}, |
@samp{sparcv9}, |
@nisamp{sparcv9}, |
@samp{ultrasparc}, |
@nisamp{ultrasparc}, |
@samp{sparc64} |
@nisamp{ultrasparc2}, |
|
@nisamp{ultrasparc2i}, |
|
@nisamp{ultrasparc3}, |
|
@nisamp{sparc64} |
|
|
@item |
@item |
80x86 family: |
80x86 family: |
@samp{i386}, |
@nisamp{i386}, |
@samp{i486}, |
@nisamp{i486}, |
@samp{i586}, |
@nisamp{i586}, |
@samp{pentium}, |
@nisamp{pentium}, |
@samp{pentiummmx}, |
@nisamp{pentiummmx}, |
@samp{pentiumpro}, |
@nisamp{pentiumpro}, |
@samp{pentium2}, |
@nisamp{pentium2}, |
@samp{pentium3}, |
@nisamp{pentium3}, |
@samp{k6}, |
@nisamp{pentium4}, |
@samp{k62}, |
@nisamp{k6}, |
@samp{k63}, |
@nisamp{k62}, |
@samp{athlon} |
@nisamp{k63}, |
|
@nisamp{athlon} |
|
|
@item |
@item |
Other: |
Other: |
@samp{a29k}, |
@nisamp{a29k}, |
@samp{arm}, |
@nisamp{arm}, |
@samp{clipper}, |
@nisamp{clipper}, |
@samp{i960}, |
@nisamp{i960}, |
@samp{ns32k}, |
@nisamp{ns32k}, |
@samp{pyramid}, |
@nisamp{pyramid}, |
@samp{vax}, |
@nisamp{sh}, |
@samp{z8k} |
@nisamp{sh2}, |
|
@nisamp{vax}, |
|
@nisamp{z8k} |
@end itemize |
@end itemize |
|
|
CPUs not listed use generic C code. If some of the assembly code causes |
CPUs not listed will use generic C code. |
problems, the generic C code can be selected with CPU @samp{none}. |
|
|
|
|
@item Generic C Build |
|
|
|
If some of the assembly code causes problems, or if otherwise desired, the |
|
generic C code can be selected with CPU @samp{none}. For example, |
|
|
|
@example |
|
./configure --host=none-unknown-freebsd3.5 |
|
@end example |
|
|
|
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. |
|
|
|
@item @option{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 |
|
|
|
@example |
|
./configure --host=mips64-sgi-irix6 ABI=n32 |
|
@end example |
|
|
|
See @ref{ABI and ISA}, for the available choices on relevant CPUs, and what |
|
applications need to do. |
|
|
@item @option{CC}, @option{CFLAGS} |
@item @option{CC}, @option{CFLAGS} |
|
|
The C compiler used is chosen from among some likely candidates, with GCC |
By default the C compiler used is chosen from among some likely candidates, |
normally preferred if it's present. The usual @samp{CC=whatever} can be |
with @command{gcc} normally preferred if it's present. The usual |
passed to @samp{./configure} to choose something different. |
@samp{CC=whatever} can be passed to @samp{./configure} to choose something |
|
different. |
|
|
For some configurations specific compiler flags are set based on the target |
For some systems, default compiler flags are set based on the CPU and |
CPU and compiler, see @samp{CFLAGS} in the generated @file{Makefile}s. The |
compiler. The usual @samp{CFLAGS="-whatever"} can be passed to |
usual @samp{CFLAGS="-whatever"} can be passed to @samp{./configure} to use |
@samp{./configure} to use something different or to set good flags for systems |
something different or to set good flags for systems GMP doesn't otherwise |
GMP doesn't otherwise know. |
know. |
|
|
|
Note that if @samp{CC} is set then @samp{CFLAGS} must also be set. This |
The @samp{CC} and @samp{CFLAGS} used are printed during @samp{./configure}, |
applies even if @samp{CC} is merely one of the choices GMP would make itself. |
and can be found in each generated @file{Makefile}. This is the easiest way |
This may change in a future release. |
to check the defaults when considering changing or adding something. |
|
|
@item @option{--disable-alloca} |
Note that when @samp{CC} and @samp{CFLAGS} are specified on a system |
|
supporting multiple ABIs it's important to give an explicit |
|
@samp{ABI=whatever}, since GMP can't determine the ABI just from the flags and |
|
won't be able to select the correct assembler code. |
|
|
|
If just @samp{CC} is selected then normal default @samp{CFLAGS} for that |
|
compiler will be used (if GMP recognises it). For example @samp{CC=gcc} can |
|
be used to force the use of GCC, with default flags (and default ABI). |
|
|
|
@item @option{CPPFLAGS} |
|
|
|
Any flags like @samp{-D} defines or @samp{-I} includes required by the |
|
preprocessor should be set in @samp{CPPFLAGS} rather than @samp{CFLAGS}. |
|
Compiling is done with both @samp{CPPFLAGS} and @samp{CFLAGS}, but |
|
preprocessing uses just @samp{CPPFLAGS}. This distinction is because most |
|
preprocessors won't accept all the flags the compiler does. Preprocessing is |
|
done separately in some configure tests, and in the @samp{ansi2knr} support |
|
for K&R compilers. |
|
|
|
@item C++ Support, @option{--enable-cxx} |
|
C++ support in GMP can be enabled with @samp{--enable-cxx}, in which case a |
|
C++ compiler will be required. As a convenience @samp{--enable-cxx=detect} |
|
can be used to enable C++ support only if a compiler can be found. The C++ |
|
support consists of a library @file{libgmpxx.la} and header file |
|
@file{gmpxx.h}. |
|
|
|
A separate @file{libgmpxx.la} has been adopted rather than having C++ objects |
|
within @file{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. |
|
|
|
@file{libgmpxx.la} will use certain internals from @file{libgmp.la} and can |
|
only be expected to work with @file{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 @file{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. |
|
|
|
@item @option{CXX}, @option{CXXFLAGS} |
|
When C++ support is enabled, the C++ compiler and its flags can be set with |
|
variables @samp{CXX} and @samp{CXXFLAGS} in the usual way. The default for |
|
@samp{CXX} is the first compiler that works from a list of likely candidates, |
|
with @command{g++} normally preferred when available. The default for |
|
@samp{CXXFLAGS} is to try @samp{CFLAGS}, @samp{CFLAGS} without @samp{-g}, then |
|
for @command{g++} either @samp{-g -O2} or @samp{-O2}, or for other compilers |
|
@samp{-g} or nothing. Trying @samp{CFLAGS} this way is convenient when using |
|
@samp{gcc} and @samp{g++} together, since the flags for @samp{gcc} will |
|
usually suit @samp{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). @samp{./configure} |
|
isn't currently able to check these things very well itself, so for that |
|
reason @samp{--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 @samp{CXX} to the same as |
|
@samp{CC}. Although @command{gcc} for instance recognises @file{foo.cc} as |
|
C++ code, only @command{g++} will invoke the linker the right way when |
|
building an executable or shared library from object files. |
|
|
|
@item Temporary Memory, @option{--enable-alloca=<choice>} |
@cindex Stack overflow segfaults |
@cindex Stack overflow segfaults |
@cindex @code{alloca} |
@cindex @code{alloca} |
|
|
By default, GMP allocates temporary workspace using @code{alloca} if that |
GMP allocates temporary workspace using one of the following three methods, |
function is available, or @code{malloc} if not. If you're working with large |
which can be selected with for instance |
numbers and @code{alloca} overflows the available stack space, you can build |
@samp{--enable-alloca=malloc-reentrant}. |
with @option{--disable-alloca} to use @code{malloc} instead. @code{malloc} |
|
will probably be slightly slower than @code{alloca}. |
|
|
|
When not using @code{alloca}, it's actually the allocation function |
@itemize @bullet |
selected with @code{mp_set_memory_functions} that's used, this being |
@item |
@code{malloc} by default. @xref{Custom Allocation}. |
@samp{alloca} - C library or compiler builtin. |
|
@item |
|
@samp{malloc-reentrant} - the heap, in a re-entrant fashion. |
|
@item |
|
@samp{malloc-notreentrant} - the heap, with global variables. |
|
@end itemize |
|
|
Depending on your system, the only indication of stack overflow might be a |
For convenience, the following choices are also available. |
segmentation violation. It might be possible to increase available stack |
@samp{--disable-alloca} is the same as @samp{--enable-alloca=no}. |
space with @command{limit}, @command{ulimit} or @code{setrlimit}, or under |
|
DJGPP with @command{stubedit} or @code{_stklen}. |
|
|
|
@item @option{--enable-fft} |
@itemize @bullet |
|
@item |
|
@samp{yes} - a synonym for @samp{alloca}. |
|
@item |
|
@samp{no} - a synonym for @samp{malloc-reentrant}. |
|
@item |
|
@samp{reentrant} - @code{alloca} if available, otherwise |
|
@samp{malloc-reentrant}. This is the default. |
|
@item |
|
@samp{notreentrant} - @code{alloca} if available, otherwise |
|
@samp{malloc-notreentrant}. |
|
@end itemize |
|
|
By default multiplications are done using Karatsuba and 3-way Toom-Cook |
@code{alloca} is reentrant and fast, and is recommended, but when working with |
algorithms, but a Fermat FFT can be enabled, for use on large to very large |
large numbers it can overflow the available stack space, in which case one of |
operands. Currently the FFT is recommended only for knowledgeable users who |
the two malloc methods will need to be used. Alternately it might be possible |
check the algorithm thresholds for their CPU. |
to increase available stack with @command{limit}, @command{ulimit} or |
|
@code{setrlimit}, or under DJGPP with @command{stubedit} or |
|
@code{@w{_stklen}}. Note that depending on the system the only indication of |
|
stack overflow might be a segmentation violation. |
|
|
@item @option{--enable-mpbsd} |
@samp{malloc-reentrant} is, as the name suggests, reentrant and thread safe, |
|
but @samp{malloc-notreentrant} is faster and should be used if reentrancy is |
|
not required. |
|
|
The Berkeley MP compatibility library (@file{libmp.a}) and header file |
The two malloc methods in fact use the memory allocation functions selected by |
|
@code{mp_set_memory_functions}, these being @code{malloc} and friends by |
|
default. @xref{Custom Allocation}. |
|
|
|
An additional choice @samp{--enable-alloca=debug} is available, to help when |
|
debugging memory related problems (@pxref{Debugging}). |
|
|
|
@item FFT Multiplication, @option{--disable-fft} |
|
|
|
By default multiplications are done using Karatsuba, 3-way Toom-Cook, and |
|
Fermat FFT. The FFT is only used on large to very large operands and can be |
|
disabled to save code size if desired. |
|
|
|
@item Berkeley MP, @option{--enable-mpbsd} |
|
|
|
The Berkeley MP compatibility library (@file{libmp}) and header file |
(@file{mp.h}) are built and installed only if @option{--enable-mpbsd} is used. |
(@file{mp.h}) are built and installed only if @option{--enable-mpbsd} is used. |
@xref{BSD Compatible Functions}. |
@xref{BSD Compatible Functions}. |
|
|
|
@item MPFR, @option{--enable-mpfr} |
|
@cindex MPFR |
|
|
|
The optional MPFR functions are built and installed only if |
|
@option{--enable-mpfr} is used. These are in a separate library |
|
@file{libmpfr.a} and are documented separately too (@pxref{Introduction to |
|
MPFR,, Introduction to MPFR, mpfr, MPFR}). |
|
|
|
@item Assertion Checking, @option{--enable-assert} |
|
|
|
This option enables some consistency checking within the library. This can be |
|
of use while debugging, @pxref{Debugging}. |
|
|
|
@item Execution Profiling, @option{--enable-profiling=prof/gprof} |
|
|
|
Profiling support can be enabled either for @command{prof} or @command{gprof}. |
|
This adds @samp{-p} or @samp{-pg} respectively to @samp{CFLAGS}, and for some |
|
systems adds corresponding @code{mcount} calls to the assembler code. |
|
@xref{Profiling}. |
|
|
@item @option{MPN_PATH} |
@item @option{MPN_PATH} |
|
|
Various assembler versions of mpn subroutines are provided, and, for a given |
Various assembler versions of each mpn subroutines are provided. For a given |
CPU target, a search is made though a path to choose a version of each. For |
CPU, a search is made though a path to choose a version of each. For example |
example @samp{sparcv8} has path @samp{"sparc32/v8 sparc32 generic"}, which |
@samp{sparcv8} has |
means it looks first for v8 code, falls back on plain sparc32, and finally |
|
falls back on generic C. Knowledgeable users with special requirements can |
|
specify a path with @samp{MPN_PATH="dir list"}. This will normally be |
|
unnecessary because all sensible paths should be available under one or other |
|
CPU target. |
|
|
|
@item Demonstration Programs |
@example |
@cindex Demonstration programs |
MPN_PATH="sparc32/v8 sparc32 generic" |
@cindex Example programs |
@end example |
|
|
The @file{demos} subdirectory has some sample programs using GMP. These |
which means look first for v8 code, then plain sparc32 (which is v7), and |
aren't built or installed, but there's a @file{Makefile} with rules for them. |
finally fall back on generic C. Knowledgeable users with special requirements |
For instance, @samp{make pexpr} and then @samp{./pexpr 68^975+10}. |
can specify a different path. Normally this is completely unnecessary. |
|
|
@item Documentation |
@item Documentation |
|
|
The document you're now reading is @file{gmp.texi}. The usual automake |
The document you're now reading is @file{gmp.texi}. The usual automake |
targets are available to make @file{gmp.ps} and/or @file{gmp.dvi}. Some |
targets are available to make PostScript @file{gmp.ps} and/or DVI |
supplementary notes can be found in the @file{doc} subdirectory. |
@file{gmp.dvi}. |
|
|
|
HTML can be produced with @samp{makeinfo --html}, see @ref{makeinfo |
|
html,Generating HTML,Generating HTML,texinfo,Texinfo}. Or alternately |
|
@samp{texi2html}, see @ref{Top,Texinfo to HTML,About,texi2html,Texinfo To |
|
HTML}. |
|
|
|
PDF can be produced with @samp{texi2dvi --pdf} (@pxref{PDF |
|
Output,PDF,,texinfo,Texinfo}) or with @samp{pdftex}. |
|
|
|
Some supplementary notes can be found in the @file{doc} subdirectory. |
|
|
@end table |
@end table |
|
|
|
|
Line 487 supplementary notes can be found in the @file{doc} sub |
|
Line 1008 supplementary notes can be found in the @file{doc} sub |
|
@node ABI and ISA, Notes for Package Builds, Build Options, Installing GMP |
@node ABI and ISA, Notes for Package Builds, Build Options, Installing GMP |
@section ABI and ISA |
@section ABI and ISA |
@cindex ABI |
@cindex ABI |
|
@cindex Application Binary Interface |
@cindex ISA |
@cindex ISA |
|
@cindex Instruction Set Architecture |
|
|
ABI (Application Binary Interface) refers to the calling conventions between |
ABI (Application Binary Interface) refers to the calling conventions between |
functions, meaning what registers are used and what sizes the various C data |
functions, meaning what registers are used and what sizes the various C data |
Line 495 types are. ISA (Instruction Set Architecture) refers |
|
Line 1018 types are. ISA (Instruction Set Architecture) refers |
|
registers a CPU has available. |
registers a CPU has available. |
|
|
Some 64-bit ISA CPUs have both a 64-bit ABI and a 32-bit ABI defined, the |
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 chooses the best |
latter for compatibility with older CPUs in the family. GMP supports some |
ABI available for a given target system, and this generally gives |
CPUs like this in both ABIs. In fact within GMP @samp{ABI} means a |
significantly greater speed. |
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 @code{long} or a 64-bit |
|
@code{long long}. |
|
|
The burden is on application programs and cooperating libraries to ensure they |
By default GMP chooses the best ABI available for a given system, and this |
match the ABI chosen by GMP. Fortunately this presents a difficulty only on a |
generally gives significantly greater speed. But an ABI can be chosen |
few systems, and if you have one of them then the performance gains are enough |
explicitly to make GMP compatible with other libraries, or particular |
to make it worth the trouble. |
application requirements. For example, |
|
|
Some of what's described in this section may change in future releases of GMP. |
@example |
|
./configure ABI=32 |
|
@end example |
|
|
|
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 @code{long}. When a @code{long long} limb |
|
is used this is encoded in the generated @file{gmp.h}. This is convenient for |
|
applications, but it does mean that @file{gmp.h} will vary, and can't be just |
|
copied around. @file{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 @samp{libdir}, or it might require |
|
more than that. Note that builds for different ABIs need to done separately, |
|
with a fresh @command{./configure} and @command{make} each. |
|
|
@table @asis |
@table @asis |
|
@sp 1 |
@need 1000 |
@need 1000 |
@item HPPA 2.0 |
@item HPPA 2.0 (@samp{hppa2.0*}) |
|
|
CPU target @samp{hppa2.0} uses the hppa2.0n 32-bit ABI, but either a 32-bit or |
@table @asis |
64-bit limb. |
@item @samp{ABI=2.0w} |
|
|
A 64-bit limb is available on HP-UX 10 or up when using @command{c89}. No |
The 2.0w ABI uses 64-bit limbs and pointers and is available on HP-UX 11 or up |
@command{gcc} support is planned for 64-bit operations in this ABI. |
when using @command{cc}. @command{gcc} support for this is in progress. |
Applications must be compiled with the same options as GMP, which means |
Applications must be compiled with |
|
|
@example |
@example |
c89 +DA2.0 +e -D_LONG_LONG_LIMB |
cc +DD64 |
@end example |
@end example |
|
|
A 32-bit limb is used in other cases, and no special compiler options are |
@item @samp{ABI=2.0n} |
needed. |
|
|
|
CPU target @samp{hppa2.0w} uses the hppa2.0w 64-bit ABI, which is available on |
The 2.0n ABI means the 32-bit HPPA 1.0 ABI but with a 64-bit limb using |
HP-UX 11 or up when using @command{c89}. @command{gcc} support for this is in |
@code{long long}. This is available on HP-UX 10 or up when using |
progress. Applications must be compiled for the same ABI, which means |
@command{cc}. No @command{gcc} support is planned for this. Applications |
|
must be compiled with |
|
|
@example |
@example |
c89 +DD64 |
cc +DA2.0 +e |
@end example |
@end example |
|
|
|
@item @samp{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. |
|
@end table |
|
|
|
All three ABIs are available for CPUs @samp{hppa2.0w} and @samp{hppa2.0}, but |
|
for CPU @samp{hppa2.0n} only 2.0n or 1.0 are allowed. |
|
|
|
@sp 1 |
@need 1000 |
@need 1000 |
@item MIPS 3 and 4 under IRIX 6 |
@item MIPS under IRIX 6 (@samp{mips*-*-irix[6789]}) |
|
|
Targets @samp{mips*-*-irix6*} use the n32 ABI and a 64-bit limb. Applications |
IRIX 6 supports the n32 and 64 ABIs and always has a 64-bit MIPS 3 or better |
must be compiled for the same ABI, which means either |
CPU. In both these ABIs GMP uses a 64-bit limb. A new enough @command{gcc} |
|
is required (2.95 for instance). |
|
|
|
@table @asis |
|
@item @samp{ABI=n32} |
|
|
|
The n32 ABI is 32-bit pointers and integers, but with a 64-bit limb using a |
|
@code{long long}. Applications must be compiled with |
|
|
@example |
@example |
gcc -mabi=n32 |
gcc -mabi=n32 |
cc -n32 |
cc -n32 |
@end example |
@end example |
|
|
|
@item @samp{ABI=64} |
|
|
|
The 64-bit ABI is 64-bit pointers and integers. Applications must be compiled |
|
with |
|
|
|
@example |
|
gcc -mabi=64 |
|
cc -64 |
|
@end example |
|
@end table |
|
|
|
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. |
|
|
|
@sp 1 |
@need 1000 |
@need 1000 |
@item PowerPC 64 |
@item PowerPC 64 (@samp{powerpc64}, @samp{powerpc620}, @samp{powerpc630}) |
|
|
CPU target @samp{powerpc64} uses either the 32-bit ABI or the AIX 64-bit ABI. |
@table @asis |
The latter is used on targets @samp{powerpc64-*-aix*} and applications must be |
@item @samp{ABI=aix64} |
compiled using either |
|
|
|
|
The AIX 64 ABI uses 64-bit limbs and pointers and is available on systems |
|
@samp{*-*-aix*}. Applications must be compiled (and linked) with |
|
|
@example |
@example |
gcc -maix64 |
gcc -maix64 |
xlc -q64 |
xlc -q64 |
@end example |
@end example |
|
|
On other systems the 32-bit ABI is used, but with 64-bit limbs provided by |
@item @samp{ABI=32} |
@code{long long} in @command{gcc}. Applications must be compiled using |
|
|
|
@example |
This is the basic 32-bit PowerPC ABI. No special compiler options are needed |
gcc -D_LONG_LONG_LIMB |
for applications. |
@end example |
@end table |
|
|
|
@sp 1 |
@need 1000 |
@need 1000 |
@item Sparc V9 |
@item Sparc V9 (@samp{sparcv9} and @samp{ultrasparc*}) |
|
|
On a sparc v9 CPU, either the v8plus 32-bit ABI or v9 64-bit ABI is used. |
@table @asis |
Targets @samp{ultrasparc*-*-solaris2.[7-9]}, @samp{sparcv9-*-solaris2.[7-9]} |
@item @samp{ABI=64} |
and @samp{sparc64-*-linux*} use the v9 ABI, if the compiler supports it. |
|
Other targets use the v8plus ABI (but with as much of the v9 ISA as possible |
|
in the circumstances). Note that Solaris prior to 2.7 doesn't save all |
|
registers properly, and hence uses the v8plus ABI. |
|
|
|
For the v8plus ABI, applications can be compiled with either |
The 64-bit V9 ABI is available on Solaris 2.7 and up and GNU/Linux. GCC 2.95 |
|
or up, or Sun @command{cc} is required. Applications must be compiled with |
|
|
@example |
@example |
|
gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9 |
|
cc -xarch=v9 |
|
@end example |
|
|
|
@item @samp{ABI=32} |
|
|
|
On Solaris 2.6 and earlier, and on Solaris 2.7 with the kernel in 32-bit mode, |
|
only the plain V8 32-bit ABI can be used, since the kernel doesn't save all |
|
registers. GMP still uses as much of the V9 ISA as it can in these |
|
circumstances. No special compiler options are required for applications, |
|
though using something like the following requesting V9 code within the V8 ABI |
|
is recommended. |
|
|
|
@example |
gcc -mv8plus |
gcc -mv8plus |
cc -xarch=v8plus |
cc -xarch=v8plus |
@end example |
@end example |
|
|
For the v9 ABI, applications must be compiled with either |
@command{gcc} 2.8 and earlier only supports @samp{-mv8} though. |
|
@end table |
|
|
|
Don't be confused by the names of these sparc @samp{-m} and @samp{-x} options, |
|
they're called @samp{arch} but they effectively control the ABI. |
|
|
|
On Solaris 2.7 with the kernel in 32-bit-mode, a normal native build will |
|
reject @samp{ABI=64} because the resulting executables won't run. |
|
@samp{ABI=64} can still be built if desired by making it look like a |
|
cross-compile, for example |
|
|
@example |
@example |
gcc -m64 -mptr64 -Wa,-xarch=v9 -mcpu=v9 |
./configure --build=none --host=sparcv9-sun-solaris2.7 ABI=64 |
cc -xarch=v9 |
|
@end example |
@end example |
|
|
Don't be confused by the names of these options, they're called @samp{arch} |
|
but they effectively control the ABI. |
|
@end table |
@end table |
|
|
|
|
Line 601 GMP should present no great difficulties for packaging |
|
Line 1195 GMP should present no great difficulties for packaging |
|
distribution. |
distribution. |
|
|
@cindex Libtool versioning |
@cindex Libtool versioning |
|
@cindex Shared library versioning |
Libtool is used to build the library and @samp{-version-info} is set |
Libtool is used to build the library and @samp{-version-info} is set |
appropriately, having started from @samp{3:0:0} in GMP 3.0. The GMP 3 series |
appropriately, having started from @samp{3:0:0} in GMP 3.0. The GMP 4 series |
will be upwardly binary compatible in each release, but may be adding |
will be upwardly binary compatible in each release and will be upwardly binary |
additional function interfaces. On systems where libtool versioning is not |
compatible with all of the GMP 3 series. Additional function interfaces may |
fully checked by the loader, an auxiliary mechanism may be needed to express |
be added in each release, so on systems where libtool versioning is not fully |
that a dynamic linked application depends on a new enough minor version of |
checked by the loader an auxiliary mechanism may be needed to express that a |
GMP. |
dynamic linked application depends on a new enough GMP. |
|
|
|
An auxiliary mechanism may also be needed to express that @file{libgmpxx.la} |
|
(from @option{--enable-cxx}, @pxref{Build Options}) requires @file{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. |
|
|
|
Using @samp{DESTDIR} or a @samp{prefix} override with @samp{make install} and |
|
a shared @file{libgmpxx} may run into a libtool relinking problem, see |
|
@ref{Known Build Problems}. |
|
|
When building a package for a CPU family, care should be taken to use |
When building a package for a CPU family, care should be taken to use |
@samp{--target} to choose the least common denominator among the CPUs which |
@samp{--host} (or @samp{--build}) to choose the least common denominator among |
might use the package. For example this might necessitate @samp{i386} for |
the CPUs which might use the package. For example this might necessitate |
x86s, or plain @samp{sparc} (meaning V7) for SPARCs. |
@samp{i386} for x86s, or plain @samp{sparc} (meaning V7) for SPARCs. |
|
|
Users who care about speed will want GMP built for their exact CPU type, to |
Users who care about speed will want GMP built for their exact CPU type, to |
make use of the available optimizations. Providing a way to suitably rebuild |
make 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 |
a package may be useful. This could be as simple as making it possible for a |
user to omit @samp{--target} in a build so @samp{./config.guess} will detect |
user to omit @samp{--build} (and @samp{--host}) so @samp{./config.guess} will |
the CPU. But a way to manually specify a @samp{--target} will be wanted for |
detect the CPU. But a way to manually specify a @samp{--build} will be wanted |
systems where @samp{./config.guess} is inexact. |
for systems where @samp{./config.guess} is inexact. |
|
|
|
Note that @file{gmp.h} is a generated file, and will be architecture and ABI |
|
dependent. |
|
|
|
|
@need 2000 |
@need 2000 |
@node Notes for Particular Systems, Known Build Problems, Notes for Package Builds, Installing GMP |
@node Notes for Particular Systems, Known Build Problems, Notes for Package Builds, Installing GMP |
@section Notes for Particular Systems |
@section Notes for Particular Systems |
@cindex Build notes for particular systems |
@cindex Build notes for particular systems |
|
@cindex Particular systems |
|
@cindex Systems |
@table @asis |
@table @asis |
|
|
@c This section is more or less meant for notes about performance or about |
@c This section is more or less meant for notes about performance or about |
Line 633 systems where @samp{./config.guess} is inexact. |
|
Line 1243 systems where @samp{./config.guess} is inexact. |
|
@c scratching their head. Fun with different ABIs on a system belongs in the |
@c scratching their head. Fun with different ABIs on a system belongs in the |
@c above section. |
@c above section. |
|
|
@item AIX 4.3 |
@item AIX 3 and 4 |
|
|
Targets @samp{*-*-aix4.[3-9]*} have shared libraries disabled since they seem |
On systems @samp{*-*-aix[34]*} shared libraries are disabled by default, since |
to fail on AIX 4.3. |
some versions of the native @command{ar} fail on the convenience libraries |
|
used. A shared build can be attempted with |
|
|
|
@example |
|
./configure --enable-shared --disable-static |
|
@end example |
|
|
|
Note that the @samp{--disable-static} is necessary because in a shared build |
|
libtool makes @file{libgmp.a} a symlink to @file{libgmp.so}, apparently for |
|
the benefit of old versions of @command{ld} which only recognise @file{.a}, |
|
but unfortunately this is done even if a fully functional @command{ld} is |
|
available. |
|
|
|
@item ARM |
|
|
|
On systems @samp{arm*-*-*}, versions of GCC up to and including 2.95.3 have a |
|
bug in unsigned division, giving wrong results for some operands. GMP |
|
@samp{./configure} will demand GCC 2.95.4 or later. |
|
|
|
@item Compaq C++ |
|
Compaq C++ on OSF 5.1 has two flavours of @code{iostream}, a standard one and |
|
an old pre-standard one (see @samp{man iostream_intro}). GMP can only use the |
|
standard one, which unfortunately is not the default but must be selected by |
|
defining @code{__USE_STD_IOSTREAM}. Configure with for instance |
|
|
|
@example |
|
./configure --enable-cxx CPPFLAGS=-D__USE_STD_IOSTREAM |
|
@end example |
|
|
|
@item Microsoft Windows |
|
On systems @samp{*-*-cygwin*}, @samp{*-*-mingw*} and @samp{*-*-pw32*} by |
|
default GMP builds only a static library, but a DLL can be built instead using |
|
|
|
@example |
|
./configure --disable-static --enable-shared |
|
@end example |
|
|
|
Static and DLL libraries can't both be built, since certain export directives |
|
in @file{gmp.h} must be different. @samp{--enable-cxx} cannot be used when |
|
building a DLL, since libtool doesn't currently support C++ DLLs. This might |
|
change in the future. |
|
|
|
@item Microsoft C |
|
A MINGW DLL build of GMP can be used with Microsoft C. Libtool doesn't |
|
install @file{.lib} and @file{.exp} files, but they can be created with the |
|
following commands, where @file{/my/inst/dir} is the install directory (with a |
|
@file{lib} subdirectory). |
|
|
|
@example |
|
lib /machine:IX86 /def:_libs/libgmp-3.dll-def |
|
cp libgmp-3.lib /my/inst/dir/lib |
|
cp _libs/libgmp-3.dll-exp /my/inst/dir/lib/libgmp-3.exp |
|
@end example |
|
|
|
MINGW uses @samp{msvcrt.dll} for I/O, so applications wanting to use the GMP |
|
I/O routines must be compiled with @samp{cl /MD} to do the same. If one of |
|
the other I/O choices provided by MS C is desired then the suggestion is to |
|
use the GMP string functions and confine I/O to the application. |
|
|
|
@item Motorola 68k CPU Types |
|
|
|
@samp{m68k} is taken to mean 68000. @samp{m68020} or higher will give a |
|
performance boost on applicable CPUs. @samp{m68360} can be used for CPU32 |
|
series chips. @samp{m68302} can be used for ``Dragonball'' series chips, |
|
though this is merely a synonym for @samp{m68000}. |
|
|
@item OpenBSD 2.6 |
@item OpenBSD 2.6 |
|
|
@command{m4} in this release of OpenBSD has a bug in @code{eval} that makes it |
@command{m4} in this release of OpenBSD has a bug in @code{eval} that makes it |
Line 645 unsuitable for @file{.asm} file processing. @samp{./c |
|
Line 1319 unsuitable for @file{.asm} file processing. @samp{./c |
|
the problem and either abort or choose another m4 in the @env{PATH}. The bug |
the problem and either abort or choose another m4 in the @env{PATH}. The bug |
is fixed in OpenBSD 2.7, so either upgrade or use GNU m4. |
is fixed in OpenBSD 2.7, so either upgrade or use GNU m4. |
|
|
@item Sparc V8 |
@item Power CPU Types |
|
|
Using CPU target @samp{sparcv8} or @samp{supersparc} on relevant systems will |
In GMP, CPU types @samp{power*} and @samp{powerpc*} will each use instructions |
give a significant performance increase over the V7 code. |
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 assembler 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 (CPU @samp{none}), possibly |
|
with appropriate compiler options (like @samp{-mcpu=common} for |
|
@command{gcc}). CPU @samp{rs6000} (which is not a CPU but a family of |
|
workstations) is accepted by @file{config.sub}, but is currently equivalent to |
|
@samp{none}. |
|
|
|
@item Sparc CPU Types |
|
|
|
@samp{sparcv8} or @samp{supersparc} on relevant systems will give a |
|
significant performance increase over the V7 code. |
|
|
|
@item Sparc App Regs |
|
@cindex Sparc |
|
The GMP assembler code for both 32-bit and 64-bit Sparc clobbers the |
|
``application registers'' @code{g2}, @code{g3} and @code{g4}, the same way |
|
that the GCC default @samp{-mapp-regs} does (@pxref{SPARC Options,,, gcc, |
|
Using the GNU Compiler Collection (GCC)}). |
|
|
|
This makes that code unsuitable for use with the special V9 |
|
@samp{-mcmodel=embmedany} (which uses @code{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 CPU @samp{none} |
|
to avoid the assembler code. |
|
|
@item SunOS 4 |
@item SunOS 4 |
|
|
@command{/usr/bin/m4} lacks various features needed to process @file{.asm} |
@command{/usr/bin/m4} lacks various features needed to process @file{.asm} |
Line 657 files, and instead @samp{./configure} will automatical |
|
Line 1356 files, and instead @samp{./configure} will automatical |
|
@command{/usr/5bin/m4}, which we believe is always available (if not then use |
@command{/usr/5bin/m4}, which we believe is always available (if not then use |
GNU m4). |
GNU m4). |
|
|
@item x86 Pentium and PentiumPro |
@item x86 CPU Types |
|
|
The Intel Pentium P5 code is good for its intended P5, but quite slow when run |
@samp{i386} selects generic code which will run reasonably well on all x86 |
on Intel P6 class chips (PPro, P-II, P-III)@. @samp{i386} is a better choice |
chips. |
if you're making binaries that must run on both. |
|
|
|
@item x86 MMX and old GAS |
@samp{i586}, @samp{pentium} or @samp{pentiummmx} code is good for the intended |
|
P5 Pentium chips, but quite slow when run on Intel P6 class chips (PPro, P-II, |
|
P-III)@. @samp{i386} is a better choice when making binaries that must run on |
|
both. |
|
|
Old versions of GAS don't support MMX instructions, in particular version |
@samp{pentium4} and an SSE2 capable assembler are important for best results |
1.92.3 that comes with FreeBSD 2.2.8 doesn't (and unfortunately there's no |
on Pentium 4. The specific code is for instance roughly a 2@cross{} to |
newer assembler for that system). |
3@cross{} speedup over the generic @samp{i386} code. |
|
|
If the target CPU has MMX code but the assembler doesn't support it, a warning |
@item x86 MMX and SSE2 Code |
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. |
|
|
|
@item x86 GCC 2.95.2 @samp{-march=pentiumpro} |
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. |
|
|
GCC 2.95.2 miscompiles @file{mpz/powm.c} when @samp{-march=pentiumpro} is |
Old versions of @samp{gas} don't support MMX instructions, in particular |
used, so that option is omitted from the @env{CFLAGS} chosen for relevant |
version 1.92.3 that comes with FreeBSD 2.2.8 doesn't (and unfortunately |
CPUs. The problem is believed to be fixed in GCC 2.96. |
there's no newer assembler for that system). |
|
|
|
Solaris 2.6 and 2.7 @command{as} generate incorrect object code for register |
|
to register @code{movq} instructions, and so can't be used for MMX code. |
|
Install a recent @command{gas} if MMX code is wanted on these systems. |
@end table |
@end table |
|
|
|
|
Line 690 CPUs. The problem is believed to be fixed in GCC 2.96 |
|
Line 1395 CPUs. The problem is believed to be fixed in GCC 2.96 |
|
@c This section is more or less meant for known build problems that are not |
@c This section is more or less meant for known build problems that are not |
@c otherwise worked around and require some sort of manual intervention. |
@c otherwise worked around and require some sort of manual intervention. |
|
|
You might find more up-to-date information at @uref{http://www.swox.com/gmp/}. |
You might find more up-to-date information at @uref{http://swox.com/gmp/}. |
|
|
@table @asis |
@table @asis |
|
@item 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 |
|
|
@item Generic C on a 64-bit system |
@example |
|
./configure CC=gcc-with-my-options |
|
@end example |
|
|
When making a generic C build using @samp{--target=none} on a 64-bit system |
@item DJGPP |
(meaning where @code{unsigned long} is 64 bits), @code{BITS_PER_MP_LIMB}, |
The DJGPP port of @command{bash} 2.03 is unable to run the @samp{configure} |
@code{BITS_PER_LONGINT} and @code{BYTES_PER_MP_LIMB} in |
script, it exits silently, having died writing a preamble to |
@file{mpn/generic/gmp-mparam.h} need to be changed to 64 and 8. This will |
@file{config.log}. Use @command{bash} 2.04 or higher. |
hopefully be automated in a future version of GMP. |
|
|
|
|
@samp{make all} was found to run out of memory during the final |
|
@file{libgmp.la} link on one system tested, despite having 64Mb available. A |
|
separate @samp{make libgmp.la} helped, perhaps recursing into the various |
|
subdirectories uses up memory. |
|
|
|
@item @samp{DESTDIR} and shared @file{libgmpxx} |
|
@cindex @samp{DESTDIR} |
|
@samp{make install DESTDIR=/my/staging/area}, or the same with a @samp{prefix} |
|
override, to install to a temporary directory is not fully supported by |
|
current versions of libtool when building a shared version of a library which |
|
depends on another being built at the same time, like @file{libgmpxx} and |
|
@file{libgmp}. |
|
|
|
The problem is that @file{libgmpxx} is relinked at the install stage to ensure |
|
that if the system puts a hard-coded path to @file{libgmp} within |
|
@file{libgmpxx} then that path will be correct. Naturally the linker is |
|
directed to look only at the final location, not the staging area, so if |
|
@file{libgmp} is not already in that final location then the link will fail. |
|
|
|
A workaround for this on SVR4 style systems, such as GNU/Linux, where paths |
|
are not hard-coded, is to include the staging area in the linker's search |
|
using @code{LD_LIBRARY_PATH}. For example with @samp{--prefix=/usr} but |
|
installing under @samp{/my/staging/area}, |
|
|
|
@example |
|
LD_LIBRARY_PATH=/my/staging/area/usr/lib \ |
|
make install DESTDIR=/my/staging/area |
|
@end example |
|
|
|
@item GNU binutils @command{strip} prior to 2.12 |
|
@cindex Stripped libraries |
|
|
|
@command{strip} from GNU binutils 2.11 and earlier should not be used on the |
|
static libraries @file{libgmp.a} and @file{libmp.a} since it will discard all |
|
but the last of multiple archive members with the same name, like the three |
|
versions of @file{init.o} in @file{libgmp.a}. Binutils 2.12 or higher can be |
|
used successfully. |
|
|
|
The shared libraries @file{libgmp.so} and @file{libmp.so} are not affected by |
|
this and any version of @command{strip} can be used on them. |
|
|
|
@item @command{make} syntax error |
|
|
|
On certain versions of SCO OpenServer 5 and IRIX 6.5 the native @command{make} |
|
is unable to handle the long dependencies list for @file{libgmp.la}. The |
|
symptom is a ``syntax error'' on the following line of the top-level |
|
@file{Makefile}. |
|
|
|
@example |
|
libgmp.la: $(libgmp_la_OBJECTS) $(libgmp_la_DEPENDENCIES) |
|
@end example |
|
|
|
Either use GNU Make, or as a workaround remove |
|
@code{$(libgmp_la_DEPENDENCIES)} from that line (which will make the initial |
|
build work, but if any recompiling is done @file{libgmp.la} might not be |
|
rebuilt). |
|
|
|
@item MacOS X and GCC |
|
Libtool currently only knows how to create shared libraries on MacOS X using |
|
the native @command{cc} (which is a modified GCC), not a plain GCC. A |
|
static-only build should work though (@samp{--disable-shared}). |
|
|
|
Also, libtool currently cannot build C++ shared libraries on MacOS X, so if |
|
@samp{--enable-cxx} is desired then @samp{--disable-shared} must be used. |
|
Hopefully this will be fixed in the future. |
|
|
@item NeXT prior to 3.3 |
@item NeXT prior to 3.3 |
|
|
The system compiler on old versions of NeXT was a massacred and old GCC, even |
The system compiler on old versions of NeXT was a massacred and old GCC, even |
if it called itself @file{cc}. This compiler cannot be used to build GMP, you |
if it called itself @file{cc}. This compiler cannot be used to build GMP, you |
need to get a real GCC, and install that before you compile GMP. (NeXT may |
need to get a real GCC, and install that. (NeXT may have fixed this in |
have fixed this in release 3.3 of their system.) |
release 3.3 of their system.) |
|
|
@item POWER and PowerPC |
@item POWER and PowerPC |
|
|
|
|
Use the GNU assembler instead of the system assembler, since the latter has |
Use the GNU assembler instead of the system assembler, since the latter has |
serious bugs. |
serious bugs. |
|
|
@item Stripped Libraries |
@item Solaris 2.6 |
@cindex Stripped libraries |
|
|
|
GNU binutils @samp{strip} should not be used on the static libraries |
The system @command{sed} prints an error ``Output line too long'' when libtool |
@file{libgmp.a} and @file{libmp.a}, neither directly nor via @samp{make |
builds @file{libgmp.la}. This doesn't seem to cause any obvious ill effects, |
install-strip}. It can be used on the shared libraries @file{libgmp.so} and |
but GNU @command{sed} is recommended, to avoid any doubt. |
@file{libmp.so} though. |
|
|
|
Currently (binutils 2.10.0), @samp{strip} extracts archives into a single |
@item Sparc Solaris 2.7 with gcc 2.95.2 in ABI=32 |
directory, but GMP contains multiple object files of the same name (eg. three |
|
versions of @file{init.o}), and they overwrite each other, leaving only the |
|
one that happens to be last. |
|
|
|
If stripped static libraries are wanted, the suggested workaround is to build |
A shared library build of GMP seems to fail in this combination, it builds but |
normally, strip the separate object files, and do another @samp{make all} to |
then fails the tests, apparently due to some incorrect data relocations within |
rebuild. Alternately @samp{CFLAGS} with @samp{-g} omitted can always be used |
@code{gmp_randinit_lc_2exp_size}. The exact cause is unknown, |
if it's just debugging which is unwanted. |
@samp{--disable-shared} is recommended. |
|
|
@item SunOS 4 Native Tools |
@item Windows DLL test programs |
|
|
The setting for @code{GSYM_PREFIX} in @file{config.m4} may be incorrectly |
When creating a DLL version of @file{libgmp}, libtool creates wrapper scripts |
determined when using the native @command{grep}, leading at link-time to |
like @file{t-mul} for programs that would normally be @file{t-mul.exe}, in |
undefined symbols like @code{___gmpn_add_n}. To fix this, after running |
order to setup the right library paths etc. This works fine, but the absence |
@samp{./configure}, change the relevant line in @file{config.m4} to |
of @file{t-mul.exe} etc causes @command{make} to think they need recompiling |
@samp{define(<GSYM_PREFIX>, <_>)}. |
every time, which is an annoyance when re-running a @samp{make check}. |
|
|
The @command{ranlib} command will need to be run manually when building a |
|
static library with the native @command{ar}. After @samp{make}, run |
|
@samp{ranlib .libs/libgmp.a}, and when using @option{--enable-mpbsd} run |
|
@samp{ranlib .libs/libmp.a} too. |
|
|
|
@item @file{version.c} compilation |
|
|
|
The current @samp{./configure} relies on certain features of @command{sed} |
|
that some old systems don't have. One symptom is @code{VERSION} not being set |
|
correctly in the generated @file{config.h}, leading to @file{version.c} |
|
failing to compile. Irix 5.3, MIPS RISC/OS and Ultrix 4.4 are believed to be |
|
affected. GNU @command{sed} is recommended, though it might be possible to |
|
build by editing @file{config.h} manually instead. |
|
|
|
@item VAX running Ultrix |
|
|
|
You need to build and install the GNU assembler before you compile GMP. The VAX |
|
assembly in GMP uses an instruction (@code{jsobgtr}) that cannot be assembled by |
|
the Ultrix assembler. |
|
@end table |
@end table |
|
|
|
|
|
|
@node GMP Basics, Reporting Bugs, Installing GMP, Top |
@node GMP Basics, Reporting Bugs, Installing GMP, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@chapter GMP Basics |
@chapter GMP Basics |
@cindex Basics |
@cindex Basics |
|
|
@cindex @file{gmp.h} |
|
All declarations needed to use GMP are collected in the include file |
|
@file{gmp.h}. It is designed to work with both C and C++ compilers. |
|
|
|
@strong{Using functions, macros, data types, etc.@: not documented in this |
@strong{Using functions, macros, data types, etc.@: not documented in this |
manual is strongly discouraged. If you do so your application is guaranteed |
manual is strongly discouraged. If you do so your application is guaranteed |
to be incompatible with future versions of GMP.} |
to be incompatible with future versions of GMP.} |
|
|
@menu |
@menu |
* Nomenclature and Types:: Which data types are there? |
* Headers and Libraries:: |
* Function Classes:: How the functions are organized. |
* Nomenclature and Types:: |
* GMP Variable Conventions:: Some rules and hints about variables. |
* Function Classes:: |
* GMP and Reentrancy:: What about reentrancy? |
* Variable Conventions:: |
* Useful Macros and Constants:: Convenient helpers. |
* Parameter Conventions:: |
* Compatibility with older versions:: Compatibility issues. |
* Memory Management:: |
* Getting the Latest Version of GMP:: How to get the software. |
* Reentrancy:: |
|
* Useful Macros and Constants:: |
|
* Compatibility with older versions:: |
|
* Demonstration Programs:: |
|
* Efficiency:: |
|
* Debugging:: |
|
* Profiling:: |
|
* Autoconf:: |
|
* Emacs:: |
@end menu |
@end menu |
|
|
@node Nomenclature and Types, Function Classes, GMP Basics, GMP Basics |
@node Headers and Libraries, Nomenclature and Types, GMP Basics, GMP Basics |
|
@section Headers and Libraries |
|
@cindex Headers |
|
|
|
@cindex @file{gmp.h} |
|
All declarations needed to use GMP are collected in the include file |
|
@file{gmp.h}. It is designed to work with both C and C++ compilers. |
|
|
|
@example |
|
#include <gmp.h> |
|
@end example |
|
|
|
Note however that prototypes for GMP functions with @code{FILE *} parameters |
|
are only provided if @code{<stdio.h>} is included too. |
|
|
|
@example |
|
#include <stdio.h> |
|
#include <gmp.h> |
|
@end example |
|
|
|
Likewise @code{<stdarg.h>} (or @code{<varargs.h>}) is required for prototypes |
|
with @code{va_list} parameters, such as @code{gmp_vprintf}. And |
|
@code{<obstack.h>} for prototypes with @code{struct obstack} parameters, such |
|
as @code{gmp_obstack_printf}, when available. |
|
|
|
@cindex Libraries |
|
@cindex Linking |
|
All programs using GMP must link against the @file{libgmp} library. On a |
|
typical Unix-like system this can be done with @samp{-lgmp}, for example |
|
|
|
@example |
|
gcc myprogram.c -lgmp |
|
@end example |
|
|
|
GMP C++ functions are in a separate @file{libgmpxx} library. This is built |
|
and installed if C++ support has been enabled (@pxref{Build Options}). For |
|
example, |
|
|
|
@example |
|
g++ mycxxprog.cc -lgmpxx -lgmp |
|
@end example |
|
|
|
GMP is built using Libtool and an application can use that to link if desired, |
|
@pxref{Top,Shared library support for GNU,Introduction,libtool,GNU Libtool} |
|
|
|
If GMP has been installed to a non-standard location then it may be necessary |
|
to use @samp{-I} and @samp{-L} compiler options to point to the right |
|
directories, and some sort of run-time path for a shared library. Consult |
|
your compiler documentation, for instance @ref{Top,,Introduction,gcc,Using and |
|
Porting the GNU Compiler Collection}. |
|
|
|
|
|
@node Nomenclature and Types, Function Classes, Headers and Libraries, GMP Basics |
@section Nomenclature and Types |
@section Nomenclature and Types |
@cindex Nomenclature |
@cindex Nomenclature |
@cindex Types |
@cindex Types |
Line 833 is @code{mpf_t}. |
|
Line 1640 is @code{mpf_t}. |
|
@tindex @code{mp_limb_t} |
@tindex @code{mp_limb_t} |
@noindent |
@noindent |
A @dfn{limb} means the part of a multi-precision number that fits in a single |
A @dfn{limb} means the part of a multi-precision number that fits in a single |
word. (We chose this word because a limb of the human body is analogous to a |
machine word. (We chose this word because a limb of the human body is |
digit, only larger, and containing several digits.) Normally a limb contains |
analogous to a digit, only larger, and containing several digits.) Normally a |
32 or 64 bits. The C data type for a limb is @code{mp_limb_t}. |
limb is 32 or 64 bits. The C data type for a limb is @code{mp_limb_t}. |
|
|
|
|
@node Function Classes, GMP Variable Conventions, Nomenclature and Types, GMP Basics |
@node Function Classes, Variable Conventions, Nomenclature and Types, GMP Basics |
@section Function Classes |
@section Function Classes |
@cindex Function classes |
@cindex Function classes |
|
|
Line 847 There are six classes of functions in the GMP library: |
|
Line 1654 There are six classes of functions in the GMP library: |
|
@enumerate |
@enumerate |
@item |
@item |
Functions for signed integer arithmetic, with names beginning with |
Functions for signed integer arithmetic, with names beginning with |
@code{mpz_}. The associated type is @code{mpz_t}. There are about 100 |
@code{mpz_}. The associated type is @code{mpz_t}. There are about 150 |
functions in this class. |
functions in this class. |
|
|
@item |
@item |
Functions for rational number arithmetic, with names beginning with |
Functions for rational number arithmetic, with names beginning with |
@code{mpq_}. The associated type is @code{mpq_t}. There are about 20 |
@code{mpq_}. The associated type is @code{mpq_t}. There are about 40 |
functions in this class, but the functions in the previous class can be used |
functions in this class, but the integer functions can be used for arithmetic |
for performing arithmetic on the numerator and denominator separately. |
on the numerator and denominator separately. |
|
|
@item |
@item |
Functions for floating-point arithmetic, with names beginning with |
Functions for floating-point arithmetic, with names beginning with |
@code{mpf_}. The associated type is @code{mpf_t}. There are about 50 |
@code{mpf_}. The associated type is @code{mpf_t}. There are about 60 |
functions is this class. |
functions is this class. |
|
|
@item |
@item |
Functions compatible with Berkeley GMP, such as @code{itom}, @code{madd}, and |
Functions compatible with Berkeley MP, such as @code{itom}, @code{madd}, and |
@code{mult}. The associated type is @code{MINT}. |
@code{mult}. The associated type is @code{MINT}. |
|
|
@item |
@item |
Fast low-level functions that operate on natural numbers. These are used by |
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 |
the functions in the preceding groups, and you can also call them directly |
from very time-critical user programs. These functions' names begin with |
from very time-critical user programs. These functions' names begin with |
@code{mpn_}. There are about 30 (hard-to-use) functions in this class. |
@code{mpn_}. The associated type is array of @code{mp_limb_t}. There are |
|
about 30 (hard-to-use) functions in this class. |
|
|
The associated type is array of @code{mp_limb_t}. |
|
|
|
@item |
@item |
Miscellaneous functions. Functions for setting up custom allocation and |
Miscellaneous functions. Functions for setting up custom allocation and |
functions for generating random numbers. |
functions for generating random numbers. |
@end enumerate |
@end enumerate |
|
|
|
|
@node GMP Variable Conventions, GMP and Reentrancy, Function Classes, GMP Basics |
@node Variable Conventions, Parameter Conventions, Function Classes, GMP Basics |
@section GMP Variable Conventions |
@section Variable Conventions |
@cindex Variable conventions |
@cindex Variable conventions |
@cindex Parameter conventions |
|
@cindex Conventions for variables |
@cindex Conventions for variables |
|
|
As a general rule, all GMP functions expect output arguments before input |
GMP functions generally have output arguments before input arguments. This |
arguments. This notation is based on an analogy with the assignment operator. |
notation is by analogy with the assignment operator. The BSD MP compatibility |
(The BSD MP compatibility functions disobey this rule, having the output |
functions are exceptions, having the output arguments last. |
argument(s) last.) |
|
|
|
GMP lets you use the same variable for both input and output in one call. For |
GMP lets you use the same variable for both input and output in one call. For |
example, the main function for integer multiplication, @code{mpz_mul}, can be |
example, the main function for integer multiplication, @code{mpz_mul}, can be |
Line 905 purpose. Which function to use depends on the type of |
|
Line 1709 purpose. Which function to use depends on the type of |
|
chapters on integer functions, rational number functions, and floating-point |
chapters on integer functions, rational number functions, and floating-point |
functions for details. |
functions for details. |
|
|
A variable should only be initialized once, or at least cleared out between |
A variable should only be initialized once, or at least cleared between each |
each initialization. After a variable has been initialized, it may be |
initialization. After a variable has been initialized, it may be assigned to |
assigned to any number of times. |
any number of times. |
|
|
For efficiency reasons, avoid initializing and clearing out a GMP variable in |
For efficiency reasons, avoid excessive initializing and clearing. In |
a loop. Instead, initialize it before entering the loop, and clear it out |
general, initialize near the start of a function and clear near the end. For |
after the loop has exited. |
example, |
|
|
GMP variables are small, containing only a couple of sizes, and pointers to |
@example |
allocated data. Once you have initialized a GMP variable, you don't need to |
void |
worry about space allocation. All functions in GMP automatically allocate |
foo (void) |
additional space when a variable does not already have enough. They do not, |
@{ |
however, reduce the space when a smaller value is stored. Most of the time |
mpz_t n; |
this policy is best, since it avoids frequent re-allocation. |
int i; |
|
mpz_init (n); |
|
for (i = 1; i < 100; i++) |
|
@{ |
|
mpz_mul (n, @dots{}); |
|
mpz_fdiv_q (n, @dots{}); |
|
@dots{} |
|
@} |
|
mpz_clear (n); |
|
@} |
|
@end example |
|
|
When a variable of type @code{mpz_t} is used as a function parameter, it's |
|
effectively a call-by-reference, meaning anything the function does to it will |
|
be be done to the original in the caller. When a function is going to return |
|
an @code{mpz_t} result, it should provide a separate parameter or parameters |
|
that it sets, like the GMP library functions do. A @code{return} of an |
|
@code{mpz_t} doesn't return the object, only a pointer to it, and this is |
|
almost certainly not what you want. All this applies to @code{mpq_t} and |
|
@code{mpf_t} too. |
|
|
|
Here's an example function accepting an @code{mpz_t} parameter, doing a |
@node Parameter Conventions, Memory Management, Variable Conventions, GMP Basics |
certain calculation, and returning a result. |
@section Parameter Conventions |
|
@cindex Parameter conventions |
|
@cindex Conventions for parameters |
|
|
|
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 |
|
@code{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 @code{return} of an @code{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 @code{mpz_t} parameter, doing a calculation, |
|
and storing the result to the indicated parameter. |
|
|
@example |
@example |
void |
void |
myfunction (mpz_t result, mpz_t param, unsigned long n) |
foo (mpz_t result, const mpz_t param, unsigned long n) |
@{ |
@{ |
unsigned long i; |
unsigned long i; |
|
|
mpz_mul_ui (result, param, n); |
mpz_mul_ui (result, param, n); |
for (i = 1; i < n; i++) |
for (i = 1; i < n; i++) |
mpz_add_ui (result, result, i*7); |
mpz_add_ui (result, result, i*7); |
|
|
mpz_t r, n; |
mpz_t r, n; |
mpz_init (r); |
mpz_init (r); |
mpz_init_set_str (n, "123456", 0); |
mpz_init_set_str (n, "123456", 0); |
|
foo (r, n, 20L); |
myfunction (r, n, 20L); |
gmp_printf ("%Zd\n", r); |
mpz_out_str (stdout, 10, r); printf ("\n"); |
|
|
|
return 0; |
return 0; |
@} |
@} |
@end example |
@end example |
|
|
This example will work if @code{result} and @code{param} are the same |
@code{foo} works even if the mainline passes the same variable for |
variable, just like the library functions. But sometimes this is tricky to |
@code{param} and @code{result}, just like the library functions. But |
arrange, and an application might not want to bother for its own subroutines. |
sometimes it's tricky to make that work, and an application might not want to |
|
bother supporting that sort of thing. |
|
|
@code{mpz_t} is actually implemented as a one-element array of a certain |
For interest, the GMP types @code{mpz_t} etc are implemented as one-element |
structure type. This is why using it to declare a variable gives an object |
arrays of certain structures. This is why declaring a variable creates an |
with the fields GMP needs, but then using it as a parameter passes a pointer |
object with the fields GMP needs, but then using it as a parameter passes a |
to the object. Note that the actual contents of an @code{mpz_t} are for |
pointer to the object. Note that the actual fields in each @code{mpz_t} etc |
internal use only and you should not access them directly if you want your |
are for internal use only and should not be accessed directly by code that |
code to be compatible with future GMP releases. |
expects to be compatible with future GMP releases. |
|
|
|
|
@node GMP and Reentrancy, Useful Macros and Constants, GMP Variable Conventions, GMP Basics |
@need 1000 |
@section GMP and Reentrancy |
@node Memory Management, Reentrancy, Parameter Conventions, GMP Basics |
|
@section Memory Management |
|
@cindex Memory Management |
|
|
|
The GMP types like @code{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. |
|
|
|
@code{mpz_t} and @code{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 @code{mpz_realloc2}, or clear variables no longer needed. |
|
|
|
@code{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 @code{malloc} and friends by default, but this |
|
can be changed, see @ref{Custom Allocation}. Temporary memory on the stack is |
|
also used (via @code{alloca}), but this can be changed at build-time if |
|
desired, see @ref{Build Options}. |
|
|
|
|
|
@node Reentrancy, Useful Macros and Constants, Memory Management, GMP Basics |
|
@section Reentrancy |
@cindex Reentrancy |
@cindex Reentrancy |
@cindex Thread safety |
@cindex Thread safety |
@cindex Multi-threading |
@cindex Multi-threading |
|
|
The GMP code is reentrant and thread-safe, with some exceptions: |
GMP is reentrant and thread-safe, with some exceptions: |
|
|
@itemize @bullet |
@itemize @bullet |
@item |
@item |
The function @code{mpf_set_default_prec} saves the selected precision in |
If configured with @option{--enable-alloca=malloc-notreentrant} (or with |
a global variable. |
@option{--enable-alloca=notreentrant} when @code{alloca} is not available), |
|
then naturally GMP is not reentrant. |
|
|
@item |
@item |
The function @code{mp_set_memory_functions} uses several global |
@code{mpf_set_default_prec} and @code{mpf_init} use a global variable for the |
variables for storing the selected memory allocation functions. |
selected precision. @code{mpf_init2} can be used instead. |
|
|
@item |
@item |
|
@code{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 @code{gmp_randstate_t} parameter can be used instead. |
|
|
|
@item |
|
@code{mp_set_memory_functions} uses global variables to store the selected |
|
memory allocation functions. |
|
|
|
@item |
If the memory allocation functions set by a call to |
If the memory allocation functions set by a call to |
@code{mp_set_memory_functions} (or @code{malloc} and friends by default) are |
@code{mp_set_memory_functions} (or @code{malloc} and friends by default) are |
not reentrant, GMP will not be reentrant either. |
not reentrant, then GMP will not be reentrant either. |
|
|
@item |
@item |
The old random number functions (@code{mpz_random}, etc) use a random number |
If the standard I/O functions such as @code{fwrite} are not reentrant then the |
generator from the C library, usually @code{mrand48} or @code{random}. These |
GMP I/O functions using them will not be reentrant either. |
routines are not reentrant, since they rely on global state. |
|
(However the newer random number functions that accept a |
|
@code{gmp_randstate_t} parameter are reentrant.) |
|
|
|
@item |
@item |
If @code{alloca} is not available, or GMP is configured with |
It's safe for two threads to read from the same GMP variable simultaneously, |
@samp{--disable-alloca}, the library is not reentrant, due to the current |
but it's not safe for one to read while the another might be writing, nor for |
implementation of @file{stack-alloc.c}. In the generated @file{config.h}, |
two threads to write simultaneously. It's not safe for two threads to |
@code{USE_STACK_ALLOC} set to 1 will mean not reentrant. |
generate a random number from the same @code{gmp_randstate_t} simultaneously, |
|
since this involves an update of that variable. |
|
|
|
@item |
|
On SCO systems the default @code{<ctype.h>} macros use per-file static |
|
variables and may not be reentrant, depending whether the compiler optimizes |
|
away fetches from them. The GMP text-based input functions are affected. |
@end itemize |
@end itemize |
|
|
|
|
@need 2000 |
@need 2000 |
@node Useful Macros and Constants, Compatibility with older versions, GMP and Reentrancy, GMP Basics |
@node Useful Macros and Constants, Compatibility with older versions, Reentrancy, GMP Basics |
@section Useful Macros and Constants |
@section Useful Macros and Constants |
@cindex Useful macros and constants |
@cindex Useful macros and constants |
@cindex Constants |
@cindex Constants |
|
|
@deftypevr {Global Constant} {const int} mp_bits_per_limb |
@deftypevr {Global Constant} {const int} mp_bits_per_limb |
|
@findex mp_bits_per_limb |
@cindex Bits per limb |
@cindex Bits per limb |
@cindex Limb size |
@cindex Limb size |
The number of bits per limb. |
The number of bits per limb. |
Line 1028 For GMP i.j, these numbers will be i, j, and 0, respec |
|
Line 1888 For GMP i.j, these numbers will be i, j, and 0, respec |
|
For GMP i.j.k, these numbers will be i, j, and k, respectively. |
For GMP i.j.k, these numbers will be i, j, and k, respectively. |
@end defmac |
@end defmac |
|
|
|
@deftypevr {Global Constant} {const char * const} gmp_version |
|
@findex gmp_version |
|
The GMP version number, as a null-terminated string, in the form ``i.j'' or |
|
``i.j.k''. This release is @nicode{"@value{VERSION}"}. |
|
@end deftypevr |
|
|
@node Compatibility with older versions, Getting the Latest Version of GMP, Useful Macros and Constants, GMP Basics |
|
|
@node Compatibility with older versions, Demonstration Programs, Useful Macros and Constants, GMP Basics |
@section Compatibility with older versions |
@section Compatibility with older versions |
@cindex Compatibility with older versions |
@cindex Compatibility with older versions |
@cindex Upward compatibility |
@cindex Upward compatibility |
|
|
This version of GMP is upwardly binary compatible with versions 3.0 and 3.0.1, |
This version of GMP is upwardly binary compatible with all 4.x and 3.x |
and upwardly compatible at the source level with versions 2.0, 2.0.1, and |
versions, and upwardly compatible at the source level with all 2.x versions, |
2.0.2, with the following exceptions. |
with the following exceptions. |
|
|
@itemize @bullet |
@itemize @bullet |
@item |
@item |
@code{mpn_gcd} had its source arguments swapped as of GMP 3.0 for consistency |
@code{mpn_gcd} had its source arguments swapped as of GMP 3.0, for consistency |
with other @code{mpn} functions. |
with other @code{mpn} functions. |
|
|
@item |
@item |
@code{mpf_get_prec} counted precision slightly differently in GMP 3.0 and |
@code{mpf_get_prec} counted precision slightly differently in GMP 3.0 and |
3.0.1, but in 3.1 has reverted to the 2.0.x style. |
3.0.1, but in 3.1 reverted to the 2.x style. |
|
|
@end itemize |
@end itemize |
|
|
There are a number of compatibility issues between GMP 1 and GMP 2 that of |
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 3. Please |
course also apply when porting applications from GMP 1 to GMP 4. Please |
see the GMP 2 manual for details. |
see the GMP 2 manual for details. |
|
|
|
The Berkeley MP compatibility library (@pxref{BSD Compatible Functions}) is |
|
source and binary compatible with the standard @file{libmp}. |
|
|
@c @enumerate |
@c @enumerate |
@c @item Integer division functions round the result differently. The obsolete |
@c @item Integer division functions round the result differently. The obsolete |
@c functions (@code{mpz_div}, @code{mpz_divmod}, @code{mpz_mdiv}, |
@c functions (@code{mpz_div}, @code{mpz_divmod}, @code{mpz_mdiv}, |
Line 1093 see the GMP 2 manual for details. |
|
Line 1961 see the GMP 2 manual for details. |
|
@c @item The functions @code{mpz_pow_ui} and @code{mpz_ui_pow_ui} now yield 1 |
@c @item The functions @code{mpz_pow_ui} and @code{mpz_ui_pow_ui} now yield 1 |
@c for 0^0. (In version 1, they yielded 0.) |
@c for 0^0. (In version 1, they yielded 0.) |
|
|
|
@c In version 1 of the library, @code{mpq_set_den} handled negative |
|
@c denominators by copying the sign to the numerator. That is no longer done. |
|
|
|
@c Pure assignment functions do not canonicalize the assigned variable. It is |
|
@c the responsibility of the user to canonicalize the assigned variable before |
|
@c any arithmetic operations are performed on that variable. |
|
@c Note that this is an incompatible change from version 1 of the library. |
|
|
@c @end enumerate |
@c @end enumerate |
|
|
|
|
@node Getting the Latest Version of GMP, , Compatibility with older versions, GMP Basics |
@need 1000 |
@section Getting the Latest Version of GMP |
@node Demonstration Programs, Efficiency, Compatibility with older versions, GMP Basics |
@cindex Latest version of GMP |
@section Demonstration programs |
@cindex Anonymous FTP of latest version |
@cindex Demonstration programs |
@cindex FTP of latest version |
@cindex Example programs |
|
@cindex Sample programs |
|
The @file{demos} subdirectory has some sample programs using GMP. These |
|
aren't built or installed, but there's a @file{Makefile} with rules for them. |
|
For instance, |
|
|
The latest version of the GMP library is available at |
@example |
@uref{ftp://ftp.gnu.org/pub/gnu/gmp}. Many sites around the world mirror |
make pexpr |
@samp{ftp.gnu.org}; please use a mirror site near you, see |
./pexpr 68^975+10 |
@uref{http://www.gnu.org/order/ftp.html}. |
@end example |
|
|
|
@noindent |
|
The following programs are provided |
|
|
|
@itemize @bullet |
|
@item |
|
@samp{pexpr} is an expression evaluator, the program used on the GMP web page. |
|
@item |
|
The @samp{calc} subdirectory has a similar but simpler evaluator using |
|
@command{lex} and @command{yacc}. |
|
@item |
|
The @samp{expr} subdirectory is yet another expression evaluator, a library |
|
designed for ease of use within a C program. See @file{demos/expr/README} for |
|
more information. |
|
@item |
|
@samp{factorize} is a Pollard-Rho factorization program. |
|
@item |
|
@samp{isprime} is a command-line interface to the @code{mpz_probab_prime_p} |
|
function. |
|
@item |
|
@samp{primes} counts or lists primes in an interval, using a sieve. |
|
@item |
|
@samp{qcn} is an example use of @code{mpz_kronecker_ui} to estimate quadratic |
|
class numbers. |
|
@item |
|
@cindex @code{perl} |
|
The @samp{perl} subdirectory is a comprehensive perl interface to GMP. See |
|
@file{demos/perl/INSTALL} for more information. Documentation is in POD |
|
format in @file{demos/perl/GMP.pm}. |
|
@end itemize |
|
|
|
|
|
@need 1000 |
|
@node Efficiency, Debugging, Demonstration Programs, GMP Basics |
|
@section Efficiency |
|
@cindex Efficiency |
|
|
|
@table @asis |
|
@item 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. |
|
|
|
@item Static Linking |
|
On some CPUs, in particular the x86s, the static @file{libgmp.a} should be |
|
used for maximum speed, since the PIC code in the shared @file{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. |
|
|
|
@item 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. |
|
|
|
@item Reallocations |
|
An @code{mpz_t} or @code{mpq_t} variable used to hold successively increasing |
|
values will have its memory repeatedly @code{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 @code{mpz_init2} or @code{mpz_realloc2} can |
|
be called to allocate the necessary space from the beginning |
|
(@pxref{Initializing Integers}). |
|
|
|
It doesn't matter if a size set with @code{mpz_init2} or @code{mpz_realloc2} |
|
is too small, since all functions will do a further reallocation if necessary. |
|
Badly overestimating memory required will waste space though. |
|
|
|
@item @code{2exp} functions |
|
It's up to an application to call functions like @code{mpz_mul_2exp} when |
|
appropriate. General purpose functions like @code{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. |
|
|
|
@item @code{ui} and @code{si} functions |
|
The @code{ui} functions and the small number of @code{si} functions exist for |
|
convenience and should be used where applicable. But if for example an |
|
@code{mpz_t} contains a value that fits in an @code{unsigned long} there's no |
|
need extract it and call a @code{ui} function, just use the regular @code{mpz} |
|
function. |
|
|
|
@item In-Place Operations |
|
@code{mpz_abs}, @code{mpq_abs}, @code{mpf_abs}, @code{mpz_neg}, @code{mpq_neg} |
|
and @code{mpf_neg} are fast when used for in-place operations like |
|
@code{mpz_abs(x,x)}, since in the current implementation only a single field |
|
of @code{x} needs changing. On suitable compilers (GCC for instance) this is |
|
inlined too. |
|
|
|
@code{mpz_add_ui}, @code{mpz_sub_ui}, @code{mpf_add_ui} and @code{mpf_sub_ui} |
|
benefit from an in-place operation like @code{mpz_add_ui(x,x,y)}, since |
|
usually only one or two limbs of @code{x} will need to be changed. The same |
|
applies to the full precision @code{mpz_add} etc if @code{y} is small. If |
|
@code{y} is big then cache locality may be helped, but that's all. |
|
|
|
@code{mpz_mul} is currently the opposite, a separate destination is slightly |
|
better. A call like @code{mpz_mul(x,x,y)} will, unless @code{y} is only one |
|
limb, make a temporary copy of @code{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. |
|
|
|
@code{mpz_set}, @code{mpq_set}, @code{mpq_set_num}, @code{mpf_set}, etc, make |
|
no attempt to recognise a copy of something to itself, so a call like |
|
@code{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. |
|
|
|
@example |
|
if (x != y) |
|
mpz_set (x, y); |
|
@end example |
|
|
|
Note that it's never worth introducing extra @code{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. |
|
|
|
@item Divisibility Testing (Small Integers) |
|
|
|
@code{mpz_divisible_ui_p} and @code{mpz_congruent_ui_p} are the best functions |
|
for testing whether an @code{mpz_t} is divisible by an individual small |
|
integer. They use an algorithm which is faster than @code{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 @math{23@times{}29@times{}31 = 20677} and then test that. |
|
|
|
The division functions like @code{mpz_tdiv_q_ui} which give a quotient as well |
|
as a remainder are generally a little slower than the remainder-only functions |
|
like @code{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 (@code{mpz_divexact_ui} can be used if the |
|
remainder is zero). |
|
|
|
@item Rational Arithmetic |
|
The @code{mpq} functions operate on @code{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 @code{mpq_numref} and @code{mpq_denref} macros give access to the |
|
numerator and denominator to do things outside the scope of the supplied |
|
@code{mpq} functions. @xref{Applying Integer Functions}. |
|
|
|
The canonical form for rationals allows mixed-type @code{mpq_t} and integer |
|
additions or subtractions to be done directly with multiples of the |
|
denominator. This will be somewhat faster than @code{mpq_add}. For example, |
|
|
|
@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); |
|
@end example |
|
|
|
@item Number Sequences |
|
Functions like @code{mpz_fac_ui}, @code{mpz_fib_ui} and @code{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. |
|
|
|
@item 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. |
|
@c Reference: Knuth volume 2 section 4.1, page 184 of second edition. :-) |
|
@end table |
|
|
|
|
|
@node Debugging, Profiling, Efficiency, GMP Basics |
|
@section Debugging |
|
@cindex Debugging |
|
|
|
@table @asis |
|
@item Stack Overflow |
|
Depending on the system, a segmentation violation or bus error might be the |
|
only indication of stack overflow. See @samp{--enable-alloca} choices in |
|
@ref{Build Options}, for how to address this. |
|
|
|
In new enough versions of GCC, @samp{-fstack-check} may be able to ensure an |
|
overflow is recognised by the system before too much damage is done, or |
|
@samp{-fstack-limit-symbol} or @samp{-fstack-limit-register} may be able to |
|
add checking if the system itself doesn't do any (@pxref{Code Gen Options,, |
|
Options for Code Generation, gcc, Using the GNU Compiler Collection (GCC)}). |
|
These options must be added to the @samp{CFLAGS} used in the GMP build |
|
(@pxref{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. |
|
|
|
@item Heap Problems |
|
The most likely cause of application problems with GMP is heap corruption. |
|
Failing to @code{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 @code{malloc} has some diagnostic facilities, see |
|
@ref{Allocation Debugging,,,libc,The GNU C Library Reference Manual}, or |
|
@samp{man 3 malloc}. Other possibilities, in no particular order, include |
|
|
|
@display |
|
@uref{http://www.inf.ethz.ch/personal/biere/projects/ccmalloc} |
|
@uref{http://quorum.tamu.edu/jon/gnu} @ (debauch) |
|
@uref{http://dmalloc.com} |
|
@uref{http://www.perens.com/FreeSoftware} @ (electric fence) |
|
@uref{http://packages.debian.org/fda} |
|
@uref{http://www.gnupdate.org/components/leakbug} |
|
@uref{http://people.redhat.com/~otaylor/memprof} |
|
@uref{http://www.cbmamiga.demon.co.uk/mpatrol} |
|
@end display |
|
|
|
The GMP default allocation routines in @file{memory.c} also have a simple |
|
sentinel scheme which can be enabled with @code{#define DEBUG} in that file. |
|
This is mainly designed for detecting buffer overruns during GMP development, |
|
but might find other uses. |
|
|
|
@item Stack Backtraces |
|
On some systems the compiler options GMP uses by default can interfere with |
|
debugging. In particular on x86 and 68k systems @samp{-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. |
|
|
|
@item GNU Debugger |
|
A sample @file{.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. |
|
|
|
@item Source File Paths |
|
GMP has multiple source files with the same name, in different directories. |
|
For example @file{mpz}, @file{mpq}, @file{mpf} and @file{mpfr} each have an |
|
@file{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. |
|
|
|
@example |
|
cd /my/build/dir |
|
/my/source/dir/gmp-@value{VERSION}/configure |
|
@end example |
|
|
|
This works via @code{VPATH}, and might require GNU @command{make}. |
|
Alternately it might be possible to change the @code{.c.lo} rules |
|
appropriately. |
|
|
|
@item Assertion Checking |
|
The build option @option{--enable-assert} is available to add some consistency |
|
checks to the library (see @ref{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 @code{mpn} functions, however, will benefit |
|
from @option{--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 assembler code, so |
|
CPU @samp{none} should be used for maximum checking. |
|
|
|
@item Temporary Memory Checking |
|
The build option @option{--enable-alloca=debug} arranges that each block of |
|
temporary memory in GMP is allocated with a separate call to @code{malloc} (or |
|
the allocation function set with @code{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 @code{alloca} which will go |
|
nowhere near any malloc debugger hooks. |
|
|
|
@item Maximum Debuggability |
|
To summarize the above, a GMP build for maximum debuggability would be |
|
|
|
@example |
|
./configure --disable-shared --enable-assert \ |
|
--enable-alloca=debug --host=none CFLAGS=-g |
|
@end example |
|
|
|
For C++, add @samp{--enable-cxx CXXFLAGS=-g}. |
|
|
|
@item Checker |
|
The checker program (@uref{http://savannah.gnu.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. Configure with |
|
|
|
@example |
|
./configure --host=none-pc-linux-gnu CC=checkergcc |
|
@end example |
|
|
|
@samp{--host=none} must be used, since the GMP assembler 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. |
|
|
|
@item Valgrind |
|
The valgrind program (@uref{http://devel-home.kde.org/~sewardj}) is a memory |
|
checker for x86s. 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. |
|
|
|
Current versions (20020226 snapshot) don't support MMX or SSE, so GMP must be |
|
configured for an x86 without those (eg. plain @samp{i386}), or with a special |
|
@code{MPN_PATH} that excludes those subdirectories (@pxref{Build Options}). |
|
|
|
@item Other Problems |
|
Any suspected bug in GMP itself should be isolated to make sure it's not an |
|
application problem, see @ref{Reporting Bugs}. |
|
@end table |
|
|
|
|
|
@node Profiling, Autoconf, Debugging, GMP Basics |
|
@section Profiling |
|
@cindex 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. |
|
|
|
Depending on the system, it may be possible to get a flat profile, meaning |
|
simple timer sampling of the program counter, with no special GMP build |
|
options, just a @samp{-p} when compiling the mainline. This is a good way to |
|
ensure minimum interference with normal operation. The necessary symbol type |
|
and size information exists in most of the GMP assembler code. |
|
|
|
The @samp{--enable-profiling} build option can be used to add suitable |
|
compiler flags, either for @command{prof} (@samp{-p}) or @command{gprof} |
|
(@samp{-pg}), see @ref{Build Options}. Which of the two is available and what |
|
they do will depend on the system, and possibly on support available in |
|
@file{libc}. For some systems appropriate corresponding @code{mcount} calls |
|
are added to the assembler code too. |
|
|
|
On x86 systems @command{prof} gives call counting, so that average time spent |
|
in a function can be determined. @command{gprof}, where supported, adds call |
|
graph construction, so for instance calls to @code{mpn_add_n} from |
|
@code{mpz_add} and from @code{mpz_mul} can be differentiated. |
|
|
|
On x86 and 68k systems @samp{-pg} and @samp{-fomit-frame-pointer} are |
|
incompatible, so the latter is not used when @command{gprof} profiling is |
|
selected, which may result in poorer code generation. If @command{prof} |
|
profiling is selected instead it should still be possible to use |
|
@command{gprof}, but only the @samp{gprof -p} flat profile and call counts can |
|
be expected to be valid, not the @samp{gprof -q} call graph. |
|
|
|
|
|
@node Autoconf, Emacs, Profiling, GMP Basics |
|
@section Autoconf |
|
@cindex Autoconf detections |
|
|
|
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 @code{__gmpz}. The following therefore would be a simple test, |
|
|
|
@example |
|
AC_CHECK_LIB(gmp, __gmpz_init) |
|
@end example |
|
|
|
This just uses the default @code{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, |
|
|
|
@example |
|
AC_CHECK_LIB(gmp, __gmpz_init, , [AC_MSG_ERROR( |
|
[GNU MP not found, see http://swox.com/gmp])]) |
|
@end example |
|
|
|
If functions added in some particular version of GMP are required, then one of |
|
those can be used when checking. For example @code{mpz_mul_si} was added in |
|
GMP 3.1, |
|
|
|
@example |
|
AC_CHECK_LIB(gmp, __gmpz_mul_si, , [AC_MSG_ERROR( |
|
[GNU MP not found, or not 3.1 or up, see http://swox.com/gmp])]) |
|
@end example |
|
|
|
An alternative would be to test the version number in @file{gmp.h} using say |
|
@code{AC_EGREP_CPP}. That would make it possible to test the exact version, |
|
if some particular sub-minor release is known to be necessary. |
|
|
|
An application that can use either GMP 2 or 3 will need to test for |
|
@code{__gmpz_init} (GMP 3 and up) or @code{mpz_init} (GMP 2), and it's also |
|
worth checking for @file{libgmp2} since Debian GNU/Linux systems used that |
|
name in the past. For example, |
|
|
|
@example |
|
AC_CHECK_LIB(gmp, __gmpz_init, , |
|
[AC_CHECK_LIB(gmp, mpz_init, , |
|
[AC_CHECK_LIB(gmp2, mpz_init)])]) |
|
@end example |
|
|
|
In general it's suggested 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 @code{sizeof} in the code. |
|
This can be done in the normal way with @code{mp_limb_t} etc, but GMP 4.0 or |
|
up is best for this, since prior versions needed certain @samp{-D} defines on |
|
systems using a @code{long long} limb. The following would suit Autoconf 2.50 |
|
or up, |
|
|
|
@example |
|
AC_CHECK_SIZEOF(mp_limb_t, , [#include <gmp.h>]) |
|
@end example |
|
|
|
The optional @code{mpfr} functions are provided in a separate |
|
@file{libmpfr.a}, and this might be from GMP with @option{--enable-mpfr} or |
|
from MPFR installed separately. Either way @file{libmpfr} depends on |
|
@file{libgmp}, it doesn't stand alone. Currently only a static |
|
@file{libmpfr.a} will be available, not a shared library, since upward binary |
|
compatibility is not guaranteed. |
|
|
|
@example |
|
AC_CHECK_LIB(mpfr, mpfr_add, , [AC_MSG_ERROR( |
|
[Need MPFR either from GNU MP 4 or separate MPFR package. |
|
See http://www.mpfr.org or http://swox.com/gmp]) |
|
@end example |
|
|
|
|
|
@node Emacs, , Autoconf, GMP Basics |
|
@section Emacs |
|
@cindex Emacs |
|
|
|
@key{C-h C-i} (@code{info-lookup-symbol}) is a good way to find documentation |
|
on C functions while editing (@pxref{Info Lookup, , Info Documentation Lookup, |
|
emacs, The Emacs Editor}). |
|
|
|
The GMP manual can be included in such lookups by putting the following in |
|
your @file{.emacs}, |
|
|
|
@c This isn't pretty, but there doesn't seem to be a better way (in emacs |
|
@c 21.2 at least). info-lookup->mode-value could be used for the "assoc"s, |
|
@c but that function isn't documented, whereas info-lookup-alist is. |
|
@c |
|
@example |
|
(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))))) |
|
@end example |
|
|
|
The same can be done for MPFR, with @code{(mpfr)} in place of @code{(gmp)}. |
|
|
|
|
@node Reporting Bugs, Integer Functions, GMP Basics, Top |
@node Reporting Bugs, Integer Functions, GMP Basics, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@chapter Reporting Bugs |
@chapter Reporting Bugs |
Line 1116 The latest version of the GMP library is available at |
|
Line 2458 The latest version of the GMP library is available at |
|
|
|
If you think you have found a bug in the GMP library, please investigate it |
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 |
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, you may |
much to ask you to report the bugs you find. |
want to check @uref{http://www.swox.com/gmp/} for patches for this release. |
|
|
|
|
Before you report a bug, check it's not already addressed in @ref{Known Build |
|
Problems}, or perhaps @ref{Notes for Particular Systems}. You may also want |
|
to check @uref{http://swox.com/gmp/} for patches for this release. |
|
|
Please include the following in any report, |
Please include the following in any report, |
|
|
@itemize @bullet |
@itemize @bullet |
Line 1138 If you get a crash, include a stack backtrace from the |
|
Line 2483 If you get a crash, include a stack backtrace from the |
|
informative (@samp{where} in @command{gdb}, or @samp{$C} in @command{adb}). |
informative (@samp{where} in @command{gdb}, or @samp{$C} in @command{adb}). |
|
|
@item |
@item |
@strong{Please do not send core dumps, executables or @command{strace}s.} |
Please do not send core dumps, executables or @command{strace}s. |
|
|
@item |
@item |
The configuration options you used when building GMP, if any. |
The configuration options you used when building GMP, if any. |
Line 1151 with @samp{gcc -v}, otherwise perhaps @samp{what `whic |
|
Line 2496 with @samp{gcc -v}, otherwise perhaps @samp{what `whic |
|
The output from running @samp{uname -a}. |
The output from running @samp{uname -a}. |
|
|
@item |
@item |
The output from running @samp{./config.guess}. |
The output from running @samp{./config.guess}, and from running |
|
@samp{./configfsf.guess} (might be the same). |
|
|
@item |
@item |
If the bug is related to @samp{configure}, then the contents of |
If the bug is related to @samp{configure}, then the contents of |
Line 1159 If the bug is related to @samp{configure}, then the co |
|
Line 2505 If the bug is related to @samp{configure}, then the co |
|
|
|
@item |
@item |
If the bug is related to an @file{asm} file not assembling, then the contents |
If the bug is related to an @file{asm} file not assembling, then the contents |
of @file{config.m4}. |
of @file{config.m4} and the offending line or lines from the temporary |
|
@file{mpn/tmp-<file>.s}. |
@end itemize |
@end itemize |
|
|
|
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 |
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. |
compiler; the GMP code tends to explore interesting corners in compilers. |
|
|
Line 1199 GMP integers are stored in objects of type @code{mpz_t |
|
Line 2550 GMP integers are stored in objects of type @code{mpz_t |
|
* Integer Logic and Bit Fiddling:: |
* Integer Logic and Bit Fiddling:: |
* I/O of Integers:: |
* I/O of Integers:: |
* Integer Random Numbers:: |
* Integer Random Numbers:: |
|
* Integer Import and Export:: |
* Miscellaneous Integer Functions:: |
* Miscellaneous Integer Functions:: |
@end menu |
@end menu |
|
|
Line 1209 GMP integers are stored in objects of type @code{mpz_t |
|
Line 2561 GMP integers are stored in objects of type @code{mpz_t |
|
@cindex Initialization functions |
@cindex Initialization functions |
|
|
The functions for integer arithmetic assume that all integer objects are |
The functions for integer arithmetic assume that all integer objects are |
initialized. You do that by calling the function @code{mpz_init}. |
initialized. You do that by calling the function @code{mpz_init}. For |
|
example, |
|
|
@deftypefun void mpz_init (mpz_t @var{integer}) |
|
Initialize @var{integer} with limb space and set the initial numeric value to |
|
0. Each variable should normally only be initialized once, or at least cleared |
|
out (using @code{mpz_clear}) between each initialization. |
|
@end deftypefun |
|
|
|
Here is an example of using @code{mpz_init}: |
|
|
|
@example |
@example |
@{ |
@{ |
mpz_t integ; |
mpz_t integ; |
Line 1233 Here is an example of using @code{mpz_init}: |
|
Line 2578 Here is an example of using @code{mpz_init}: |
|
@} |
@} |
@end example |
@end example |
|
|
@noindent |
|
As you can see, you can store new values any number of times, once an |
As you can see, you can store new values any number of times, once an |
object is initialized. |
object is initialized. |
|
|
|
@deftypefun void mpz_init (mpz_t @var{integer}) |
|
Initialize @var{integer}, and set its value to 0. |
|
@end deftypefun |
|
|
|
@deftypefun void mpz_init2 (mpz_t @var{integer}, unsigned long @var{n}) |
|
Initialize @var{integer}, with space for @var{n} bits, and set its value to 0. |
|
|
|
@var{n} is only the initial space, @var{integer} will grow automatically in |
|
the normal way, if necessary, for subsequent values stored. @code{mpz_init2} |
|
makes it possible to avoid such reallocations if a maximum size is known in |
|
advance. |
|
@end deftypefun |
|
|
@deftypefun void mpz_clear (mpz_t @var{integer}) |
@deftypefun void mpz_clear (mpz_t @var{integer}) |
Free the limb space occupied by @var{integer}. Make sure to call this |
Free the space occupied by @var{integer}. Call this function for all |
function for all @code{mpz_t} variables when you are done with them. |
@code{mpz_t} variables when you are done with them. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {void *} _mpz_realloc (mpz_t @var{integer}, mp_size_t @var{new_alloc}) |
@deftypefun void mpz_realloc2 (mpz_t @var{integer}, unsigned long @var{n}) |
Change the limb space allocation to @var{new_alloc} limbs. This function is |
Change the space allocated for @var{integer} to @var{n} bits. The value in |
not normally called from user code, but it can be used to give memory back to |
@var{integer} is preserved if it fits, or is set to 0 if not. |
the heap, or to increase the space of a variable to avoid repeated automatic |
|
re-allocation. |
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. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_array_init (mpz_t @var{integer_array}[], size_t @var{array_size}, mp_size_t @var{fixed_num_bits}) |
@deftypefun void mpz_array_init (mpz_t @var{integer_array}[], size_t @var{array_size}, @w{mp_size_t @var{fixed_num_bits}}) |
Allocate @strong{fixed} limb space for all @var{array_size} integers in |
This is a special type of initialization. @strong{Fixed} space of |
@var{integer_array}. The fixed allocation for each integer in the array is |
@var{fixed_num_bits} bits is allocated to each of the @var{array_size} |
enough to store @var{fixed_num_bits}. If the fixed space will be insufficient |
integers in @var{integer_array}. |
for storing the result of a subsequent calculation, the result is |
|
unpredictable. |
|
|
|
This function is useful for decreasing the working set for some algorithms |
The space will not be automatically increased, unlike the normal |
that use large integer arrays. |
@code{mpz_init}, but instead an application must ensure it's sufficient for |
|
any value stored. The following space requirements apply to various |
|
functions, |
|
|
There is no way to de-allocate the storage allocated by this function. |
@itemize @bullet |
Don't call @code{mpz_clear}! |
@item |
|
@code{mpz_abs}, @code{mpz_neg}, @code{mpz_set}, @code{mpz_set_si} and |
|
@code{mpz_set_ui} need room for the value they store. |
|
|
|
@item |
|
@code{mpz_add}, @code{mpz_add_ui}, @code{mpz_sub} and @code{mpz_sub_ui} need |
|
room for the larger of the two operands, plus an extra |
|
@code{mp_bits_per_limb}. |
|
|
|
@item |
|
@code{mpz_mul}, @code{mpz_mul_ui} and @code{mpz_mul_ui} need room for the sum |
|
of the number of bits in their operands, but each rounded up to a multiple of |
|
@code{mp_bits_per_limb}. |
|
|
|
@item |
|
@code{mpz_swap} can be used between two array variables, but not between an |
|
array and a normal variable. |
|
@end itemize |
|
|
|
For other functions, or if in doubt, the suggestion is to calculate in a |
|
regular @code{mpz_init} variable and copy the result to an array variable with |
|
@code{mpz_set}. |
|
|
|
@code{mpz_array_init} can reduce memory usage in algorithms that need large |
|
arrays of integers, since it avoids allocating and reallocating lots of small |
|
memory blocks. There is no way to free the storage allocated by this |
|
function. Don't call @code{mpz_clear}! |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun {void *} _mpz_realloc (mpz_t @var{integer}, mp_size_t @var{new_alloc}) |
|
Change the space for @var{integer} to @var{new_alloc} limbs. The value in |
|
@var{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. |
|
|
|
@code{mpz_realloc2} is the preferred way to accomplish allocation changes like |
|
this. @code{mpz_realloc2} and @code{_mpz_realloc} are the same except that |
|
@code{_mpz_realloc} takes the new size in limbs. |
|
@end deftypefun |
|
|
|
|
@node Assigning Integers, Simultaneous Integer Init & Assign, Initializing Integers, Integer Functions |
@node Assigning Integers, Simultaneous Integer Init & Assign, Initializing Integers, Integer Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@section Assignment Functions |
@section Assignment Functions |
Line 1280 These functions assign new values to already initializ |
|
Line 2675 These functions assign new values to already initializ |
|
@deftypefunx void mpz_set_q (mpz_t @var{rop}, mpq_t @var{op}) |
@deftypefunx void mpz_set_q (mpz_t @var{rop}, mpq_t @var{op}) |
@deftypefunx void mpz_set_f (mpz_t @var{rop}, mpf_t @var{op}) |
@deftypefunx void mpz_set_f (mpz_t @var{rop}, mpf_t @var{op}) |
Set the value of @var{rop} from @var{op}. |
Set the value of @var{rop} from @var{op}. |
|
|
|
@code{mpz_set_d}, @code{mpz_set_q} and @code{mpz_set_f} truncate @var{op} to |
|
make it an integer. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpz_set_str (mpz_t @var{rop}, char *@var{str}, int @var{base}) |
@deftypefun int mpz_set_str (mpz_t @var{rop}, char *@var{str}, int @var{base}) |
Set the value of @var{rop} from @var{str}, a '\0'-terminated C string in base |
Set the value of @var{rop} from @var{str}, a null-terminated C string in base |
@var{base}. White space is allowed in the string, and is simply ignored. The |
@var{base}. White space is allowed in the string, and is simply ignored. The |
base may vary from 2 to 36. If @var{base} is 0, the actual base is determined |
base may vary from 2 to 36. If @var{base} is 0, the actual base is determined |
from the leading characters: if the first two characters are `0x' or `0X', |
from the leading characters: if the first two characters are ``0x'' or ``0X'', |
hexadecimal is assumed, otherwise if the first character is `0', octal is |
hexadecimal is assumed, otherwise if the first character is ``0'', octal is |
assumed, otherwise decimal is assumed. |
assumed, otherwise decimal is assumed. |
|
|
This function returns 0 if the entire string up to the '\0' is a valid |
This function returns 0 if the entire string is a valid number in base |
number in base @var{base}. Otherwise it returns @minus{}1. |
@var{base}. Otherwise it returns @minus{}1. |
|
|
[It turns out that it is not entirely true that this function ignores |
[It turns out that it is not entirely true that this function ignores |
white-space. It does ignore it between digits, but not after a minus sign |
white-space. It does ignore it between digits, but not after a minus sign or |
or within or after "0x". We are considering changing the definition of |
within or after ``0x''. We are considering changing the definition of this |
this function, making it fail when there is any white-space in the input, |
function, making it fail when there is any white-space in the input, since |
since that makes a lot of sense. Please tell us your opinion about this |
that makes a lot of sense. Send your opinion of this change to |
change. Do you really want it to accept "3 14" as meaning 314 as it does |
@email{bug-gmp@@gnu.org}. Do you really want it to accept @nicode{"3 14"} as |
now?] |
meaning 314 as it does now?] |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_swap (mpz_t @var{rop1}, mpz_t @var{rop2}) |
@deftypefun void mpz_swap (mpz_t @var{rop1}, mpz_t @var{rop2}) |
Line 1364 This section describes functions for converting GMP in |
|
Line 2762 This section describes functions for converting GMP in |
|
types. Functions for converting @emph{to} GMP integers are described in |
types. Functions for converting @emph{to} GMP integers are described in |
@ref{Assigning Integers} and @ref{I/O of Integers}. |
@ref{Assigning Integers} and @ref{I/O of Integers}. |
|
|
@deftypefun mp_limb_t mpz_getlimbn (mpz_t @var{op}, mp_size_t @var{n}) |
@deftypefun {unsigned long int} mpz_get_ui (mpz_t @var{op}) |
Return limb #@var{n} from @var{op}. This function allows for very efficient |
Return the value of @var{op} as an @code{unsigned long}. |
decomposition of a number in its limbs. |
|
|
|
The function @code{mpz_size} can be used to determine the useful range for |
If @var{op} is too big to fit an @code{unsigned long} then just the least |
@var{n}. |
significant bits that do fit are returned. The sign of @var{op} is ignored, |
|
only the absolute value is used. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpz_get_ui (mpz_t @var{op}) |
|
Return the least significant part from @var{op}. This function combined with |
|
@* @code{mpz_tdiv_q_2exp(@dots{}, @var{op}, CHAR_BIT*sizeof(unsigned long |
|
int))} can be used to decompose an integer into unsigned longs. |
|
@end deftypefun |
|
|
|
@deftypefun {signed long int} mpz_get_si (mpz_t @var{op}) |
@deftypefun {signed long int} mpz_get_si (mpz_t @var{op}) |
If @var{op} fits into a @code{signed long int} return the value of @var{op}. |
If @var{op} fits into a @code{signed long int} return the value of @var{op}. |
Otherwise return the least significant part of @var{op}, with the same sign |
Otherwise return the least significant part of @var{op}, with the same sign |
as @var{op}. |
as @var{op}. |
|
|
If @var{op} is too large to fit in a @code{signed long int}, the returned |
If @var{op} is too big to fit in a @code{signed long int}, the returned |
result is probably not very useful. To find out if the value will fit, use |
result is probably not very useful. To find out if the value will fit, use |
the function @code{mpz_fits_slong_p}. |
the function @code{mpz_fits_slong_p}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun double mpz_get_d (mpz_t @var{op}) |
@deftypefun double mpz_get_d (mpz_t @var{op}) |
Convert @var{op} to a double. |
Convert @var{op} to a @code{double}. |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun double mpz_get_d_2exp (signed long int *@var{exp}, mpz_t @var{op}) |
|
Find @var{d} and @var{exp} such that @m{@var{d}\times 2^{exp}, @var{d} times 2 |
|
raised to @var{exp}}, with @math{0.5@le{}@GMPabs{@var{d}}<1}, is a good |
|
approximation to @var{op}. |
|
@end deftypefun |
|
|
@deftypefun {char *} mpz_get_str (char *@var{str}, int @var{base}, mpz_t @var{op}) |
@deftypefun {char *} mpz_get_str (char *@var{str}, int @var{base}, mpz_t @var{op}) |
Convert @var{op} to a string of digits in base @var{base}. The base may vary |
Convert @var{op} to a string of digits in base @var{base}. The base may vary |
from 2 to 36. |
from 2 to 36. |
|
|
If @var{str} is @code{NULL}, space for the result string is allocated using the |
If @var{str} is @code{NULL}, the result string is allocated using the current |
default allocation function. |
allocation function (@pxref{Custom Allocation}). The block will be |
|
@code{strlen(str)+1} bytes, that being exactly enough for the string and |
|
null-terminator. |
|
|
If @var{str} is not @code{NULL}, it should point to a block of storage enough large |
If @var{str} is not @code{NULL}, it should point to a block of storage large |
for the result. To find out the right amount of space to provide for |
enough for the result, that being @code{mpz_sizeinbase (@var{op}, @var{base}) |
@var{str}, use @code{mpz_sizeinbase (@var{op}, @var{base}) + 2}. The two |
+ 2}. The two extra bytes are for a possible minus sign, and the |
extra bytes are for a possible minus sign, and for the terminating null |
null-terminator. |
character. |
|
|
|
A pointer to the result string is returned. This pointer will will either |
A pointer to the result string is returned, being either the allocated block, |
equal @var{str}, or if that is @code{NULL}, will point to the allocated storage. |
or the given @var{str}. |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun mp_limb_t mpz_getlimbn (mpz_t @var{op}, mp_size_t @var{n}) |
|
Return limb number @var{n} from @var{op}. The sign of @var{op} is ignored, |
|
just the absolute value is used. The least significant limb is number 0. |
|
|
|
@code{mpz_size} can be used to find how many limbs make up @var{op}. |
|
@code{mpz_getlimbn} returns zero if @var{n} is outside the range 0 to |
|
@code{mpz_size(@var{op})-1}. |
|
@end deftypefun |
|
|
|
|
@need 2000 |
@need 2000 |
@node Integer Arithmetic, Integer Division, Converting Integers, Integer Functions |
@node Integer Arithmetic, Integer Division, Converting Integers, Integer Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
Line 1419 equal @var{str}, or if that is @code{NULL}, will point |
|
Line 2827 equal @var{str}, or if that is @code{NULL}, will point |
|
|
|
@deftypefun void mpz_add (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun void mpz_add (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefunx void mpz_add_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
@deftypefunx void mpz_add_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
@ifnottex |
Set @var{rop} to @math{@var{op1} + @var{op2}}. |
Set @var{rop} to @var{op1} + @var{op2}. |
|
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{op1} + @var{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_sub (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun void mpz_sub (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefunx void mpz_sub_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
@deftypefunx void mpz_sub_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
|
@deftypefunx void mpz_ui_sub (mpz_t @var{rop}, unsigned long int @var{op1}, mpz_t @var{op2}) |
Set @var{rop} to @var{op1} @minus{} @var{op2}. |
Set @var{rop} to @var{op1} @minus{} @var{op2}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_mul (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun void mpz_mul (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefunx void mpz_mul_si (mpz_t @var{rop}, mpz_t @var{op1}, long int @var{op2}) |
@deftypefunx void mpz_mul_si (mpz_t @var{rop}, mpz_t @var{op1}, long int @var{op2}) |
@deftypefunx void mpz_mul_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
@deftypefunx void mpz_mul_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
@ifnottex |
Set @var{rop} to @math{@var{op1} @GMPtimes{} @var{op2}}. |
Set @var{rop} to @var{op1} times @var{op2}. |
|
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{op1} \times @var{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_addmul_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
@deftypefun void mpz_addmul (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@ifnottex |
@deftypefunx void mpz_addmul_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
Add @var{op1} times @var{op2} to @var{rop}. |
Set @var{rop} to @math{@var{rop} + @var{op1} @GMPtimes{} @var{op2}}. |
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{rop} + @var{op1} \times @var{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun void mpz_submul (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
|
@deftypefunx void mpz_submul_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
|
Set @var{rop} to @math{@var{rop} - @var{op1} @GMPtimes{} @var{op2}}. |
|
@end deftypefun |
|
|
@deftypefun void mpz_mul_2exp (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
@deftypefun void mpz_mul_2exp (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long int @var{op2}) |
@cindex Bit shift left |
@cindex Bit shift left |
@ifnottex |
Set @var{rop} to @m{@var{op1} \times 2^{op2}, @var{op1} times 2 raised to |
Set @var{rop} to @var{op1} times 2 raised to @var{op2}. This operation can |
@var{op2}}. This operation can also be defined as a left shift by @var{op2} |
also be defined as a left shift, @var{op2} steps. |
bits. |
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{op1} \times 2^{op2}$. This operation can also be |
|
defined as a left shift, @var{op2} steps. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_neg (mpz_t @var{rop}, mpz_t @var{op}) |
@deftypefun void mpz_neg (mpz_t @var{rop}, mpz_t @var{op}) |
Line 1479 Set @var{rop} to the absolute value of @var{op}. |
|
Line 2874 Set @var{rop} to the absolute value of @var{op}. |
|
@cindex Integer division functions |
@cindex Integer division functions |
@cindex Division functions |
@cindex Division functions |
|
|
Division is undefined if the divisor is zero, and passing a zero divisor to the |
Division is undefined if the divisor is zero. Passing a zero divisor to the |
divide or modulo functions, as well passing a zero mod argument to the |
division or modulo functions (including the modular powering functions |
@code{mpz_powm} and @code{mpz_powm_ui} functions, will make these functions |
@code{mpz_powm} and @code{mpz_powm_ui}), will cause an intentional division by |
intentionally divide by zero. This lets the user handle arithmetic exceptions |
zero. This lets a program handle arithmetic exceptions in these functions the |
in these functions in the same manner as other arithmetic exceptions. |
same way as for normal C @code{int} arithmetic. |
|
|
There are three main groups of division functions: |
@c Separate deftypefun groups for cdiv, fdiv and tdiv produce a blank line |
@itemize @bullet |
@c between each, and seem to let tex do a better job of page breaks than an |
@item |
@c @sp 1 in the middle of one big set. |
Functions that truncate the quotient towards 0. The names of these functions |
|
start with @code{mpz_tdiv}. The @samp{t} in the name is short for |
|
@samp{truncate}. |
|
@item |
|
Functions that round the quotient towards |
|
@ifnottex |
|
@minus{}infinity). |
|
@end ifnottex |
|
@tex |
|
$-\infty$ |
|
@end tex |
|
The names of these routines start with @code{mpz_fdiv}. The @samp{f} in the |
|
name is short for @samp{floor}. |
|
@item |
|
Functions that round the quotient towards |
|
@ifnottex |
|
+infinity. |
|
@end ifnottex |
|
@tex |
|
$+\infty$ |
|
@end tex |
|
The names of these routines start with @code{mpz_cdiv}. The @samp{c} in the |
|
name is short for @samp{ceil}. |
|
@end itemize |
|
|
|
For each rounding mode, there are a couple of variants. Here @samp{q} means |
@deftypefun void mpz_cdiv_q (mpz_t @var{q}, mpz_t @var{n}, mpz_t @var{d}) |
that the quotient is computed, while @samp{r} means that the remainder is |
@deftypefunx void mpz_cdiv_r (mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
computed. Functions that compute both the quotient and remainder have |
@deftypefunx void mpz_cdiv_qr (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
@samp{qr} in the name. |
@maybepagebreak |
|
@deftypefunx {unsigned long int} mpz_cdiv_q_ui (mpz_t @var{q}, mpz_t @var{n}, @w{unsigned long int @var{d}}) |
@deftypefun void mpz_tdiv_q (mpz_t @var{q}, mpz_t @var{n}, mpz_t @var{d}) |
@deftypefunx {unsigned long int} mpz_cdiv_r_ui (mpz_t @var{r}, mpz_t @var{n}, @w{unsigned long int @var{d}}) |
@deftypefunx {unsigned long int} mpz_tdiv_q_ui (mpz_t @var{q}, mpz_t @var{n}, unsigned long int @var{d}) |
@deftypefunx {unsigned long int} mpz_cdiv_qr_ui (mpz_t @var{q}, mpz_t @var{r}, @w{mpz_t @var{n}}, @w{unsigned long int @var{d}}) |
Set @var{q} to [@var{n}/@var{d}], truncated towards 0. |
@deftypefunx {unsigned long int} mpz_cdiv_ui (mpz_t @var{n}, @w{unsigned long int @var{d}}) |
|
@maybepagebreak |
The function @code{mpz_tdiv_q_ui} returns the absolute value of the true |
@deftypefunx void mpz_cdiv_q_2exp (mpz_t @var{q}, mpz_t @var{n}, @w{unsigned long int @var{b}}) |
remainder. |
@deftypefunx void mpz_cdiv_r_2exp (mpz_t @var{r}, mpz_t @var{n}, @w{unsigned long int @var{b}}) |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_tdiv_r (mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
|
@deftypefunx {unsigned long int} mpz_tdiv_r_ui (mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
|
@ifnottex |
|
Set @var{r} to (@var{n} - [@var{n}/@var{d}] * @var{d}), where the quotient is |
|
truncated towards 0. Unless @var{r} becomes zero, it will get the same sign as |
|
@var{n}. |
|
@end ifnottex |
|
@tex |
|
Set @var{r} to $(@var{n} - [@var{n}/@var{d}] \times @var{d})$, where the |
|
quotient is truncated towards 0. Unless @var{r} becomes zero, it will get the |
|
same sign as @var{n}. |
|
@end tex |
|
|
|
The function @code{mpz_tdiv_r_ui} returns the absolute value of the remainder. |
|
@end deftypefun |
|
|
|
@deftypefun void mpz_tdiv_qr (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
|
@deftypefunx {unsigned long int} mpz_tdiv_qr_ui (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
|
@ifnottex |
|
Set @var{q} to [@var{n}/@var{d}], truncated towards 0. Set @var{r} to (@var{n} |
|
- [@var{n}/@var{d}] * @var{d}). Unless @var{r} becomes zero, it will get the |
|
same sign as @var{n}. If @var{q} and @var{r} are the same variable, the |
|
results are undefined. |
|
@end ifnottex |
|
@tex |
|
Set @var{q} to [@var{n}/@var{d}], truncated towards 0. Set @var{r} to $(@var{n} |
|
- [@var{n}/@var{d}] \times @var{d})$. Unless @var{r} becomes zero, it will get the |
|
same sign as @var{n}. If @var{q} and @var{r} are the same variable, the |
|
results are undefined. |
|
@end tex |
|
|
|
The function @code{mpz_tdiv_qr_ui} returns the absolute value of the remainder. |
|
@end deftypefun |
|
|
|
@deftypefun {unsigned long int} mpz_tdiv_ui (mpz_t @var{n}, unsigned long int @var{d}) |
|
Like @code{mpz_tdiv_r_ui}, but the remainder is not stored anywhere; its |
|
absolute value is just returned. |
|
@end deftypefun |
|
|
|
@deftypefun void mpz_fdiv_q (mpz_t @var{q}, mpz_t @var{n}, mpz_t @var{d}) |
@deftypefun void mpz_fdiv_q (mpz_t @var{q}, mpz_t @var{n}, mpz_t @var{d}) |
@deftypefunx {unsigned long int} mpz_fdiv_q_ui (mpz_t @var{q}, mpz_t @var{n}, unsigned long int @var{d}) |
@deftypefunx void mpz_fdiv_r (mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
@ifnottex |
@deftypefunx void mpz_fdiv_qr (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
Set @var{q} to @var{n}/@var{d}, rounded towards @minus{}infinity. |
@maybepagebreak |
@end ifnottex |
@deftypefunx {unsigned long int} mpz_fdiv_q_ui (mpz_t @var{q}, mpz_t @var{n}, @w{unsigned long int @var{d}}) |
@tex |
@deftypefunx {unsigned long int} mpz_fdiv_r_ui (mpz_t @var{r}, mpz_t @var{n}, @w{unsigned long int @var{d}}) |
Set @var{q} to $\lfloor@var{n}/@var{d}\rfloor$. |
@deftypefunx {unsigned long int} mpz_fdiv_qr_ui (mpz_t @var{q}, mpz_t @var{r}, @w{mpz_t @var{n}}, @w{unsigned long int @var{d}}) |
@end tex |
@deftypefunx {unsigned long int} mpz_fdiv_ui (mpz_t @var{n}, @w{unsigned long int @var{d}}) |
|
@maybepagebreak |
The function @code{mpz_fdiv_q_ui} returns the remainder. |
@deftypefunx void mpz_fdiv_q_2exp (mpz_t @var{q}, mpz_t @var{n}, @w{unsigned long int @var{b}}) |
|
@deftypefunx void mpz_fdiv_r_2exp (mpz_t @var{r}, mpz_t @var{n}, @w{unsigned long int @var{b}}) |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_fdiv_r (mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
@deftypefun void mpz_tdiv_q (mpz_t @var{q}, mpz_t @var{n}, mpz_t @var{d}) |
@deftypefunx {unsigned long int} mpz_fdiv_r_ui (mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
@deftypefunx void mpz_tdiv_r (mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
@ifnottex |
@deftypefunx void mpz_tdiv_qr (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
Set @var{r} to (@var{n} - @var{n}/@var{d} * @var{d}), where the quotient is |
@maybepagebreak |
rounded towards @minus{}infinity. Unless @var{r} becomes zero, it will get the |
@deftypefunx {unsigned long int} mpz_tdiv_q_ui (mpz_t @var{q}, mpz_t @var{n}, @w{unsigned long int @var{d}}) |
same sign as @var{d}. |
@deftypefunx {unsigned long int} mpz_tdiv_r_ui (mpz_t @var{r}, mpz_t @var{n}, @w{unsigned long int @var{d}}) |
@end ifnottex |
@deftypefunx {unsigned long int} mpz_tdiv_qr_ui (mpz_t @var{q}, mpz_t @var{r}, @w{mpz_t @var{n}}, @w{unsigned long int @var{d}}) |
@tex |
@deftypefunx {unsigned long int} mpz_tdiv_ui (mpz_t @var{n}, @w{unsigned long int @var{d}}) |
Set @var{r} to $(@var{n} - \lfloor@var{n}/@var{d}\rfloor \times @var{d})$. |
@maybepagebreak |
Unless @var{r} becomes zero, it will get the same sign as @var{d}. |
@deftypefunx void mpz_tdiv_q_2exp (mpz_t @var{q}, mpz_t @var{n}, @w{unsigned long int @var{b}}) |
@end tex |
@deftypefunx void mpz_tdiv_r_2exp (mpz_t @var{r}, mpz_t @var{n}, @w{unsigned long int @var{b}}) |
|
@cindex Bit shift right |
|
|
The function @code{mpz_fdiv_r_ui} returns the remainder. |
@sp 1 |
@end deftypefun |
Divide @var{n} by @var{d}, forming a quotient @var{q} and/or remainder |
|
@var{r}. For the @code{2exp} functions, @m{@var{d}=2^b, @var{d}=2^@var{b}}. |
|
The rounding is in three styles, each suiting different applications. |
|
|
@deftypefun void mpz_fdiv_qr (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
@itemize @bullet |
@deftypefunx {unsigned long int} mpz_fdiv_qr_ui (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
@item |
@ifnottex |
@code{cdiv} rounds @var{q} up towards @m{+\infty, +infinity}, and @var{r} will |
Set @var{q} to @var{n}/@var{d}, rounded towards @minus{}infinity. Set @var{r} |
have the opposite sign to @var{d}. The @code{c} stands for ``ceil''. |
to (@var{n} - @var{n}/@var{d} * @var{d}). Unless @var{r} becomes zero, it |
|
will get the same sign as @var{d}. If @var{q} and @var{r} are the same |
|
variable, the results are undefined. |
|
@end ifnottex |
|
@tex |
|
Set @var{q} to $\lfloor@var{n}/@var{d}\rfloor$. Set @var{r} to $(@var{n} - |
|
\lfloor@var{n}/@var{d}\rfloor \times @var{d})$. Unless @var{r} becomes zero, |
|
it will get the same sign as @var{d}. If @var{q} and @var{r} are the same |
|
variable, the results are undefined. |
|
@end tex |
|
|
|
The function @code{mpz_fdiv_qr_ui} returns the remainder. |
@item |
@end deftypefun |
@code{fdiv} rounds @var{q} down towards @m{-\infty, @minus{}infinity}, and |
|
@var{r} will have the same sign as @var{d}. The @code{f} stands for |
|
``floor''. |
|
|
@deftypefun {unsigned long int} mpz_fdiv_ui (mpz_t @var{n}, unsigned long int @var{d}) |
@item |
Like @code{mpz_fdiv_r_ui}, but the remainder is not stored anywhere; it is just |
@code{tdiv} rounds @var{q} towards zero, and @var{r} will have the same sign |
returned. |
as @var{n}. The @code{t} stands for ``truncate''. |
@end deftypefun |
@end itemize |
|
|
@deftypefun void mpz_cdiv_q (mpz_t @var{q}, mpz_t @var{n}, mpz_t @var{d}) |
In all cases @var{q} and @var{r} will satisfy |
@deftypefunx {unsigned long int} mpz_cdiv_q_ui (mpz_t @var{q}, mpz_t @var{n}, unsigned long int @var{d}) |
@m{@var{n}=@var{q}@var{d}+@var{r}, @var{n}=@var{q}*@var{d}+@var{r}}, and |
@ifnottex |
@var{r} will satisfy @math{0@le{}@GMPabs{@var{r}}<@GMPabs{@var{d}}}. |
Set @var{q} to @var{n}/@var{d}, rounded towards +infinity. |
|
@end ifnottex |
|
@tex |
|
Set @var{q} to $\lceil@var{n}/@var{d}\rceil$. |
|
@end tex |
|
|
|
The function @code{mpz_cdiv_q_ui} returns the negated remainder. |
The @code{q} functions calculate only the quotient, the @code{r} functions |
@end deftypefun |
only the remainder, and the @code{qr} functions calculate both. Note that for |
|
@code{qr} the same variable cannot be passed for both @var{q} and @var{r}, or |
|
results will be unpredictable. |
|
|
@deftypefun void mpz_cdiv_r (mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
For the @code{ui} variants the return value is the remainder, and in fact |
@deftypefunx {unsigned long int} mpz_cdiv_r_ui (mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
returning the remainder is all the @code{div_ui} functions do. For |
@ifnottex |
@code{tdiv} and @code{cdiv} the remainder can be negative, so for those the |
Set @var{r} to (@var{n} - @var{n}/@var{d} * @var{d}), where the quotient is |
return value is the absolute value of the remainder. |
rounded towards +infinity. Unless @var{r} becomes zero, it will get the |
|
opposite sign as @var{d}. |
|
@end ifnottex |
|
@tex |
|
Set @var{r} to $(@var{n} - \lceil@var{n}/@var{d}\rceil \times @var{d})$. Unless |
|
@var{r} becomes zero, it will get the opposite sign as @var{d}. |
|
@end tex |
|
|
|
The function @code{mpz_cdiv_r_ui} returns the negated remainder. |
The @code{2exp} functions are right shifts and bit masks, but of course |
|
rounding the same as the other functions. For positive @var{n} both |
|
@code{mpz_fdiv_q_2exp} and @code{mpz_tdiv_q_2exp} are simple bitwise right |
|
shifts. For negative @var{n}, @code{mpz_fdiv_q_2exp} is effectively an |
|
arithmetic right shift treating @var{n} as twos complement the same as the |
|
bitwise logical functions do, whereas @code{mpz_tdiv_q_2exp} effectively |
|
treats @var{n} as sign and magnitude. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_cdiv_qr (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
|
@deftypefunx {unsigned long int} mpz_cdiv_qr_ui (mpz_t @var{q}, mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
|
@ifnottex |
|
Set @var{q} to @var{n}/@var{d}, rounded towards +infinity. Set @var{r} |
|
to (@var{n} - @var{n}/@var{d} * @var{d}). Unless @var{r} becomes zero, it |
|
will get the opposite sign as @var{d}. If @var{q} and @var{r} are the same |
|
variable, the results are undefined. |
|
@end ifnottex |
|
@tex |
|
Set @var{q} to $\lceil@var{n}/@var{d}\rceil$. Set @var{r} to $(@var{n} - |
|
\lceil@var{n}/@var{d}\rceil \times @var{d})$. Unless @var{r} becomes zero, it will |
|
get the opposite sign as @var{d}. If @var{q} and @var{r} are the same |
|
variable, the results are undefined. |
|
@end tex |
|
|
|
The function @code{mpz_cdiv_qr_ui} returns the negated remainder. |
|
@end deftypefun |
|
|
|
@deftypefun {unsigned long int} mpz_cdiv_ui (mpz_t @var{n}, unsigned long int @var{d}) |
|
Like @code{mpz_tdiv_r_ui}, but the remainder is not stored anywhere; its |
|
negated value is just returned. |
|
@end deftypefun |
|
|
|
@deftypefun void mpz_mod (mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
@deftypefun void mpz_mod (mpz_t @var{r}, mpz_t @var{n}, mpz_t @var{d}) |
@deftypefunx {unsigned long int} mpz_mod_ui (mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
@deftypefunx {unsigned long int} mpz_mod_ui (mpz_t @var{r}, mpz_t @var{n}, @w{unsigned long int @var{d}}) |
Set @var{r} to @var{n} @code{mod} @var{d}. The sign of the divisor is ignored; |
Set @var{r} to @var{n} @code{mod} @var{d}. The sign of the divisor is |
the result is always non-negative. |
ignored; the result is always non-negative. |
|
|
The function @code{mpz_mod_ui} returns the remainder. |
@code{mpz_mod_ui} is identical to @code{mpz_fdiv_r_ui} above, returning the |
|
remainder as well as setting @var{r}. See @code{mpz_fdiv_ui} above if only |
|
the return value is wanted. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_divexact (mpz_t @var{q}, mpz_t @var{n}, mpz_t @var{d}) |
@deftypefun void mpz_divexact (mpz_t @var{q}, mpz_t @var{n}, mpz_t @var{d}) |
|
@deftypefunx void mpz_divexact_ui (mpz_t @var{q}, mpz_t @var{n}, unsigned long @var{d}) |
@cindex Exact division functions |
@cindex Exact division functions |
Set @var{q} to @var{n}/@var{d}. This function produces correct results only |
Set @var{q} to @var{n}/@var{d}. These functions produce correct results only |
when it is known in advance that @var{d} divides @var{n}. |
when it is known in advance that @var{d} divides @var{n}. |
|
|
Since mpz_divexact is much faster than any of the other routines that produce |
These routines are much faster than the other division functions, and are the |
the quotient (@pxref{References} Jebelean), it is the best choice for instances |
best choice when exact division is known to occur, for example reducing a |
in which exact division is known to occur, such as reducing a rational to |
rational to lowest terms. |
lowest terms. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_tdiv_q_2exp (mpz_t @var{q}, mpz_t @var{n}, unsigned long int @var{d}) |
@deftypefun int mpz_divisible_p (mpz_t @var{n}, mpz_t @var{d}) |
@cindex Bit shift right |
@deftypefunx int mpz_divisible_ui_p (mpz_t @var{n}, unsigned long int @var{d}) |
@ifnottex |
@deftypefunx int mpz_divisible_2exp_p (mpz_t @var{n}, unsigned long int @var{b}) |
Set @var{q} to @var{n} divided by 2 raised to @var{d}. The quotient is truncated |
Return non-zero if @var{n} is exactly divisible by @var{d}, or in the case of |
towards 0. |
@code{mpz_divisible_2exp_p} by @m{2^b,2^@var{b}}. |
@end ifnottex |
|
@tex |
|
Set @var{q} to $[{n}/2^{d}]$, truncated towards 0. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_tdiv_r_2exp (mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
@deftypefun int mpz_congruent_p (mpz_t @var{n}, mpz_t @var{c}, mpz_t @var{d}) |
@ifnottex |
@deftypefunx int mpz_congruent_ui_p (mpz_t @var{n}, unsigned long int @var{c}, unsigned long int @var{d}) |
Divide @var{n} by (2 raised to @var{d}), rounding the quotient towards 0, and |
@deftypefunx int mpz_congruent_2exp_p (mpz_t @var{n}, mpz_t @var{c}, unsigned long int @var{b}) |
put the remainder in @var{r}. |
Return non-zero if @var{n} is congruent to @var{c} modulo @var{d}, or in the |
@end ifnottex |
case of @code{mpz_congruent_2exp_p} modulo @m{2^b,2^@var{b}}. |
@tex |
|
Set @var{r} to $n - [n / 2^{d}] \times 2^{d}$, where [ ] indicates rounding towards |
|
0. |
|
@end tex |
|
Unless it is zero, @var{r} will have the same sign as @var{n}. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_fdiv_q_2exp (mpz_t @var{q}, mpz_t @var{n}, unsigned long int @var{d}) |
|
@ifnottex |
|
Set @var{q} to @var{n} divided by 2 raised to @var{d}, rounded towards |
|
@minus{}infinity. |
|
@end ifnottex |
|
@tex |
|
Set @var{q} to $\lfloor{n}/2^{d}\rfloor$. |
|
@end tex |
|
This operation can also be defined as arithmetic right shift @var{d} bit |
|
positions. |
|
@end deftypefun |
|
|
|
@deftypefun void mpz_fdiv_r_2exp (mpz_t @var{r}, mpz_t @var{n}, unsigned long int @var{d}) |
|
@ifnottex |
|
Divide @var{n} by (2 raised to @var{d}), rounding the quotient towards |
|
@minus{}infinity, and put the remainder in @var{r}. |
|
@end ifnottex |
|
@tex |
|
Set @var{r} to $n - \lfloor{n}/2^{d}\rfloor \times 2^{d}$. |
|
@end tex |
|
The sign of @var{r} will always be positive. |
|
This operation can also be defined as masking of the @var{d} least significant |
|
bits. |
|
@end deftypefun |
|
|
|
|
|
@need 2000 |
@need 2000 |
@node Integer Exponentiation, Integer Roots, Integer Division, Integer Functions |
@node Integer Exponentiation, Integer Roots, Integer Division, Integer Functions |
@section Exponentiation Functions |
@section Exponentiation Functions |
@cindex Integer exponentiation functions |
@cindex Integer exponentiation functions |
@cindex Exponentiation functions |
@cindex Exponentiation functions |
|
@cindex Powering functions |
|
|
@deftypefun void mpz_powm (mpz_t @var{rop}, mpz_t @var{base}, mpz_t @var{exp}, mpz_t @var{mod}) |
@deftypefun void mpz_powm (mpz_t @var{rop}, mpz_t @var{base}, mpz_t @var{exp}, mpz_t @var{mod}) |
@deftypefunx void mpz_powm_ui (mpz_t @var{rop}, mpz_t @var{base}, unsigned long int @var{exp}, mpz_t @var{mod}) |
@deftypefunx void mpz_powm_ui (mpz_t @var{rop}, mpz_t @var{base}, unsigned long int @var{exp}, mpz_t @var{mod}) |
@ifnottex |
Set @var{rop} to @m{base^{exp} \bmod mod, (@var{base} raised to @var{exp}) |
Set @var{rop} to (@var{base} raised to @var{exp}) @code{mod} @var{mod}. If |
modulo @var{mod}}. |
@var{exp} is negative, the result is undefined. |
|
@end ifnottex |
|
@tex |
|
Set @var{rop} to $base^{exp} \bmod mod$. If |
|
@var{exp} is negative, the result is undefined. |
|
@end tex |
|
|
|
|
Negative @var{exp} is supported if an inverse @math{@var{base}^@W{-1} @bmod |
|
@var{mod}} exists (see @code{mpz_invert} in @ref{Number Theoretic Functions}). |
|
If an inverse doesn't exist then a divide by zero is raised. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_pow_ui (mpz_t @var{rop}, mpz_t @var{base}, unsigned long int @var{exp}) |
@deftypefun void mpz_pow_ui (mpz_t @var{rop}, mpz_t @var{base}, unsigned long int @var{exp}) |
@deftypefunx void mpz_ui_pow_ui (mpz_t @var{rop}, unsigned long int @var{base}, unsigned long int @var{exp}) |
@deftypefunx void mpz_ui_pow_ui (mpz_t @var{rop}, unsigned long int @var{base}, unsigned long int @var{exp}) |
@ifnottex |
Set @var{rop} to @m{base^{exp}, @var{base} raised to @var{exp}}. The case |
Set @var{rop} to @var{base} raised to @var{exp}. The case of 0^0 yields 1. |
@math{0^0} yields 1. |
@end ifnottex |
|
@tex |
|
Set @var{rop} to $base^{exp}$. The case of $0^0$ yields 1. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
|
|
Line 1770 Set @var{rop} to $base^{exp}$. The case of $0^0$ yiel |
|
Line 3033 Set @var{rop} to $base^{exp}$. The case of $0^0$ yiel |
|
@cindex Root extraction functions |
@cindex Root extraction functions |
|
|
@deftypefun int mpz_root (mpz_t @var{rop}, mpz_t @var{op}, unsigned long int @var{n}) |
@deftypefun int mpz_root (mpz_t @var{rop}, mpz_t @var{op}, unsigned long int @var{n}) |
@ifnottex |
Set @var{rop} to @m{\lfloor\root n \of {op}\rfloor@C{},} the truncated integer |
Set @var{rop} to the truncated integer part of the @var{n}th root of @var{op}. |
part of the @var{n}th root of @var{op}. Return non-zero if the computation |
@end ifnottex |
was exact, i.e., if @var{op} is @var{rop} to the @var{n}th power. |
@tex |
|
Set @var{rop} to $\lfloor\root n \of {op}\rfloor$, the truncated integer |
|
part of the @var{n}th root of @var{op}. |
|
@end tex |
|
Return non-zero if the computation was exact, i.e., if @var{op} is |
|
@var{rop} to the @var{n}th power. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_sqrt (mpz_t @var{rop}, mpz_t @var{op}) |
@deftypefun void mpz_sqrt (mpz_t @var{rop}, mpz_t @var{op}) |
@ifnottex |
Set @var{rop} to @m{\lfloor\sqrt{@var{op}}\rfloor@C{},} the truncated |
Set @var{rop} to the truncated integer part of the square root of @var{op}. |
integer part of the square root of @var{op}. |
@end ifnottex |
|
@tex |
|
Set @var{rop} to $\lfloor\sqrt{@var{op}}\rfloor$, the truncated integer part of |
|
the square root of @var{op}. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_sqrtrem (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op}) |
@deftypefun void mpz_sqrtrem (mpz_t @var{rop1}, mpz_t @var{rop2}, mpz_t @var{op}) |
@ifnottex |
Set @var{rop1} to @m{\lfloor\sqrt{@var{op}}\rfloor, the truncated integer part |
Set @var{rop1} to the truncated integer part of the square root of @var{op}, |
of the square root of @var{op}}, like @code{mpz_sqrt}. Set @var{rop2} to the |
like @code{mpz_sqrt}. Set @var{rop2} to |
remainder @m{(@var{op} - @var{rop1}^2), |
@var{op}@minus{}@var{rop1}*@var{rop1}, |
@var{op}@minus{}@var{rop1}*@var{rop1}}, which will be zero if @var{op} is a |
@end ifnottex |
perfect square. |
@tex |
|
Set @var{rop1} to $\lfloor\sqrt{@var{op}}\rfloor$, like @code{mpz_sqrt}. |
|
Set @var{rop2} to $(@var{op} - @var{rop1}^2)$, |
|
@end tex |
|
(i.e., zero if @var{op} is a perfect square). |
|
|
|
If @var{rop1} and @var{rop2} are the same variable, the results are |
If @var{rop1} and @var{rop2} are the same variable, the results are |
undefined. |
undefined. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpz_perfect_power_p (mpz_t @var{op}) |
@deftypefun int mpz_perfect_power_p (mpz_t @var{op}) |
@ifnottex |
|
Return non-zero if @var{op} is a perfect power, i.e., if there exist integers |
Return non-zero if @var{op} is a perfect power, i.e., if there exist integers |
@var{a} and @var{b}, with @var{b} > 1, such that @var{op} equals a raised to |
@m{a,@var{a}} and @m{b,@var{b}}, with @m{b>1, @var{b}>1}, such that |
b. Return zero otherwise. |
@m{@var{op}=a^b, @var{op} equals @var{a} raised to the power @var{b}}. |
@end ifnottex |
|
@tex |
Under this definition both 0 and 1 are considered to be perfect powers. |
Return non-zero if @var{op} is a perfect power, i.e., if there exist integers |
Negative values of @var{op} are accepted, but of course can only be odd |
$a$ and $b$, with $b>1$, such that $@var{op}=a^b$. Return zero otherwise. |
perfect powers. |
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpz_perfect_square_p (mpz_t @var{op}) |
@deftypefun int mpz_perfect_square_p (mpz_t @var{op}) |
Return non-zero if @var{op} is a perfect square, i.e., if the square root of |
Return non-zero if @var{op} is a perfect square, i.e., if the square root of |
@var{op} is an integer. Return zero otherwise. |
@var{op} is an integer. Under this definition both 0 and 1 are considered to |
|
be perfect squares. |
@end deftypefun |
@end deftypefun |
|
|
|
|
Line 1832 Return non-zero if @var{op} is a perfect square, i.e., |
|
Line 3078 Return non-zero if @var{op} is a perfect square, i.e., |
|
|
|
@deftypefun int mpz_probab_prime_p (mpz_t @var{n}, int @var{reps}) |
@deftypefun int mpz_probab_prime_p (mpz_t @var{n}, int @var{reps}) |
@cindex Prime testing functions |
@cindex Prime testing functions |
If this function returns 0, @var{n} is definitely not prime. If it |
Determine whether @var{n} is prime. Return 2 if @var{n} is definitely prime, |
returns 1, then @var{n} is `probably' prime. If it returns 2, then |
return 1 if @var{n} is probably prime (without being certain), or return 0 if |
@var{n} is surely prime. Reasonable values of reps vary from 5 to 10; a |
@var{n} is definitely composite. |
higher value lowers the probability for a non-prime to pass as a |
|
`probable' prime. |
|
|
|
The function uses Miller-Rabin's probabilistic test. |
This function does some trial divisions, then some Miller-Rabin probabilistic |
|
primality tests. @var{reps} controls how many such tests are done, 5 to 10 is |
|
a reasonable number, more will reduce the chances of a composite being |
|
returned as ``probably prime''. |
|
|
|
Miller-Rabin and similar tests can be more properly called compositeness |
|
tests. Numbers which fail are known to be composite but those which pass |
|
might be prime or might be composite. Only a few composites pass, hence those |
|
which pass are considered probably prime. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpz_nextprime (mpz_t @var{rop}, mpz_t @var{op}) |
@deftypefun void mpz_nextprime (mpz_t @var{rop}, mpz_t @var{op}) |
Set @var{rop} to the next prime greater than @var{op}. |
Set @var{rop} to the next prime greater than @var{op}. |
|
|
This function uses a probabilistic algorithm to identify primes, but for for |
This function uses a probabilistic algorithm to identify primes. For |
practical purposes it's adequate, since the chance of a composite passing will |
practical purposes it's adequate, the chance of a composite passing will be |
be extremely small. |
extremely small. |
@end deftypefun |
@end deftypefun |
|
|
@c mpz_prime_p not implemented as of gmp 3.0. |
@c mpz_prime_p not implemented as of gmp 3.0. |
Line 1865 be extremely small. |
|
Line 3117 be extremely small. |
|
@deftypefun void mpz_gcd (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun void mpz_gcd (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@cindex Greatest common divisor functions |
@cindex Greatest common divisor functions |
Set @var{rop} to the greatest common divisor of @var{op1} and @var{op2}. |
Set @var{rop} to the greatest common divisor of @var{op1} and @var{op2}. |
The result is always positive even if either of or both input operands |
The result is always positive even if one or both input operands |
are negative. |
are negative. |
@end deftypefun |
@end deftypefun |
|
|
|
|
|
|
@deftypefun void mpz_gcdext (mpz_t @var{g}, mpz_t @var{s}, mpz_t @var{t}, mpz_t @var{a}, mpz_t @var{b}) |
@deftypefun void mpz_gcdext (mpz_t @var{g}, mpz_t @var{s}, mpz_t @var{t}, mpz_t @var{a}, mpz_t @var{b}) |
@cindex Extended GCD |
@cindex Extended GCD |
Compute @var{g}, @var{s}, and @var{t}, such that @var{a}@var{s} + |
Set @var{g} to the greatest common divisor of @var{a} and @var{b}, and in |
@var{b}@var{t} = @var{g} = @code{gcd}(@var{a}, @var{b}). If @var{t} is |
addition set @var{s} and @var{t} to coefficients satisfying |
@code{NULL}, that argument is not computed. |
@math{@var{a}@GMPmultiply{}@var{s} + @var{b}@GMPmultiply{}@var{t} = @var{g}}. |
|
@var{g} is always positive, even if one or both of @var{a} and @var{b} are |
|
negative. |
|
|
|
If @var{t} is @code{NULL} then that value is not computed. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_lcm (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun void mpz_lcm (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
|
@deftypefunx void mpz_lcm_ui (mpz_t @var{rop}, mpz_t @var{op1}, unsigned long @var{op2}) |
@cindex Least common multiple functions |
@cindex Least common multiple functions |
Set @var{rop} to the least common multiple of @var{op1} and @var{op2}. |
Set @var{rop} to the least common multiple of @var{op1} and @var{op2}. |
|
@var{rop} is always positive, irrespective of the signs of @var{op1} and |
|
@var{op2}. @var{rop} will be zero if either @var{op1} or @var{op2} is zero. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpz_invert (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun int mpz_invert (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@cindex Modular inverse functions |
@cindex Modular inverse functions |
Compute the inverse of @var{op1} modulo @var{op2} and put the result in |
Compute the inverse of @var{op1} modulo @var{op2} and put the result in |
@var{rop}. Return non-zero if an inverse exists, zero otherwise. When the |
@var{rop}. If the inverse exists, the return value is non-zero and @var{rop} |
function returns zero, @var{rop} is undefined. |
will satisfy @math{0 @le{} @var{rop} < @var{op2}}. If an inverse doesn't exist |
|
the return value is zero and @var{rop} is undefined. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpz_jacobi (mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun int mpz_jacobi (mpz_t @var{a}, mpz_t @var{b}) |
@deftypefunx int mpz_legendre (mpz_t @var{op1}, mpz_t @var{op2}) |
@cindex Jacobi symbol functions |
@cindex Jabobi symbol functions |
Calculate the Jacobi symbol @m{\left(a \over b\right), |
Compute the Jacobi and Legendre symbols, respectively. @var{op2} should be |
(@var{a}/@var{b})}. This is defined only for @var{b} odd. |
odd and must be positive. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpz_si_kronecker (long @var{a}, mpz_t @var{b}); |
@deftypefun int mpz_legendre (mpz_t @var{a}, mpz_t @var{p}) |
@deftypefunx int mpz_ui_kronecker (unsigned long @var{a}, mpz_t @var{b}); |
Calculate the Legendre symbol @m{\left(a \over p\right), |
@deftypefunx int mpz_kronecker_si (mpz_t @var{a}, long @var{b}); |
(@var{a}/@var{p})}. This is defined only for @var{p} an odd positive |
@deftypefunx int mpz_kronecker_ui (mpz_t @var{a}, unsigned long @var{b}); |
prime, and for such @var{p} it's identical to the Jacobi symbol. |
|
@end deftypefun |
|
|
|
@deftypefun int mpz_kronecker (mpz_t @var{a}, mpz_t @var{b}) |
|
@deftypefunx int mpz_kronecker_si (mpz_t @var{a}, long @var{b}) |
|
@deftypefunx int mpz_kronecker_ui (mpz_t @var{a}, unsigned long @var{b}) |
|
@deftypefunx int mpz_si_kronecker (long @var{a}, mpz_t @var{b}) |
|
@deftypefunx int mpz_ui_kronecker (unsigned long @var{a}, mpz_t @var{b}) |
@cindex Kronecker symbol functions |
@cindex Kronecker symbol functions |
@tex |
Calculate the Jacobi symbol @m{\left(a \over b\right), |
Calculate the value of the Kronecker/Jacobi symbol $\left(a \over b\right)$, |
(@var{a}/@var{b})} with the Kronecker extension @m{\left(a \over |
with the Kronecker extension $\left(a \over 2\right) = \left(2 \over a\right)$ |
2\right) = \left(2 \over a\right), (a/2)=(2/a)} when @math{a} odd, or |
when $a$ odd, or $\left(a \over 2\right) = 0$ when $a$ even. |
@m{\left(a \over 2\right) = 0, (a/2)=0} when @math{a} even. |
@end tex |
|
@ifnottex |
When @var{b} is odd the Jacobi symbol and Kronecker symbol are |
Calculate the value of the Kronecker/Jacobi symbol (@var{a}/@var{b}), with the |
identical, so @code{mpz_kronecker_ui} etc can be used for mixed |
Kronecker extension (a/2)=(2/a) when a odd, or (a/2)=0 when a even. |
precision Jacobi symbols too. |
@end ifnottex |
|
All values of @var{a} and @var{b} give a well-defined result. See Henri |
For more information see Henri Cohen section 1.4.2 (@pxref{References}), |
Cohen, section 1.4.2, for more information (@pxref{References}). See also the |
or any number theory textbook. See also the example program |
example program @file{demos/qcn.c} which uses @code{mpz_kronecker_ui}. |
@file{demos/qcn.c} which uses @code{mpz_kronecker_ui}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpz_remove (mpz_t @var{rop}, mpz_t @var{op}, mpz_t @var{f}) |
@deftypefun {unsigned long int} mpz_remove (mpz_t @var{rop}, mpz_t @var{op}, mpz_t @var{f}) |
Remove all occurrences of the factor @var{f} from @var{op} and store the |
Remove all occurrences of the factor @var{f} from @var{op} and store the |
result in @var{rop}. Return the multiplicity of @var{f} in @var{op}. |
result in @var{rop}. The return value is how many such occurrences were |
|
removed. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_fac_ui (mpz_t @var{rop}, unsigned long int @var{op}) |
@deftypefun void mpz_fac_ui (mpz_t @var{rop}, unsigned long int @var{op}) |
Line 1937 Set @var{rop} to @var{op}!, the factorial of @var{op}. |
|
Line 3204 Set @var{rop} to @var{op}!, the factorial of @var{op}. |
|
@deftypefun void mpz_bin_ui (mpz_t @var{rop}, mpz_t @var{n}, unsigned long int @var{k}) |
@deftypefun void mpz_bin_ui (mpz_t @var{rop}, mpz_t @var{n}, unsigned long int @var{k}) |
@deftypefunx void mpz_bin_uiui (mpz_t @var{rop}, unsigned long int @var{n}, @w{unsigned long int @var{k}}) |
@deftypefunx void mpz_bin_uiui (mpz_t @var{rop}, unsigned long int @var{n}, @w{unsigned long int @var{k}}) |
@cindex Binomial coefficient functions |
@cindex Binomial coefficient functions |
Compute the binomial coefficient |
Compute the binomial coefficient @m{\left({n}\atop{k}\right), @var{n} over |
@ifnottex |
@var{k}} and store the result in @var{rop}. Negative values of @var{n} are |
@var{n} over @var{k} |
supported by @code{mpz_bin_ui}, using the identity |
@end ifnottex |
@m{\left({-n}\atop{k}\right) = (-1)^k \left({n+k-1}\atop{k}\right), |
@tex |
bin(-n@C{}k) = (-1)^k * bin(n+k-1@C{}k)}, see Knuth volume 1 section 1.2.6 |
$\left({n}\atop{k}\right)$ |
part G. |
@end tex |
|
and store the result in @var{rop}. Negative values of @var{n} are supported |
|
by @code{mpz_bin_ui}, using the identity |
|
@ifnottex |
|
bin(-n,k) = (-1)^k * bin(n+k-1,k) |
|
@end ifnottex |
|
@tex |
|
$\left({-n}\atop{k}\right) = (-1)^k \left({n+k-1}\atop{k}\right)$ |
|
@end tex |
|
(see Knuth volume 1 section 1.2.6 part G). |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_fib_ui (mpz_t @var{rop}, unsigned long int @var{n}) |
@deftypefun void mpz_fib_ui (mpz_t @var{fn}, unsigned long int @var{n}) |
|
@deftypefunx void mpz_fib2_ui (mpz_t @var{fn}, mpz_t @var{fnsub1}, unsigned long int @var{n}) |
@cindex Fibonacci sequence functions |
@cindex Fibonacci sequence functions |
Compute the @var{n}th Fibonacci number and store the result in @var{rop}. |
@code{mpz_fib_ui} sets @var{fn} to to @m{F_n,F[n]}, the @var{n}'th Fibonacci |
|
number. @code{mpz_fib2_ui} sets @var{fn} to @m{F_n,F[n]}, and @var{fnsub1} to |
|
@m{F_{n-1},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 @code{mpz_fib2_ui} and |
|
iterate the defining @m{F_{n+1} = F_n + F_{n-1}, F[n+1]=F[n]+F[n-1]} or |
|
similar. |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun void mpz_lucnum_ui (mpz_t @var{ln}, unsigned long int @var{n}) |
|
@deftypefunx void mpz_lucnum2_ui (mpz_t @var{ln}, mpz_t @var{lnsub1}, unsigned long int @var{n}) |
|
@cindex Lucas number functions |
|
@code{mpz_lucnum_ui} sets @var{ln} to to @m{L_n,L[n]}, the @var{n}'th Lucas |
|
number. @code{mpz_lucnum2_ui} sets @var{ln} to @m{L_n,L[n]}, and @var{lnsub1} |
|
to @m{L_{n-1},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 @code{mpz_lucnum2_ui} and |
|
iterate the defining @m{L_{n+1} = L_n + L_{n-1}, 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 @code{mpz_fib2_ui} and @code{mpz_lucnum2_ui}. The |
|
formulas for going from Fibonacci to Lucas can be found in @ref{Lucas Numbers |
|
Algorithm}, the reverse is straightforward too. |
|
@end deftypefun |
|
|
|
|
@node Integer Comparisons, Integer Logic and Bit Fiddling, Number Theoretic Functions, Integer Functions |
@node Integer Comparisons, Integer Logic and Bit Fiddling, Number Theoretic Functions, Integer Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@section Comparison Functions |
@section Comparison Functions |
@cindex Integer comparison functions |
@cindex Integer comparison functions |
@cindex Comparison functions |
@cindex Comparison functions |
|
|
@deftypefun int mpz_cmp (mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefn Function int mpz_cmp (mpz_t @var{op1}, mpz_t @var{op2}) |
@ifnottex |
@deftypefnx Function int mpz_cmp_d (mpz_t @var{op1}, double @var{op2}) |
Compare @var{op1} and @var{op2}. Return a positive value if @var{op1} > |
|
@var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} < |
|
@var{op2}. |
|
@end ifnottex |
|
@tex |
|
Compare @var{op1} and @var{op2}. Return a positive value if $@var{op1} > |
|
@var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1} |
|
< @var{op2}$. |
|
@end tex |
|
@end deftypefun |
|
|
|
@deftypefn Macro int mpz_cmp_ui (mpz_t @var{op1}, unsigned long int @var{op2}) |
|
@deftypefnx Macro int mpz_cmp_si (mpz_t @var{op1}, signed long int @var{op2}) |
@deftypefnx Macro int mpz_cmp_si (mpz_t @var{op1}, signed long int @var{op2}) |
@ifnottex |
@deftypefnx Macro int mpz_cmp_ui (mpz_t @var{op1}, unsigned long int @var{op2}) |
Compare @var{op1} and @var{op2}. Return a positive value if @var{op1} > |
Compare @var{op1} and @var{op2}. Return a positive value if @math{@var{op1} > |
@var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} < |
@var{op2}}, zero if @math{@var{op1} = @var{op2}}, or a negative value if |
@var{op2}. |
@math{@var{op1} < @var{op2}}. |
@end ifnottex |
|
@tex |
|
Compare @var{op1} and @var{op2}. Return a positive value if $@var{op1} > |
|
@var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1} |
|
< @var{op2}$. |
|
@end tex |
|
|
|
These functions are actually implemented as macros. They evaluate their |
Note that @code{mpz_cmp_ui} and @code{mpz_cmp_si} are macros and will evaluate |
arguments multiple times. |
their arguments more than once. |
@end deftypefn |
@end deftypefn |
|
|
|
@deftypefn Function int mpz_cmpabs (mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun int mpz_cmpabs (mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefnx Function int mpz_cmpabs_d (mpz_t @var{op1}, double @var{op2}) |
@deftypefunx int mpz_cmpabs_ui (mpz_t @var{op1}, unsigned long int @var{op2}) |
@deftypefnx Function int mpz_cmpabs_ui (mpz_t @var{op1}, unsigned long int @var{op2}) |
@ifnottex |
|
Compare the absolute values of @var{op1} and @var{op2}. Return a positive |
Compare the absolute values of @var{op1} and @var{op2}. Return a positive |
value if @var{op1} > @var{op2}, zero if @var{op1} = @var{op2}, and a negative |
value if @math{@GMPabs{@var{op1}} > @GMPabs{@var{op2}}}, zero if |
value if @var{op1} < @var{op2}. |
@math{@GMPabs{@var{op1}} = @GMPabs{@var{op2}}}, or a negative value if |
@end ifnottex |
@math{@GMPabs{@var{op1}} < @GMPabs{@var{op2}}}. |
@tex |
|
Compare the absolute values of @var{op1} and @var{op2}. Return a positive |
|
value if $|@var{op1}| > |@var{op2}|$, zero if $|@var{op1}| = |@var{op2}|$, and a |
|
negative value if $|@var{op1}| < |@var{op2}|$. |
|
@end tex |
|
@end deftypefun |
|
|
|
|
Note that @code{mpz_cmpabs_si} is a macro and will evaluate its arguments more |
|
than once. |
|
@end deftypefn |
|
|
@deftypefn Macro int mpz_sgn (mpz_t @var{op}) |
@deftypefn Macro int mpz_sgn (mpz_t @var{op}) |
@ifnottex |
@cindex Sign tests |
Return +1 if @var{op} > 0, 0 if @var{op} = 0, and @minus{}1 if @var{op} < 0. |
@cindex Integer sign tests |
@end ifnottex |
Return @math{+1} if @math{@var{op} > 0}, 0 if @math{@var{op} = 0}, and |
@tex |
@math{-1} if @math{@var{op} < 0}. |
Return $+1$ if $@var{op} > 0$, 0 if $@var{op} = 0$, and $-1$ if $@var{op} < 0$. |
|
@end tex |
|
|
|
This function is actually implemented as a macro. It evaluates its |
This function is actually implemented as a macro. It evaluates its argument |
arguments multiple times. |
multiple times. |
@end deftypefn |
@end deftypefn |
|
|
|
|
@node Integer Logic and Bit Fiddling, I/O of Integers, Integer Comparisons, Integer Functions |
@node Integer Logic and Bit Fiddling, I/O of Integers, Integer Comparisons, Integer Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@section Logical and Bit Manipulation Functions |
@section Logical and Bit Manipulation Functions |
Line 2031 arguments multiple times. |
|
Line 3292 arguments multiple times. |
|
@cindex Bit manipulation functions |
@cindex Bit manipulation functions |
@cindex Integer bit manipulation functions |
@cindex Integer bit manipulation functions |
|
|
These functions behave as if two's complement arithmetic were used (although |
These functions behave as if twos complement arithmetic were used (although |
sign-magnitude is used by the actual implementation). |
sign-magnitude is the actual implementation). The least significant bit is |
|
number 0. |
|
|
@deftypefun void mpz_and (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun void mpz_and (mpz_t @var{rop}, mpz_t @var{op1}, mpz_t @var{op2}) |
Set @var{rop} to @var{op1} logical-and @var{op2}. |
Set @var{rop} to @var{op1} logical-and @var{op2}. |
Line 2051 Set @var{rop} to the one's complement of @var{op}. |
|
Line 3313 Set @var{rop} to the one's complement of @var{op}. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpz_popcount (mpz_t @var{op}) |
@deftypefun {unsigned long int} mpz_popcount (mpz_t @var{op}) |
For non-negative numbers, return the population count of @var{op}. For |
If @math{@var{op}@ge{}0}, return the population count of @var{op}, which is |
negative numbers, return the largest possible value (@var{MAX_ULONG}). |
the number of 1 bits in the binary representation. If @math{@var{op}<0}, the |
|
number of 1s is infinite, and the return value is @var{MAX_ULONG}, the largest |
|
possible @code{unsigned long}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpz_hamdist (mpz_t @var{op1}, mpz_t @var{op2}) |
@deftypefun {unsigned long int} mpz_hamdist (mpz_t @var{op1}, mpz_t @var{op2}) |
If @var{op1} and @var{op2} are both non-negative, return the hamming distance |
If @var{op1} and @var{op2} are both @math{@ge{}0} or both @math{<0}, return |
between the two operands. Otherwise, return the largest possible value |
the hamming distance between the two operands, which is the number of bit |
(@var{MAX_ULONG}). |
positions where @var{op1} and @var{op2} have different bit values. If one |
|
operand is @math{@ge{}0} and the other @math{<0} then the number of bits |
It is possible to extend this function to return a useful value when the |
different is infinite, and the return value is @var{MAX_ULONG}, the largest |
operands are both negative, but the current implementation returns |
possible @code{unsigned long}. |
@var{MAX_ULONG} in this case. @strong{Do not depend on this behavior, since |
|
it will change in a future release.} |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpz_scan0 (mpz_t @var{op}, unsigned long int @var{starting_bit}) |
@deftypefun {unsigned long int} mpz_scan0 (mpz_t @var{op}, unsigned long int @var{starting_bit}) |
Scan @var{op}, starting with bit @var{starting_bit}, towards more significant |
@deftypefunx {unsigned long int} mpz_scan1 (mpz_t @var{op}, unsigned long int @var{starting_bit}) |
bits, until the first clear bit is found. Return the index of the found bit. |
Scan @var{op}, starting from bit @var{starting_bit}, towards more significant |
@end deftypefun |
bits, until the first 0 or 1 bit (respectively) is found. Return the index of |
|
the found bit. |
|
|
@deftypefun {unsigned long int} mpz_scan1 (mpz_t @var{op}, unsigned long int @var{starting_bit}) |
If the bit at @var{starting_bit} is already what's sought, then |
Scan @var{op}, starting with bit @var{starting_bit}, towards more significant |
@var{starting_bit} is returned. |
bits, until the first set bit is found. Return the index of the found bit. |
|
|
If there's no bit found, then @var{MAX_ULONG} is returned. This will happen |
|
in @code{mpz_scan0} past the end of a positive number, or @code{mpz_scan1} |
|
past the end of a negative. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_setbit (mpz_t @var{rop}, unsigned long int @var{bit_index}) |
@deftypefun void mpz_setbit (mpz_t @var{rop}, unsigned long int @var{bit_index}) |
Line 2085 Clear bit @var{bit_index} in @var{rop}. |
|
Line 3351 Clear bit @var{bit_index} in @var{rop}. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpz_tstbit (mpz_t @var{op}, unsigned long int @var{bit_index}) |
@deftypefun int mpz_tstbit (mpz_t @var{op}, unsigned long int @var{bit_index}) |
Check bit @var{bit_index} in @var{op} and return 0 or 1 accordingly. |
Test bit @var{bit_index} in @var{op} and return 0 or 1 accordingly. |
@end deftypefun |
@end deftypefun |
|
|
@node I/O of Integers, Integer Random Numbers, Integer Logic and Bit Fiddling, Integer Functions |
@node I/O of Integers, Integer Random Numbers, Integer Logic and Bit Fiddling, Integer Functions |
|
|
|
|
|
|
@need 2000 |
@need 2000 |
@node Integer Random Numbers, Miscellaneous Integer Functions, I/O of Integers, Integer Functions |
@node Integer Random Numbers, Integer Import and Export, I/O of Integers, Integer Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@section Random Number Functions |
@section Random Number Functions |
@cindex Integer random number functions |
@cindex Integer random number functions |
Line 2161 parameter that is read and modified. Please see the @ |
|
Line 3427 parameter that is read and modified. Please see the @ |
|
Functions} for more information on how to use and not to use random |
Functions} for more information on how to use and not to use random |
number functions. |
number functions. |
|
|
@deftypefun void mpz_urandomb (mpz_t @var{rop}, gmp_randstate_t @var{state}, |
@deftypefun void mpz_urandomb (mpz_t @var{rop}, gmp_randstate_t @var{state}, unsigned long int @var{n}) |
unsigned long int @var{n}) |
Generate a uniformly distributed random integer in the range 0 to @m{2^n-1, |
Generate a uniformly distributed random integer in the range |
2^@var{n}@minus{}1}, inclusive. |
@ifnottex |
|
0 to 2^@var{n} @minus{} 1, |
|
@end ifnottex |
|
@tex |
|
0 to $2^n-1$, |
|
@end tex |
|
inclusive. |
|
|
|
The variable @var{state} must be initialized by calling one of the |
The variable @var{state} must be initialized by calling one of the |
@code{gmp_randinit} functions (@ref{Random State Initialization}) before |
@code{gmp_randinit} functions (@ref{Random State Initialization}) before |
invoking this function. |
invoking this function. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpz_urandomm (mpz_t @var{rop}, gmp_randstate_t @var{state}, |
@deftypefun void mpz_urandomm (mpz_t @var{rop}, gmp_randstate_t @var{state}, mpz_t @var{n}) |
mpz_t @var{n}) |
Generate a uniform random integer in the range 0 to @math{@var{n}-1}, |
Generate a uniform random integer in the range 0 to |
inclusive. |
@ifnottex |
|
@var{n} @minus{} 1, inclusive. |
|
@end ifnottex |
|
@tex |
|
$n-1$, inclusive. |
|
@end tex |
|
|
|
The variable @var{state} must be initialized by calling one of the |
The variable @var{state} must be initialized by calling one of the |
@code{gmp_randinit} functions (@ref{Random State Initialization}) |
@code{gmp_randinit} functions (@ref{Random State Initialization}) |
Line 2197 Generate a random integer with long strings of zeros a |
|
Line 3450 Generate a random integer with long strings of zeros a |
|
binary representation. Useful for testing functions and algorithms, |
binary representation. Useful for testing functions and algorithms, |
since this kind of random numbers have proven to be more likely to |
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 |
trigger corner-case bugs. The random number will be in the range |
@ifnottex |
0 to @m{2^n-1, 2^@var{n}@minus{}1}, inclusive. |
0 to 2^@var{n} @minus{} 1, |
|
@end ifnottex |
|
@tex |
|
0 to $2^n-1$, |
|
@end tex |
|
inclusive. |
|
|
|
The variable @var{state} must be initialized by calling one of the |
The variable @var{state} must be initialized by calling one of the |
@code{gmp_randinit} functions (@ref{Random State Initialization}) |
@code{gmp_randinit} functions (@ref{Random State Initialization}) |
Line 2230 This function is obsolete. Use @code{mpz_rrandomb} in |
|
Line 3477 This function is obsolete. Use @code{mpz_rrandomb} in |
|
@end deftypefun |
@end deftypefun |
|
|
|
|
|
@node Integer Import and Export, Miscellaneous Integer Functions, Integer Random Numbers, Integer Functions |
|
@section Integer Import and Export |
|
|
|
@code{mpz_t} variables can be converted to and from arbitrary words of binary |
|
data with the following functions. |
|
|
|
@deftypefun void mpz_import (mpz_t @var{rop}, size_t @var{count}, int @var{order}, int @var{size}, int @var{endian}, size_t @var{nails}, const void *@var{op}) |
|
@cindex Integer import |
|
@cindex Import |
|
Set @var{rop} from an array of word data at @var{op}. |
|
|
|
The parameters specify the format of the data. @var{count} many words are |
|
read, each @var{size} bytes. @var{order} can be 1 for most significant word |
|
first or -1 for least significant first. Within each word @var{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 @var{nails} bits |
|
of each word are skipped, this can be 0 to use the full words. |
|
|
|
There are no data alignment restrictions on @var{op}, any address is allowed. |
|
|
|
Here's an example converting an array of @code{unsigned long} data, most |
|
significant element first and host byte order within each value. |
|
|
|
@example |
|
unsigned long a[20]; |
|
mpz_t z; |
|
mpz_import (z, 20, 1, sizeof(a[0]), 0, 0, a); |
|
@end example |
|
|
|
This example assumes the full @code{sizeof} bytes are used for data in the |
|
given type, which is usually true, and certainly true for @code{unsigned long} |
|
everywhere we know of. However on Cray vector systems it may be noted that |
|
@code{short} and @code{int} are always stored in 8 bytes (and with |
|
@code{sizeof} indicating that) but use only 32 or 46 bits. The @var{nails} |
|
feature can account for this, by passing for instance |
|
@code{8*sizeof(int)-INT_BIT}. |
|
@end deftypefun |
|
|
|
@deftypefun void *mpz_export (void *@var{rop}, size_t *@var{count}, int @var{order}, int @var{size}, int @var{endian}, size_t @var{nails}, mpz_t @var{op}) |
|
@cindex Integer export |
|
@cindex Export |
|
Fill @var{rop} with word data from @var{op}. |
|
|
|
The parameters specify the format of the data produced. Each word will be |
|
@var{size} bytes and @var{order} can be 1 for most significant word first or |
|
-1 for least significant first. Within each word @var{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 @var{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 @code{*@var{count}}. @var{rop} |
|
must have enough space for the data, or if @var{rop} is @code{NULL} then a |
|
result array of the necessary size is allocated using the current GMP |
|
allocation function (@pxref{Custom Allocation}). In either case the return |
|
value is the destination used, @var{rop} or the allocated block. |
|
|
|
If @var{op} is non-zero then the most significant word produced will be |
|
non-zero. If @var{op} is zero then the count returned will be zero and |
|
nothing written to @var{rop}. If @var{rop} is @code{NULL} in this case, no |
|
block is allocated, just @code{NULL} is returned. |
|
|
|
There are no data alignment restrictions on @var{rop}, any address is allowed. |
|
The sign of @var{op} is ignored, just the absolute value is used. |
|
|
|
When an application is allocating space itself the required size can be |
|
determined with a calculation like the following. Since @code{mpz_sizeinbase} |
|
always returns at least 1, @code{count} here will be at least one, which |
|
avoids any portability problems with @code{malloc(0)}, though if @code{z} is |
|
zero no space at all is actually needed. |
|
|
|
@example |
|
numb = 8*size - nail; |
|
count = (mpz_sizeinbase (z, 2) + numb-1) / numb; |
|
p = malloc (count * size); |
|
@end example |
|
@end deftypefun |
|
|
|
|
@need 2000 |
@need 2000 |
@node Miscellaneous Integer Functions, , Integer Random Numbers, Integer Functions |
@node Miscellaneous Integer Functions, , Integer Import and Export, Integer Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@section Miscellaneous Functions |
@section Miscellaneous Functions |
@cindex Miscellaneous integer functions |
@cindex Miscellaneous integer functions |
Line 2251 short int}, or @code{signed short int}, respectively. |
|
Line 3576 short int}, or @code{signed short int}, respectively. |
|
@deftypefn Macro int mpz_odd_p (mpz_t @var{op}) |
@deftypefn Macro int mpz_odd_p (mpz_t @var{op}) |
@deftypefnx Macro int mpz_even_p (mpz_t @var{op}) |
@deftypefnx Macro int mpz_even_p (mpz_t @var{op}) |
Determine whether @var{op} is odd or even, respectively. Return non-zero if |
Determine whether @var{op} is odd or even, respectively. Return non-zero if |
yes, zero if no. These macros evaluate their arguments more than once. |
yes, zero if no. These macros evaluate their argument more than once. |
@end deftypefn |
@end deftypefn |
|
|
@deftypefun size_t mpz_size (mpz_t @var{op}) |
@deftypefun size_t mpz_size (mpz_t @var{op}) |
Line 2262 the returned value will be zero. |
|
Line 3587 the returned value will be zero. |
|
|
|
@deftypefun size_t mpz_sizeinbase (mpz_t @var{op}, int @var{base}) |
@deftypefun size_t mpz_sizeinbase (mpz_t @var{op}, int @var{base}) |
Return the size of @var{op} measured in number of digits in base @var{base}. |
Return the size of @var{op} measured in number of digits in base @var{base}. |
The base may vary from 2 to 36. The returned value will be exact or 1 too |
The base may vary from 2 to 36. The sign of @var{op} is ignored, just the |
big. If @var{base} is a power of 2, the returned value will always be exact. |
absolute value is used. The result will be exact or 1 too big. If @var{base} |
|
is a power of 2, the result will always be exact. If @var{op} is zero the |
|
return value is always 1. |
|
|
This function is useful in order to allocate the right amount of space before |
This function is useful in order to allocate the right amount of space before |
converting @var{op} to a string. The right amount of allocation is normally |
converting @var{op} to a string. The right amount of allocation is normally |
two more than the value returned by @code{mpz_sizeinbase} (one extra for a |
two more than the value returned by @code{mpz_sizeinbase} (one extra for a |
minus sign and one for the terminating '\0'). |
minus sign and one for the null-terminator). |
@end deftypefun |
@end deftypefun |
|
|
|
|
Line 2289 Zero has the unique representation 0/1. |
|
Line 3616 Zero has the unique representation 0/1. |
|
|
|
Pure assignment functions do not canonicalize the assigned variable. It is |
Pure assignment functions do not canonicalize the assigned variable. It is |
the responsibility of the user to canonicalize the assigned variable before |
the responsibility of the user to canonicalize the assigned variable before |
any arithmetic operations are performed on that variable. @strong{Note that |
any arithmetic operations are performed on that variable. |
this is an incompatible change from version 1 of the library.} |
|
|
|
@deftypefun void mpq_canonicalize (mpq_t @var{op}) |
@deftypefun void mpq_canonicalize (mpq_t @var{op}) |
Remove any factors that are common to the numerator and denominator of |
Remove any factors that are common to the numerator and denominator of |
Line 2299 Remove any factors that are common to the numerator an |
|
Line 3625 Remove any factors that are common to the numerator an |
|
|
|
@menu |
@menu |
* Initializing Rationals:: |
* Initializing Rationals:: |
|
* Rational Conversions:: |
* Rational Arithmetic:: |
* Rational Arithmetic:: |
* Comparing Rationals:: |
* Comparing Rationals:: |
* Applying Integer Functions:: |
* Applying Integer Functions:: |
* I/O of Rationals:: |
* I/O of Rationals:: |
* Miscellaneous Rational Functions:: |
|
@end menu |
@end menu |
|
|
@node Initializing Rationals, Rational Arithmetic, Rational Number Functions, Rational Number Functions |
@node Initializing Rationals, Rational Conversions, Rational Number Functions, Rational Number Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@section Initialization and Assignment Functions |
@section Initialization and Assignment Functions |
@cindex Initialization and assignment functions |
@cindex Initialization and assignment functions |
Line 2335 Set the value of @var{rop} to @var{op1}/@var{op2}. No |
|
Line 3661 Set the value of @var{rop} to @var{op1}/@var{op2}. No |
|
@code{mpq_canonicalize} before any operations are performed on @var{rop}. |
@code{mpq_canonicalize} before any operations are performed on @var{rop}. |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun int mpq_set_str (mpq_t @var{rop}, char *@var{str}, int @var{base}) |
|
Set @var{rop} from a null-terminated string @var{str} in the given @var{base}. |
|
|
|
The string can be an integer like ``41'' or a fraction like ``41/152''. The |
|
fraction must be in canonical form (@pxref{Rational Number Functions}), or if |
|
not then @code{mpq_canonicalize} must be called. |
|
|
|
The numerator and optional denominator are parsed the same as in |
|
@code{mpz_set_str} (@pxref{Assigning Integers}). White space is allowed in |
|
the string, and is simply ignored. The @var{base} can vary from 2 to 36, or |
|
if @var{base} is 0 then the leading characters are used: @code{0x} for hex, |
|
@code{0} for octal, or decimal otherwise. Note that this is done separately |
|
for the numerator and denominator, so for instance @code{0xEF/100} is 239/100, |
|
whereas @code{0xEF/0x100} is 239/256. |
|
|
|
The return value is 0 if the entire string is a valid number, or @minus{}1 if |
|
not. |
|
@end deftypefun |
|
|
@deftypefun void mpq_swap (mpq_t @var{rop1}, mpq_t @var{rop2}) |
@deftypefun void mpq_swap (mpq_t @var{rop1}, mpq_t @var{rop2}) |
Swap the values @var{rop1} and @var{rop2} efficiently. |
Swap the values @var{rop1} and @var{rop2} efficiently. |
@end deftypefun |
@end deftypefun |
|
|
|
|
@node Rational Arithmetic, Comparing Rationals, Initializing Rationals, Rational Number Functions |
@need 2000 |
|
@node Rational Conversions, Rational Arithmetic, Initializing Rationals, Rational Number Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
|
@section Conversion Functions |
|
@cindex Rational conversion functions |
|
@cindex Conversion functions |
|
|
|
@deftypefun double mpq_get_d (mpq_t @var{op}) |
|
Convert @var{op} to a @code{double}. |
|
@end deftypefun |
|
|
|
@deftypefun void mpq_set_d (mpq_t @var{rop}, double @var{op}) |
|
@deftypefunx void mpq_set_f (mpq_t @var{rop}, mpf_t @var{op}) |
|
Set @var{rop} to the value of @var{op}, without rounding. |
|
@end deftypefun |
|
|
|
@deftypefun {char *} mpq_get_str (char *@var{str}, int @var{base}, mpq_t @var{op}) |
|
Convert @var{op} to a string of digits in base @var{base}. The base may vary |
|
from 2 to 36. The string will be of the form @samp{num/den}, or if the |
|
denominator is 1 then just @samp{num}. |
|
|
|
If @var{str} is @code{NULL}, the result string is allocated using the current |
|
allocation function (@pxref{Custom Allocation}). The block will be |
|
@code{strlen(str)+1} bytes, that being exactly enough for the string and |
|
null-terminator. |
|
|
|
If @var{str} is not @code{NULL}, it should point to a block of storage large |
|
enough for the result, that being |
|
|
|
@example |
|
mpz_sizeinbase (mpq_numref(@var{op}), @var{base}) |
|
+ mpz_sizeinbase (mpq_denref(@var{op}), @var{base}) + 3 |
|
@end example |
|
|
|
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 @var{str}. |
|
@end deftypefun |
|
|
|
|
|
@node Rational Arithmetic, Comparing Rationals, Rational Conversions, Rational Number Functions |
|
@comment node-name, next, previous, up |
@section Arithmetic Functions |
@section Arithmetic Functions |
@cindex Rational arithmetic functions |
@cindex Rational arithmetic functions |
@cindex Arithmetic functions |
@cindex Arithmetic functions |
Line 2355 Set @var{difference} to @var{minuend} @minus{} @var{su |
|
Line 3742 Set @var{difference} to @var{minuend} @minus{} @var{su |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpq_mul (mpq_t @var{product}, mpq_t @var{multiplier}, mpq_t @var{multiplicand}) |
@deftypefun void mpq_mul (mpq_t @var{product}, mpq_t @var{multiplier}, mpq_t @var{multiplicand}) |
@ifnottex |
Set @var{product} to @math{@var{multiplier} @GMPtimes{} @var{multiplicand}}. |
Set @var{product} to @var{multiplier} times @var{multiplicand}. |
|
@end ifnottex |
|
@tex |
|
Set @var{product} to $@var{multiplier} \times @var{multiplicand}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun void mpq_mul_2exp (mpq_t @var{rop}, mpq_t @var{op1}, unsigned long int @var{op2}) |
|
Set @var{rop} to @m{@var{op1} \times 2^{op2}, @var{op1} times 2 raised to |
|
@var{op2}}. |
|
@end deftypefun |
|
|
@deftypefun void mpq_div (mpq_t @var{quotient}, mpq_t @var{dividend}, mpq_t @var{divisor}) |
@deftypefun void mpq_div (mpq_t @var{quotient}, mpq_t @var{dividend}, mpq_t @var{divisor}) |
@cindex Division functions |
@cindex Division functions |
Set @var{quotient} to @var{dividend}/@var{divisor}. |
Set @var{quotient} to @var{dividend}/@var{divisor}. |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun void mpq_div_2exp (mpq_t @var{rop}, mpq_t @var{op1}, unsigned long int @var{op2}) |
|
Set @var{rop} to @m{@var{op1}/2^{op2}, @var{op1} divided by 2 raised to |
|
@var{op2}}. |
|
@end deftypefun |
|
|
@deftypefun void mpq_neg (mpq_t @var{negated_operand}, mpq_t @var{operand}) |
@deftypefun void mpq_neg (mpq_t @var{negated_operand}, mpq_t @var{operand}) |
Set @var{negated_operand} to @minus{}@var{operand}. |
Set @var{negated_operand} to @minus{}@var{operand}. |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun void mpq_abs (mpq_t @var{rop}, mpq_t @var{op}) |
|
Set @var{rop} to the absolute value of @var{op}. |
|
@end deftypefun |
|
|
@deftypefun void mpq_inv (mpq_t @var{inverted_number}, mpq_t @var{number}) |
@deftypefun void mpq_inv (mpq_t @var{inverted_number}, mpq_t @var{number}) |
Set @var{inverted_number} to 1/@var{number}. If the new denominator is |
Set @var{inverted_number} to 1/@var{number}. If the new denominator is |
zero, this routine will divide by zero. |
zero, this routine will divide by zero. |
Line 2384 zero, this routine will divide by zero. |
|
Line 3780 zero, this routine will divide by zero. |
|
@cindex Comparison functions |
@cindex Comparison functions |
|
|
@deftypefun int mpq_cmp (mpq_t @var{op1}, mpq_t @var{op2}) |
@deftypefun int mpq_cmp (mpq_t @var{op1}, mpq_t @var{op2}) |
@ifnottex |
Compare @var{op1} and @var{op2}. Return a positive value if @math{@var{op1} > |
Compare @var{op1} and @var{op2}. Return a positive value if @var{op1} > |
@var{op2}}, zero if @math{@var{op1} = @var{op2}}, and a negative value if |
@var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} < |
@math{@var{op1} < @var{op2}}. |
@var{op2}. |
|
@end ifnottex |
|
@tex |
|
Compare @var{op1} and @var{op2}. Return a positive value if $@var{op1} > |
|
@var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1} |
|
< @var{op2}$. |
|
@end tex |
|
|
|
To determine if two rationals are equal, @code{mpq_equal} is faster than |
To determine if two rationals are equal, @code{mpq_equal} is faster than |
@code{mpq_cmp}. |
@code{mpq_cmp}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefn Macro int mpq_cmp_ui (mpq_t @var{op1}, unsigned long int @var{num2}, unsigned long int @var{den2}) |
@deftypefn Macro int mpq_cmp_ui (mpq_t @var{op1}, unsigned long int @var{num2}, unsigned long int @var{den2}) |
@ifnottex |
@deftypefnx Macro int mpq_cmp_si (mpq_t @var{op1}, long int @var{num2}, unsigned long int @var{den2}) |
Compare @var{op1} and @var{num2}/@var{den2}. Return a positive value if |
Compare @var{op1} and @var{num2}/@var{den2}. Return a positive value if |
@var{op1} > @var{num2}/@var{den2}, zero if @var{op1} = @var{num2}/@var{den2}, |
@math{@var{op1} > @var{num2}/@var{den2}}, zero if @math{@var{op1} = |
and a negative value if @var{op1} < @var{num2}/@var{den2}. |
@var{num2}/@var{den2}}, and a negative value if @math{@var{op1} < |
@end ifnottex |
@var{num2}/@var{den2}}. |
@tex |
|
Compare @var{op1} and @var{num2}/@var{den2}. Return a positive value if |
|
$@var{op1} > @var{num2}/@var{den2}$, zero if $@var{op1} = |
|
@var{num2}/@var{den2}$, and a negative value if $@var{op1} < |
|
@var{num2}/@var{den2}$. |
|
@end tex |
|
|
|
This routine allows that @var{num2} and @var{den2} have common factors. |
@var{num2} and @var{den2} are allowed to have common factors. |
|
|
This function is actually implemented as a macro. It evaluates its |
These functions are implemented as a macros and evaluate their arguments |
arguments multiple times. |
multiple times. |
@end deftypefn |
@end deftypefn |
|
|
@deftypefn Macro int mpq_sgn (mpq_t @var{op}) |
@deftypefn Macro int mpq_sgn (mpq_t @var{op}) |
@ifnottex |
@cindex Sign tests |
Return +1 if @var{op} > 0, 0 if @var{op} = 0, and @minus{}1 if @var{op} < 0. |
@cindex Rational sign tests |
@end ifnottex |
Return @math{+1} if @math{@var{op} > 0}, 0 if @math{@var{op} = 0}, and |
@tex |
@math{-1} if @math{@var{op} < 0}. |
Return $+1$ if $@var{op} > 0$, 0 if $@var{op} = 0$, and $-1$ if $@var{op} < 0$. |
|
@end tex |
|
|
|
This function is actually implemented as a macro. It evaluates its |
This function is actually implemented as a macro. It evaluates its |
arguments multiple times. |
arguments multiple times. |
Line 2443 function is much faster. |
|
Line 3824 function is much faster. |
|
@cindex Numerator and denominator |
@cindex Numerator and denominator |
|
|
The set of @code{mpq} functions is quite small. In particular, there are few |
The set of @code{mpq} functions is quite small. In particular, there are few |
functions for either input or output. But there are two macros that allow us |
functions for either input or output. The following functions give direct |
to apply any @code{mpz} function on the numerator or denominator of a rational |
access to the numerator and denominator of an @code{mpq_t}. |
number. If these macros are used to assign to the rational number, |
|
@code{mpq_canonicalize} normally need to be called afterwards. |
|
|
|
|
Note that if an assignment to the numerator and/or denominator could take an |
|
@code{mpq_t} out of the canonical form described at the start of this chapter |
|
(@pxref{Rational Number Functions}) then @code{mpq_canonicalize} must be |
|
called before any other @code{mpq} functions are applied to that @code{mpq_t}. |
|
|
@deftypefn Macro mpz_t mpq_numref (mpq_t @var{op}) |
@deftypefn Macro mpz_t mpq_numref (mpq_t @var{op}) |
@deftypefnx Macro mpz_t mpq_denref (mpq_t @var{op}) |
@deftypefnx Macro mpz_t mpq_denref (mpq_t @var{op}) |
Return a reference to the numerator and denominator of @var{op}, respectively. |
Return a reference to the numerator and denominator of @var{op}, respectively. |
The @code{mpz} functions can be used on the result of these macros. |
The @code{mpz} functions can be used on the result of these macros. |
@end deftypefn |
@end deftypefn |
|
|
|
@deftypefun void mpq_get_num (mpz_t @var{numerator}, mpq_t @var{rational}) |
|
@deftypefunx void mpq_get_den (mpz_t @var{denominator}, mpq_t @var{rational}) |
|
@deftypefunx void mpq_set_num (mpq_t @var{rational}, mpz_t @var{numerator}) |
|
@deftypefunx void mpq_set_den (mpq_t @var{rational}, mpz_t @var{denominator}) |
|
Get or set the numerator or denominator of a rational. These functions are |
|
equivalent to calling @code{mpz_set} with an appropriate @code{mpq_numref} or |
|
@code{mpq_denref}. Direct use of @code{mpq_numref} or @code{mpq_denref} is |
|
recommended instead of these functions. |
|
@end deftypefun |
|
|
|
|
@need 2000 |
@need 2000 |
@node I/O of Rationals, Miscellaneous Rational Functions, Applying Integer Functions, Rational Number Functions |
@node I/O of Rationals, , Applying Integer Functions, Rational Number Functions |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@section Input and Output Functions |
@section Input and Output Functions |
@cindex Rational input and output functions |
@cindex Rational input and output functions |
Line 2464 The @code{mpz} functions can be used on the result of |
|
Line 3858 The @code{mpz} functions can be used on the result of |
|
@cindex Output functions |
@cindex Output functions |
@cindex I/O functions |
@cindex I/O functions |
|
|
Functions that perform input from a stdio stream, and functions that output to |
When using any of these functions, it's a good idea to include @file{stdio.h} |
a stdio stream. Passing a @code{NULL} pointer for a @var{stream} argument to |
|
any of these functions will make them read from @code{stdin} and write to |
|
@code{stdout}, respectively. |
|
|
|
When using any of these functions, it is a good idea to include @file{stdio.h} |
|
before @file{gmp.h}, since that will allow @file{gmp.h} to define prototypes |
before @file{gmp.h}, since that will allow @file{gmp.h} to define prototypes |
for these functions. |
for these functions. |
|
|
|
Passing a @code{NULL} pointer for a @var{stream} argument to any of these |
|
functions will make them read from @code{stdin} and write to @code{stdout}, |
|
respectively. |
|
|
@deftypefun size_t mpq_out_str (FILE *@var{stream}, int @var{base}, mpq_t @var{op}) |
@deftypefun size_t mpq_out_str (FILE *@var{stream}, int @var{base}, mpq_t @var{op}) |
Output @var{op} on stdio stream @var{stream}, as a string of digits in base |
Output @var{op} on stdio stream @var{stream}, as a string of digits in base |
@var{base}. The base may vary from 2 to 36. Output is in the form |
@var{base}. The base may vary from 2 to 36. Output is in the form |
Line 2481 Output @var{op} on stdio stream @var{stream}, as a str |
|
Line 3874 Output @var{op} on stdio stream @var{stream}, as a str |
|
Return the number of bytes written, or if an error occurred, return 0. |
Return the number of bytes written, or if an error occurred, return 0. |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun size_t mpq_inp_str (mpq_t @var{rop}, FILE *@var{stream}, int @var{base}) |
|
Read a string of digits from @var{stream} and convert them to a rational in |
|
@var{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. |
|
|
@need 2000 |
The input can be a fraction like @samp{17/63} or just an integer like |
@node Miscellaneous Rational Functions, , I/O of Rationals, Rational Number Functions |
@samp{123}. Reading stops at the first character not in this form, and white |
@comment node-name, next, previous, up |
space is not permitted within the string. If the input might not be in |
@section Miscellaneous Functions |
canonical form, then @code{mpq_canonicalize} must be called (@pxref{Rational |
@cindex Rational miscellaneous functions |
Number Functions}). |
@cindex Miscellaneous rational functions |
|
|
|
@deftypefun double mpq_get_d (mpq_t @var{op}) |
The @var{base} can be between 2 and 36, or can be 0 in which case the leading |
Convert @var{op} to a double. |
characters of the string determine the base, @samp{0x} or @samp{0X} for |
|
hexadecimal, @samp{0} for octal, or decimal otherwise. The leading characters |
|
are examined separately for the numerator and denominator of a fraction, so |
|
for instance @samp{0x10/11} is 16/11, whereas @samp{0x10/0x11} is 16/17. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpq_set_d (mpq_t @var{rop}, double @var{d}) |
|
Set @var{rop} to the value of d, without rounding. |
|
@end deftypefun |
|
|
|
These functions assign between either the numerator or denominator of a |
|
rational, and an integer. Instead of using these functions, it is preferable |
|
to use the more general mechanisms @code{mpq_numref} and @code{mpq_denref}, |
|
together with @code{mpz_set}. |
|
|
|
@deftypefun void mpq_set_num (mpq_t @var{rational}, mpz_t @var{numerator}) |
|
Copy @var{numerator} to the numerator of @var{rational}. When this risks to |
|
make the numerator and denominator of @var{rational} have common factors, you |
|
have to pass @var{rational} to @code{mpq_canonicalize} before any operations |
|
are performed on @var{rational}. |
|
|
|
This function is equivalent to |
|
@code{mpz_set (mpq_numref (@var{rational}), @var{numerator})}. |
|
@end deftypefun |
|
|
|
@deftypefun void mpq_set_den (mpq_t @var{rational}, mpz_t @var{denominator}) |
|
Copy @var{denominator} to the denominator of @var{rational}. When this risks |
|
to make the numerator and denominator of @var{rational} have common factors, |
|
or if the denominator might be negative, you have to pass @var{rational} to |
|
@code{mpq_canonicalize} before any operations are performed on @var{rational}. |
|
|
|
@strong{In version 1 of the library, negative denominators were handled by |
|
copying the sign to the numerator. That is no longer done.} |
|
|
|
This function is equivalent to |
|
@code{mpz_set (mpq_denref (@var{rational}), @var{denominators})}. |
|
@end deftypefun |
|
|
|
@deftypefun void mpq_get_num (mpz_t @var{numerator}, mpq_t @var{rational}) |
|
Copy the numerator of @var{rational} to the integer @var{numerator}, to |
|
prepare for integer operations on the numerator. |
|
|
|
This function is equivalent to |
|
@code{mpz_set (@var{numerator}, mpq_numref (@var{rational}))}. |
|
@end deftypefun |
|
|
|
@deftypefun void mpq_get_den (mpz_t @var{denominator}, mpq_t @var{rational}) |
|
Copy the denominator of @var{rational} to the integer @var{denominator}, to |
|
prepare for integer operations on the denominator. |
|
|
|
This function is equivalent to |
|
@code{mpz_set (@var{denominator}, mpq_denref (@var{rational}))}. |
|
@end deftypefun |
|
|
|
|
|
@node Floating-point Functions, Low-level Functions, Rational Number Functions, Top |
@node Floating-point Functions, Low-level Functions, Rational Number Functions, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@chapter Floating-point Functions |
@chapter Floating-point Functions |
@cindex Floating-point functions |
@cindex Floating-point functions |
@cindex Float functions |
@cindex Float functions |
|
@cindex User-defined precision |
|
@cindex Precision of floats |
|
|
This chapter describes the GMP functions for performing floating point |
GMP floating point numbers are stored in objects of type @code{mpf_t} and |
arithmetic. These functions start with the prefix @code{mpf_}. |
functions operating on them have an @code{mpf_} prefix. |
|
|
GMP floating point numbers are stored in objects of type @code{mpf_t}. |
The mantissa of each float has a user-selectable precision, limited only by |
|
available memory. Each variable has its own precision, and that can be |
|
increased or decreased at any time. |
|
|
The GMP floating-point functions have an interface that is similar to the GMP |
The exponent of each float is a fixed precision, one machine word on most |
integer functions. The function prefix for floating-point operations is |
systems. In the current implementation the exponent is a count of limbs, so |
@code{mpf_}. |
for example on a 32-bit system this means a range of roughly |
|
@math{2^@W{-68719476768}} to @math{2^@W{68719476736}}, or on a 64-bit system |
|
this will be greater. Note however @code{mpf_get_str} can only return an |
|
exponent which fits an @code{mp_exp_t} and currently @code{mpf_set_str} |
|
doesn't accept exponents bigger than a @code{long}. |
|
|
There is one significant characteristic of floating-point numbers that has |
Each variable keeps a size for the mantissa data actually in use. This means |
motivated a difference between this function class and other GMP function |
that if a float is exactly represented in only a few bits then only those bits |
classes: the inherent inexactness of floating point arithmetic. The user has |
will be used in a calculation, even if the selected precision is high. |
to specify the precision of each variable. A computation that assigns a |
|
variable will take place with the precision of the assigned variable; the |
|
precision of variables used as input is ignored. |
|
|
|
@cindex User-defined precision |
All calculations are performed to the precision of the destination variable. |
@cindex Precision of floats |
Each function is defined to calculate with ``infinite precision'' followed by |
The precision of a calculation is defined as follows: Compute the requested |
a truncation to the destination precision, but of course the work done is only |
operation exactly (with ``infinite precision''), and truncate the result to |
what's needed to determine a result under that definition. |
the destination variable precision. Even if the user has asked for a very |
|
high precision, GMP will not calculate with superfluous digits. For example, |
|
if two low-precision numbers of nearly equal magnitude are added, the |
|
precision of the result will be limited to what is required to represent the |
|
result accurately. |
|
|
|
The GMP floating-point functions are @emph{not} intended as a smooth extension |
The precision selected for a variable is a minimum value, GMP may increase it |
to the IEEE P754 arithmetic. Specifically, the results obtained on one |
a little to facilitate efficient calculation. Currently this means rounding |
computer often differs from the results obtained on a computer with a |
up to a whole limb, and then sometimes having a further partial limb, |
different word size. |
depending on the high limb of the mantissa. But applications shouldn't be |
|
concerned by such details. |
|
|
|
The mantissa in stored in binary, as might be imagined from the fact |
|
precisions are expressed in bits. One consequence of this is that decimal |
|
fractions like @math{0.1} cannot be represented exactly. The same is true of |
|
plain IEEE @code{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.) |
|
|
|
@code{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. This might change in a future release. |
|
|
|
Note that the @code{mpf} functions are @emph{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. |
|
|
@menu |
@menu |
* Initializing Floats:: |
* Initializing Floats:: |
* Assigning Floats:: |
* Assigning Floats:: |
Line 2602 subsequent calls to @code{mpf_init} will use this prec |
|
Line 3972 subsequent calls to @code{mpf_init} will use this prec |
|
initialized variables are unaffected. |
initialized variables are unaffected. |
@end deftypefun |
@end deftypefun |
|
|
|
@deftypefun {unsigned long int} mpf_get_default_prec (void) |
|
Return the default default precision actually used. |
|
@end deftypefun |
|
|
An @code{mpf_t} object must be initialized before storing the first value in |
An @code{mpf_t} object must be initialized before storing the first value in |
it. The functions @code{mpf_init} and @code{mpf_init2} are used for that |
it. The functions @code{mpf_init} and @code{mpf_init2} are used for that |
purpose. |
purpose. |
Line 2629 Here is an example on how to initialize floating-point |
|
Line 4003 Here is an example on how to initialize floating-point |
|
@example |
@example |
@{ |
@{ |
mpf_t x, y; |
mpf_t x, y; |
mpf_init (x); /* use default precision */ |
mpf_init (x); /* use default precision */ |
mpf_init2 (y, 256); /* precision @emph{at least} 256 bits */ |
mpf_init2 (y, 256); /* precision @emph{at least} 256 bits */ |
@dots{} |
@dots{} |
/* Unless the program is about to exit, do ... */ |
/* Unless the program is about to exit, do ... */ |
mpf_clear (x); |
mpf_clear (x); |
Line 2643 calculation. A typical use would be for adjusting the |
|
Line 4017 calculation. A typical use would be for adjusting the |
|
iterative algorithms like Newton-Raphson, making the computation precision |
iterative algorithms like Newton-Raphson, making the computation precision |
closely match the actual accurate part of the numbers. |
closely match the actual accurate part of the numbers. |
|
|
@deftypefun void mpf_set_prec (mpf_t @var{rop}, unsigned long int @var{prec}) |
@deftypefun {unsigned long int} mpf_get_prec (mpf_t @var{op}) |
Set the precision of @var{rop} to be @strong{at least} @var{prec} bits. |
Return the current precision of @var{op}, in bits. |
Since changing the precision involves calls to @code{realloc}, this routine |
|
should not be called in a tight loop. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpf_get_prec (mpf_t @var{op}) |
@deftypefun void mpf_set_prec (mpf_t @var{rop}, unsigned long int @var{prec}) |
Return the precision actually used for assignments of @var{op}. |
Set the precision of @var{rop} to be @strong{at least} @var{prec} bits. The |
|
value in @var{rop} will be truncated to the new precision. |
|
|
|
This function requires a call to @code{realloc}, and so should not be used in |
|
a tight loop. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_set_prec_raw (mpf_t @var{rop}, unsigned long int @var{prec}) |
@deftypefun void mpf_set_prec_raw (mpf_t @var{rop}, unsigned long int @var{prec}) |
Set the precision of @var{rop} to be @strong{at least} @var{prec} bits. This |
Set the precision of @var{rop} to be @strong{at least} @var{prec} bits, |
is a low-level function that does not change the allocation. The @var{prec} |
without changing the memory allocated. |
argument must not be larger that the precision previously returned by |
|
@code{mpf_get_prec}. It is crucial that the precision of @var{rop} is |
@var{prec} must be no more than the allocated precision for @var{rop}, that |
ultimately reset to exactly the value returned by @code{mpf_get_prec} before |
being the precision when @var{rop} was initialized, or in the most recent |
the first call to @code{mpf_set_prec_raw}. |
@code{mpf_set_prec}. |
|
|
|
The value in @var{rop} is unchanged, and in particular if it had a higher |
|
precision than @var{prec} it will retain that higher precision. New values |
|
written to @var{rop} will use the new @var{prec}. |
|
|
|
Before calling @code{mpf_clear} or the full @code{mpf_set_prec}, another |
|
@code{mpf_set_prec_raw} call must be made to restore @var{rop} to its original |
|
allocated precision. Failing to do so will have unpredictable results. |
|
|
|
@code{mpf_get_prec} can be used before @code{mpf_set_prec_raw} to get the |
|
original allocated precision. After @code{mpf_set_prec_raw} it reflects the |
|
@var{prec} value set. |
|
|
|
@code{mpf_set_prec_raw} is an efficient way to use an @code{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. |
@end deftypefun |
@end deftypefun |
|
|
|
|
Line 2687 Set the value of @var{rop} from the string in @var{str |
|
Line 4080 Set the value of @var{rop} from the string in @var{str |
|
form @samp{M@@N} or, if the base is 10 or less, alternatively @samp{MeN}. |
form @samp{M@@N} or, if the base is 10 or less, alternatively @samp{MeN}. |
@samp{M} is the mantissa and @samp{N} is the exponent. The mantissa is always |
@samp{M} is the mantissa and @samp{N} is the exponent. The mantissa is always |
in the specified base. The exponent is either in the specified base or, if |
in the specified base. The exponent is either in the specified base or, if |
@var{base} is negative, in decimal. |
@var{base} is negative, in decimal. The decimal point expected is taken from |
|
the current locale, on systems providing @code{localeconv}. |
|
|
The argument @var{base} may be in the ranges 2 to 36, or @minus{}36 to |
The argument @var{base} may be in the ranges 2 to 36, or @minus{}36 to |
@minus{}2. Negative values are used to specify that the exponent is in |
@minus{}2. Negative values are used to specify that the exponent is in |
Line 2703 the mantissa, but not in other places, such as after a |
|
Line 4097 the mantissa, but not in other places, such as after a |
|
exponent. We are considering changing the definition of this function, making |
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 |
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 |
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?] |
to accept @nicode{"3 14"} as meaning 314 as it does now?] |
|
|
This function returns 0 if the entire string up to the '\0' is a valid number |
This function returns 0 if the entire string is a valid number in base |
in base @var{base}. Otherwise it returns @minus{}1. |
@var{base}. Otherwise it returns @minus{}1. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_swap (mpf_t @var{rop1}, mpf_t @var{rop2}) |
@deftypefun void mpf_swap (mpf_t @var{rop1}, mpf_t @var{rop2}) |
Swap the values @var{rop1} and @var{rop2} efficiently. |
Swap @var{rop1} and @var{rop2} efficiently. Both the values and the |
|
precisions of the two variables are swapped. |
@end deftypefun |
@end deftypefun |
|
|
|
|
Line 2758 set by @code{mpf_set_default_prec}. |
|
Line 4153 set by @code{mpf_set_default_prec}. |
|
@cindex Conversion functions |
@cindex Conversion functions |
|
|
@deftypefun double mpf_get_d (mpf_t @var{op}) |
@deftypefun double mpf_get_d (mpf_t @var{op}) |
Convert @var{op} to a double. |
Convert @var{op} to a @code{double}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {char *} mpf_get_str (char *@var{str}, mp_exp_t *@var{expptr}, int @var{base}, size_t @var{n_digits}, mpf_t @var{op}) |
@deftypefun double mpf_get_d_2exp (signed long int *@var{exp}, mpf_t @var{op}) |
Convert @var{op} to a string of digits in base @var{base}. The base may vary |
Find @var{d} and @var{exp} such that @m{@var{d}\times 2^{exp}, @var{d} times 2 |
from 2 to 36. Generate at most @var{n_digits} significant digits, or if |
raised to @var{exp}}, with @math{0.5@le{}@GMPabs{@var{d}}<1}, is a good |
@var{n_digits} is 0, the maximum number of digits accurately representable by |
approximation to @var{op}. This is similar to the standard C function |
@var{op}. |
@code{frexp}. |
|
@end deftypefun |
|
|
If @var{str} is @code{NULL}, space for the mantissa is allocated using the default |
@deftypefun long mpf_get_si (mpf_t @var{op}) |
allocation function. |
@deftypefunx {unsigned long} mpf_get_ui (mpf_t @var{op}) |
|
Convert @var{op} to a @code{long} or @code{unsigned long}, truncating any |
|
fraction part. If @var{op} is too big for the return type, the result is |
|
undefined. |
|
|
If @var{str} is not @code{NULL}, it should point to a block of storage enough large |
See also @code{mpf_fits_slong_p} and @code{mpf_fits_ulong_p} |
for the mantissa, i.e., @var{n_digits} + 2. The two extra bytes are for a |
(@pxref{Miscellaneous Float Functions}). |
possible minus sign, and for the terminating null character. |
@end deftypefun |
|
|
The exponent is written through the pointer @var{expptr}. |
@deftypefun {char *} mpf_get_str (char *@var{str}, mp_exp_t *@var{expptr}, int @var{base}, size_t @var{n_digits}, mpf_t @var{op}) |
|
Convert @var{op} to a string of digits in base @var{base}. @var{base} can be |
|
2 to 36. Up to @var{n_digits} digits will be generated. Trailing zeros are |
|
not returned. No more digits than can be accurately represented by @var{op} |
|
are ever generated. If @var{n_digits} is 0 then that accurate maximum number |
|
of digits are generated. |
|
|
If @var{n_digits} is 0, the maximum number of digits meaningfully achievable |
If @var{str} is @code{NULL}, the result string is allocated using the current |
from the precision of @var{op} will be generated. Note that the space |
allocation function (@pxref{Custom Allocation}). The block will be |
requirements for @var{str} in this case will be impossible for the user to |
@code{strlen(str)+1} bytes, that being exactly enough for the string and |
predetermine. Therefore, you need to pass @code{NULL} for the string argument |
null-terminator. |
whenever @var{n_digits} is 0. |
|
|
|
|
If @var{str} is not @code{NULL}, it should point to a block of |
|
@math{@var{n_digits} + 2} bytes, that being enough for the mantissa, a |
|
possible minus sign, and a null-terminator. When @var{n_digits} is 0 to get |
|
all significant digits, an application won't be able to know the space |
|
required, and @var{str} should be @code{NULL} in that case. |
|
|
The generated string is a fraction, with an implicit radix point immediately |
The generated string is a fraction, with an implicit radix point immediately |
to the left of the first digit. For example, the number 3.1416 would be |
to the left of the first digit. The applicable exponent is written through |
returned as "31416" in the string and 1 written at @var{expptr}. |
the @var{expptr} pointer. For example, the number 3.1416 would be returned as |
|
string @nicode{"31416"} and exponent 1. |
|
|
A pointer to the result string is returned. This pointer will will either |
When @var{op} is zero, an empty string is produced and the exponent returned |
equal @var{str}, or if that is @code{NULL}, will point to the allocated storage. |
is 0. |
|
|
|
A pointer to the result string is returned, being either the allocated block |
|
or the given @var{str}. |
@end deftypefun |
@end deftypefun |
|
|
|
|
Line 2799 equal @var{str}, or if that is @code{NULL}, will point |
|
Line 4212 equal @var{str}, or if that is @code{NULL}, will point |
|
|
|
@deftypefun void mpf_add (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
@deftypefun void mpf_add (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
@deftypefunx void mpf_add_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@deftypefunx void mpf_add_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@ifnottex |
Set @var{rop} to @math{@var{op1} + @var{op2}}. |
Set @var{rop} to @var{op1} + @var{op2}. |
|
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{op1} + @var{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_sub (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
@deftypefun void mpf_sub (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
Line 2815 Set @var{rop} to @var{op1} @minus{} @var{op2}. |
|
Line 4223 Set @var{rop} to @var{op1} @minus{} @var{op2}. |
|
|
|
@deftypefun void mpf_mul (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
@deftypefun void mpf_mul (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
@deftypefunx void mpf_mul_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@deftypefunx void mpf_mul_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@ifnottex |
Set @var{rop} to @math{@var{op1} @GMPtimes{} @var{op2}}. |
Set @var{rop} to @var{op1} times @var{op2}. |
|
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{op1} \times @var{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
Division is undefined if the divisor is zero, and passing a zero divisor to |
Division is undefined if the divisor is zero, and passing a zero divisor to the |
the divide functions will make these functions intentionally divide by zero. |
divide functions will make these functions intentionally divide by zero. This |
This lets the user handle arithmetic exceptions in these functions in the same |
lets the user handle arithmetic exceptions in these functions in the same |
manner as other arithmetic exceptions. |
manner as other arithmetic exceptions. |
|
|
@deftypefun void mpf_div (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
@deftypefun void mpf_div (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
Line 2838 Set @var{rop} to @var{op1}/@var{op2}. |
|
Line 4241 Set @var{rop} to @var{op1}/@var{op2}. |
|
@deftypefun void mpf_sqrt (mpf_t @var{rop}, mpf_t @var{op}) |
@deftypefun void mpf_sqrt (mpf_t @var{rop}, mpf_t @var{op}) |
@deftypefunx void mpf_sqrt_ui (mpf_t @var{rop}, unsigned long int @var{op}) |
@deftypefunx void mpf_sqrt_ui (mpf_t @var{rop}, unsigned long int @var{op}) |
@cindex Root extraction functions |
@cindex Root extraction functions |
@ifnottex |
Set @var{rop} to @m{\sqrt{@var{op}}, the square root of @var{op}}. |
Set @var{rop} to the square root of @var{op}. |
|
@end ifnottex |
|
@tex |
|
Set @var{rop} to $\sqrt{@var{op}}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_pow_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@deftypefun void mpf_pow_ui (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@cindex Exponentiation functions |
@cindex Exponentiation functions |
@ifnottex |
@cindex Powering functions |
Set @var{rop} to @var{op1} raised to the power @var{op2}. |
Set @var{rop} to @m{@var{op1}^{op2}, @var{op1} raised to the power @var{op2}}. |
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{op1}^{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_neg (mpf_t @var{rop}, mpf_t @var{op}) |
@deftypefun void mpf_neg (mpf_t @var{rop}, mpf_t @var{op}) |
Line 2865 Set @var{rop} to the absolute value of @var{op}. |
|
Line 4259 Set @var{rop} to the absolute value of @var{op}. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_mul_2exp (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@deftypefun void mpf_mul_2exp (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@ifnottex |
Set @var{rop} to @m{@var{op1} \times 2^{op2}, @var{op1} times 2 raised to |
Set @var{rop} to @var{op1} times 2 raised to @var{op2}. |
@var{op2}}. |
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{op1} \times 2^{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_div_2exp (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@deftypefun void mpf_div_2exp (mpf_t @var{rop}, mpf_t @var{op1}, unsigned long int @var{op2}) |
@ifnottex |
Set @var{rop} to @m{@var{op1}/2^{op2}, @var{op1} divided by 2 raised to |
Set @var{rop} to @var{op1} divided by 2 raised to @var{op2}. |
@var{op2}}. |
@end ifnottex |
|
@tex |
|
Set @var{rop} to $@var{op1}/2^{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@node Float Comparison, I/O of Floats, Float Arithmetic, Floating-point Functions |
@node Float Comparison, I/O of Floats, Float Arithmetic, Floating-point Functions |
Line 2889 Set @var{rop} to $@var{op1}/2^{op2}$. |
|
Line 4275 Set @var{rop} to $@var{op1}/2^{op2}$. |
|
@cindex Comparison functions |
@cindex Comparison functions |
|
|
@deftypefun int mpf_cmp (mpf_t @var{op1}, mpf_t @var{op2}) |
@deftypefun int mpf_cmp (mpf_t @var{op1}, mpf_t @var{op2}) |
|
@deftypefunx int mpf_cmp_d (mpf_t @var{op1}, double @var{op2}) |
@deftypefunx int mpf_cmp_ui (mpf_t @var{op1}, unsigned long int @var{op2}) |
@deftypefunx int mpf_cmp_ui (mpf_t @var{op1}, unsigned long int @var{op2}) |
@deftypefunx int mpf_cmp_si (mpf_t @var{op1}, signed long int @var{op2}) |
@deftypefunx int mpf_cmp_si (mpf_t @var{op1}, signed long int @var{op2}) |
@ifnottex |
Compare @var{op1} and @var{op2}. Return a positive value if @math{@var{op1} > |
Compare @var{op1} and @var{op2}. Return a positive value if @var{op1} > |
@var{op2}}, zero if @math{@var{op1} = @var{op2}}, and a negative value if |
@var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} < |
@math{@var{op1} < @var{op2}}. |
@var{op2}. |
|
@end ifnottex |
|
@tex |
|
Compare @var{op1} and @var{op2}. Return a positive value if $@var{op1} > |
|
@var{op2}$, zero if $@var{op1} = @var{op2}$, and a negative value if $@var{op1} |
|
< @var{op2}$. |
|
@end tex |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpf_eq (mpf_t @var{op1}, mpf_t @var{op2}, unsigned long int op3) |
@deftypefun int mpf_eq (mpf_t @var{op1}, mpf_t @var{op2}, unsigned long int op3) |
Return non-zero if the first @var{op3} bits of @var{op1} and @var{op2} are |
Return non-zero if the first @var{op3} bits of @var{op1} and @var{op2} are |
equal, zero otherwise. I.e., test of @var{op1} and @var{op2} are |
equal, zero otherwise. I.e., test of @var{op1} and @var{op2} are approximately |
approximately equal. |
equal. |
|
|
|
Caution: Currently only whole limbs are compared, and only in an exact |
|
fashion. In the future values like 1000 and 0111 may be considered the same |
|
to 3 bits (on the basis that their difference is that small). |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_reldiff (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
@deftypefun void mpf_reldiff (mpf_t @var{rop}, mpf_t @var{op1}, mpf_t @var{op2}) |
Compute the relative difference between @var{op1} and @var{op2} and store the |
Compute the relative difference between @var{op1} and @var{op2} and store the |
result in @var{rop}. |
result in @var{rop}. This is @math{@GMPabs{@var{op1}-@var{op2}}/@var{op1}}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefn Macro int mpf_sgn (mpf_t @var{op}) |
@deftypefn Macro int mpf_sgn (mpf_t @var{op}) |
@ifnottex |
@cindex Sign tests |
Return +1 if @var{op} > 0, 0 if @var{op} = 0, and @minus{}1 if @var{op} < 0. |
@cindex Float sign tests |
@end ifnottex |
Return @math{+1} if @math{@var{op} > 0}, 0 if @math{@var{op} = 0}, and |
@tex |
@math{-1} if @math{@var{op} < 0}. |
Return $+1$ if $@var{op} > 0$, 0 if $@var{op} = 0$, and $-1$ if $@var{op} < 0$. |
|
@end tex |
|
|
|
This function is actually implemented as a macro. It evaluates its |
This function is actually implemented as a macro. It evaluates its arguments |
arguments multiple times. |
multiple times. |
@end deftypefn |
@end deftypefn |
|
|
@node I/O of Floats, Miscellaneous Float Functions, Float Comparison, Floating-point Functions |
@node I/O of Floats, Miscellaneous Float Functions, Float Comparison, Floating-point Functions |
Line 2935 arguments multiple times. |
|
Line 4317 arguments multiple times. |
|
@cindex I/O functions |
@cindex I/O functions |
|
|
Functions that perform input from a stdio stream, and functions that output to |
Functions that perform input from a stdio stream, and functions that output to |
a stdio stream. Passing a @code{NULL} pointer for a @var{stream} argument to any of |
a stdio stream. Passing a @code{NULL} pointer for a @var{stream} argument to |
these functions will make them read from @code{stdin} and write to |
any of these functions will make them read from @code{stdin} and write to |
@code{stdout}, respectively. |
@code{stdout}, respectively. |
|
|
When using any of these functions, it is a good idea to include @file{stdio.h} |
When using any of these functions, it is a good idea to include @file{stdio.h} |
Line 2944 before @file{gmp.h}, since that will allow @file{gmp.h |
|
Line 4326 before @file{gmp.h}, since that will allow @file{gmp.h |
|
for these functions. |
for these functions. |
|
|
@deftypefun size_t mpf_out_str (FILE *@var{stream}, int @var{base}, size_t @var{n_digits}, mpf_t @var{op}) |
@deftypefun size_t mpf_out_str (FILE *@var{stream}, int @var{base}, size_t @var{n_digits}, mpf_t @var{op}) |
Output @var{op} on stdio stream @var{stream}, as a string of digits in |
Print @var{op} to @var{stream}, as a string of digits. Return the number of |
base @var{base}. The base may vary from 2 to 36. Print at most |
bytes written, or if an error occurred, return 0. |
@var{n_digits} significant digits, or if @var{n_digits} is 0, the maximum |
|
number of digits accurately representable by @var{op}. |
|
|
|
In addition to the significant digits, a leading @samp{0.} and a |
The mantissa is prefixed with an @samp{0.} and is in the given @var{base}, |
trailing exponent, in the form @samp{eNNN}, are printed. If @var{base} |
which may vary from 2 to 36. An exponent then printed, separated by an |
is greater than 10, @samp{@@} will be used instead of @samp{e} as |
@samp{e}, or if @var{base} is greater than 10 then by an @samp{@@}. The |
exponent delimiter. |
exponent is always in decimal. The decimal point follows the current locale, |
|
on systems providing @code{localeconv}. |
|
|
Return the number of bytes written, or if an error occurred, return 0. |
Up to @var{n_digits} will be printed from the mantissa, except that no more |
|
digits than are accurately representable by @var{op} will be printed. |
|
@var{n_digits} can be 0 to select that accurate maximum. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun size_t mpf_inp_str (mpf_t @var{rop}, FILE *@var{stream}, int @var{base}) |
@deftypefun size_t mpf_inp_str (mpf_t @var{rop}, FILE *@var{stream}, int @var{base}) |
Input a string in base @var{base} from stdio stream @var{stream}, and put the |
Read a string in base @var{base} from @var{stream}, and put the read float in |
read float in @var{rop}. The string is of the form @samp{M@@N} or, if the |
@var{rop}. The string is of the form @samp{M@@N} or, if the base is 10 or |
base is 10 or less, alternatively @samp{MeN}. @samp{M} is the mantissa and |
less, alternatively @samp{MeN}. @samp{M} is the mantissa and @samp{N} is the |
@samp{N} is the exponent. The mantissa is always in the specified base. The |
exponent. The mantissa is always in the specified base. The exponent is |
exponent is either in the specified base or, if @var{base} is negative, in |
either in the specified base or, if @var{base} is negative, in decimal. The |
decimal. |
decimal point expected is taken from the current locale, on systems providing |
|
@code{localeconv}. |
|
|
The argument @var{base} may be in the ranges 2 to 36, or @minus{}36 to |
The argument @var{base} may be in the ranges 2 to 36, or @minus{}36 to |
@minus{}2. Negative values are used to specify that the exponent is in |
@minus{}2. Negative values are used to specify that the exponent is in |
Line 2998 Return the number of bytes read, or if an error occurr |
|
Line 4382 Return the number of bytes read, or if an error occurr |
|
@deftypefun void mpf_ceil (mpf_t @var{rop}, mpf_t @var{op}) |
@deftypefun void mpf_ceil (mpf_t @var{rop}, mpf_t @var{op}) |
@deftypefunx void mpf_floor (mpf_t @var{rop}, mpf_t @var{op}) |
@deftypefunx void mpf_floor (mpf_t @var{rop}, mpf_t @var{op}) |
@deftypefunx void mpf_trunc (mpf_t @var{rop}, mpf_t @var{op}) |
@deftypefunx void mpf_trunc (mpf_t @var{rop}, mpf_t @var{op}) |
Set @var{rop} to @var{op} rounded to an integer. @code{mpf_ceil} rounds to |
Set @var{rop} to @var{op} rounded to an integer. @code{mpf_ceil} rounds to the |
the next higher integer, @code{mpf_floor} to the next lower, and |
next higher integer, @code{mpf_floor} to the next lower, and @code{mpf_trunc} |
@code{mpf_trunc} to the integer towards zero. |
to the integer towards zero. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_urandomb (mpf_t @var{rop}, gmp_randstate_t @var{state}, unsigned long int @var{nbits}) |
@deftypefun int mpf_integer_p (mpf_t @var{op}) |
Generate a uniformly distributed random float in @var{rop}, such that 0 <= |
Return non-zero if @var{op} is an integer. |
@var{rop} < 1, with @var{nbits} significant bits in the mantissa. |
@end deftypefun |
|
|
|
@deftypefun int mpf_fits_ulong_p (mpf_t @var{op}) |
|
@deftypefunx int mpf_fits_slong_p (mpf_t @var{op}) |
|
@deftypefunx int mpf_fits_uint_p (mpf_t @var{op}) |
|
@deftypefunx int mpf_fits_sint_p (mpf_t @var{op}) |
|
@deftypefunx int mpf_fits_ushort_p (mpf_t @var{op}) |
|
@deftypefunx int mpf_fits_sshort_p (mpf_t @var{op}) |
|
Return non-zero if @var{op} would fit in the respective C data type, when |
|
truncated to an integer. |
|
@end deftypefun |
|
|
|
@deftypefun void mpf_urandomb (mpf_t @var{rop}, gmp_randstate_t @var{state}, unsigned long int @var{nbits}) |
|
Generate a uniformly distributed random float in @var{rop}, such that @math{0 |
|
@le{} @var{rop} < 1}, with @var{nbits} significant bits in the mantissa. |
|
|
The variable @var{state} must be initialized by calling one of the |
The variable @var{state} must be initialized by calling one of the |
@code{gmp_randinit} functions (@ref{Random State Initialization}) |
@code{gmp_randinit} functions (@ref{Random State Initialization}) before |
before invoking this function. |
invoking this function. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpf_random2 (mpf_t @var{rop}, mp_size_t @var{max_size}, mp_exp_t @var{max_exp}) |
@deftypefun void mpf_random2 (mpf_t @var{rop}, mp_size_t @var{max_size}, mp_exp_t @var{exp}) |
Generate a random float of at most @var{max_size} limbs, with long strings of |
Generate a random float of at most @var{max_size} limbs, with long strings of |
zeros and ones in the binary representation. The exponent of the number is in |
zeros and ones in the binary representation. The exponent of the number is in |
the interval @minus{}@var{exp} to @var{exp}. This function is useful for |
the interval @minus{}@var{exp} to @var{exp}. This function is useful for |
testing functions and algorithms, since this kind of random numbers have |
testing functions and algorithms, since this kind of random numbers have proven |
proven to be more likely to trigger corner-case bugs. Negative random numbers |
to be more likely to trigger corner-case bugs. Negative random numbers are |
are generated when @var{max_size} is negative. |
generated when @var{max_size} is negative. |
@end deftypefun |
@end deftypefun |
|
|
|
|
|
|
@c @deftypefun size_t mpf_size (mpf_t @var{op}) |
@c @deftypefun size_t mpf_size (mpf_t @var{op}) |
@c Return the size of @var{op} measured in number of limbs. If @var{op} is |
@c Return the size of @var{op} measured in number of limbs. If @var{op} is |
@c zero, the returned value will be zero. (@xref{Nomenclature}, for an |
@c zero, the returned value will be zero. (@xref{Nomenclature}, for an |
Line 3032 are generated when @var{max_size} is negative. |
|
Line 4428 are generated when @var{max_size} is negative. |
|
@c releases.} |
@c releases.} |
@c @end deftypefun |
@c @end deftypefun |
|
|
|
|
@node Low-level Functions, Random Number Functions, Floating-point Functions, Top |
@node Low-level Functions, Random Number Functions, Floating-point Functions, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@chapter Low-level Functions |
@chapter Low-level Functions |
@cindex Low-level functions |
@cindex Low-level functions |
|
|
This chapter describes low-level GMP functions, used to implement the high-level |
This chapter describes low-level GMP functions, used to implement the |
GMP functions, but also intended for time-critical user code. |
high-level GMP functions, but also intended for time-critical user code. |
|
|
These functions start with the prefix @code{mpn_}. |
These functions start with the prefix @code{mpn_}. |
|
|
Line 3056 limb count. A destination operand is specified by jus |
|
Line 4453 limb count. A destination operand is specified by jus |
|
responsibility of the caller to ensure that the destination has enough space |
responsibility of the caller to ensure that the destination has enough space |
for storing the result. |
for storing the result. |
|
|
With this way of specifying operands, it is possible to perform computations |
With this way of specifying operands, it is possible to perform computations on |
on subranges of an argument, and store the result into a subrange of a |
subranges of an argument, and store the result into a subrange of a |
destination. |
destination. |
|
|
A common requirement for all functions is that each source area needs at |
A common requirement for all functions is that each source area needs at least |
least one limb. No size argument may be zero. Unless otherwise stated, |
one limb. No size argument may be zero. Unless otherwise stated, in-place |
in-place operations are allowed where source and destination are the |
operations are allowed where source and destination are the same, but not where |
same, but not where they only partly overlap. |
they only partly overlap. |
|
|
The @code{mpn} functions are the base for the implementation of the |
The @code{mpn} functions are the base for the implementation of the |
@code{mpz_}, @code{mpf_}, and @code{mpq_} functions. |
@code{mpz_}, @code{mpf_}, and @code{mpq_} functions. |
|
|
This example adds the number beginning at @var{s1p} and the number |
This example adds the number beginning at @var{s1p} and the number beginning at |
beginning at @var{s2p} and writes the sum at @var{destp}. All areas |
@var{s2p} and writes the sum at @var{destp}. All areas have @var{n} limbs. |
have @var{size} limbs. |
|
|
|
@example |
@example |
cy = mpn_add_n (destp, s1p, s2p, size) |
cy = mpn_add_n (destp, s1p, s2p, n) |
@end example |
@end example |
|
|
@noindent |
@noindent |
In the notation used here, a source operand is identified by the pointer to |
In the notation used here, a source operand is identified by the pointer to |
the least significant limb, and the limb count in braces. For example, |
the least significant limb, and the limb count in braces. For example, |
@{s1p, s1size@}. |
@{@var{s1p}, @var{s1n}@}. |
|
|
@deftypefun mp_limb_t mpn_add_n (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{size}) |
@deftypefun mp_limb_t mpn_add_n (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{n}) |
Add @{@var{s1p}, @var{size}@} and @{@var{s2p}, @var{size}@}, and |
Add @{@var{s1p}, @var{n}@} and @{@var{s2p}, @var{n}@}, and write the @var{n} |
write the @var{size} least significant limbs of the result to @var{rp}. |
least significant limbs of the result to @var{rp}. Return carry, either 0 or |
Return carry, either 0 or 1. |
1. |
|
|
This is the lowest-level function for addition. It is the preferred function |
This is the lowest-level function for addition. It is the preferred function |
for addition, since it is written in assembly for most targets. For addition |
for addition, since it is written in assembly for most CPUs. For addition of |
of a variable to itself (i.e., @var{s1p} equals @var{s2p}, use |
a variable to itself (i.e., @var{s1p} equals @var{s2p}, use @code{mpn_lshift} |
@code{mpn_lshift} with a count of 1 for optimal speed. |
with a count of 1 for optimal speed. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_add_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{size}, mp_limb_t @var{s2limb}) |
@deftypefun mp_limb_t mpn_add_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{n}, mp_limb_t @var{s2limb}) |
Add @{@var{s1p}, @var{size}@} and @var{s2limb}, and write the |
Add @{@var{s1p}, @var{n}@} and @var{s2limb}, and write the @var{n} least |
@var{size} least significant limbs of the result to @var{rp}. Return |
significant limbs of the result to @var{rp}. Return carry, either 0 or 1. |
carry, either 0 or 1. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_add (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, const mp_limb_t *@var{s2p}, mp_size_t @var{s2size}) |
@deftypefun mp_limb_t mpn_add (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{s1n}, const mp_limb_t *@var{s2p}, mp_size_t @var{s2n}) |
Add @{@var{s1p}, @var{s1size}@} and @{@var{s2p}, |
Add @{@var{s1p}, @var{s1n}@} and @{@var{s2p}, @var{s2n}@}, and write the |
@var{s2size}@}, and write the @var{s1size} least significant limbs of |
@var{s1n} least significant limbs of the result to @var{rp}. Return carry, |
the result to @var{rp}. Return carry, either 0 or 1. |
either 0 or 1. |
|
|
This function requires that @var{s1size} is greater than or equal to |
This function requires that @var{s1n} is greater than or equal to @var{s2n}. |
@var{s2size}. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_sub_n (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{size}) |
@deftypefun mp_limb_t mpn_sub_n (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{n}) |
Subtract @{@var{s2p}, @var{s2size}@} from @{@var{s1p}, |
Subtract @{@var{s2p}, @var{n}@} from @{@var{s1p}, @var{n}@}, and write the |
@var{size}@}, and write the @var{size} least significant limbs of the result |
@var{n} least significant limbs of the result to @var{rp}. Return borrow, |
to @var{rp}. Return borrow, either 0 or 1. |
either 0 or 1. |
|
|
This is the lowest-level function for subtraction. It is the preferred |
This is the lowest-level function for subtraction. It is the preferred |
function for subtraction, since it is written in assembly for most targets. |
function for subtraction, since it is written in assembly for most CPUs. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_sub_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{size}, mp_limb_t @var{s2limb}) |
@deftypefun mp_limb_t mpn_sub_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{n}, mp_limb_t @var{s2limb}) |
Subtract @var{s2limb} from @{@var{s1p}, @var{size}@}, and write the |
Subtract @var{s2limb} from @{@var{s1p}, @var{n}@}, and write the @var{n} least |
@var{size} least significant limbs of the result to @var{rp}. Return |
significant limbs of the result to @var{rp}. Return borrow, either 0 or 1. |
borrow, either 0 or 1. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_sub (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, const mp_limb_t *@var{s2p}, mp_size_t @var{s2size}) |
@deftypefun mp_limb_t mpn_sub (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{s1n}, const mp_limb_t *@var{s2p}, mp_size_t @var{s2n}) |
Subtract @{@var{s2p}, @var{s2size}@} from @{@var{s1p}, |
Subtract @{@var{s2p}, @var{s2n}@} from @{@var{s1p}, @var{s1n}@}, and write the |
@var{s1size}@}, and write the @var{s1size} least significant limbs of |
@var{s1n} least significant limbs of the result to @var{rp}. Return borrow, |
the result to @var{rp}. Return borrow, either 0 or 1. |
either 0 or 1. |
|
|
This function requires that @var{s1size} is greater than or equal to |
This function requires that @var{s1n} is greater than or equal to |
@var{s2size}. |
@var{s2n}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpn_mul_n (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{size}) |
@deftypefun void mpn_mul_n (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{n}) |
Multiply @{@var{s1p}, @var{size}@} and @{@var{s2p}, @var{size}@}, |
Multiply @{@var{s1p}, @var{n}@} and @{@var{s2p}, @var{n}@}, and write the |
and write the @strong{entire} result to @var{rp}. |
2*@var{n}-limb result to @var{rp}. |
|
|
The destination has to have space for 2*@var{size} limbs, even if the |
The destination has to have space for 2*@var{n} limbs, even if the product's |
significant result might be one limb smaller. |
most significant limb is zero. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_mul_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{size}, mp_limb_t @var{s2limb}) |
@deftypefun mp_limb_t mpn_mul_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{n}, mp_limb_t @var{s2limb}) |
Multiply @{@var{s1p}, @var{size}@} and @var{s2limb}, and write the |
Multiply @{@var{s1p}, @var{n}@} by @var{s2limb}, and write the @var{n} least |
@var{size} least significant limbs of the product to @var{rp}. Return |
significant limbs of the product to @var{rp}. Return the most significant |
the most significant limb of the product. |
limb of the product. @{@var{s1p}, @var{n}@} and @{@var{rp}, @var{n}@} are |
|
allowed to overlap provided @math{@var{rp} @le{} @var{s1p}}. |
|
|
This is a low-level function that is a building block for general |
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 |
multiplication as well as other operations in GMP. It is written in assembly |
for most targets. |
for most CPUs. |
|
|
Don't call this function if @var{s2limb} is a power of 2; use |
Don't call this function if @var{s2limb} is a power of 2; use @code{mpn_lshift} |
@code{mpn_lshift} with a count equal to the logarithm of @var{s2limb} |
with a count equal to the logarithm of @var{s2limb} instead, for optimal speed. |
instead, for optimal speed. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_addmul_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{size}, mp_limb_t @var{s2limb}) |
@deftypefun mp_limb_t mpn_addmul_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{n}, mp_limb_t @var{s2limb}) |
Multiply @{@var{s1p}, @var{size}@} and @var{s2limb}, and add the |
Multiply @{@var{s1p}, @var{n}@} and @var{s2limb}, and add the @var{n} least |
@var{size} least significant limbs of the product to @{@var{rp}, |
significant limbs of the product to @{@var{rp}, @var{n}@} and write the result |
@var{size}@} and write the result to @var{rp}. Return |
to @var{rp}. Return the most significant limb of the product, plus carry-out |
the most significant limb of the product, plus carry-out from the addition. |
from the addition. |
|
|
This is a low-level function that is a building block for general |
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 |
multiplication as well as other operations in GMP. It is written in assembly |
for most targets. |
for most CPUs. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_submul_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{size}, mp_limb_t @var{s2limb}) |
@deftypefun mp_limb_t mpn_submul_1 (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{n}, mp_limb_t @var{s2limb}) |
Multiply @{@var{s1p}, @var{size}@} and @var{s2limb}, and subtract the |
Multiply @{@var{s1p}, @var{n}@} and @var{s2limb}, and subtract the @var{n} |
@var{size} least significant limbs of the product from @{@var{rp}, |
least significant limbs of the product from @{@var{rp}, @var{n}@} and write the |
@var{size}@} and write the result to @var{rp}. Return the most |
result to @var{rp}. Return the most significant limb of the product, minus |
significant limb of the product, minus borrow-out from the subtraction. |
borrow-out from the subtraction. |
|
|
This is a low-level function that is a building block for general |
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 |
multiplication and division as well as other operations in GMP. It is written |
in assembly for most targets. |
in assembly for most CPUs. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_mul (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, const mp_limb_t *@var{s2p}, mp_size_t @var{s2size}) |
@deftypefun mp_limb_t mpn_mul (mp_limb_t *@var{rp}, const mp_limb_t *@var{s1p}, mp_size_t @var{s1n}, const mp_limb_t *@var{s2p}, mp_size_t @var{s2n}) |
Multiply @{@var{s1p}, @var{s1size}@} and @{@var{s2p}, |
Multiply @{@var{s1p}, @var{s1n}@} and @{@var{s2p}, @var{s2n}@}, and write the |
@var{s2size}@}, and write the result to @var{rp}. Return the most |
result to @var{rp}. Return the most significant limb of the result. |
significant limb of the result. |
|
|
|
The destination has to have space for @var{s1size} + @var{s2size} |
The destination has to have space for @var{s1n} + @var{s2n} limbs, even if the |
limbs, even if the result might be one limb smaller. |
result might be one limb smaller. |
|
|
This function requires that @var{s1size} is greater than or equal to |
This function requires that @var{s1n} is greater than or equal to |
@var{s2size}. The destination must be distinct from either input operands. |
@var{s2n}. The destination must be distinct from both input operands. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpn_tdiv_qr (mp_limb_t *@var{qp}, mp_limb_t *@var{rp}, mp_size_t @var{qxn}, const mp_limb_t *@var{np}, mp_size_t @var{nn}, const mp_limb_t *@var{dp}, mp_size_t @var{dn}) |
@deftypefun void mpn_tdiv_qr (mp_limb_t *@var{qp}, mp_limb_t *@var{rp}, mp_size_t @var{qxn}, const mp_limb_t *@var{np}, mp_size_t @var{nn}, const mp_limb_t *@var{dp}, mp_size_t @var{dn}) |
Divide @{@var{np}, @var{nn}@} by @{@var{dp}, @var{dn}@}. Write the quotient |
Divide @{@var{np}, @var{nn}@} by @{@var{dp}, @var{dn}@} and put the quotient |
at @var{qp} and the remainder at @var{rp}. |
at @{@var{qp}, @var{nn}@minus{}@var{dn}+1@} and the remainder at @{@var{rp}, |
|
@var{dn}@}. The quotient is rounded towards 0. |
|
|
The quotient written at @var{qp} will be @var{nn} @minus{} @var{dn} + 1 limbs. |
No overlap is permitted between arguments. @var{nn} must be greater than or |
The remainder written at @var{rp} will be @var{dn} limbs. |
equal to @var{dn}. The most significant limb of @var{dp} must be non-zero. |
|
The @var{qxn} operand must be zero. |
It is required that @var{nn} is greater than or equal to @var{dn}. The |
@comment FIXME: Relax overlap requirements! |
@var{qxn} operand must be zero. |
|
|
|
The quotient is rounded towards 0. |
|
|
|
No overlap between arguments is permitted. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_divrem (mp_limb_t *@var{r1p}, mp_size_t @var{xsize}, mp_limb_t *@var{rs2p}, mp_size_t @var{rs2size}, const mp_limb_t *@var{s3p}, mp_size_t @var{s3size}) |
@deftypefun mp_limb_t mpn_divrem (mp_limb_t *@var{r1p}, mp_size_t @var{qxn}, mp_limb_t *@var{rs2p}, mp_size_t @var{rs2n}, const mp_limb_t *@var{s3p}, mp_size_t @var{s3n}) |
[This function is obsolete. Please call @code{mpn_tdiv_qr} instead for |
[This function is obsolete. Please call @code{mpn_tdiv_qr} instead for best |
best performance.] |
performance.] |
|
|
Divide @{@var{rs2p}, @var{rs2size}@} by @{@var{s3p}, @var{s3size}@}, and write |
Divide @{@var{rs2p}, @var{rs2n}@} by @{@var{s3p}, @var{s3n}@}, and write the |
the quotient at @var{r1p}, with the exception of the most significant limb, |
quotient at @var{r1p}, with the exception of the most significant limb, which |
which is returned. The remainder replaces the dividend at @var{rs2p}; it will |
is returned. The remainder replaces the dividend at @var{rs2p}; it will be |
be @var{s3size} limbs long (i.e., as many limbs as the divisor). |
@var{s3n} limbs long (i.e., as many limbs as the divisor). |
|
|
In addition to an integer quotient, @var{xsize} fraction limbs are developed, |
In addition to an integer quotient, @var{qxn} fraction limbs are developed, and |
and stored after the integral limbs. For most usages, @var{xsize} will be |
stored after the integral limbs. For most usages, @var{qxn} will be zero. |
zero. |
|
|
|
It is required that @var{rs2size} is greater than or equal to @var{s3size}. |
It is required that @var{rs2n} is greater than or equal to @var{s3n}. It is |
It is required that the most significant bit of the divisor is set. |
required that the most significant bit of the divisor is set. |
|
|
If the quotient is not needed, pass @var{rs2p} + @var{s3size} as @var{r1p}. |
If the quotient is not needed, pass @var{rs2p} + @var{s3n} as @var{r1p}. Aside |
Aside from that special case, no overlap between arguments is permitted. |
from that special case, no overlap between arguments is permitted. |
|
|
Return the most significant limb of the quotient, either 0 or 1. |
Return the most significant limb of the quotient, either 0 or 1. |
|
|
The area at @var{r1p} needs to be @var{rs2size} @minus{} @var{s3size} + |
The area at @var{r1p} needs to be @var{rs2n} @minus{} @var{s3n} + @var{qxn} |
@var{xsize} limbs large. |
limbs large. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefn Function mp_limb_t mpn_divrem_1 (mp_limb_t *@var{r1p}, mp_size_t @var{xsize}, @w{mp_limb_t *@var{s2p}}, mp_size_t @var{s2size}, mp_limb_t @var{s3limb}) |
@deftypefn Function mp_limb_t mpn_divrem_1 (mp_limb_t *@var{r1p}, mp_size_t @var{qxn}, @w{mp_limb_t *@var{s2p}}, mp_size_t @var{s2n}, mp_limb_t @var{s3limb}) |
@deftypefnx Macro mp_limb_t mpn_divmod_1 (mp_limb_t *@var{r1p}, mp_limb_t *@var{s2p}, @w{mp_size_t @var{s2size}}, @w{mp_limb_t @var{s3limb}}) |
@deftypefnx Macro mp_limb_t mpn_divmod_1 (mp_limb_t *@var{r1p}, mp_limb_t *@var{s2p}, @w{mp_size_t @var{s2n}}, @w{mp_limb_t @var{s3limb}}) |
Divide @{@var{s2p}, @var{s2size}@} by @var{s3limb}, and write the quotient |
Divide @{@var{s2p}, @var{s2n}@} by @var{s3limb}, and write the quotient at |
at @var{r1p}. Return the remainder. |
@var{r1p}. Return the remainder. |
|
|
The integer quotient is written to @{@var{r1p}+@var{xsize}, @var{s2size}@} and |
The integer quotient is written to @{@var{r1p}+@var{qxn}, @var{s2n}@} and in |
in addition @var{xsize} fraction limbs are developed and written to |
addition @var{qxn} fraction limbs are developed and written to @{@var{r1p}, |
@{@var{r1p}, @var{xsize}@}. Either or both @var{s2size} and @var{xsize} can |
@var{qxn}@}. Either or both @var{s2n} and @var{qxn} can be zero. For most |
be zero. For most usages, @var{xsize} will be zero. |
usages, @var{qxn} will be zero. |
|
|
@code{mpn_divmod_1} exists for upward source compatibility and is simply a |
@code{mpn_divmod_1} exists for upward source compatibility and is simply a |
macro calling @code{mpn_divrem_1} with an @var{xsize} of 0. |
macro calling @code{mpn_divrem_1} with a @var{qxn} of 0. |
|
|
The areas at @var{r1p} and @var{s2p} have to be identical or completely |
The areas at @var{r1p} and @var{s2p} have to be identical or completely |
separate, not partially overlapping. |
separate, not partially overlapping. |
@end deftypefn |
@end deftypefn |
|
|
@deftypefun mp_limb_t mpn_divmod (mp_limb_t *@var{r1p}, mp_limb_t *@var{rs2p}, mp_size_t @var{rs2size}, const mp_limb_t *@var{s3p}, mp_size_t @var{s3size}) |
@deftypefun mp_limb_t mpn_divmod (mp_limb_t *@var{r1p}, mp_limb_t *@var{rs2p}, mp_size_t @var{rs2n}, const mp_limb_t *@var{s3p}, mp_size_t @var{s3n}) |
@strong{This interface is obsolete. It will disappear from future releases. |
[This function is obsolete. Please call @code{mpn_tdiv_qr} instead for best |
Use @code{mpn_divrem} in its stead.} |
performance.] |
@end deftypefun |
@end deftypefun |
|
|
@deftypefn Macro mp_limb_t mpn_divexact_by3 (mp_limb_t *@var{rp}, mp_limb_t *@var{sp}, @w{mp_size_t @var{size}}) |
@deftypefn Macro mp_limb_t mpn_divexact_by3 (mp_limb_t *@var{rp}, mp_limb_t *@var{sp}, @w{mp_size_t @var{n}}) |
@deftypefnx Function mp_limb_t mpn_divexact_by3c (mp_limb_t *@var{rp}, mp_limb_t *@var{sp}, @w{mp_size_t @var{size}}, mp_limb_t @var{carry}) |
@deftypefnx Function mp_limb_t mpn_divexact_by3c (mp_limb_t *@var{rp}, mp_limb_t *@var{sp}, @w{mp_size_t @var{n}}, mp_limb_t @var{carry}) |
Divide @{@var{sp}, @var{size}@} by 3, expecting it to divide exactly, and |
Divide @{@var{sp}, @var{n}@} by 3, expecting it to divide exactly, and writing |
writing the result to @{@var{rp}, @var{size}@}. If 3 divides exactly, the |
the result to @{@var{rp}, @var{n}@}. If 3 divides exactly, the return value is |
return value is zero and the result is the quotient. If not, the return value |
zero and the result is the quotient. If not, the return value is non-zero and |
is non-zero and the result won't be anything useful. |
the result won't be anything useful. |
|
|
@code{mpn_divexact_by3c} takes an initial carry parameter, which can be the |
@code{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 |
return value from a previous call, so a large calculation can be done piece by |
piece. @code{mpn_divexact_by3} is simply a macro calling |
piece from low to high. @code{mpn_divexact_by3} is simply a macro calling |
@code{mpn_divexact_by3c} with a 0 carry parameter. |
@code{mpn_divexact_by3c} with a 0 carry parameter. |
|
|
These routines use a multiply-by-inverse and will be faster than |
These routines use a multiply-by-inverse and will be faster than |
@code{mpn_divrem_1} on CPUs with fast multiplication but slow division. |
@code{mpn_divrem_1} on CPUs with fast multiplication but slow division. |
|
|
The source @math{a}, result @math{q}, size @math{n}, initial carry @math{i}, |
The source @math{a}, result @math{q}, size @math{n}, initial carry @math{i}, |
and return value @math{c} satisfy |
and return value @math{c} satisfy @m{cb^n+a-i=3q, c*b^n + a-i = 3*q}, where |
@tex |
@m{b=2\GMPraise{@code{mp\_bits\_per\_limb}}, b=2^mp_bits_per_limb}. The |
$c b^n + a - i = 3q$, |
return @math{c} is always 0, 1 or 2, and the initial carry @math{i} must also |
@end tex |
be 0, 1 or 2 (these are both borrows really). When @math{c=0} clearly |
@ifnottex |
@math{q=(a-i)/3}. When @m{c \neq 0, c!=0}, the remainder @math{(a-i) @bmod{} |
@math{c*b^n + a-i = 3*q}, |
3} is given by @math{3-c}, because @math{b @equiv{} 1 @bmod{} 3} (when |
@end ifnottex |
@code{mp_bits_per_limb} is even, which is always so currently). |
where @math{b} is the size of a limb |
|
@tex |
|
($2^{32}$ or $2^{64}$). |
|
@end tex |
|
@ifnottex |
|
(@math{2^32} or @math{2^64}). |
|
@end ifnottex |
|
@math{c} is always 0, 1 or 2, and the initial carry must also be 0, 1 or 2 |
|
(these are both borrows really). When @math{c=0}, clearly @math{q=(a-i)/3}. |
|
When |
|
@tex |
|
$c \neq 0$, |
|
the remainder $(a-i) \, mod \, 3$ |
|
@end tex |
|
@ifnottex |
|
@math{c!=0}, the remainder @math{(a-i) mod 3} |
|
@end ifnottex |
|
is given by @math{3-c}, because |
|
@tex |
|
$b \equiv 1 \, mod \, 3$. |
|
@end tex |
|
@ifnottex |
|
@math{b @equiv{} 1 mod 3}. |
|
@end ifnottex |
|
@end deftypefn |
@end deftypefn |
|
|
@deftypefun mp_limb_t mpn_mod_1 (mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, mp_limb_t @var{s2limb}) |
@deftypefun mp_limb_t mpn_mod_1 (mp_limb_t *@var{s1p}, mp_size_t @var{s1n}, mp_limb_t @var{s2limb}) |
Divide @{@var{s1p}, @var{s1size}@} by @var{s2limb}, and return the remainder. |
Divide @{@var{s1p}, @var{s1n}@} by @var{s2limb}, and return the remainder. |
@var{s1size} can be zero. |
@var{s1n} can be zero. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_preinv_mod_1 (mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, mp_limb_t @var{s2limb}, mp_limb_t @var{s3limb}) |
@deftypefun mp_limb_t mpn_bdivmod (mp_limb_t *@var{rp}, mp_limb_t *@var{s1p}, mp_size_t @var{s1n}, const mp_limb_t *@var{s2p}, mp_size_t @var{s2n}, unsigned long int @var{d}) |
@strong{This interface is obsolete. It will disappear from future releases. |
This function puts the low |
Use @code{mpn_mod_1} in its stead.} |
@math{@GMPfloor{@var{d}/@nicode{mp\_bits\_per\_limb}}} limbs of @var{q} = |
@end deftypefun |
@{@var{s1p}, @var{s1n}@}/@{@var{s2p}, @var{s2n}@} mod @m{2^d,2^@var{d}} at |
|
@var{rp}, and returns the high @var{d} mod @code{mp_bits_per_limb} bits of |
|
@var{q}. |
|
|
@deftypefun mp_limb_t mpn_bdivmod (mp_limb_t *@var{rp}, mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, const mp_limb_t *@var{s2p}, mp_size_t @var{s2size}, unsigned long int @var{d}) |
@{@var{s1p}, @var{s1n}@} - @var{q} * @{@var{s2p}, @var{s2n}@} mod @m{2 |
The function puts the low [@var{d}/@var{BITS_PER_MP_LIMB}] limbs of |
\GMPraise{@var{s1n}*@code{mp\_bits\_per\_limb}}, |
@var{q} = |
2^(@var{s1n}*@nicode{mp\_bits\_per\_limb})} is placed at @var{s1p}. Since the |
@{@var{s1p}, @var{s1size}@}/@{@var{s2p}, @var{s2size}@} |
low @math{@GMPfloor{@var{d}/@nicode{mp\_bits\_per\_limb}}} limbs of this |
mod 2^@var{d} |
difference are zero, it is possible to overwrite the low limbs at @var{s1p} |
at @var{rp}, |
with this difference, provided @math{@var{rp} @le{} @var{s1p}}. |
and returns the high @var{d} mod @var{BITS_PER_MP_LIMB} bits of @var{q}. |
|
|
|
@{@var{s1p}, @var{s1size}@} - @var{q} * @{@var{s2p}, @var{s2size}@} |
This function requires that @math{@var{s1n} * @nicode{mp\_bits\_per\_limb} |
mod 2^(@var{s1size}*@var{BITS_PER_MP_LIMB}) |
@ge{} @var{D}}, and that @{@var{s2p}, @var{s2n}@} is odd. |
is placed at @var{s1p}. |
|
Since the low [@var{d}/@var{BITS_PER_MP_LIMB}] limbs of |
|
this difference are zero, it is possible to overwrite the low limbs at |
|
@var{s1p} with this difference, |
|
provided @var{rp} <= @var{s1p}. |
|
|
|
This function requires that @var{s1size} * @var{BITS_PER_MP_LIMB} >= @var{D}, |
@strong{This interface is preliminary. It might change incompatibly in future |
and that @{@var{s2p}, @var{s2size}@} is odd. |
revisions.} |
|
|
@strong{This interface is preliminary. It might change incompatibly in |
|
future revisions.} |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_lshift (mp_limb_t *@var{rp}, const mp_limb_t *@var{src_ptr}, mp_size_t @var{src_size}, unsigned long int @var{count}) |
@deftypefun mp_limb_t mpn_lshift (mp_limb_t *@var{rp}, const mp_limb_t *@var{sp}, mp_size_t @var{n}, unsigned int @var{count}) |
Shift @{@var{src_ptr}, @var{src_size}@} @var{count} bits to the left, and |
Shift @{@var{sp}, @var{n}@} left by @var{count} bits, and write the result to |
write the @var{src_size} least significant limbs of the result to |
@{@var{rp}, @var{n}@}. The bits shifted out at the left are returned in the |
@var{rp}. @var{count} might be in the range 1 to n @minus{} 1, on an |
least significant @var{count} bits of the return value (the rest of the return |
n-bit machine. The bits shifted out to the left are returned. |
value is zero). |
|
|
Overlapping of the destination space and the source space is allowed in this |
@var{count} must be in the range 1 to @nicode{mp_bits_per_limb}@minus{}1. The |
function, provided @var{rp} >= @var{src_ptr}. |
regions @{@var{sp}, @var{n}@} and @{@var{rp}, @var{n}@} may overlap, provided |
|
@math{@var{rp} @ge{} @var{sp}}. |
|
|
This function is written in assembly for most targets. |
This function is written in assembly for most CPUs. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limp_t mpn_rshift (mp_limb_t *@var{rp}, const mp_limb_t *@var{src_ptr}, mp_size_t @var{src_size}, unsigned long int @var{count}) |
@deftypefun mp_limb_t mpn_rshift (mp_limb_t *@var{rp}, const mp_limb_t *@var{sp}, mp_size_t @var{n}, unsigned int @var{count}) |
Shift @{@var{src_ptr}, @var{src_size}@} @var{count} bits to the right, and |
Shift @{@var{sp}, @var{n}@} right by @var{count} bits, and write the result to |
write the @var{src_size} most significant limbs of the result to |
@{@var{rp}, @var{n}@}. The bits shifted out at the right are returned in the |
@var{rp}. @var{count} might be in the range 1 to n @minus{} 1, on an |
most significant @var{count} bits of the return value (the rest of the return |
n-bit machine. The bits shifted out to the right are returned. |
value is zero). |
|
|
Overlapping of the destination space and the source space is allowed in this |
@var{count} must be in the range 1 to @nicode{mp_bits_per_limb}@minus{}1. The |
function, provided @var{rp} <= @var{src_ptr}. |
regions @{@var{sp}, @var{n}@} and @{@var{rp}, @var{n}@} may overlap, provided |
|
@math{@var{rp} @le{} @var{sp}}. |
|
|
This function is written in assembly for most targets. |
This function is written in assembly for most CPUs. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpn_cmp (const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{size}) |
@deftypefun int mpn_cmp (const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{n}) |
Compare @{@var{s1p}, @var{size}@} and @{@var{s2p}, @var{size}@} and |
Compare @{@var{s1p}, @var{n}@} and @{@var{s2p}, @var{n}@} and return a |
return a positive value if s1 > src2, 0 of they are equal, and a negative |
positive value if @math{@var{s1} > @var{s2}}, 0 if they are equal, or a |
value if s1 < src2. |
negative value if @math{@var{s1} < @var{s2}}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_size_t mpn_gcd (mp_limb_t *@var{rp}, mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, mp_limb_t *@var{s2p}, mp_size_t @var{s2size}) |
@deftypefun mp_size_t mpn_gcd (mp_limb_t *@var{rp}, mp_limb_t *@var{s1p}, mp_size_t @var{s1n}, mp_limb_t *@var{s2p}, mp_size_t @var{s2n}) |
Puts at @var{rp} the greatest common divisor of @{@var{s1p}, |
Set @{@var{rp}, @var{retval}@} to the greatest common divisor of @{@var{s1p}, |
@var{s1size}@} and @{@var{s2p}, @var{s2size}@}; both source |
@var{s1n}@} and @{@var{s2p}, @var{s2n}@}. The result can be up to @var{s2n} |
operands are destroyed by the operation. The size in limbs of the greatest |
limbs, the return value is the actual number produced. Both source operands |
common divisor is returned. |
are destroyed. |
|
|
@{@var{s1p}, @var{s1size}@} must have at least as many bits as |
@{@var{s1p}, @var{s1n}@} must have at least as many bits as @{@var{s2p}, |
@{@var{s2p}, @var{s2size}@}, and @{@var{s2p}, @var{s2size}@} must be odd. |
@var{s2n}@}. @{@var{s2p}, @var{s2n}@} must be odd. Both operands must have |
|
non-zero most significant limbs. No overlap is permitted between @{@var{s1p}, |
|
@var{s1n}@} and @{@var{s2p}, @var{s2n}@}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_limb_t mpn_gcd_1 (const mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, mp_limb_t @var{s2limb}) |
@deftypefun mp_limb_t mpn_gcd_1 (const mp_limb_t *@var{s1p}, mp_size_t @var{s1n}, mp_limb_t @var{s2limb}) |
Return the greatest common divisor of @{@var{s1p}, @var{s1size}@} |
Return the greatest common divisor of @{@var{s1p}, @var{s1n}@} and |
and @var{s2limb}, where @var{s2limb} (as well as @var{s1size}) |
@var{s2limb}. Both operands must be non-zero. |
must be different from 0. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_size_t mpn_gcdext (mp_limb_t *@var{r1p}, mp_limb_t *@var{r2p}, mp_size_t *@var{r2size}, mp_limb_t *@var{s1p}, mp_size_t @var{s1size}, mp_limb_t *@var{s2p}, mp_size_t @var{s2size}) |
@deftypefun mp_size_t mpn_gcdext (mp_limb_t *@var{r1p}, mp_limb_t *@var{r2p}, mp_size_t *@var{r2n}, mp_limb_t *@var{s1p}, mp_size_t @var{s1n}, mp_limb_t *@var{s2p}, mp_size_t @var{s2n}) |
Compute the greatest common divisor of @{@var{s1p}, @var{s1size}@} and |
Calculate the greatest common divisor of @{@var{s1p}, @var{s1n}@} and |
@{@var{s2p}, @var{s2size}@}. Store the gcd at @var{r1p} and return its size |
@{@var{s2p}, @var{s2n}@}. Store the gcd at @{@var{r1p}, @var{retval}@} and |
in limbs. Write the first cofactor at @var{r2p} and store its size in |
the first cofactor at @{@var{r2p}, *@var{r2n}@}, with *@var{r2n} negative if |
*@var{r2size}. If the cofactor is negative, *@var{r2size} is negative and |
the cofactor is negative. @var{r1p} and @var{r2p} should each have room for |
@var{r2p} is the absolute value of the cofactor. |
@math{@var{s1n}+1} limbs, but the return value and value stored through |
|
@var{r2n} indicate the actual number produced. |
|
|
@{@var{s1p}, @var{s1size}@} must be greater than or equal to @{@var{s2p}, |
@math{@{@var{s1p}, @var{s1n}@} @ge{} @{@var{s2p}, @var{s2n}@}} is required, |
@var{s2size}@}. Neither operand may equal 0. Both source operands are |
and both must be non-zero. The regions @{@var{s1p}, @math{@var{s1n}+1}@} and |
destroyed, plus one limb past the end of each, ie. @{@var{s1p}, |
@{@var{s2p}, @math{@var{s2n}+1}@} are destroyed (i.e. the operands plus an |
@var{s1size}+1@} and @{@var{s2p}, @var{s2size}+1@}. |
extra limb past the end of each). |
|
|
|
The cofactor @var{r1} will satisfy @m{r_2 s_1 + k s_2 = r_1, @var{r2}*@var{s1} |
|
+ @var{k}*@var{s2} = @var{r1}}. The second cofactor @var{k} is not calculated |
|
but can easily be obtained from @m{(r_1 - r_2 s_1) / s_2, (@var{r1} - |
|
@var{r2}*@var{s1}) / @var{s2}}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_size_t mpn_sqrtrem (mp_limb_t *@var{r1p}, mp_limb_t *@var{r2p}, const mp_limb_t *@var{sp}, mp_size_t @var{size}) |
@deftypefun mp_size_t mpn_sqrtrem (mp_limb_t *@var{r1p}, mp_limb_t *@var{r2p}, const mp_limb_t *@var{sp}, mp_size_t @var{n}) |
Compute the square root of @{@var{sp}, @var{size}@} and put the result at |
Compute the square root of @{@var{sp}, @var{n}@} and put the result at |
@var{r1p}. Write the remainder at @var{r2p}, unless @var{r2p} is @code{NULL}. |
@{@var{r1p}, @math{@GMPceil{@var{n}/2}}@} and the remainder at @{@var{r2p}, |
|
@var{retval}@}. @var{r2p} needs space for @var{n} limbs, but the return value |
|
indicates how many are produced. |
|
|
Return the size of the remainder, whether @var{r2p} was @code{NULL} or non-@code{NULL}. |
The most significant limb of @{@var{sp}, @var{n}@} must be non-zero. The |
Iff the operand was a perfect square, the return value will be 0. |
areas @{@var{r1p}, @math{@GMPceil{@var{n}/2}}@} and @{@var{sp}, @var{n}@} must |
|
be completely separate. The areas @{@var{r2p}, @var{n}@} and @{@var{sp}, |
|
@var{n}@} must be either identical or completely separate. |
|
|
The areas at @var{r1p} and @var{sp} have to be distinct. The areas at |
If the remainder is not wanted then @var{r2p} can be @code{NULL}, and in this |
@var{r2p} and @var{sp} have to be identical or completely separate, not |
case the return value is zero or non-zero according to whether the remainder |
partially overlapping. |
would have been zero or non-zero. |
|
|
@ifnottex |
A return value of zero indicates a perfect square. See also |
The area at @var{r1p} needs to have space for ceil(@var{size}/2) limbs. |
@code{mpz_perfect_square_p}. |
@end ifnottex |
|
@tex |
|
The area at @var{r1p} needs to have space for $\lceil@var{size}/2\rceil$ limbs. |
|
@end tex |
|
The area at @var{r2p} needs to be @var{size} limbs large. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_size_t mpn_get_str (unsigned char *@var{str}, int @var{base}, mp_limb_t *@var{s1p}, mp_size_t @var{s1size}) |
@deftypefun mp_size_t mpn_get_str (unsigned char *@var{str}, int @var{base}, mp_limb_t *@var{s1p}, mp_size_t @var{s1n}) |
Convert @{@var{s1p}, @var{s1size}@} to a raw unsigned char array in base |
Convert @{@var{s1p}, @var{s1n}@} to a raw unsigned char array at @var{str} in |
@var{base}. The string is not in ASCII; to convert it to printable format, |
base @var{base}, and return the number of characters produced. There may be |
add the ASCII codes for @samp{0} or @samp{A}, depending on the base and |
leading zeros in the string. The string is not in ASCII; to convert it to |
range. There may be leading zeros in the string. |
printable format, add the ASCII codes for @samp{0} or @samp{A}, depending on |
|
the base and range. @var{base} can vary from 2 to 256. |
|
|
The area at @var{s1p} is clobbered. |
The most significant limb of the input @{@var{s1p}, @var{s1n}@} must be |
|
non-zero. The input @{@var{s1p}, @var{s1n}@} is clobbered, except when |
|
@var{base} is a power of 2, in which case it's unchanged. |
|
|
Return the number of characters in @var{str}. |
|
|
|
The area at @var{str} has to have space for the largest possible number |
The area at @var{str} has to have space for the largest possible number |
represented by a @var{s1size} long limb array, plus one extra character. |
represented by a @var{s1n} long limb array, plus one extra character. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun mp_size_t mpn_set_str (mp_limb_t *@var{r1p}, const char *@var{str}, size_t @var{strsize}, int @var{base}) |
@deftypefun mp_size_t mpn_set_str (mp_limb_t *@var{rp}, const unsigned char *@var{str}, size_t @var{strsize}, int @var{base}) |
Convert the raw unsigned char array at @var{str} of length @var{strsize} to |
Convert bytes @{@var{str},@var{strsize}@} in the given @var{base} to limbs at |
a limb array @{@var{s1p}, @var{s1size}@}. The base of @var{str} is |
@var{rp}. |
@var{base}. |
|
|
|
Return the number of limbs stored in @var{r1p}. |
@math{@var{str}[0]} is the most significant byte and |
|
@math{@var{str}[@var{strsize}-1]} is the least significant. Each byte should |
|
be a value in the range 0 to @math{@var{base}-1}, not an ASCII character. |
|
@var{base} can vary from 2 to 256. |
|
|
|
The return value is the number of limbs written to @var{rp}. If the most |
|
significant input byte is non-zero then the high limb at @var{rp} will be |
|
non-zero, and only that exact number of limbs will be required there. |
|
|
|
If the most significant input byte is zero then there may be high zero limbs |
|
written to @var{rp} and included in the return value. |
|
|
|
@var{strsize} must be at least 1, and no overlap is permitted between |
|
@{@var{str},@var{strsize}@} and the result at @var{rp}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpn_scan0 (const mp_limb_t *@var{s1p}, unsigned long int @var{bit}) |
@deftypefun {unsigned long int} mpn_scan0 (const mp_limb_t *@var{s1p}, unsigned long int @var{bit}) |
Line 3446 It is required that there be a set bit within the area |
|
Line 4823 It is required that there be a set bit within the area |
|
beyond bit position @var{bit}, so that the function has something to return. |
beyond bit position @var{bit}, so that the function has something to return. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mpn_random (mp_limb_t *@var{r1p}, mp_size_t @var{r1size}) |
@deftypefun void mpn_random (mp_limb_t *@var{r1p}, mp_size_t @var{r1n}) |
@deftypefunx void mpn_random2 (mp_limb_t *@var{r1p}, mp_size_t @var{r1size}) |
@deftypefunx void mpn_random2 (mp_limb_t *@var{r1p}, mp_size_t @var{r1n}) |
Generate a random number of length @var{r1size} and store it at @var{r1p}. |
Generate a random number of length @var{r1n} and store it at @var{r1p}. The |
The most significant limb is always non-zero. @code{mpn_random} generates |
most significant limb is always non-zero. @code{mpn_random} generates |
uniformly distributed limb data, @code{mpn_random2} generates long strings of |
uniformly distributed limb data, @code{mpn_random2} generates long strings of |
zeros and ones in the binary representation. |
zeros and ones in the binary representation. |
|
|
Line 3457 zeros and ones in the binary representation. |
|
Line 4834 zeros and ones in the binary representation. |
|
routines. |
routines. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpn_popcount (const mp_limb_t *@var{s1p}, unsigned long int @var{size}) |
@deftypefun {unsigned long int} mpn_popcount (const mp_limb_t *@var{s1p}, mp_size_t @var{n}) |
Count the number of set bits in @{@var{s1p}, @var{size}@}. |
Count the number of set bits in @{@var{s1p}, @var{n}@}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {unsigned long int} mpn_hamdist (const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, unsigned long int @var{size}) |
@deftypefun {unsigned long int} mpn_hamdist (const mp_limb_t *@var{s1p}, const mp_limb_t *@var{s2p}, mp_size_t @var{n}) |
Compute the hamming distance between @{@var{s1p}, @var{size}@} and |
Compute the hamming distance between @{@var{s1p}, @var{n}@} and @{@var{s2p}, |
@{@var{s2p}, @var{size}@}. |
@var{n}@}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mpn_perfect_square_p (const mp_limb_t *@var{s1p}, mp_size_t @var{size}) |
@deftypefun int mpn_perfect_square_p (const mp_limb_t *@var{s1p}, mp_size_t @var{n}) |
Return non-zero iff @{@var{s1p}, @var{size}@} is a perfect square. |
Return non-zero iff @{@var{s1p}, @var{n}@} is a perfect square. |
@end deftypefun |
@end deftypefun |
|
|
|
|
@node Random Number Functions, BSD Compatible Functions, Low-level Functions, Top |
@sp 1 |
@chapter Random Number Functions |
@section Nails |
@cindex Random number functions |
@cindex Nails |
|
|
There are two groups of random number functions in GNU MP; older |
@strong{Everything in this section is highly experimental and may disappear or |
functions that call C library random number generators, rely on a global |
be subject to incompatible changes in a future version of GMP.} |
state, and aren't very random; and newer functions that don't have these |
|
problems. The newer functions are self-contained, they accept a random |
|
state parameter that supplants global state, and generate good random |
|
numbers. |
|
|
|
The random state parameter is of the type @code{gmp_randstate_t}. It must be |
Nails are an experimental feature whereby a few bits are left unused at the |
initialized by a call to one of the @code{gmp_randinit} functions (@ref{Random |
top of each @code{mp_limb_t}. This can significantly improve carry handling |
State Initialization}). The initial seed is set using one of the |
on some processors. |
@code{gmp_randseed} functions (@ref{Random State Initialization}). |
|
|
|
The size of the seed determines the number of different sequences of |
All the @code{mpn} functions accepting limb data will expect the nail bits to |
random numbers that is possible to generate. The ``quality'' of the |
be zero on entry, and will return data with the nails similarly all zero. |
seed is the randomness of a given seed compared to the previous seed |
This applies both to limb vectors and to single limb arguments. |
used and affects the randomness of separate number sequences. |
|
|
|
The algorithm for assigning seed is critical if the generated random numbers |
Nails can be enabled by configuring with @samp{--enable-nails}. By default |
are to be used for important applications, such as generating cryptographic |
the number of bits will be chosen according to what suits the host processor, |
keys. |
but a particular number can be selected with @samp{--enable-nails=N}. |
|
|
The traditional method is to use the current system time for seeding. One has |
At the mpn level, a nail build is neither source nor binary compatible with a |
to be careful when using the current time though. If the application seeds the |
non-nail build, strictly speaking. But programs acting on limbs only through |
random functions very often, say several times per second, and the resolution |
the mpn functions are likely to work equally well with either build, and |
of the system clock is comparatively low, like one second, the same sequence of |
judicious use of the definitions below should make any program compatible with |
numbers will be generated until the system clock ticks. Furthermore, the |
either build, at the source level. |
current system time is quite easy to guess, so a system depending on any |
|
unpredictability of the random number sequence should absolutely not use that |
|
as its only source for a seed value. |
|
|
|
On some systems there is a special device, often called @code{/dev/random}, |
For the higher level routines, meaning @code{mpz} etc, a nail build should be |
which provides a source of somewhat random numbers more usable as seed. |
fully source and binary compatible with a non-nail build. |
|
|
The functions actually generating random functions are documented under |
@defmac GMP_NAIL_BITS |
``Miscellaneous Functions'' in their respective function class: |
@defmacx GMP_NUMB_BITS |
@ref{Miscellaneous Integer Functions}, @ref{Miscellaneous Float Functions}. |
@defmacx GMP_LIMB_BITS |
|
@code{GMP_NAIL_BITS} is the number of nail bits, or 0 when nails are not in |
|
use. @code{GMP_NUMB_BITS} is the number of data bits in a limb. |
|
@code{GMP_LIMB_BITS} is the total number of bits in an @code{mp_limb_t}. In |
|
all cases |
|
|
|
@example |
|
GMP_LIMB_BITS == GMP_NAIL_BITS + GMP_NUMB_BITS |
|
@end example |
|
@end defmac |
|
|
|
@defmac GMP_NAIL_MASK |
|
@defmacx GMP_NUMB_MASK |
|
Bit masks for the nail and number parts of a limb. @code{GMP_NAIL_MASK} is 0 |
|
when nails are not in use. |
|
|
|
@code{GMP_NAIL_MASK} is not often needed, since the nail part can be obtained |
|
with @code{x >> GMP_NUMB_BITS}, and that means one less large constant, which |
|
can help various RISC chips. |
|
@end defmac |
|
|
|
@defmac GMP_NUMB_MAX |
|
The maximum value that can be stored in the number part of a limb. This is |
|
the same as @code{GMP_NUMB_MASK}, but can be used for clarity when doing |
|
comparisons rather than bit-wise operations. |
|
@end defmac |
|
|
|
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. |
|
|
|
|
|
@node Random Number Functions, Formatted Output, Low-level Functions, Top |
|
@chapter Random Number Functions |
|
@cindex Random number functions |
|
|
|
Sequences of pseudo-random numbers in GMP are generated using a variable of |
|
type @code{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 |
|
@code{gmp_randinit} functions, and can be seeded with one of the |
|
@code{gmp_randseed} functions. |
|
|
|
The functions actually generating random numbers are described in @ref{Integer |
|
Random Numbers}, and @ref{Miscellaneous Float Functions}. |
|
|
|
The older style random number functions don't accept a @code{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 @code{gmp_randstate_t} |
|
are recommended for applications that care about randomness. |
|
|
@menu |
@menu |
* Random State Initialization:: How to initialize a random state. |
* Random State Initialization:: |
|
* Random State Seeding:: |
@end menu |
@end menu |
|
|
@node Random State Initialization, , Random Number Functions, Random Number Functions |
@node Random State Initialization, Random State Seeding, Random Number Functions, Random Number Functions |
@section Random State Initialization |
@section Random State Initialization |
@cindex Random number state |
@cindex Random number state |
|
|
See @ref{Random Number Functions} for a discussion on how to choose the |
@deftypefun void gmp_randinit_default (gmp_randstate_t @var{state}) |
initial seed value passed to these functions. |
Initialize @var{state} with a default algorithm. This will be a compromise |
|
between speed and randomness, and is recommended for applications with no |
|
special requirements. |
|
@end deftypefun |
|
|
@deftypefun void gmp_randinit (gmp_randstate_t @var{state}, gmp_randalg_t @var{alg}, ...) |
@deftypefun void gmp_randinit_lc_2exp (gmp_randstate_t @var{state}, mpz_t @var{a}, @w{unsigned long @var{c}}, @w{unsigned long @var{m2exp}}) |
Initialize random state variable @var{state}. |
Initialize @var{state} with a linear congruential algorithm @m{X = (@var{a}X + |
|
@var{c}) @bmod 2^{m2exp}, X = (@var{a}*X + @var{c}) mod 2^@var{m2exp}}. |
|
|
@var{alg} denotes what algorithm to use for random number generation. |
The low bits of @math{X} in this algorithm are not very random. The least |
Use one of |
significant bit will have a period no more than 2, and the second bit no more |
@itemize @minus |
than 4, etc. For this reason only the high half of each @math{X} is actually |
@item GMP_RAND_ALG_LC --- Linear congruential. |
used. |
|
|
A fast generator defined by @math{X = (aX + c) mod m}. |
When a random number of more than @math{@var{m2exp}/2} bits is to be |
|
generated, multiple iterations of the recurrence are used and the results |
|
concatenated. |
|
@end deftypefun |
|
|
A third argument @var{size} of type unsigned long int is required. @var{size} |
@deftypefun int gmp_randinit_lc_2exp_size (gmp_randstate_t @var{state}, unsigned long @var{size}) |
is the size of the largest good quality random number to be generated, |
Initialize @var{state} for a linear congruential algorithm as per |
expressed in number of bits. If the random generation functions are asked for |
@code{gmp_randinit_lc_2exp}. @var{a}, @var{c} and @var{m2exp} are selected |
a bigger random number than indicated by this parameter, two or more numbers |
from a table, chosen so that @var{size} bits (or more) of each @math{X} will |
of @var{size} bits will be generated and concatenated, resulting in a ``bad'' |
be used, ie. @math{@var{m2exp}/2 @ge{} @var{size}}. |
random number. This can be used to generate big random numbers relatively |
|
cheap if the quality of randomness isn't of great importance. |
|
|
|
a, c, and m are picked from a table where the modulus (m) is a power of 2 and |
If successful the return value is non-zero. If @var{size} is bigger than the |
the multiplier is congruent to 5 (mod 8). The choice is based on the |
table data provides then the return value is zero. The maximum @var{size} |
@var{size} parameter. The maximum @var{size} supported by this algorithm is |
currently supported is 128. |
128. If you need bigger random numbers, use your own scheme and call one of |
@end deftypefun |
the other @code{gmp_randinit} functions. |
|
|
|
|
@deftypefun void gmp_randinit (gmp_randstate_t @var{state}, @w{gmp_randalg_t @var{alg}}, ...) |
|
@strong{This function is obsolete.} |
|
|
|
Initialize @var{state} with an algorithm selected by @var{alg}. The only |
|
choice is @code{GMP_RAND_ALG_LC}, which is @code{gmp_randinit_lc_2exp_size}. |
|
A third parameter of type @code{unsigned long} is required, this is the |
|
@var{size} for that function. @code{GMP_RAND_ALG_DEFAULT} or 0 are the same |
|
as @code{GMP_RAND_ALG_LC}. |
|
|
|
@code{gmp_randinit} sets bits in @code{gmp_errno} to indicate an error. |
|
@code{GMP_ERROR_UNSUPPORTED_ARGUMENT} if @var{alg} is unsupported, or |
|
@code{GMP_ERROR_INVALID_ARGUMENT} if the @var{size} parameter is too big. |
|
@end deftypefun |
|
|
|
@c Not yet in the library. |
@ignore |
@ignore |
@item GMP_RAND_ALG_BBS --- Blum, Blum, and Shub. |
@deftypefun void gmp_randinit_lc (gmp_randstate_t @var{state}, mpz_t @var{a}, unsigned long int @var{c}, mpz_t @var{m}) |
|
Initialize @var{state} for a linear congruential scheme @m{X = (@var{a}X + |
|
@var{c}) @bmod @var{m}, X = (@var{a}*X + @var{c}) mod 2^@var{m}}. |
|
@end deftypefun |
@end ignore |
@end ignore |
@end itemize |
|
|
|
If @var{alg} is 0 or GMP_RAND_ALG_DEFAULT, the default algorithm is used. The |
@deftypefun void gmp_randclear (gmp_randstate_t @var{state}) |
default algorithm is typically a fast algorithm like the linear congruential |
Free all memory occupied by @var{state}. |
and requires a third @var{size} argument (see GMP_RAND_ALG_LC). |
@end deftypefun |
|
|
When you're done with a @var{state} variable, call @code{gmp_randclear} |
|
to deallocate any memory allocated by this function. |
|
|
|
@code{gmp_randinit} may set the following bits in @var{gmp_errno}: |
@node Random State Seeding, , Random State Initialization, Random Number Functions |
@c FIXME: gmp_errno is printed in uppercase. That's wrong. |
@section Random State Seeding |
@itemize |
@cindex Random number seeding |
@item GMP_ERROR_UNSUPPORTED_ARGUMENT --- @var{alg} is unsupported |
|
@item GMP_ERROR_INVALID_ARGUMENT --- @var{size} is too big |
@deftypefun void gmp_randseed (gmp_randstate_t @var{state}, mpz_t @var{seed}) |
@end itemize |
@deftypefunx void gmp_randseed_ui (gmp_randstate_t @var{state}, @w{unsigned long int @var{seed}}) |
|
Set an initial seed value into @var{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 @file{/dev/random} which provides |
|
random data better suited for use as a seed. |
@end deftypefun |
@end deftypefun |
|
|
|
|
@ignore |
@node Formatted Output, Formatted Input, Random Number Functions, Top |
@deftypefun void gmp_randinit_lc (gmp_randstate_t @var{state}, mpz_t @var{a}, |
@chapter Formatted Output |
unsigned long int @var{c}, mpz_t @var{m}) |
@cindex Formatted output |
|
@cindex @code{printf} formatted output |
|
|
Initialize random state variable @var{state} with given linear congruential |
@menu |
scheme. |
* Formatted Output Strings:: |
|
* Formatted Output Functions:: |
|
* C++ Formatted Output:: |
|
@end menu |
|
|
Parameters @var{a}, @var{c}, and @var{m} are the multiplier, adder, and modulus |
@node Formatted Output Strings, Formatted Output Functions, Formatted Output, Formatted Output |
for the linear congruential scheme to use, respectively. |
@section Format Strings |
|
|
When you're done with a @var{state} variable, call @code{gmp_randclear} |
@code{gmp_printf} and friends accept format strings similar to the standard C |
to deallocate any memory allocated by this function. |
@code{printf} (@pxref{Formatted Output,,,libc,The GNU C Library Reference |
|
Manual}). A format specification is of the form |
|
|
|
@example |
|
% [flags] [width] [.[precision]] [type] conv |
|
@end example |
|
|
|
GMP adds types @samp{Z}, @samp{Q} and @samp{F} for @code{mpz_t}, @code{mpq_t} |
|
and @code{mpf_t} respectively, and @samp{N} for an @code{mp_limb_t} array. |
|
@samp{Z}, @samp{Q} and @samp{N} behave like integers. @samp{Q} will print a |
|
@samp{/} and a denominator, if needed. @samp{F} behaves like a float. For |
|
example, |
|
|
|
@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); |
|
|
|
const mp_limb_t *ptr; |
|
mp_size_t size; |
|
gmp_printf ("limb array %Nx\n", ptr, size); |
|
@end example |
|
|
|
For @samp{N} the limbs are expected least significant first, as per the |
|
@code{mpn} functions (@pxref{Low-level Functions}). A negative size can be |
|
given to print the value as a negative. |
|
|
|
All the standard C @code{printf} types behave the same as the C library |
|
@code{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 @code{printf} and only the GMP extensions handled directly. |
|
|
|
The flags accepted are as follows. GLIBC style @nisamp{'} is only for the |
|
standard C types (not the GMP types), and only if the C library supports it. |
|
|
|
@quotation |
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item @nicode{0} @tab pad with zeros (rather than spaces) |
|
@item @nicode{#} @tab show the base with @samp{0x}, @samp{0X} or @samp{0} |
|
@item @nicode{+} @tab always show a sign |
|
@item (space) @tab show a space or a @samp{-} sign |
|
@item @nicode{'} @tab group digits, GLIBC style (not GMP types) |
|
@end multitable |
|
@end quotation |
|
|
|
The optional width and precision can be given as a number within the format |
|
string, or as a @samp{*} to take an extra parameter of type @code{int}, the |
|
same as the standard @code{printf}. |
|
|
|
The standard types accepted are as follows. @samp{h} and @samp{l} are |
|
portable, the rest will depend on the compiler (or include files) for the type |
|
and the C library for the output. |
|
|
|
@quotation |
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item @nicode{h} @tab @nicode{short} |
|
@item @nicode{hh} @tab @nicode{char} |
|
@item @nicode{j} @tab @nicode{intmax_t} or @nicode{uintmax_t} |
|
@item @nicode{l} @tab @nicode{long} or @nicode{wchar_t} |
|
@item @nicode{ll} @tab @nicode{long long} |
|
@item @nicode{L} @tab @nicode{long double} |
|
@item @nicode{q} @tab @nicode{quad_t} or @nicode{u_quad_t} |
|
@item @nicode{t} @tab @nicode{ptrdiff_t} |
|
@item @nicode{z} @tab @nicode{size_t} |
|
@end multitable |
|
@end quotation |
|
|
|
@noindent |
|
The GMP types are |
|
|
|
@quotation |
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item @nicode{F} @tab @nicode{mpf_t}, float conversions |
|
@item @nicode{Q} @tab @nicode{mpq_t}, integer conversions |
|
@item @nicode{N} @tab @nicode{mp_limb_t} array, integer conversions |
|
@item @nicode{Z} @tab @nicode{mpz_t}, integer conversions |
|
@end multitable |
|
@end quotation |
|
|
|
The conversions accepted are as follows. @samp{a} and @samp{A} are always |
|
supported for @code{mpf_t} but depend on the C library for standard C float |
|
types. @samp{m} and @samp{p} depend on the C library. |
|
|
|
@quotation |
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item @nicode{a} @nicode{A} @tab hex floats, C99 style |
|
@item @nicode{c} @tab character |
|
@item @nicode{d} @tab decimal integer |
|
@item @nicode{e} @nicode{E} @tab scientific format float |
|
@item @nicode{f} @tab fixed point float |
|
@item @nicode{i} @tab same as @nicode{d} |
|
@item @nicode{g} @nicode{G} @tab fixed or scientific float |
|
@item @nicode{m} @tab @code{strerror} string, GLIBC style |
|
@item @nicode{n} @tab store characters written so far |
|
@item @nicode{o} @tab octal integer |
|
@item @nicode{p} @tab pointer |
|
@item @nicode{s} @tab string |
|
@item @nicode{u} @tab unsigned integer |
|
@item @nicode{x} @nicode{X} @tab hex integer |
|
@end multitable |
|
@end quotation |
|
|
|
@samp{o}, @samp{x} and @samp{X} are unsigned for the standard C types, but for |
|
types @samp{Z}, @samp{Q} and @samp{N} they are signed. @samp{u} is not |
|
meaningful for @samp{Z}, @samp{Q} and @samp{N}. |
|
|
|
@samp{n} can be used with any type, even the GMP types. |
|
|
|
Other types or conversions that might be accepted by the C library |
|
@code{printf} cannot be used through @code{gmp_printf}, this includes for |
|
instance extensions registered with GLIBC @code{register_printf_function}. |
|
Also currently there's no support for POSIX @samp{$} style numbered arguments |
|
(perhaps this will be added in the future). |
|
|
|
The precision field has it's usual meaning for integer @samp{Z} and float |
|
@samp{F} types, but is currently undefined for @samp{Q} and should not be used |
|
with that. |
|
|
|
@code{mpf_t} conversions only ever generate as many digits as can be |
|
accurately represented by the operand, the same as @code{mpf_get_str} does. |
|
Zeros will be used if necessary to pad to the requested precision. This |
|
happens even for an @samp{f} conversion of an @code{mpf_t} which is an |
|
integer, for instance @math{2^@W{1024}} in an @code{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 @samp{%.Fe} or @samp{%.Ff} can |
|
be used to specifically request just the significant digits. |
|
|
|
The decimal point character (or string) is taken from the current locale |
|
settings on systems which provide @code{localeconv} (@pxref{Locales,,Locales |
|
and Internationalization,libc,The GNU C Library Reference Manual}). The C |
|
library will normally do the same for standard float output. |
|
|
|
The format string is only interpreted as plain @code{char}s, multibyte |
|
characters are not recognised. Perhaps this will change in the future. |
|
|
|
|
|
@node Formatted Output Functions, C++ Formatted Output, Formatted Output Strings, Formatted Output |
|
@section Functions |
|
|
|
Each of the following functions is similar to the corresponding C library |
|
function. The basic @code{printf} forms take a variable argument list. The |
|
@code{vprintf} forms take an argument pointer, see @ref{Variadic |
|
Functions,,,libc,The GNU C Library Reference Manual}, or @samp{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 @code{gmp_printf} and @code{gmp_fprintf} will return |
|
@math{-1} to indicate a write error. All the functions can return @math{-1} |
|
if the C library @code{printf} variant in use returns @math{-1}, but this |
|
shouldn't normally occur. |
|
|
|
@deftypefun int gmp_printf (const char *@var{fmt}, ...) |
|
@deftypefunx int gmp_vprintf (const char *@var{fmt}, va_list @var{ap}) |
|
Print to the standard output @code{stdout}. Return the number of characters |
|
written, or @math{-1} if an error occurred. |
@end deftypefun |
@end deftypefun |
@end ignore |
|
|
|
@deftypefun void gmp_randinit_lc_2exp (gmp_randstate_t @var{state}, mpz_t @var{a}, |
@deftypefun int gmp_fprintf (FILE *@var{fp}, const char *@var{fmt}, ...) |
unsigned long int @var{c}, unsigned long int @var{m2exp}) |
@deftypefunx int gmp_vfprintf (FILE *@var{fp}, const char *@var{fmt}, va_list @var{ap}) |
|
Print to the stream @var{fp}. Return the number of characters written, or |
|
@math{-1} if an error occurred. |
|
@end deftypefun |
|
|
Initialize random state variable @var{state} with given linear congruential |
@deftypefun int gmp_sprintf (char *@var{buf}, const char *@var{fmt}, ...) |
scheme. |
@deftypefunx int gmp_vsprintf (char *@var{buf}, const char *@var{fmt}, va_list @var{ap}) |
|
Form a null-terminated string in @var{buf}. Return the number of characters |
|
written, excluding the terminating null. |
|
|
Parameters @var{a}, @var{c}, and @var{m2exp} are the multiplier, adder, and |
No overlap is permitted between the space at @var{buf} and the string |
modulus for the linear congruential scheme to use, respectively. The modulus |
@var{fmt}. |
is expressed as a power of 2, so that |
|
@ifnottex |
|
@var{m} = 2^@var{m2exp}. |
|
@end ifnottex |
|
@tex |
|
$m = 2^{m2exp}$. |
|
@end tex |
|
|
|
The least significant bits of a random number generated by the linear |
These functions are not recommended, since there's no protection against |
congruential algorithm where the modulus is a power of two are not very random. |
exceeding the space available at @var{buf}. |
Therefore, the lower half of a random number generated by an LC scheme |
@end deftypefun |
initialized with this function is discarded. Thus, the size of a random number |
|
is @var{m2exp} / 2 (rounded upwards) bits when this function has been used for |
|
initializing the random state. |
|
|
|
When you're done with a @var{state} variable, call @code{gmp_randclear} |
@deftypefun int gmp_snprintf (char *@var{buf}, size_t @var{size}, const char *@var{fmt}, ...) |
to deallocate any memory allocated by this function. |
@deftypefunx int gmp_vsnprintf (char *@var{buf}, size_t @var{size}, const char *@var{fmt}, va_list @var{ap}) |
|
Form a null-terminated string in @var{buf}. No more than @var{size} bytes |
|
will be written. To get the full output, @var{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 @math{@var{retval} @ge{} |
|
@var{size}} then the actual output has been truncated to the first |
|
@math{@var{size}-1} characters, and a null appended. |
|
|
|
No overlap is permitted between the region @{@var{buf},@var{size}@} and the |
|
@var{fmt} string. |
|
|
|
Notice the return value is in ISO C99 @code{snprintf} style. This is so even |
|
if the C library @code{vsnprintf} is the older GLIBC 2.0.x style. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void gmp_randseed (gmp_randstate_t @var{state}, mpz_t @var{seed}) |
@deftypefun int gmp_asprintf (char **@var{pp}, const char *@var{fmt}, ...) |
@deftypefunx void gmp_randseed_ui (gmp_randstate_t @var{state}, unsigned long int @var{seed}) |
@deftypefunx int gmp_vasprintf (char *@var{pp}, const char *@var{fmt}, va_list @var{ap}) |
|
Form a null-terminated string in a block of memory obtained from the current |
|
memory allocation function (@pxref{Custom Allocation}). The block will be the |
|
size of the string and null-terminator. Put the address of the block in |
|
*@var{pp}. Return the number of characters produced, excluding the |
|
null-terminator. |
|
|
Set the initial seed value. |
Unlike the C library @code{asprintf}, @code{gmp_asprintf} doesn't return |
|
@math{-1} if there's no more memory available, it lets the current allocation |
|
function handle that. |
|
@end deftypefun |
|
|
Parameter @var{seed} is the initial random seed. The function |
@deftypefun int gmp_obstack_printf (struct obstack *@var{ob}, const char *@var{fmt}, ...) |
@code{gmp_randseed_ui} takes the @var{seed} as an unsigned long int rather |
@deftypefunx int gmp_obstack_vprintf (struct obstack *@var{ob}, const char *@var{fmt}, va_list @var{ap}) |
than as an mpz_t. |
Append to the current obstack object, in the same style as |
|
@code{obstack_printf}. Return the number of characters written. A |
|
null-terminator is not written. |
|
|
|
@var{fmt} cannot be within the current obstack object, since the 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 |
|
@ref{Obstacks,,,libc,The GNU C Library Reference Manual}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void gmp_randclear (gmp_randstate_t @var{state}) |
|
Free all memory occupied by @var{state}. Make sure to call this |
@node C++ Formatted Output, , Formatted Output Functions, Formatted Output |
function for all @code{gmp_randstate_t} variables when you are done with |
@section C++ Formatted Output |
them. |
@cindex C++ @code{ostream} output |
|
@cindex @code{ostream} output |
|
|
|
The following functions are provided in @file{libgmpxx}, which is built if C++ |
|
support is enabled (@pxref{Build Options}). Prototypes are available from |
|
@code{<gmp.h>}. |
|
|
|
@deftypefun ostream& operator<< (ostream& @var{stream}, mpz_t @var{op}) |
|
Print @var{op} to @var{stream}, using its @code{ios} formatting settings. |
|
@code{ios::width} is reset to 0 after output, the same as the standard |
|
@code{ostream operator<<} routines do. |
|
|
|
In hex or octal, @var{op} is printed as a signed number, the same as for |
|
decimal. This is unlike the standard @code{operator<<} routines on @code{int} |
|
etc, which instead give twos complement. |
@end deftypefun |
@end deftypefun |
|
|
@node BSD Compatible Functions, Custom Allocation, Random Number Functions, Top |
@deftypefun ostream& operator<< (ostream& @var{stream}, mpq_t @var{op}) |
|
Print @var{op} to @var{stream}, using its @code{ios} formatting settings. |
|
@code{ios::width} is reset to 0 after output, the same as the standard |
|
@code{ostream operator<<} routines do. |
|
|
|
Output will be a fraction like @samp{5/9}, or if the denominator is 1 then |
|
just a plain integer like @samp{123}. |
|
|
|
In hex or octal, @var{op} is printed as a signed value, the same as for |
|
decimal. If @code{ios::showbase} is set then a base indicator is shown on |
|
both the numerator and denominator (if the denominator is required). |
|
@end deftypefun |
|
|
|
@deftypefun ostream& operator<< (ostream& @var{stream}, mpf_t @var{op}) |
|
Print @var{op} to @var{stream}, using its @code{ios} formatting settings. |
|
@code{ios::width} is reset to 0 after output, the same as the standard |
|
@code{ostream operator<<} routines do. The decimal point follows the current |
|
locale, on systems providing @code{localeconv}. |
|
|
|
Hex and octal are supported, unlike the standard @code{operator<<} on |
|
@code{double}. The mantissa will be in hex or octal, the exponent will be in |
|
decimal. For hex the exponent delimiter is an @samp{@@}. This is as per |
|
@code{mpf_out_str}. |
|
|
|
@code{ios::showbase} is supported, and will put a base on the mantissa, for |
|
example hex @samp{0x1.8} or @samp{0x0.8}, or octal @samp{01.4} or @samp{00.4}. |
|
This last form is slightly strange, but at least differentiates itself from |
|
decimal. |
|
@end deftypefun |
|
|
|
These operators mean that GMP types can be printed in the usual C++ way, for |
|
example, |
|
|
|
@example |
|
mpz_t z; |
|
int n; |
|
... |
|
cout << "iteration " << n << " value " << z << "\n"; |
|
@end example |
|
|
|
But note that @code{ostream} output (and @code{istream} input, @pxref{C++ |
|
Formatted Input}) is the only overloading available and using for instance |
|
@code{+} with an @code{mpz_t} will have unpredictable results. |
|
|
|
|
|
@node Formatted Input, C++ Class Interface, Formatted Output, Top |
|
@chapter Formatted Input |
|
@cindex Formatted input |
|
@cindex @code{scanf} formatted input |
|
|
|
@menu |
|
* Formatted Input Strings:: |
|
* Formatted Input Functions:: |
|
* C++ Formatted Input:: |
|
@end menu |
|
|
|
|
|
@node Formatted Input Strings, Formatted Input Functions, Formatted Input, Formatted Input |
|
@section Formatted Input Strings |
|
|
|
@code{gmp_scanf} and friends accept format strings similar to the standard C |
|
@code{scanf} (@pxref{Formatted Input,,,libc,The GNU C Library Reference |
|
Manual}). A format specification is of the form |
|
|
|
@example |
|
% [flags] [width] [type] conv |
|
@end example |
|
|
|
GMP adds types @samp{Z}, @samp{Q} and @samp{F} for @code{mpz_t}, @code{mpq_t} |
|
and @code{mpf_t} respectively. @samp{Z} and @samp{Q} behave like integers. |
|
@samp{Q} will read a @samp{/} and a denominator, if present. @samp{F} behaves |
|
like a float. |
|
|
|
GMP variables don't require an @code{&} when passed to @code{gmp_scanf}, since |
|
they're already ``call-by-reference''. For example, |
|
|
|
@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); |
|
@end example |
|
|
|
All the standard C @code{scanf} types behave the same as in the C library |
|
@code{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 @code{scanf} and only the GMP extensions handled directly. |
|
|
|
The flags accepted are as follows. @samp{a} and @samp{'} will depend on |
|
support from the C library, and @samp{'} cannot be used with GMP types. |
|
|
|
@quotation |
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item @nicode{*} @tab read but don't store |
|
@item @nicode{a} @tab allocate a buffer (string conversions) |
|
@item @nicode{'} @tab group digits, GLIBC style (not GMP types) |
|
@end multitable |
|
@end quotation |
|
|
|
The standard types accepted are as follows. @samp{h} and @samp{l} are |
|
portable, the rest will depend on the compiler (or include files) for the type |
|
and the C library for the input. |
|
|
|
@quotation |
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item @nicode{h} @tab @nicode{short} |
|
@item @nicode{hh} @tab @nicode{char} |
|
@item @nicode{j} @tab @nicode{intmax_t} or @nicode{uintmax_t} |
|
@item @nicode{l} @tab @nicode{long int}, @nicode{double} or @nicode{wchar_t} |
|
@item @nicode{ll} @tab @nicode{long long} |
|
@item @nicode{L} @tab @nicode{long double} |
|
@item @nicode{q} @tab @nicode{quad_t} or @nicode{u_quad_t} |
|
@item @nicode{t} @tab @nicode{ptrdiff_t} |
|
@item @nicode{z} @tab @nicode{size_t} |
|
@end multitable |
|
@end quotation |
|
|
|
@noindent |
|
The GMP types are |
|
|
|
@quotation |
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item @nicode{F} @tab @nicode{mpf_t}, float conversions |
|
@item @nicode{Q} @tab @nicode{mpq_t}, integer conversions |
|
@item @nicode{Z} @tab @nicode{mpz_t}, integer conversions |
|
@end multitable |
|
@end quotation |
|
|
|
The conversions accepted are as follows. @samp{p} and @samp{[} will depend on |
|
support from the C library, the rest are standard. |
|
|
|
@quotation |
|
@multitable {(space)} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item @nicode{c} @tab character or characters |
|
@item @nicode{d} @tab decimal integer |
|
@item @nicode{e} @nicode{E} @nicode{f} @nicode{g} @nicode{G} |
|
@tab float |
|
@item @nicode{i} @tab integer with base indicator |
|
@item @nicode{n} @tab characters read so far |
|
@item @nicode{o} @tab octal integer |
|
@item @nicode{p} @tab pointer |
|
@item @nicode{s} @tab string of non-whitespace characters |
|
@item @nicode{u} @tab decimal integer |
|
@item @nicode{x} @nicode{X} @tab hex integer |
|
@item @nicode{[} @tab string of characters in a set |
|
@end multitable |
|
@end quotation |
|
|
|
@samp{e}, @samp{E}, @samp{f}, @samp{g} and @samp{G} are identical, they all |
|
read either fixed point or scientific format, and either @samp{e} or @samp{E} |
|
for the exponent in scientific format. |
|
|
|
@samp{x} and @samp{X} are identical, both accept both upper and lower case |
|
hexadecimal. |
|
|
|
@samp{o}, @samp{u}, @samp{x} and @samp{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 (see @code{strtoul}, @ref{Parsing of Integers,,,libc,The GNU C |
|
Library Reference Manual}). For GMP types there are no overflows, and |
|
@samp{d} and @samp{u} are identical. |
|
|
|
@samp{Q} type reads the numerator and (optional) denominator as given. If the |
|
value might not be in canonical form then @code{mpq_canonicalize} must be |
|
called before using it in any calculations (@pxref{Rational Number |
|
Functions}). |
|
|
|
@samp{Qi} will read a base specification separately for the numerator and |
|
denominator. For example @samp{0x10/11} would be 16/11, whereas |
|
@samp{0x10/0x11} would be 16/17. |
|
|
|
@samp{n} can be used with any of the types above, even the GMP types. |
|
@samp{*} to suppress assignment is allowed, though the field would then do |
|
nothing at all. |
|
|
|
Other conversions or types that might be accepted by the C library |
|
@code{scanf} cannot be used through @code{gmp_scanf}. |
|
|
|
Whitespace is read and discarded before a field, except for @samp{c} and |
|
@samp{[} conversions. |
|
|
|
For float conversions, the decimal point character (or string) expected is |
|
taken from the current locale settings on systems which provide |
|
@code{localeconv} (@pxref{Locales,,Locales and Internationalization,libc,The |
|
GNU C Library Reference Manual}). The C library will normally do the same for |
|
standard float input. |
|
|
|
The format string is only interpreted as plain @code{char}s, multibyte |
|
characters are not recognised. Perhaps this will change in the future. |
|
|
|
|
|
@node Formatted Input Functions, C++ Formatted Input, Formatted Input Strings, Formatted Input |
|
@section Formatted Input Functions |
|
|
|
Each of the following functions is similar to the corresponding C library |
|
function. The plain @code{scanf} forms take a variable argument list. The |
|
@code{vscanf} forms take an argument pointer, see @ref{Variadic |
|
Functions,,,libc,The GNU C Library Reference Manual}, or @samp{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 @var{fmt} string and any of the results |
|
produced. |
|
|
|
@deftypefun int gmp_scanf (const char *@var{fmt}, ...) |
|
@deftypefunx int gmp_vscanf (const char *@var{fmt}, va_list @var{ap}) |
|
Read from the standard input @code{stdin}. |
|
@end deftypefun |
|
|
|
@deftypefun int gmp_fscanf (FILE *@var{fp}, const char *@var{fmt}, ...) |
|
@deftypefunx int gmp_vfscanf (FILE *@var{fp}, const char *@var{fmt}, va_list @var{ap}) |
|
Read from the stream @var{fp}. |
|
@end deftypefun |
|
|
|
@deftypefun int gmp_sscanf (const char *@var{s}, const char *@var{fmt}, ...) |
|
@deftypefunx int gmp_vsscanf (const char *@var{s}, const char *@var{fmt}, va_list @var{ap}) |
|
Read from a null-terminated string @var{s}. |
|
@end deftypefun |
|
|
|
The return value from each of these functions is the same as the standard C99 |
|
@code{scanf}, namely the number of fields successfully parsed and stored. |
|
@samp{%n} fields and fields read but suppressed by @samp{*} don't count |
|
towards the return value. |
|
|
|
If end of file or file error, or end of string, is reached when a match is |
|
required, and when no previous non-suppressed fields have matched, then the |
|
return value is EOF instead of 0. A match is required for a literal character |
|
in the format string or a field other than @samp{%n}. Whitespace in the |
|
format string is only an optional match and won't induce an EOF in this |
|
fashion. Leading whitespace read and discarded for a field doesn't count as a |
|
match. |
|
|
|
|
|
@node C++ Formatted Input, , Formatted Input Functions, Formatted Input |
|
@section C++ Formatted Input |
|
@cindex C++ @code{istream} input |
|
@cindex @code{istream} input |
|
|
|
The following functions are provided in @file{libgmpxx}, which is built only |
|
if C++ support is enabled (@pxref{Build Options}). Prototypes are available |
|
from @code{<gmp.h>}. |
|
|
|
@deftypefun istream& operator>> (istream& @var{stream}, mpz_t @var{rop}) |
|
Read @var{rop} from @var{stream}, using its @code{ios} formatting settings. |
|
@end deftypefun |
|
|
|
@deftypefun istream& operator>> (istream& @var{stream}, mpq_t @var{rop}) |
|
Read @var{rop} from @var{stream}, using its @code{ios} formatting settings. |
|
|
|
An integer like @samp{123} will be read, or a fraction like @samp{5/9}. If |
|
the fraction is not in canonical form then @code{mpq_canonicalize} must be |
|
called (@pxref{Rational Number Functions}). |
|
@end deftypefun |
|
|
|
@deftypefun istream& operator>> (istream& @var{stream}, mpf_t @var{rop}) |
|
Read @var{rop} from @var{stream}, using its @code{ios} formatting settings. |
|
|
|
Hex or octal floats are not supported, but might be in the future. |
|
@end deftypefun |
|
|
|
These operators mean that GMP types can be read in the usual C++ way, for |
|
example, |
|
|
|
@example |
|
mpz_t z; |
|
... |
|
cin >> z; |
|
@end example |
|
|
|
But note that @code{istream} input (and @code{ostream} output, @pxref{C++ |
|
Formatted Output}) is the only overloading available and using for instance |
|
@code{+} with an @code{mpz_t} will have unpredictable results. |
|
|
|
|
|
@node C++ Class Interface, BSD Compatible Functions, Formatted Input, Top |
|
@chapter C++ Class Interface |
|
@cindex C++ 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 |
|
@file{gmp.h} has @code{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. For GCC this means version 2.91 or later. |
|
|
|
@strong{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 MPFR:: |
|
* C++ Interface Random Numbers:: |
|
* C++ Interface Limitations:: |
|
@end menu |
|
|
|
|
|
@node C++ Interface General, C++ Interface Integers, C++ Class Interface, C++ Class Interface |
|
@section C++ Interface General |
|
|
|
@noindent |
|
All the C++ classes and functions are available with |
|
|
|
@cindex gmpxx.h |
|
@example |
|
#include <gmpxx.h> |
|
@end example |
|
|
|
Programs should be linked with the @file{libgmpxx} and @file{libgmp} |
|
libraries. For example, |
|
|
|
@example |
|
g++ mycxxprog.cc -lgmpxx -lgmp |
|
@end example |
|
|
|
@noindent |
|
The classes defined are |
|
|
|
@deftp Class mpz_class |
|
@deftpx Class mpq_class |
|
@deftpx Class mpf_class |
|
@end deftp |
|
|
|
The standard operators and various standard functions are overloaded to allow |
|
arithmetic with these classes. For example, |
|
|
|
@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; |
|
@} |
|
@end example |
|
|
|
An important feature of the implementation is that an expression like |
|
@code{a=b+c} results in a single call to the corresponding @code{mpz_add}, |
|
without using a temporary for the @code{b+c} part. Expressions which by their |
|
nature imply intermediate values, like @code{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 @code{long}, @code{unsigned long} and @code{double}. |
|
Smaller types like @code{int} or @code{float} can also be intermixed, since |
|
C++ will promote them. |
|
|
|
Note that @code{bool} is not accepted directly, but must be explicitly cast to |
|
an @code{int} first. This is because C++ will automatically convert any |
|
pointer to a @code{bool}, so if GMP accepted @code{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 @code{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, |
|
|
|
@deftypefun mpz_t mpz_class::get_mpz_t () |
|
@deftypefunx mpq_t mpq_class::get_mpq_t () |
|
@deftypefunx mpf_t mpf_class::get_mpf_t () |
|
@end deftypefun |
|
|
|
These can be used to call a C function which doesn't have a C++ class |
|
interface. For example to set @code{a} to the GCD of @code{b} and @code{c}, |
|
|
|
@example |
|
mpz_class a, b, c; |
|
... |
|
mpz_gcd (a.get_mpz_t(), b.get_mpz_t(), c.get_mpz_t()); |
|
@end example |
|
|
|
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, |
|
|
|
@example |
|
mpz_t z; |
|
// ... init and calculate z ... |
|
mpz_class x(z); |
|
mpz_class y; |
|
y = mpz_class (z); |
|
@end example |
|
|
|
There are no namespace setups in @file{gmpxx.h}, all types and functions are |
|
simply put into the global namespace. This is what @file{gmp.h} has done in |
|
the past, and continues to do for compatibility. The extras provided by |
|
@file{gmpxx.h} follow GMP naming conventions and are unlikely to clash with |
|
anything. |
|
|
|
|
|
@node C++ Interface Integers, C++ Interface Rationals, C++ Interface General, C++ Class Interface |
|
@section C++ Interface Integers |
|
|
|
@deftypefun void mpz_class::mpz_class (type @var{n}) |
|
Construct an @code{mpz_class}. All the standard C++ types may be used, except |
|
@code{long long} and @code{long double}, and all the GMP C++ classes can be |
|
used. Any necessary conversion follows the corresponding C function, for |
|
example @code{double} follows @code{mpz_set_d} (@pxref{Assigning Integers}). |
|
@end deftypefun |
|
|
|
@deftypefun void mpz_class::mpz_class (mpz_t @var{z}) |
|
Construct an @code{mpz_class} from an @code{mpz_t}. The value in @var{z} is |
|
copied into the new @code{mpz_class}, there won't be any permanent association |
|
between it and @var{z}. |
|
@end deftypefun |
|
|
|
@deftypefun void mpz_class::mpz_class (const char *@var{s}) |
|
@deftypefunx void mpz_class::mpz_class (const char *@var{s}, int base) |
|
@deftypefunx void mpz_class::mpz_class (const string& @var{s}) |
|
@deftypefunx void mpz_class::mpz_class (const string& @var{s}, int base) |
|
Construct an @code{mpz_class} converted from a string using |
|
@code{mpz_set_str}, (@pxref{Assigning Integers}). If the @var{base} is not |
|
given then 0 is used. |
|
@end deftypefun |
|
|
|
@deftypefun mpz_class operator/ (mpz_class @var{a}, mpz_class @var{d}) |
|
@deftypefunx mpz_class operator% (mpz_class @var{a}, mpz_class @var{d}) |
|
Divisions involving @code{mpz_class} round towards zero, as per the |
|
@code{mpz_tdiv_q} and @code{mpz_tdiv_r} functions (@pxref{Integer Division}). |
|
This corresponds to the rounding used for plain @code{int} calculations on |
|
most machines. |
|
|
|
The @code{mpz_fdiv...} or @code{mpz_cdiv...} functions can always be called |
|
directly if desired. For example, |
|
|
|
@example |
|
mpz_class q, a, d; |
|
... |
|
mpz_fdiv_q (q.get_mpz_t(), a.get_mpz_t(), d.get_mpz_t()); |
|
@end example |
|
@end deftypefun |
|
|
|
@deftypefun mpz_class abs (mpz_class @var{op1}) |
|
@deftypefunx int cmp (mpz_class @var{op1}, type @var{op2}) |
|
@deftypefunx int cmp (type @var{op1}, mpz_class @var{op2}) |
|
@deftypefunx double mpz_class::get_d (void) |
|
@deftypefunx long mpz_class::get_si (void) |
|
@deftypefunx {unsigned long} mpz_class::get_ui (void) |
|
@maybepagebreak |
|
@deftypefunx bool mpz_class::fits_sint_p (void) |
|
@deftypefunx bool mpz_class::fits_slong_p (void) |
|
@deftypefunx bool mpz_class::fits_sshort_p (void) |
|
@maybepagebreak |
|
@deftypefunx bool mpz_class::fits_uint_p (void) |
|
@deftypefunx bool mpz_class::fits_ulong_p (void) |
|
@deftypefunx bool mpz_class::fits_ushort_p (void) |
|
@maybepagebreak |
|
@deftypefunx int sgn (mpz_class @var{op}) |
|
@deftypefunx mpz_class sqrt (mpz_class @var{op}) |
|
These functions provide a C++ class interface to the corresponding GMP C |
|
routines. |
|
|
|
@code{cmp} can be used with any of the classes or the standard C++ types, |
|
except @code{long long} and @code{long double}. |
|
@end deftypefun |
|
|
|
@sp 1 |
|
Overloaded operators for combinations of @code{mpz_class} and @code{double} |
|
are provided for completeness, but it should be noted that if the given |
|
@code{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 @code{mpz_class} and @code{double}, however, are defined |
|
to follow the corresponding C functions @code{mpz_get_d} and @code{mpz_set_d}. |
|
And comparisons are always made exactly, as per @code{mpz_cmp_d}. |
|
|
|
|
|
@node C++ Interface Rationals, C++ Interface Floats, C++ Interface Integers, C++ Class Interface |
|
@section C++ Interface Rationals |
|
|
|
In all the following constructors, if a fraction is given then it should be in |
|
canonical form, or if not then @code{mpq_class::canonicalize} called. |
|
|
|
@deftypefun void mpq_class::mpq_class (type @var{op}) |
|
@deftypefunx void mpq_class::mpq_class (integer @var{num}, integer @var{den}) |
|
Construct an @code{mpq_class}. The initial value can be a single value of any |
|
type, or a pair of integers (@code{mpz_class} or standard C++ integer types) |
|
representing a fraction, except that @code{long long} and @code{long double} |
|
are not supported. For example, |
|
|
|
@example |
|
mpq_class q (99); |
|
mpq_class q (1.75); |
|
mpq_class q (1, 3); |
|
@end example |
|
@end deftypefun |
|
|
|
@deftypefun void mpq_class::mpq_class (mpq_t @var{q}) |
|
Construct an @code{mpq_class} from an @code{mpq_t}. The value in @var{q} is |
|
copied into the new @code{mpq_class}, there won't be any permanent association |
|
between it and @var{q}. |
|
@end deftypefun |
|
|
|
@deftypefun void mpq_class::mpq_class (const char *@var{s}) |
|
@deftypefunx void mpq_class::mpq_class (const char *@var{s}, int base) |
|
@deftypefunx void mpq_class::mpq_class (const string& @var{s}) |
|
@deftypefunx void mpq_class::mpq_class (const string& @var{s}, int base) |
|
Construct an @code{mpq_class} converted from a string using |
|
@code{mpq_set_str}, (@pxref{Initializing Rationals}). If the @var{base} is |
|
not given then 0 is used. |
|
@end deftypefun |
|
|
|
@deftypefun void mpq_class::canonicalize () |
|
Put an @code{mpq_class} into canonical form, as per @ref{Rational Number |
|
Functions}. All arithmetic operators require their operands in canonical |
|
form, and will return results in canonical form. |
|
@end deftypefun |
|
|
|
@deftypefun mpq_class abs (mpq_class @var{op}) |
|
@deftypefunx int cmp (mpq_class @var{op1}, type @var{op2}) |
|
@deftypefunx int cmp (type @var{op1}, mpq_class @var{op2}) |
|
@maybepagebreak |
|
@deftypefunx double mpq_class::get_d (void) |
|
@deftypefunx int sgn (mpq_class @var{op}) |
|
These functions provide a C++ class interface to the corresponding GMP C |
|
routines. |
|
|
|
@code{cmp} can be used with any of the classes or the standard C++ types, |
|
except @code{long long} and @code{long double}. |
|
@end deftypefun |
|
|
|
@deftypefun {mpz_class&} mpq_class::get_num () |
|
@deftypefunx {mpz_class&} mpq_class::get_den () |
|
Get a reference to an @code{mpz_class} which is the numerator or denominator |
|
of an @code{mpq_class}. This can be used both for read and write access. If |
|
the object returned is modified, it modifies the original @code{mpq_class}. |
|
|
|
If direct manipulation might produce a non-canonical value, then |
|
@code{mpq_class::canonicalize} must be called before further operations. |
|
@end deftypefun |
|
|
|
@deftypefun mpz_t mpq_class::get_num_mpz_t () |
|
@deftypefunx mpz_t mpq_class::get_den_mpz_t () |
|
Get a reference to the underlying @code{mpz_t} numerator or denominator of an |
|
@code{mpq_class}. This can be passed to C functions expecting an |
|
@code{mpz_t}. Any modifications made to the @code{mpz_t} will modify the |
|
original @code{mpq_class}. |
|
|
|
If direct manipulation might produce a non-canonical value, then |
|
@code{mpq_class::canonicalize} must be called before further operations. |
|
@end deftypefun |
|
|
|
@deftypefun istream& operator>> (istream& @var{stream}, mpq_class& @var{rop}); |
|
Read @var{rop} from @var{stream}, using its @code{ios} formatting settings, |
|
the same as @code{mpq_t operator>>} (@pxref{C++ Formatted Input}). |
|
|
|
If the @var{rop} read might not be in canonical form then |
|
@code{mpq_class::canonicalize} must be called. |
|
@end deftypefun |
|
|
|
|
|
@node C++ Interface Floats, C++ Interface MPFR, C++ Interface Rationals, C++ Class Interface |
|
@section C++ Interface Floats |
|
|
|
When an expression requires the use of temporary intermediate @code{mpf_class} |
|
values, like @code{f=g*h+x*y}, those temporaries will have the same precision |
|
as the destination @code{f}. Explicit constructors can be used if this |
|
doesn't suit. |
|
|
|
@deftypefun {} mpf_class::mpf_class (type @var{op}) |
|
@deftypefunx {} mpf_class::mpf_class (type @var{op}, unsigned long @var{prec}) |
|
Construct an @code{mpf_class}. Any standard C++ type can be used, except |
|
@code{long long} and @code{long double}, and any of the GMP C++ classes can be |
|
used. |
|
|
|
If @var{prec} is given, the initial precision is that value, in bits. If |
|
@var{prec} is not given, then the initial precision is determined by the type |
|
of @var{op} given. An @code{mpz_class}, @code{mpq_class}, string, or C++ |
|
builtin type will give the default @code{mpf} precision (@pxref{Initializing |
|
Floats}). An @code{mpf_class} or expression will give the precision of that |
|
value. The precision of a binary expression is the higher of the two |
|
operands. |
|
|
|
@example |
|
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 |
|
@end example |
|
@end deftypefun |
|
|
|
@deftypefun mpf_class abs (mpf_class @var{op}) |
|
@deftypefunx mpf_class ceil (mpf_class @var{op}) |
|
@deftypefunx int cmp (mpf_class @var{op1}, type @var{op2}) |
|
@deftypefunx int cmp (type @var{op1}, mpf_class @var{op2}) |
|
@maybepagebreak |
|
@deftypefunx mpf_class floor (mpf_class @var{op}) |
|
@deftypefunx mpf_class hypot (mpf_class @var{op1}, mpf_class @var{op2}) |
|
@deftypefunx double mpf_class::get_d (void) |
|
@deftypefunx long mpf_class::get_si (void) |
|
@deftypefunx {unsigned long} mpf_class::get_ui (void) |
|
@maybepagebreak |
|
@deftypefunx bool mpf_class::fits_sint_p (void) |
|
@deftypefunx bool mpf_class::fits_slong_p (void) |
|
@deftypefunx bool mpf_class::fits_sshort_p (void) |
|
@maybepagebreak |
|
@deftypefunx bool mpf_class::fits_uint_p (void) |
|
@deftypefunx bool mpf_class::fits_ulong_p (void) |
|
@deftypefunx bool mpf_class::fits_ushort_p (void) |
|
@maybepagebreak |
|
@deftypefunx int sgn (mpf_class @var{op}) |
|
@deftypefunx mpf_class sqrt (mpf_class @var{op}) |
|
@deftypefunx mpf_class trunc (mpf_class @var{op}) |
|
These functions provide a C++ class interface to the corresponding GMP C |
|
routines. |
|
|
|
@code{cmp} can be used with any of the classes or the standard C++ types, |
|
except @code{long long} and @code{long double}. |
|
|
|
The accuracy provided by @code{hypot} is not currently guaranteed. |
|
@end deftypefun |
|
|
|
@deftypefun {unsigned long int} mpf_class::get_prec () |
|
@deftypefunx void mpf_class::set_prec (unsigned long @var{prec}) |
|
@deftypefunx void mpf_class::set_prec_raw (unsigned long @var{prec}) |
|
Get or set the current precision of an @code{mpf_class}. |
|
|
|
The restrictions described for @code{mpf_set_prec_raw} (@pxref{Initializing |
|
Floats}) apply to @code{mpf_class::set_prec_raw}. Note in particular that the |
|
@code{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. |
|
@end deftypefun |
|
|
|
|
|
@node C++ Interface MPFR, C++ Interface Random Numbers, C++ Interface Floats, C++ Class Interface |
|
@section C++ Interface MPFR |
|
|
|
The C++ class interface to MPFR is provided if MPFR is enabled (@pxref{Build |
|
Options}). This interface must be regarded as preliminary and possibly |
|
subject to incompatible changes in the future, since MPFR itself is |
|
preliminary. All definitions can be obtained with |
|
|
|
@cindex mpfrxx.h |
|
@example |
|
#include <mpfrxx.h> |
|
@end example |
|
|
|
@noindent |
|
This defines |
|
|
|
@deftp Class mpfr_class |
|
@end deftp |
|
|
|
@noindent |
|
which behaves similarly to @code{mpf_class} (@pxref{C++ Interface Floats}). |
|
|
|
|
|
@node C++ Interface Random Numbers, C++ Interface Limitations, C++ Interface MPFR, C++ Class Interface |
|
@section C++ Interface Random Numbers |
|
|
|
@deftp Class gmp_randclass |
|
The C++ class interface to the GMP random number functions uses |
|
@code{gmp_randclass} to hold an algorithm selection and current state, as per |
|
@code{gmp_randstate_t}. |
|
@end deftp |
|
|
|
@deftypefun {} gmp_randclass::gmp_randclass (void (*@var{randinit}) (gmp_randstate_t, ...), ...) |
|
Construct a @code{gmp_randclass}, using a call to the given @var{randinit} |
|
function (@pxref{Random State Initialization}). The arguments expected are |
|
the same as @var{randinit}, but with @code{mpz_class} instead of @code{mpz_t}. |
|
For example, |
|
|
|
@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); |
|
@end example |
|
|
|
@code{gmp_randinit_lc_2exp_size} can fail if the size requested is too big, |
|
the behaviour of @code{gmp_randclass::gmp_randclass} is undefined in this case |
|
(perhaps this will change in the future). |
|
@end deftypefun |
|
|
|
@deftypefun {} gmp_randclass::gmp_randclass (gmp_randalg_t @var{alg}, ...) |
|
Construct a @code{gmp_randclass} using the same parameters as |
|
@code{gmp_randinit} (@pxref{Random State Initialization}). This function is |
|
obsolete and the above @var{randinit} style should be preferred. |
|
@end deftypefun |
|
|
|
@deftypefun void gmp_randclass::seed (unsigned long int @var{s}) |
|
@deftypefunx void gmp_randclass::seed (mpz_class @var{s}) |
|
Seed a random number generator. See @pxref{Random Number Functions}, for how |
|
to choose a good seed. |
|
@end deftypefun |
|
|
|
@deftypefun mpz_class gmp_randclass::get_z_bits (unsigned long @var{bits}) |
|
@deftypefunx mpz_class gmp_randclass::get_z_bits (mpz_class @var{bits}) |
|
Generate a random integer with a specified number of bits. |
|
@end deftypefun |
|
|
|
@deftypefun mpz_class gmp_randclass::get_z_range (mpz_class @var{n}) |
|
Generate a random integer in the range 0 to @math{@var{n}-1} inclusive. |
|
@end deftypefun |
|
|
|
@deftypefun mpf_class gmp_randclass::get_f () |
|
@deftypefunx mpf_class gmp_randclass::get_f (unsigned long @var{prec}) |
|
Generate a random float @var{f} in the range @math{0 <= @var{f} < 1}. @var{f} |
|
will be to @var{prec} bits precision, or if @var{prec} is not given then to |
|
the precision of the destination. For example, |
|
|
|
@example |
|
gmp_randclass r; |
|
... |
|
mpf_class f (0, 512); // 512 bits precision |
|
f = r.get_f(); // random number, 512 bits |
|
@end example |
|
@end deftypefun |
|
|
|
|
|
|
|
@node C++ Interface Limitations, , C++ Interface Random Numbers, C++ Class Interface |
|
@section C++ Interface Limitations |
|
|
|
@table @asis |
|
@item @code{mpq_class} and Templated Reading |
|
A generic piece of template code probably won't know that @code{mpq_class} |
|
requires a @code{canonicalize} call if inputs read with @code{operator>>} |
|
might be non-canonical. This can lead to incorrect results. |
|
|
|
@code{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 @code{mpq_class}. |
|
Perhaps a mechanism to tell @code{operator>>} what to do will be adopted in |
|
the future, maybe a preprocessor define, a global flag, or an @code{ios} flag |
|
pressed into service. Or maybe, at the risk of inconsistency, the |
|
@code{mpq_class} @code{operator>>} could canonicalize and leave @code{mpq_t} |
|
@code{operator>>} not doing so, for use on those occasions when that's |
|
acceptable. Send feedback or alternate ideas to @email{bug-gmp@@gnu.org}. |
|
|
|
@item 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. |
|
|
|
@item Templated Expressions |
|
|
|
A subtle difficulty exists when using expressions together with |
|
application-defined template functions. Consider the following, with @code{T} |
|
intended to be some numeric type, |
|
|
|
@example |
|
template <class T> |
|
T fun (const T &, const T &); |
|
@end example |
|
|
|
@noindent |
|
When used with, say, plain @code{mpz_class} variables, it works fine: @code{T} |
|
is resolved as @code{mpz_class}. |
|
|
|
@example |
|
mpz_class f(1), g(2); |
|
fun (f, g); // Good |
|
@end example |
|
|
|
@noindent |
|
But when one of the arguments is an expression, it doesn't work. |
|
|
|
@example |
|
mpz_class f(1), g(2), h(3); |
|
fun (f, g+h); // Bad |
|
@end example |
|
|
|
This is because @code{g+h} ends up being a certain expression template type |
|
internal to @code{gmpxx.h}, which the C++ template resolution rules are unable |
|
to automatically convert to @code{mpz_class}. The workaround is simply to add |
|
an explicit cast. |
|
|
|
@example |
|
mpz_class f(1), g(2), h(3); |
|
fun (f, mpz_class(g+h)); // Good |
|
@end example |
|
|
|
Similarly, within @code{fun} it may be necessary to cast an expression to type |
|
@code{T} when calling a templated @code{fun2}. |
|
|
|
@example |
|
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 |
|
@} |
|
@end example |
|
@end table |
|
|
|
|
|
@node BSD Compatible Functions, Custom Allocation, C++ Class Interface, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@chapter Berkeley MP Compatible Functions |
@chapter Berkeley MP Compatible Functions |
@cindex Berkeley MP compatible functions |
@cindex Berkeley MP compatible functions |
Line 3648 Apart from the incomplete set of functions, the interf |
|
Line 6143 Apart from the incomplete set of functions, the interf |
|
with @code{pow} in @file{libm.a}. |
with @code{pow} in @file{libm.a}. |
|
|
@cindex @file{mp.h} |
@cindex @file{mp.h} |
Include the header @file{mp.h} to get the definition of the necessary types |
Include the header @file{mp.h} to get the definition of the necessary types and |
and functions. If you are on a BSD derived system, make sure to include GNU |
functions. If you are on a BSD derived system, make sure to include GNU |
@file{mp.h} if you are going to link the GNU @file{libmp.a} to your program. |
@file{mp.h} if you are going to link the GNU @file{libmp.a} to your program. |
This means that you probably need to give the -I<dir> option to the compiler, |
This means that you probably need to give the @samp{-I<dir>} option to the |
where <dir> is the directory where you have GNU @file{mp.h}. |
compiler, where @samp{<dir>} is the directory where you have GNU @file{mp.h}. |
|
|
@deftypefun {MINT *} itom (signed short int @var{initial_value}) |
@deftypefun {MINT *} itom (signed short int @var{initial_value}) |
Allocate an integer consisting of a @code{MINT} object and dynamic limb space. |
Allocate an integer consisting of a @code{MINT} object and dynamic limb space. |
Line 3662 Initialize the integer to @var{initial_value}. Return |
|
Line 6157 Initialize the integer to @var{initial_value}. Return |
|
|
|
@deftypefun {MINT *} xtom (char *@var{initial_value}) |
@deftypefun {MINT *} xtom (char *@var{initial_value}) |
Allocate an integer consisting of a @code{MINT} object and dynamic limb space. |
Allocate an integer consisting of a @code{MINT} object and dynamic limb space. |
Initialize the integer from @var{initial_value}, a hexadecimal, '\0'-terminate |
Initialize the integer from @var{initial_value}, a hexadecimal, |
C string. Return a pointer to the @code{MINT} object. |
null-terminated C string. Return a pointer to the @code{MINT} object. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void move (MINT *@var{src}, MINT *@var{dest}) |
@deftypefun void move (MINT *@var{src}, MINT *@var{dest}) |
Line 3681 Subtract @var{src_2} from @var{src_1} and put the diff |
|
Line 6176 Subtract @var{src_2} from @var{src_1} and put the diff |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mult (MINT *@var{src_1}, MINT *@var{src_2}, MINT *@var{destination}) |
@deftypefun void mult (MINT *@var{src_1}, MINT *@var{src_2}, MINT *@var{destination}) |
Multiply @var{src_1} and @var{src_2} and put the product in |
Multiply @var{src_1} and @var{src_2} and put the product in @var{destination}. |
@var{destination}. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mdiv (MINT *@var{dividend}, MINT *@var{divisor}, MINT *@var{quotient}, MINT *@var{remainder}) |
@deftypefun void mdiv (MINT *@var{dividend}, MINT *@var{divisor}, MINT *@var{quotient}, MINT *@var{remainder}) |
Line 3695 Some implementations of these functions work different |
|
Line 6189 Some implementations of these functions work different |
|
negative arguments. |
negative arguments. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void msqrt (MINT *@var{operand}, MINT *@var{root}, MINT *@var{remainder}) |
@deftypefun void msqrt (MINT *@var{op}, MINT *@var{root}, MINT *@var{remainder}) |
@ifnottex |
Set @var{root} to @m{\lfloor\sqrt{@var{op}}\rfloor, the truncated integer part |
Set @var{root} to the truncated integer part of the square root of |
of the square root of @var{op}}, like @code{mpz_sqrt}. Set @var{remainder} to |
@var{operand}. Set @var{remainder} to |
@m{(@var{op} - @var{root}^2), @var{op}@minus{}@var{root}*@var{root}}, i.e. |
@var{operand}@minus{}@var{root}*@var{root}, |
zero if @var{op} is a perfect square. |
@end ifnottex |
|
@tex |
|
Set @var{root} to $\lfloor\sqrt{@var{operand}}\rfloor$, like |
|
@code{mpz_sqrt}. Set @var{remainder} to $(operand - root^2)$, |
|
@end tex |
|
(i.e., zero if @var{operand} is a perfect square). |
|
|
|
If @var{root} and @var{remainder} are the same variable, the results are |
If @var{root} and @var{remainder} are the same variable, the results are |
undefined. |
undefined. |
Line 3719 Set @var{dest} to (@var{base} raised to @var{exp}) mod |
|
Line 6207 Set @var{dest} to (@var{base} raised to @var{exp}) mod |
|
Set @var{dest} to @var{base} raised to @var{exp}. |
Set @var{dest} to @var{base} raised to @var{exp}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void gcd (MINT *@var{operand1}, MINT *@var{operand2}, MINT *@var{res}) |
@deftypefun void gcd (MINT *@var{op1}, MINT *@var{op2}, MINT *@var{res}) |
Set @var{res} to the greatest common divisor of @var{operand1} and |
Set @var{res} to the greatest common divisor of @var{op1} and @var{op2}. |
@var{operand2}. |
|
@end deftypefun |
@end deftypefun |
|
|
@deftypefun int mcmp (MINT *@var{operand1}, MINT *@var{operand2}) |
@deftypefun int mcmp (MINT *@var{op1}, MINT *@var{op2}) |
Compare @var{operand1} and @var{operand2}. Return a positive value if |
Compare @var{op1} and @var{op2}. Return a positive value if @var{op1} > |
@var{operand1} > @var{operand2}, zero if @var{operand1} = |
@var{op2}, zero if @var{op1} = @var{op2}, and a negative value if @var{op1} < |
@var{operand2}, and a negative value if @var{operand1} < @var{operand2}. |
@var{op2}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void min (MINT *@var{dest}) |
@deftypefun void min (MINT *@var{dest}) |
Line 3739 Input a decimal string from @code{stdin}, and put the |
|
Line 6226 Input a decimal string from @code{stdin}, and put the |
|
Output @var{src} to @code{stdout}, as a decimal string. Also output a newline. |
Output @var{src} to @code{stdout}, as a decimal string. Also output a newline. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {char *} mtox (MINT *@var{operand}) |
@deftypefun {char *} mtox (MINT *@var{op}) |
Convert @var{operand} to a hexadecimal string, and return a pointer to the |
Convert @var{op} to a hexadecimal string, and return a pointer to the string. |
string. The returned string is allocated using the default memory allocation |
The returned string is allocated using the default memory allocation function, |
function, @code{malloc} by default. |
@code{malloc} by default. It will be @code{strlen(str)+1} bytes, that being |
|
exactly enough for the string and null-terminator. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void mfree (MINT *@var{operand}) |
@deftypefun void mfree (MINT *@var{op}) |
De-allocate, the space used by @var{operand}. @strong{This function should |
De-allocate, the space used by @var{op}. @strong{This function should only be |
only be passed a value returned by @code{itom} or @code{xtom}.} |
passed a value returned by @code{itom} or @code{xtom}.} |
@end deftypefun |
@end deftypefun |
|
|
|
|
@node Custom Allocation, Contributors, BSD Compatible Functions, Top |
@node Custom Allocation, Language Bindings, BSD Compatible Functions, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@chapter Custom Allocation |
@chapter Custom Allocation |
@cindex Custom allocation |
@cindex Custom allocation |
@cindex Memory allocation |
@cindex Memory allocation |
@cindex Allocation of memory |
@cindex Allocation of memory |
|
|
By default, GMP uses @code{malloc}, @code{realloc} and @code{free} for memory |
By default GMP uses @code{malloc}, @code{realloc} and @code{free} for memory |
allocation. If @code{malloc} or @code{realloc} fails, GMP prints a message to |
allocation, and if they fail GMP prints a message to the standard error output |
the standard error output and terminates execution. |
and terminates the program. |
|
|
Some applications might want to allocate memory in other ways, or might not |
Alternate functions can be specified to allocate memory in a different way or |
want a fatal error when there is no more memory available. To accomplish |
to have a different error action on running out of memory. |
this, you can specify alternative memory allocation functions. |
|
|
|
This can be done in the Berkeley compatibility library as well as the main GMP |
This feature is available in the Berkeley compatibility library (@pxref{BSD |
library. |
Compatible Functions}) as well as the main GMP library. |
|
|
@deftypefun void mp_set_memory_functions (@* void *(*@var{alloc_func_ptr}) (size_t), @* void *(*@var{realloc_func_ptr}) (void *, size_t, size_t), @* void (*@var{free_func_ptr}) (void *, size_t)) |
@deftypefun void mp_set_memory_functions (@* void *(*@var{alloc_func_ptr}) (size_t), @* void *(*@var{realloc_func_ptr}) (void *, size_t, size_t), @* void (*@var{free_func_ptr}) (void *, size_t)) |
Replace the current allocation functions from the arguments. If an argument |
Replace the current allocation functions from the arguments. If an argument |
is @code{NULL}, the corresponding default function is retained. |
is @code{NULL}, the corresponding default function is used. |
|
|
@strong{Be sure to call this function only when there are no active GMP |
These functions will be used for all memory allocation done by GMP, apart from |
objects allocated using the previous memory functions! Usually, that means |
temporary space from @code{alloca} if that function is available and GMP is |
that you have to call this function before any other GMP function.} |
configured to use it (@pxref{Build Options}). |
|
|
|
@strong{Be sure to call @code{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.} |
@end deftypefun |
@end deftypefun |
|
|
The functions you supply should fit the following declarations: |
The functions supplied should fit the following declarations: |
|
|
@deftypefun {void *} allocate_function (size_t @var{alloc_size}) |
@deftypefun {void *} allocate_function (size_t @var{alloc_size}) |
This function should return a pointer to newly allocated space with at least |
Return a pointer to newly allocated space with at least @var{alloc_size} |
@var{alloc_size} storage units. |
bytes. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun {void *} reallocate_function (void *@var{ptr}, size_t @var{old_size}, size_t @var{new_size}) |
@deftypefun {void *} reallocate_function (void *@var{ptr}, size_t @var{old_size}, size_t @var{new_size}) |
This function should return a pointer to newly allocated space of at least |
Resize a previously allocated block @var{ptr} of @var{old_size} bytes to be |
@var{new_size} storage units, after copying at least the first @var{old_size} |
@var{new_size} bytes. |
storage units from @var{ptr}. It should also de-allocate the space at |
|
@var{ptr}. |
|
|
|
You can assume that the space at @var{ptr} was formerly returned from |
The block may be moved if necessary or if desired, and in that case the |
@code{allocate_function} or @code{reallocate_function}, for a request for |
smaller of @var{old_size} and @var{new_size} bytes must be copied to the new |
@var{old_size} storage units. |
location. The return value is a pointer to the resized block, that being the |
|
new location if moved or just @var{ptr} if not. |
|
|
|
@var{ptr} is never @code{NULL}, it's always a previously allocated block. |
|
@var{new_size} may be bigger or smaller than @var{old_size}. |
@end deftypefun |
@end deftypefun |
|
|
@deftypefun void deallocate_function (void *@var{ptr}, size_t @var{size}) |
@deftypefun void deallocate_function (void *@var{ptr}, size_t @var{size}) |
De-allocate the space pointed to by @var{ptr}. |
De-allocate the space pointed to by @var{ptr}. |
|
|
You can assume that the space at @var{ptr} was formerly returned from |
@var{ptr} is never @code{NULL}, it's always a previously allocated block of |
@code{allocate_function} or @code{reallocate_function}, for a request for |
@var{size} bytes. |
@var{size} storage units. |
|
@end deftypefun |
@end deftypefun |
|
|
(A @dfn{storage unit} is the unit in which the @code{sizeof} operator returns |
A @dfn{byte} here means the unit used by the @code{sizeof} operator. |
the size of an object, normally an 8 bit byte.) |
|
|
|
|
The @var{old_size} parameters to @var{reallocate_function} and |
|
@var{deallocate_function} are passed for convenience, but of course can be |
|
ignored if not needed. The default functions using @code{malloc} and friends |
|
for instance don't use them. |
|
|
@node Contributors, References, Custom Allocation, Top |
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 |
|
@var{allocate_function} or @var{reallocate_function} mustn't return |
|
@code{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 @code{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 |
|
@code{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 @code{malloc} and friends, those |
|
functions will be linked in even if the first thing a program does is an |
|
@code{mp_set_memory_functions}. It's necessary to change the GMP sources if |
|
this is a problem. |
|
|
|
|
|
@node Language Bindings, Algorithms, Custom Allocation, Top |
|
@chapter 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 GNUstep Base Library @uref{http://www.gnustep.org} (version 0.9.1) is |
|
@c intending to use GMP for its NSDecimal class, which would be an Objective |
|
@c C binding for GMP. Has some configure stuff ready, but no code. |
|
|
|
@c @spaceuref{U} is the same as @uref{U}, but with a couple of extra spaces |
|
@c in tex, just to separate the URL from the preceding text a bit. |
|
@iftex |
|
@macro spaceuref {U} |
|
@ @ @uref{\U\} |
|
@end macro |
|
@end iftex |
|
@ifnottex |
|
@macro spaceuref {U} |
|
@uref{\U\} |
|
@end macro |
|
@end ifnottex |
|
|
|
@sp 1 |
|
@table @asis |
|
@item C++ |
|
@itemize @bullet |
|
@item |
|
GMP C++ class interface, @pxref{C++ Class Interface} @* Straightforward |
|
interface, expression templates to eliminate temporaries. |
|
@item |
|
ALP @spaceuref{http://www.inria.fr/saga/logiciels/ALP} @* Linear algebra and |
|
polynomials using templates. |
|
@item |
|
Arithmos @spaceuref{http://win-www.uia.ac.be/u/cant/arithmos} @* Rationals |
|
with infinities and square roots. |
|
@item |
|
CLN @spaceuref{http://clisp.cons.org/~haible/packages-cln.html} @* High level |
|
classes for arithmetic. |
|
@item |
|
LiDIA @spaceuref{http://www.informatik.tu-darmstadt.de/TI/LiDIA} @* A C++ |
|
library for computational number theory. |
|
@item |
|
Linbox @spaceuref{http://www.linalg.org} @* Sparse vectors and matrices. |
|
@item |
|
NTL @spaceuref{http://www.shoup.net/ntl} @* A C++ number theory library. |
|
@end itemize |
|
|
|
@item Fortran |
|
@itemize @bullet |
|
@item |
|
Omni F77 @spaceuref{http://pdplab.trc.rwcp.or.jp/pdperf/Omni/home.html} @* |
|
Arbitrary precision floats. |
|
@end itemize |
|
|
|
@item Haskell |
|
@itemize @bullet |
|
@item |
|
Glasgow Haskell Compiler @spaceuref{http://www.haskell.org/ghc} |
|
@end itemize |
|
|
|
@item Java |
|
@itemize @bullet |
|
@item |
|
Kaffe @spaceuref{http://www.kaffe.org} |
|
@item |
|
Kissme @spaceuref{http://kissme.sourceforge.net} |
|
@end itemize |
|
|
|
@item Lisp |
|
@itemize @bullet |
|
@item |
|
GNU Common Lisp @spaceuref{http://www.gnu.org/software/gcl/gcl.html} @* In the |
|
process of switching to GMP for bignums. |
|
@item |
|
Librep @spaceuref{http://librep.sourceforge.net} |
|
@end itemize |
|
|
|
@item M4 |
|
@itemize @bullet |
|
@item |
|
GNU m4 betas @spaceuref{http://www.seindal.dk/rene/gnu} @* Optionally provides |
|
an arbitrary precision @code{mpeval}. |
|
@end itemize |
|
|
|
@item ML |
|
@itemize @bullet |
|
@item |
|
MLton compiler @spaceuref{http://www.mlton.org} |
|
@end itemize |
|
|
|
@item Oz |
|
@itemize @bullet |
|
@item |
|
Mozart @spaceuref{http://www.mozart-oz.org} |
|
@end itemize |
|
|
|
@item Pascal |
|
@itemize @bullet |
|
@item |
|
GNU Pascal Compiler @spaceuref{http://www.gnu-pascal.de} @* GMP unit. |
|
@end itemize |
|
|
|
@item Perl |
|
@itemize @bullet |
|
@item |
|
GMP module, see @file{demos/perl} in the GMP sources. |
|
@item |
|
Math::GMP @spaceuref{http://www.cpan.org} @* Compatible with Math::BigInt, but |
|
not as many functions as the GMP module above. |
|
@item |
|
Math::BigInt::GMP @spaceuref{http://www.cpan.org} @* Plug Math::GMP into |
|
normal Math::BigInt operations. |
|
@end itemize |
|
|
|
@need 1000 |
|
@item Pike |
|
@itemize @bullet |
|
@item |
|
mpz module in the standard distribution, @uref{http://pike.idonex.com} |
|
@end itemize |
|
|
|
@need 500 |
|
@item Prolog |
|
@itemize @bullet |
|
@item |
|
SWI Prolog @spaceuref{http://www.swi.psy.uva.nl/projects/SWI-Prolog} @* |
|
Arbitrary precision floats. |
|
@end itemize |
|
|
|
@item Python |
|
@itemize @bullet |
|
@item |
|
mpz module in the standard distribution, @uref{http://www.python.org} |
|
@item |
|
GMPY @uref{http://gmpy.sourceforge.net} |
|
@end itemize |
|
|
|
@item Scheme |
|
@itemize @bullet |
|
@item |
|
RScheme @spaceuref{http://www.rscheme.org} |
|
@item |
|
STklos @spaceuref{http://kaolin.unice.fr/STklos} |
|
@end itemize |
|
|
|
@item Smalltalk |
|
@itemize @bullet |
|
@item |
|
GNU Smalltalk @spaceuref{http://www.smalltalk.org/versions/GNUSmalltalk.html} |
|
@end itemize |
|
|
|
@item Other |
|
@itemize @bullet |
|
@item |
|
DrGenius @spaceuref{http://drgenius.seul.org} @* Geometry system and |
|
mathematical programming language. |
|
@item |
|
GiNaC @spaceuref{http://www.ginac.de} @* C++ computer algebra using CLN. |
|
@item |
|
Maxima @uref{http://www.ma.utexas.edu/users/wfs/maxima.html} @* Macsyma |
|
computer algebra using GCL. |
|
@item |
|
Q @spaceuref{http://www.musikwissenschaft.uni-mainz.de/~ag/q} @* Equational |
|
programming system. |
|
@item |
|
Regina @spaceuref{http://regina.sourceforge.net} @* Topological calculator. |
|
@item |
|
Yacas @spaceuref{http://www.xs4all.nl/~apinkus/yacas.html} @* Yet another |
|
computer algebra system. |
|
@end itemize |
|
|
|
@end table |
|
|
|
|
|
@node Algorithms, Internals, Language Bindings, Top |
|
@chapter Algorithms |
|
@cindex 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:: |
|
* Assembler Coding:: |
|
@end menu |
|
|
|
|
|
@node Multiplication Algorithms, Division Algorithms, Algorithms, Algorithms |
|
@section Multiplication |
|
@cindex Multiplication algorithms |
|
|
|
N@cross{}N limb multiplications and squares are done using one of four |
|
algorithms, as the size N increases. |
|
|
|
@quotation |
|
@multitable {KaratsubaMMM} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item Algorithm @tab Threshold |
|
@item Basecase @tab (none) |
|
@item Karatsuba @tab @code{MUL_KARATSUBA_THRESHOLD} |
|
@item Toom-3 @tab @code{MUL_TOOM3_THRESHOLD} |
|
@item FFT @tab @code{MUL_FFT_THRESHOLD} |
|
@end multitable |
|
@end quotation |
|
|
|
Similarly for squaring, with the @code{SQR} thresholds. Note though that the |
|
FFT is only used if GMP is configured with @samp{--enable-fft}, @pxref{Build |
|
Options}. |
|
|
|
N@cross{}M multiplications of operands with different sizes above |
|
@code{MUL_KARATSUBA_THRESHOLD} are currently done by splitting into M@cross{}M |
|
pieces. The Karatsuba and Toom-3 routines then operate only on equal size |
|
operands. This is not very efficient, and is slated for improvement in the |
|
future. |
|
|
|
@menu |
|
* Basecase Multiplication:: |
|
* Karatsuba Multiplication:: |
|
* Toom-Cook 3-Way Multiplication:: |
|
* FFT Multiplication:: |
|
* Other Multiplication:: |
|
@end menu |
|
|
|
|
|
@node Basecase Multiplication, Karatsuba Multiplication, Multiplication Algorithms, Multiplication Algorithms |
|
@subsection Basecase Multiplication |
|
|
|
Basecase N@cross{}M 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 |
|
@m{O(NM),O(N*M)} algorithm. See Knuth section 4.3.1 algorithm M |
|
(@pxref{References}), and the @file{mpn/generic/mul_basecase.c} code. |
|
|
|
Assembler implementations of @code{mpn_mul_basecase} are essentially the same |
|
as the generic C code, but have all the usual assembler 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 |
|
@file{mpn/generic/sqr_basecase.c}. Again the assembler implementations take |
|
essentially the same approach. |
|
|
|
@tex |
|
\def\GMPline#1#2#3#4#5#6{% |
|
\hbox {% |
|
\vrule height 2.5ex depth 1ex |
|
\hbox to 2em {\hfil{#2}\hfil}% |
|
\vrule \hbox to 2em {\hfil{#3}\hfil}% |
|
\vrule \hbox to 2em {\hfil{#4}\hfil}% |
|
\vrule \hbox to 2em {\hfil{#5}\hfil}% |
|
\vrule \hbox to 2em {\hfil{#6}\hfil}% |
|
\vrule}} |
|
\GMPdisplay{ |
|
\hbox{% |
|
\vbox{% |
|
\hbox to 1.5em {\vrule height 2.5ex depth 1ex width 0pt}% |
|
\hbox {\vrule height 2.5ex depth 1ex width 0pt u0\hfil}% |
|
\hbox {\vrule height 2.5ex depth 1ex width 0pt u1\hfil}% |
|
\hbox {\vrule height 2.5ex depth 1ex width 0pt u2\hfil}% |
|
\hbox {\vrule height 2.5ex depth 1ex width 0pt u3\hfil}% |
|
\hbox {\vrule height 2.5ex depth 1ex width 0pt u4\hfil}% |
|
\vfill}% |
|
\vbox{% |
|
\hbox{% |
|
\hbox to 2em {\hfil u0\hfil}% |
|
\hbox to 2em {\hfil u1\hfil}% |
|
\hbox to 2em {\hfil u2\hfil}% |
|
\hbox to 2em {\hfil u3\hfil}% |
|
\hbox to 2em {\hfil u4\hfil}}% |
|
\vskip 0.7ex |
|
\hrule |
|
\GMPline{u0}{d}{}{}{}{}% |
|
\hrule |
|
\GMPline{u1}{}{d}{}{}{}% |
|
\hrule |
|
\GMPline{u2}{}{}{d}{}{}% |
|
\hrule |
|
\GMPline{u3}{}{}{}{d}{}% |
|
\hrule |
|
\GMPline{u4}{}{}{}{}{d}% |
|
\hrule}}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
u0 u1 u2 u3 u4 |
|
+---+---+---+---+---+ |
|
u0 | d | | | | | |
|
+---+---+---+---+---+ |
|
u1 | | d | | | | |
|
+---+---+---+---+---+ |
|
u2 | | | d | | | |
|
+---+---+---+---+---+ |
|
u3 | | | | d | | |
|
+---+---+---+---+---+ |
|
u4 | | | | | d | |
|
+---+---+---+---+---+ |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
In practice squaring isn't a full 2@cross{} faster than multiplying, it's |
|
usually around 1.5@cross{}. Less than 1.5@cross{} probably indicates |
|
@code{mpn_sqr_basecase} wants improving on that CPU. |
|
|
|
On some CPUs @code{mpn_mul_basecase} can be faster than the generic C |
|
@code{mpn_sqr_basecase}. @code{SQR_BASECASE_THRESHOLD} is the size at which |
|
to use @code{mpn_sqr_basecase}, this will be zero if that routine should be |
|
used always. |
|
|
|
|
|
@node Karatsuba Multiplication, Toom-Cook 3-Way Multiplication, Basecase Multiplication, Multiplication Algorithms |
|
@subsection 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 @math{x} and @math{y} are treated as each split into two parts of |
|
equal length (or the most significant part one limb shorter if N is odd). |
|
|
|
@tex |
|
% GMPboxwidth used for all the multiplication pictures |
|
\global\newdimen\GMPboxwidth \global\GMPboxwidth=5em |
|
% GMPboxdepth and GMPboxheight are also used for the float pictures |
|
\global\newdimen\GMPboxdepth \global\GMPboxdepth=1ex |
|
\global\newdimen\GMPboxheight \global\GMPboxheight=2ex |
|
\gdef\GMPvrule{\vrule height \GMPboxheight depth \GMPboxdepth} |
|
\def\GMPbox#1#2{% |
|
\vbox {% |
|
\hrule |
|
\hbox to 2\GMPboxwidth{% |
|
\GMPvrule \hfil $#1$\hfil \vrule \hfil $#2$\hfil \vrule}% |
|
\hrule}} |
|
\GMPdisplay{% |
|
\vbox{% |
|
\hbox to 2\GMPboxwidth {high \hfil low} |
|
\vskip 0.7ex |
|
\GMPbox{x_1}{x_0} |
|
\vskip 0.5ex |
|
\GMPbox{y_1}{y_0} |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
high low |
|
+----------+----------+ |
|
| x1 | x0 | |
|
+----------+----------+ |
|
|
|
+----------+----------+ |
|
| y1 | y0 | |
|
+----------+----------+ |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
Let @math{b} be the power of 2 where the split occurs, ie.@: if @ms{x,0} is |
|
@math{k} limbs (@ms{y,0} the same) then |
|
@m{b=2\GMPraise{$k*$@code{mp\_bits\_per\_limb}}, b=2^(k*mp_bits_per_limb)}. |
|
With that @m{x=x_1b+x_0,x=x1*b+x0} and @m{y=y_1b+y_0,y=y1*b+y0}, and the |
|
following holds, |
|
|
|
@display |
|
@m{xy = (b^2+b)x_1y_1 - b(x_1-x_0)(y_1-y_0) + (b+1)x_0y_0, |
|
x*y = (b^2+b)*x1*y1 - b*(x1-x0)*(y1-y0) + (b+1)*x0*y0} |
|
@end display |
|
|
|
This formula means doing only three multiplies of (N/2)@cross{}(N/2) limbs, |
|
whereas a basecase multiply of N@cross{}N limbs is equivalent to four |
|
multiplies of (N/2)@cross{}(N/2). The factors @math{(b^2+b)} etc represent |
|
the positions where the three products must be added. |
|
|
|
@tex |
|
\def\GMPboxA#1#2{% |
|
\vbox{% |
|
\hrule |
|
\hbox{% |
|
\GMPvrule |
|
\hbox to 2\GMPboxwidth {\hfil\hbox{$#1$}\hfil}% |
|
\vrule |
|
\hbox to 2\GMPboxwidth {\hfil\hbox{$#2$}\hfil}% |
|
\vrule} |
|
\hrule}} |
|
\def\GMPboxB#1#2{% |
|
\hbox{% |
|
\raise \GMPboxdepth \hbox to \GMPboxwidth {\hfil #1\hskip 0.5em}% |
|
\vbox{% |
|
\hrule |
|
\hbox{% |
|
\GMPvrule |
|
\hbox to 2\GMPboxwidth {\hfil\hbox{$#2$}\hfil}% |
|
\vrule}% |
|
\hrule}}} |
|
\GMPdisplay{% |
|
\vbox{% |
|
\hbox to 4\GMPboxwidth {high \hfil low} |
|
\vskip 0.7ex |
|
\GMPboxA{x_1y_1}{x_0y_0} |
|
\vskip 0.5ex |
|
\GMPboxB{$+$}{x_1y_1} |
|
\vskip 0.5ex |
|
\GMPboxB{$+$}{x_0y_0} |
|
\vskip 0.5ex |
|
\GMPboxB{$-$}{(x_1-x_0)(y_1-y_0)} |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
high low |
|
+--------+--------+ +--------+--------+ |
|
| x1*y1 | | x0*y0 | |
|
+--------+--------+ +--------+--------+ |
|
+--------+--------+ |
|
add | x1*y1 | |
|
+--------+--------+ |
|
+--------+--------+ |
|
add | x0*y0 | |
|
+--------+--------+ |
|
+--------+--------+ |
|
sub | (x1-x0)*(y1-y0) | |
|
+--------+--------+ |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
The term @m{(x_1-x_0)(y_1-y_0),(x1-x0)*(y1-y0)} is best calculated as an |
|
absolute value, and the sign used to choose to add or subtract. Notice the |
|
sum @m{\mathop{\rm high}(x_0y_0)+\mathop{\rm low}(x_1y_1), |
|
high(x0*y0)+low(x1*y1)} occurs twice, so it's possible to do @m{5k,5*k} limb |
|
additions, rather than @m{6k,6*k}, but in GMP extra function call overheads |
|
outweigh the saving. |
|
|
|
Squaring is similar to multiplying, but with @math{x=y} the formula reduces to |
|
an equivalent with three squares, |
|
|
|
@display |
|
@m{x^2 = (b^2+b)x_1^2 - b(x_1-x_0)^2 + (b+1)x_0^2, |
|
x^2 = (b^2+b)*x1^2 - b*(x1-x0)^2 + (b+1)*x0^2} |
|
@end display |
|
|
|
The final result is accumulated from those three squares the same way as for |
|
the three multiplies above. The middle term @m{(x_1-x_0)^2,(x1-x0)^2} is now |
|
always positive. |
|
|
|
A similar formula for both multiplying and squaring can be constructed with a |
|
middle term @m{(x_1+x_0)(y_1+y_0),(x1+x0)*(y1+y0)}. But those sums can exceed |
|
@math{k} limbs, leading to more carry handling and additions than the form |
|
above. |
|
|
|
Karatsuba multiplication is asymptotically an @math{O(N^@W{1.585})} algorithm, |
|
the exponent being @m{\log3/\log2,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 @math{O(N^2)} and the advantage soon overcomes the extra additions |
|
Karatsuba performs. |
|
|
|
@code{MUL_KARATSUBA_THRESHOLD} can be as little as 10 limbs. The @code{SQR} |
|
threshold is usually about twice the @code{MUL}. The basecase algorithm will |
|
take a time of the form @m{M(N) = aN^2 + bN + c, M(N) = a*N^2 + b*N + c} and |
|
the Karatsuba algorithm @m{K(N) = 3M(N/2) + dN + e, K(N) = 3*M(N/2) + d*N + |
|
e}. Clearly per-crossproduct speedups in the basecase code reduce @math{a} |
|
and decrease the threshold, but linear style speedups reducing @math{b} will |
|
actually increase the threshold. The latter can be seen for instance when |
|
adding an optimized @code{mpn_sqr_diagonal} to @code{mpn_sqr_basecase}. Of |
|
course all speedups reduce total time, and in that sense the algorithm |
|
thresholds are merely of academic interest. |
|
|
|
|
|
@node Toom-Cook 3-Way Multiplication, FFT Multiplication, Karatsuba Multiplication, Multiplication Algorithms |
|
@subsection Toom-Cook 3-Way Multiplication |
|
|
|
The Karatsuba formula is the simplest case of a general approach to splitting |
|
inputs that leads to both Toom-Cook and FFT algorithms. A description of |
|
Toom-Cook 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 others). |
|
|
|
@tex |
|
\def\GMPbox#1#2#3{% |
|
\vbox{% |
|
\hrule \vfil |
|
\hbox to 3\GMPboxwidth {% |
|
\GMPvrule |
|
\hfil$#1$\hfil |
|
\vrule |
|
\hfil$#2$\hfil |
|
\vrule |
|
\hfil$#3$\hfil |
|
\vrule}% |
|
\vfil \hrule |
|
}} |
|
\GMPdisplay{% |
|
\vbox{% |
|
\hbox to 3\GMPboxwidth {high \hfil low} |
|
\vskip 0.7ex |
|
\GMPbox{x_2}{x_1}{x_0} |
|
\vskip 0.5ex |
|
\GMPbox{y_2}{y_1}{y_0} |
|
\vskip 0.5ex |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
high low |
|
+----------+----------+----------+ |
|
| x2 | x1 | x0 | |
|
+----------+----------+----------+ |
|
|
|
+----------+----------+----------+ |
|
| y2 | y1 | y0 | |
|
+----------+----------+----------+ |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
@noindent |
|
These parts are treated as the coefficients of two polynomials |
|
|
|
@display |
|
@group |
|
@m{X(t) = x_2t^2 + x_1t + x_0, |
|
X(t) = x2*t^2 + x1*t + x0} |
|
@m{Y(t) = y_2t^2 + y_1t + y_0, |
|
Y(t) = y2*t^2 + y1*t + y0} |
|
@end group |
|
@end display |
|
|
|
Again let @math{b} equal the power of 2 which is the size of the @ms{x,0}, |
|
@ms{x,1}, @ms{y,0} and @ms{y,1} pieces, ie.@: if they're @math{k} limbs each |
|
then @m{b=2\GMPraise{$k*$@code{mp\_bits\_per\_limb}}, |
|
b=2^(k*mp_bits_per_limb)}. With this @math{x=X(b)} and @math{y=Y(b)}. |
|
|
|
Let a polynomial @m{W(t)=X(t)Y(t),W(t)=X(t)*Y(t)} and suppose its coefficients |
|
are |
|
|
|
@display |
|
@m{W(t) = w_4t^4 + w_3t^3 + w_2t^2 + w_1t + w_0, |
|
W(t) = w4*t^4 + w3*t^3 + w2*t^2 + w1*t + w0} |
|
@end display |
|
|
|
@noindent |
|
The @m{w_i,w[i]} are going to be determined, and when they are they'll give |
|
the final result using @math{w=W(b)}, since |
|
@m{xy=X(b)Y(b),x*y=X(b)*Y(b)=W(b)}. The coefficients will be roughly |
|
@math{b^2} each, and the final @math{W(b)} will be an addition like, |
|
|
|
@tex |
|
\def\GMPbox#1#2{% |
|
\moveright #1\GMPboxwidth |
|
\vbox{% |
|
\hrule |
|
\hbox{% |
|
\GMPvrule |
|
\hbox to 2\GMPboxwidth {\hfil$#2$\hfil}% |
|
\vrule}% |
|
\hrule |
|
}} |
|
\GMPdisplay{% |
|
\vbox{% |
|
\hbox to 6\GMPboxwidth {high \hfil low}% |
|
\vskip 0.7ex |
|
\GMPbox{0}{w_4} |
|
\vskip 0.5ex |
|
\GMPbox{1}{w_3} |
|
\vskip 0.5ex |
|
\GMPbox{2}{w_2} |
|
\vskip 0.5ex |
|
\GMPbox{3}{w_1} |
|
\vskip 0.5ex |
|
\GMPbox{4}{w_1} |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
high low |
|
+-------+-------+ |
|
| w4 | |
|
+-------+-------+ |
|
+--------+-------+ |
|
| w3 | |
|
+--------+-------+ |
|
+--------+-------+ |
|
| w2 | |
|
+--------+-------+ |
|
+--------+-------+ |
|
| w1 | |
|
+--------+-------+ |
|
+-------+-------+ |
|
| w0 | |
|
+-------+-------+ |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
The @m{w_i,w[i]} coefficients could be formed by a simple set of cross |
|
products, like @m{w_4=x_2y_2,w4=x2*y2}, @m{w_3=x_2y_1+x_1y_2,w3=x2*y1+x1*y2}, |
|
@m{w_2=x_2y_0+x_1y_1+x_0y_2,w2=x2*y0+x1*y1+x0*y2} etc, but this would need all |
|
nine @m{x_iy_j,x[i]*y[j]} for @math{i,j=0,1,2}, and would be equivalent merely |
|
to a basecase multiply. Instead the following approach is used. |
|
|
|
@math{X(t)} and @math{Y(t)} are evaluated and multiplied at 5 points, giving |
|
values of @math{W(t)} at those points. The points used can be chosen in |
|
various ways, but in GMP the following are used |
|
|
|
@quotation |
|
@multitable {@m{t=\infty,t=inf}M} {MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM} |
|
@item Point @tab Value |
|
@item @math{t=0} @tab @m{x_0y_0,x0*y0}, which gives @ms{w,0} immediately |
|
@item @math{t=2} @tab @m{(4x_2+2x_1+x_0)(4y_2+2y_1+y_0),(4*x2+2*x1+x0)*(4*y2+2*y1+y0)} |
|
@item @math{t=1} @tab @m{(x_2+x_1+x_0)(y_2+y_1+y_0),(x2+x1+x0)*(y2+y1+y0)} |
|
@item @m{t={1\over2},t=1/2} @tab @m{(x_2+2x_1+4x_0)(y_2+2y_1+4y_0),(x2+2*x1+4*x0)*(y2+2*y1+4*y0)} |
|
@item @m{t=\infty,t=inf} @tab @m{x_2y_2,x2*y2}, which gives @ms{w,4} immediately |
|
@end multitable |
|
@end quotation |
|
|
|
At @m{t={1\over2},t=1/2} the value calculated is actually |
|
@m{16X({1\over2})Y({1\over2}), 16*X(1/2)*Y(1/2)}, giving a value for |
|
@m{16W({1\over2}),16*W(1/2)}, and this is always an integer. At |
|
@m{t=\infty,t=inf} the value is actually @m{\lim_{t\to\infty} {X(t)Y(t)\over |
|
t^4}, X(t)*Y(t)/t^4 in the limit as t approaches infinity}, but it's much |
|
easier to think of as simply @m{x_2y_2,x2*y2} giving @ms{w,4} immediately |
|
(much like @m{x_0y_0,x0*y0} at @math{t=0} gives @ms{w,0} immediately). |
|
|
|
Now each of the points substituted into |
|
@m{W(t)=w_4t^4+\cdots+w_0,W(t)=w4*t^4+@dots{}+w0} gives a linear combination |
|
of the @m{w_i,w[i]} coefficients, and the value of those combinations has just |
|
been calculated. |
|
|
|
@tex |
|
\GMPdisplay{% |
|
$\matrix{% |
|
W(0) & = & & & & & & & & & w_0 \cr |
|
16W({1\over2}) & = & w_4 & + & 2w_3 & + & 4w_2 & + & 8w_1 & + & 16w_0 \cr |
|
W(1) & = & w_4 & + & w_3 & + & w_2 & + & w_1 & + & w_0 \cr |
|
W(2) & = & 16w_4 & + & 8w_3 & + & 4w_2 & + & 2w_1 & + & w_0 \cr |
|
W(\infty) & = & w_4 \cr |
|
}$} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
W(0) = w0 |
|
16*W(1/2) = w4 + 2*w3 + 4*w2 + 8*w1 + 16*w0 |
|
W(1) = w4 + w3 + w2 + w1 + w0 |
|
W(2) = 16*w4 + 8*w3 + 4*w2 + 2*w1 + w0 |
|
W(inf) = w4 |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
This is a set of five equations in five unknowns, and some elementary linear |
|
algebra quickly isolates each @m{w_i,w[i]}, by subtracting multiples of one |
|
equation from another. |
|
|
|
In the code the set of five values @math{W(0)},@dots{},@m{W(\infty),W(inf)} |
|
will represent those certain linear combinations. By adding or subtracting |
|
one from another as necessary, values which are each @m{w_i,w[i]} alone are |
|
arrived at. This involves only a few subtractions of small multiples (some of |
|
which are powers of 2), and so is fast. A couple of divisions remain by |
|
powers of 2 and one division by 3 (or by 6 rather), and that last uses the |
|
special @code{mpn_divexact_by3} (@pxref{Exact Division}). |
|
|
|
In the code the values @ms{w,4}, @ms{w,2} and @ms{w,0} are formed in the |
|
destination with pointers @code{E}, @code{C} and @code{A}, and @ms{w,3} and |
|
@ms{w,1} in temporary space @code{D} and @code{B} are added to them. There |
|
are extra limbs @code{tD}, @code{tC} and @code{tB} at the high end of |
|
@ms{w,3}, @ms{w,2} and @ms{w,1} which are handled separately. The final |
|
addition then is as follows. |
|
|
|
@tex |
|
\def\GMPboxT#1{% |
|
\vbox{% |
|
\hrule |
|
\hbox {\GMPvrule\hskip 0.4em #1\hskip 0.4em \vrule}% |
|
\hrule |
|
}} |
|
\GMPdisplay{% |
|
\vbox{% |
|
\hbox to 6\GMPboxwidth {high \hfil low}% |
|
\vskip 0.7ex |
|
\vbox{% |
|
\hrule |
|
\hbox{% |
|
\GMPvrule |
|
\hbox to 2\GMPboxwidth {\hfil@code{E}\hfil} |
|
\vrule |
|
\hbox to 2\GMPboxwidth {\hfil@code{C}\hfil} |
|
\vrule |
|
\hbox to 2\GMPboxwidth {\hfil@code{A}\hfil} |
|
\vrule}% |
|
\hrule}% |
|
\vskip 0.5ex |
|
\moveright \GMPboxwidth \vbox{% |
|
\hrule |
|
\hbox to 4\GMPboxwidth {% |
|
\GMPvrule \hfil @code{D}\hfil |
|
\vrule \hfil @code{B}\hfil |
|
\vrule} |
|
\hrule}% |
|
\vskip 0.5ex |
|
\hbox{% |
|
\hbox to \GMPboxwidth{\hfil \GMPboxT{\code{tD}}}% |
|
\hbox to \GMPboxwidth{\hfil \GMPboxT{\code{tC}}}% |
|
\hbox to \GMPboxwidth{\hfil \GMPboxT{\code{tB}}}} |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
high low |
|
+-------+-------+-------+-------+-------+-------+ |
|
| E | C | A | |
|
+-------+-------+-------+-------+-------+-------+ |
|
+------+-------++------+-------+ |
|
| D || B | |
|
+------+-------++------+-------+ |
|
-- -- -- |
|
|tD| |tC| |tB| |
|
-- -- -- |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
The conversion of @math{W(t)} values to the coefficients is interpolation. A |
|
polynomial of degree 4 like @math{W(t)} is uniquely determined by values known |
|
at 5 different points. The points can be chosen to make the linear equations |
|
come out with a convenient set of steps for isolating the @m{w_i,w[i]}. |
|
|
|
In @file{mpn/generic/mul_n.c} the @code{interpolate3} routine performs the |
|
interpolation. The open-coded one-pass version may be a bit hard to |
|
understand, the steps performed can be better seen in the @code{USE_MORE_MPN} |
|
version. |
|
|
|
Squaring follows the same procedure as multiplication, but there's only one |
|
@math{X(t)} and it's evaluated at 5 points, and those values squared to give |
|
values of @math{W(t)}. The interpolation is then identical, and in fact the |
|
same @code{interpolate3} subroutine is used for both squaring and multiplying. |
|
|
|
Toom-3 is asymptotically @math{O(N^@W{1.465})}, the exponent being |
|
@m{\log5/\log3,log(5)/log(3)}, representing 5 recursive multiplies of 1/3 the |
|
original size. This is an improvement over Karatsuba at @math{O(N^@W{1.585})}, |
|
though Toom-Cook 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. |
|
@code{MUL_TOOM3_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 @file{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 above for the Karatsuba algorithm 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 (@pxref{References}), using |
|
a vector to represent the @math{x} and @math{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. |
|
|
|
|
|
@node FFT Multiplication, Other Multiplication, Toom-Cook 3-Way Multiplication, Multiplication Algorithms |
|
@subsection FFT Multiplication |
|
|
|
At large to very large sizes a Fermat style FFT multiplication is used, |
|
following Sch@"onhage and Strassen (@pxref{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 @m{xy \bmod 2^N+1, x*y mod 2^N+1}, for a given |
|
@math{N}. A full product @m{xy,x*y} is obtained by choosing @m{N \ge |
|
\mathop{\rm bits}(x)+\mathop{\rm bits}(y), N>=bits(x)+bits(y)} and padding |
|
@math{x} and @math{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 @math{k} |
|
parameter controls the split, with an FFT-@math{k} splitting into @math{2^k} |
|
pieces of @math{M=N/2^k} bits each. @math{N} must be a multiple of |
|
@m{2^k\times@code{mp\_bits\_per\_limb}, (2^k)*@nicode{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 @m{2^{N'}+1, 2^N'+1} where @math{N'} is @math{2M+k+3} rounded up to a |
|
multiple of @math{2^k} and of @code{mp_bits_per_limb}. The results of |
|
interpolation will be the following negacyclic convolution of the input |
|
pieces, and the choice of @math{N'} ensures these sums aren't truncated. |
|
@tex |
|
$$ w_n = \sum_{{i+j = b2^k+n}\atop{b=0,1}} (-1)^b x_i y_j $$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
--- |
|
\ b |
|
w[n] = / (-1) * x[i] * y[j] |
|
--- |
|
i+j==b*2^k+n |
|
b=0,1 |
|
@end example |
|
|
|
@end ifnottex |
|
The points used for the evaluation are @math{g^i} for @math{i=0} to |
|
@math{2^k-1} where @m{g=2^{2N'/2^k}, g=2^(2N'/2^k)}. @math{g} is a |
|
@m{2^k,2^k'}th root of unity mod @m{2^{N'}+1,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 @m{2^{N'}+1, 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 @math{N'}. The interpolation is |
|
an inverse fast fourier transform. The resulting set of sums of @m{x_iy_j, |
|
x[i]*y[j]} are added at appropriate offsets to give the final result. |
|
|
|
Squaring is the same, but @math{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 @math{2^N+1} product, an FFT-@math{k} is an @m{O(N^{k/(k-1)}), |
|
O(N^(k/(k-1)))} algorithm, the exponent representing @math{2^k} recursed |
|
modular multiplies each @m{1/2^{k-1},1/2^(k-1)} the size of the original. |
|
Each successive @math{k} is an asymptotic improvement, but overheads mean each |
|
is only faster at bigger and bigger sizes. In the code, @code{MUL_FFT_TABLE} |
|
and @code{SQR_FFT_TABLE} are the thresholds where each @math{k} is used. Each |
|
new @math{k} effectively swaps some multiplying for some shifts, adds and |
|
overheads. |
|
|
|
A mod @math{2^N+1} product can be formed with a normal |
|
@math{N@cross{}N@rightarrow{}2N} bit multiply plus a subtraction, so an FFT |
|
and Toom-3 etc can be compared directly. A @math{k=4} FFT at |
|
@math{O(N^@W{1.333})} can be expected to be the first faster than Toom-3 at |
|
@math{O(N^@W{1.465})}. In practice this is what's found, with |
|
@code{MUL_FFT_MODF_THRESHOLD} and @code{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 @math{N} to @math{2N} |
|
doesn't alter the theoretical complexity for a given @math{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 @math{2^k} recursed multiplies each @m{1/2^{k-2},1/2^(k-2)} the size of |
|
the inputs, making it @m{O(N^{k/(k-2)}), O(N^(k/(k-2)))}. This would mean |
|
@math{k=7} at @math{O(N^@W{1.4})} would be the first FFT faster than Toom-3. |
|
In practice @code{MUL_FFT_THRESHOLD} and @code{SQR_FFT_THRESHOLD} have been |
|
found to be in the @math{k=8} range, somewhere between 3000 and 10000 limbs. |
|
|
|
The way @math{N} is split into @math{2^k} pieces and then @math{2M+k+3} is |
|
rounded up to a multiple of @math{2^k} and @code{mp_bits_per_limb} means that |
|
when @math{2^k@ge{}@nicode{mp\_bits\_per\_limb}} the effective @math{N} is a |
|
multiple of @m{2^{2k-1},2^(2k-1)} bits. The @math{+k+3} means some values of |
|
@math{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 |
|
@math{+k+3} bits are negligible at typical FFT sizes. |
|
|
|
The practical effect of the @m{2^{2k-1},2^(2k-1)} constraint is to introduce a |
|
step-effect into measured speeds. For example @math{k=8} will round @math{N} |
|
up to a multiple of 32768 bits, so for a 32-bit limb there'll be 512 limb |
|
groups of sizes for which @code{mpn_mul_n} runs at the same speed. Or for |
|
@math{k=9} groups of 2048 limbs, @math{k=10} groups of 8192 limbs, etc. In |
|
practice it's been found each @math{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 @math{k} for a while. Something |
|
more sophisticated for @code{MUL_FFT_TABLE} and @code{SQR_FFT_TABLE} will be |
|
needed. |
|
|
|
|
|
@node Other Multiplication, , FFT Multiplication, Multiplication Algorithms |
|
@subsection Other Multiplication |
|
|
|
The 3-way Toom-Cook algorithm described above (@pxref{Toom-Cook 3-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, though it's |
|
possible a Toom-4 might fit in between Toom-3 and the FFTs. The notes here |
|
are merely for interest. |
|
|
|
In general a split into @math{r+1} pieces is made, and evaluations and |
|
pointwise multiplications done at @m{2r+1,2*r+1} points. A 4-way split does 7 |
|
pointwise multiplies, 5-way does 9, etc. Asymptotically an @math{(r+1)}-way |
|
algorithm is @m{O(N^{log(2r+1)/log(r+1)}, O(N^(log(2*r+1)/log(r+1)))}. Only |
|
the pointwise multiplications count towards big-@math{O} complexity, but the |
|
time spent in the evaluate and interpolate stages grows with @math{r} and has |
|
a significant practical impact, with the asymptotic advantage of each @math{r} |
|
realized only at bigger and bigger sizes. The overheads grow as |
|
@m{O(Nr),O(N*r)}, whereas in an @math{r=2^k} FFT they grow only as @m{O(N \log |
|
r), O(N*log(r))}. |
|
|
|
Knuth algorithm C evaluates at points 0,1,2,@dots{},@m{2r,2*r}, but exercise 4 |
|
uses @math{-r},@dots{},0,@dots{},@math{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 @math{j^2} and the |
|
multipliers at C8 become @m{2tj-j^2,2*t*j-j^2}. |
|
|
|
Splitting odd and even parts through positive and negative points can be |
|
thought of as using @math{-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 |
|
@m{i=\sqrt{-1}, i=sqrt(-1)} doesn't help, essentially because in cartesian |
|
form it takes three real multiplies to do a complex multiply. The existence |
|
of @m{2^k,2^k'}th roots of unity in a suitable ring or field lets the fast |
|
fourier transform keep splitting and get to @m{O(N \log r), 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. |
|
|
|
|
|
@node Division Algorithms, Greatest Common Divisor Algorithms, Multiplication Algorithms, Algorithms |
|
@section Division Algorithms |
|
@cindex Division algorithms |
|
|
|
@menu |
|
* Single Limb Division:: |
|
* Basecase Division:: |
|
* Divide and Conquer Division:: |
|
* Exact Division:: |
|
* Exact Remainder:: |
|
* Small Quotient Division:: |
|
@end menu |
|
|
|
|
|
@node Single Limb Division, Basecase Division, Division Algorithms, Division Algorithms |
|
@subsection Single Limb Division |
|
|
|
N@cross{}1 division is implemented using repeated 2@cross{}1 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 section 8 of ``Division by Invariant Integers |
|
using Multiplication'' by Granlund and Montgomery (@pxref{References}) and is |
|
implemented as @code{udiv_qrnnd_preinv} in @file{gmp-impl.h}. The idea is to |
|
have a fixed-point approximation to @math{1/d} (see @code{invert_limb}) and |
|
then multiply by the high limb (plus one bit) of the dividend to get a |
|
quotient @math{q}. With @math{d} normalized (high bit set), @math{q} is no |
|
more than 1 too small. Subtracting @m{qd,q*d} from the dividend gives a |
|
remainder, and reveals whether @math{q} or @math{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 |
|
@code{__udiv_qrnnd_c} or the multiply by inverse, the division performed is |
|
actually @m{a2^k,a*2^k} by @m{d2^k,d*2^k} where @math{a} is the dividend and |
|
@math{k} is the power necessary to have the high bit of @m{d2^k,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 |
|
@m{r = a \bmod d2^k, r = a mod d*2^k} followed by an extra final step @m{r2^k |
|
\bmod d2^k, 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 2@cross{}2 multiply, but the four 1@cross{}1s to do that are |
|
independent and can therefore be done partly or wholly in parallel. Likewise |
|
for a 2@cross{}1 calculating @m{qd,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 1@cross{}1 multiply |
|
for the inverse effectively becomes two @m{1\over2@cross{}1, (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. |
|
|
|
|
|
@node Basecase Division, Divide and Conquer Division, Single Limb Division, Division Algorithms |
|
@subsection Basecase Division |
|
|
|
Basecase N@cross{}M division is like long division done by hand, but in base |
|
@m{2\GMPraise{@code{mp\_bits\_per\_limb}}, 2^mp_bits_per_limb}. See Knuth |
|
section 4.3.1 algorithm D, and @file{mpn/generic/sb_divrem_mn.c}. |
|
|
|
Briefly stated, while the dividend remains larger than the divisor, a high |
|
quotient limb is formed and the N@cross{}1 product @m{qd,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 2@cross{}1 division and a |
|
1@cross{}1 multiplication plus some subtractions. The 2@cross{}1 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 @ref{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@minus{}M being the number of quotient limbs, this is an |
|
@m{O(QM),O(Q*M)} algorithm and will run at a speed similar to a basecase |
|
Q@cross{}M multiplication, differing in fact only in the extra multiply and |
|
divide for each of the Q quotient limbs. |
|
|
|
|
|
@node Divide and Conquer Division, Exact Division, Basecase Division, Division Algorithms |
|
@subsection Divide and Conquer Division |
|
|
|
For divisors larger than @code{DIV_DC_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 (@pxref{References}). |
|
|
|
The algorithm consists essentially of recognising that a 2N@cross{}N division |
|
can be done with the basecase division algorithm (@pxref{Basecase Division}), |
|
but using N/2 limbs as a base, not just a single limb. This way the |
|
multiplications that arise are (N/2)@cross{}(N/2) and can take advantage of |
|
Karatsuba and higher multiplication algorithms (@pxref{Multiplication |
|
Algorithms}). The ``digits'' of the quotient are formed by recursive |
|
N@cross{}(N/2) divisions. |
|
|
|
If the (N/2)@cross{}(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 |
|
@code{MUL_KARATSUBA_THRESHOLD} that divide and conquer is of use. |
|
|
|
@code{DIV_DC_THRESHOLD} is based on the divisor size N, so it will be somewhere |
|
above twice @code{MUL_KARATSUBA_THRESHOLD}, but how much above depends on the |
|
CPU. An optimized @code{mpn_mul_basecase} can lower @code{DIV_DC_THRESHOLD} a |
|
little by offering a ready-made advantage over repeated @code{mpn_submul_1} |
|
calls. |
|
|
|
Divide and conquer is asymptotically @m{O(M(N)\log N),O(M(N)*log(N))} where |
|
@math{M(N)} is the time for an N@cross{}N 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 @m{2.63M(N), 2.63*M(N)}. With higher |
|
algorithms the @math{M(N)} term improves and the multiplier tends to @m{\log |
|
N, log(N)}. In practice, at moderate to large sizes, a 2N@cross{}N division |
|
is about 2 to 4 times slower than an N@cross{}N multiplication. |
|
|
|
Newton's method used for division is asymptotically @math{O(M(N))} and should |
|
therefore be superior to divide and conquer, but it's believed this would only |
|
be for large to very large N. |
|
|
|
|
|
@node Exact Division, Exact Remainder, Divide and Conquer Division, Division Algorithms |
|
@subsection Exact Division |
|
|
|
A so-called exact division is when the dividend is known to be an exact |
|
multiple of the divisor. Jebelean's exact division algorithm uses this |
|
knowledge to make some significant optimizations (@pxref{References}). |
|
|
|
The idea can be illustrated in decimal for example with 368154 divided by |
|
543. Because the low digit of the dividend is 4, the low digit of the |
|
quotient must be 8. This is arrived at from @m{4 \mathord{\times} 7 \bmod 10, |
|
4*7 mod 10}, using the fact 7 is the modular inverse of 3 (the low digit of |
|
the divisor), since @m{3 \mathord{\times} 7 \mathop{\equiv} 1 \bmod 10, 3*7 |
|
@equiv{} 1 mod 10}. So @m{8\mathord{\times}543 = 4344,8*543=4344} can be |
|
subtracted from the dividend leaving 363810. Notice the low digit has become |
|
zero. |
|
|
|
The procedure is repeated at the second digit, with the next quotient digit 7 |
|
(@m{1 \mathord{\times} 7 \bmod 10, 7 @equiv{} 1*7 mod 10}), subtracting |
|
@m{7\mathord{\times}543 = 3801,7*543=3801}, leaving 325800. And finally at |
|
the third digit with quotient digit 6 (@m{8 \mathord{\times} 7 \bmod 10, 8*7 |
|
mod 10}), subtracting @m{6\mathord{\times}543 = 3258,6*543=3258} leaving 0. |
|
So the quotient is 678. |
|
|
|
Notice however that the multiplies and subtractions don't need to extend past |
|
the low three digits of the dividend, since that's enough to determine the |
|
three quotient digits. For the last quotient digit no subtraction is needed |
|
at all. On a 2N@cross{}N division like this one, only about half the work of |
|
a normal basecase division is necessary. |
|
|
|
For an N@cross{}M exact division producing Q=N@minus{}M quotient limbs, the |
|
saving over a normal basecase division is in two parts. Firstly, each of the |
|
Q quotient limbs needs only one multiply, not a 2@cross{}1 divide and |
|
multiply. Secondly, the crossproducts are reduced when @math{Q>M} to |
|
@m{QM-M(M+1)/2,Q*M-M*(M+1)/2}, or when @math{Q@le{}M} to @m{Q(Q-1)/2, |
|
Q*(Q-1)/2}. Notice the savings are complementary. If Q is big then many |
|
divisions are saved, or if Q is small then the crossproducts reduce to a small |
|
number. |
|
|
|
The modular inverse used is calculated efficiently by @code{modlimb_invert} in |
|
@file{gmp-impl.h}. This does four multiplies for a 32-bit limb, or six for a |
|
64-bit limb. @file{tune/modlinv.c} has some alternate implementations that |
|
might suit processors better at bit twiddling than multiplying. |
|
|
|
The sub-quadratic exact division described by Jebelean in ``Exact Division |
|
with Karatsuba Complexity'' is not currently implemented. It uses a |
|
rearrangement similar to the divide and conquer for normal division |
|
(@pxref{Divide and Conquer Division}), but operating from low to high. A |
|
further possibility not currently implemented is ``Bidirectional Exact Integer |
|
Division'' by Krandick and Jebelean which forms quotient limbs from both the |
|
high and low ends of the dividend, and can halve once more the number of |
|
crossproducts needed in a 2N@cross{}N division. |
|
|
|
A special case exact division by 3 exists in @code{mpn_divexact_by3}, |
|
supporting Toom-3 multiplication and @code{mpq} canonicalizations. It forms |
|
quotient digits with a multiply by the modular inverse of 3 (which is |
|
@code{0xAA..AAB}) and uses two comparisons to determine a borrow for the next |
|
limb. The multiplications don't need to be on the dependent chain, as long as |
|
the effect of the borrows is applied. Only a few optimized assembler |
|
implementations currently exist. |
|
|
|
|
|
@node Exact Remainder, Small Quotient Division, Exact Division, Division Algorithms |
|
@subsection Exact Remainder |
|
|
|
If the exact division algorithm is done with a full subtraction at each stage |
|
and the dividend isn't a multiple of the divisor, then low zero limbs are |
|
produced but with a remainder in the high limbs. For dividend @math{a}, |
|
divisor @math{d}, quotient @math{q}, and @m{b = 2 |
|
\GMPraise{@code{mp\_bits\_per\_limb}}, b = 2^mp_bits_per_limb}, then this |
|
remainder @math{r} is of the form |
|
@tex |
|
$$ a = qd + r b^n $$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
a = q*d + r*b^n |
|
@end example |
|
|
|
@end ifnottex |
|
@math{n} represents the number of zero limbs produced by the subtractions, |
|
that being the number of limbs produced for @math{q}. @math{r} will be in the |
|
range @math{0@le{}r<d} and can be viewed as a remainder, but one shifted up by |
|
a factor of @math{b^n}. |
|
|
|
Carrying out full subtractions at each stage means the same number of cross |
|
products must be done as a normal division, but there's still some single limb |
|
divisions saved. When @math{d} is a single limb some simplifications arise, |
|
providing good speedups on a number of processors. |
|
|
|
@code{mpn_bdivmod}, @code{mpn_divexact_by3}, @code{mpn_modexact_1_odd} and the |
|
@code{redc} function in @code{mpz_powm} differ subtly in how they return |
|
@math{r}, leading to some negations in the above formula, but all are |
|
essentially the same. |
|
|
|
Clearly @math{r} is zero when @math{a} is a multiple of @math{d}, and this |
|
leads to divisibility or congruence tests which are potentially more efficient |
|
than a normal division. |
|
|
|
The factor of @math{b^n} on @math{r} can be ignored in a GCD when @math{d} is |
|
odd, hence the use of @code{mpn_bdivmod} in @code{mpn_gcd}, and the use of |
|
@code{mpn_modexact_1_odd} by @code{mpn_gcd_1} and @code{mpz_kronecker_ui} etc |
|
(@pxref{Greatest Common Divisor Algorithms}). |
|
|
|
Montgomery's REDC method for modular multiplications uses operands of the form |
|
of @m{xb^{-n}, x*b^-n} and @m{yb^{-n}, y*b^-n} and on calculating @m{(xb^{-n}) |
|
(yb^{-n}), (x*b^-n)*(y*b^-n)} uses the factor of @math{b^n} in the exact |
|
remainder to reach a product in the same form @m{(xy)b^{-n}, (x*y)*b^-n} |
|
(@pxref{Modular Powering Algorithm}). |
|
|
|
Notice that @math{r} generally gives no useful information about the ordinary |
|
remainder @math{a @bmod d} since @math{b^n @bmod d} could be anything. If |
|
however @math{b^n @equiv{} 1 @bmod d}, then @math{r} is the negative of the |
|
ordinary remainder. This occurs whenever @math{d} is a factor of |
|
@math{b^n-1}, as for example with 3 in @code{mpn_divexact_by3}. Other such |
|
factors include 5, 17 and 257, but no particular use has been found for this. |
|
|
|
|
|
@node Small Quotient Division, , Exact Remainder, Division Algorithms |
|
@subsection Small Quotient Division |
|
|
|
An N@cross{}M division where the number of quotient limbs Q=N@minus{}M is |
|
small can be optimized somewhat. |
|
|
|
An ordinary basecase division normalizes the divisor by shifting it to make |
|
the high bit set, shifting the dividend accordingly, and shifting the |
|
remainder back down at the end of the calculation. This is wasteful if only a |
|
few quotient limbs are to be formed. Instead a division of just the top |
|
@m{\rm2Q,2*Q} limbs of the dividend by the top Q limbs of the divisor can be |
|
used to form a trial quotient. This requires only those limbs normalized, not |
|
the whole of the divisor and dividend. |
|
|
|
A multiply and subtract then applies the trial quotient to the M@minus{}Q |
|
unused limbs of the divisor and N@minus{}Q dividend limbs (which includes Q |
|
limbs remaining from the trial quotient division). The starting trial |
|
quotient can be 1 or 2 too big, but all cases of 2 too big and most cases of 1 |
|
too big are detected by first comparing the most significant limbs that will |
|
arise from the subtraction. An addback is done if the quotient still turns |
|
out to be 1 too big. |
|
|
|
This whole procedure is essentially the same as one step of the basecase |
|
algorithm done in a Q limb base, though with the trial quotient test done only |
|
with the high limbs, not an entire Q limb ``digit'' product. The correctness |
|
of this weaker test can be established by following the argument of Knuth |
|
section 4.3.1 exercise 20 but with the @m{v_2 \GMPhat q > b \GMPhat r |
|
+ u_2, v2*q>b*r+u2} condition appropriately relaxed. |
|
|
|
|
|
@need 1000 |
|
@node Greatest Common Divisor Algorithms, Powering Algorithms, Division Algorithms, Algorithms |
|
@section Greatest Common Divisor |
|
@cindex Greatest common divisor algorithms |
|
|
|
@menu |
|
* Binary GCD:: |
|
* Accelerated GCD:: |
|
* Extended GCD:: |
|
* Jacobi Symbol:: |
|
@end menu |
|
|
|
|
|
@node Binary GCD, Accelerated GCD, Greatest Common Divisor Algorithms, Greatest Common Divisor Algorithms |
|
@subsection Binary GCD |
|
|
|
At small sizes GMP uses an @math{O(N^2)} binary style GCD. This is described |
|
in many textbooks, for example Knuth section 4.5.2 algorithm B. It simply |
|
consists of successively reducing operands @math{a} and @math{b} using |
|
@math{@gcd{}(a,b) = @gcd{}(@min{}(a,b),@abs{}(a-b))}, and also that if |
|
@math{a} and @math{b} are first made odd then @math{@abs{}(a-b)} is even and |
|
factors of two can be discarded. |
|
|
|
Variants like letting @math{a-b} become negative and doing a different next |
|
step are of interest only as far as they suit particular CPUs, since on small |
|
operands it's machine dependent factors that determine performance. |
|
|
|
The Euclidean GCD algorithm, as per Knuth algorithms E and A, reduces using |
|
@math{a @bmod b} but this has so far been found to be slower everywhere. One |
|
reason the binary method does well is that the implied quotient at each step |
|
is usually small, so often only one or two subtractions are needed to get the |
|
same effect as a division. Quotients 1, 2 and 3 for example occur 67.7% of |
|
the time, see Knuth section 4.5.3 Theorem E. |
|
|
|
When the implied quotient is large, meaning @math{b} is much smaller than |
|
@math{a}, then a division is worthwhile. This is the basis for the initial |
|
@math{a @bmod b} reductions in @code{mpn_gcd} and @code{mpn_gcd_1} (the latter |
|
for both N@cross{}1 and 1@cross{}1 cases). But after that initial reduction, |
|
big quotients occur too rarely to make it worth checking for them. |
|
|
|
|
|
@node Accelerated GCD, Extended GCD, Binary GCD, Greatest Common Divisor Algorithms |
|
@subsection Accelerated GCD |
|
|
|
For sizes above @code{GCD_ACCEL_THRESHOLD}, GMP uses the Accelerated GCD |
|
algorithm described independently by Weber and Jebelean (the latter as the |
|
``Generalized Binary'' algorithm), @pxref{References}. This algorithm is |
|
still @math{O(N^2)}, but is much faster than the binary algorithm since it |
|
does fewer multi-precision operations. It consists of alternating the |
|
@math{k}-ary reduction by Sorenson, and a ``dmod'' exact remainder reduction. |
|
|
|
For operands @math{u} and @math{v} the @math{k}-ary reduction replaces |
|
@math{u} with @m{nv-du,n*v-d*u} where @math{n} and @math{d} are single limb |
|
values chosen to give two trailing zero limbs on that value, which can be |
|
stripped. @math{n} and @math{d} are calculated using an algorithm similar to |
|
half of a two limb GCD (see @code{find_a} in @file{mpn/generic/gcd.c}). |
|
|
|
When @math{u} and @math{v} differ in size by more than a certain number of |
|
bits, a dmod is performed to zero out bits at the low end of the larger. It |
|
consists of an exact remainder style division applied to an appropriate number |
|
of bits (@pxref{Exact Division}, and @pxref{Exact Remainder}). This is faster |
|
than a @math{k}-ary reduction but useful only when the operands differ in |
|
size. There's a dmod after each @math{k}-ary reduction, and if the dmod |
|
leaves the operands still differing in size then it's repeated. |
|
|
|
The @math{k}-ary reduction step can introduce spurious factors into the GCD |
|
calculated, and these are eliminated at the end by taking GCDs with the |
|
original inputs @math{@gcd{}(u,@gcd{}(v,g))} using the binary algorithm. |
|
Since @math{g} is almost always small this takes very little time. |
|
|
|
At small sizes the algorithm needs a good implementation of @code{find_a}. At |
|
larger sizes it's dominated by @code{mpn_addmul_1} applying @math{n} and |
|
@math{d}. |
|
|
|
|
|
@node Extended GCD, Jacobi Symbol, Accelerated GCD, Greatest Common Divisor Algorithms |
|
@subsection Extended GCD |
|
|
|
The extended GCD calculates @math{@gcd{}(a,b)} and also cofactors @math{x} and |
|
@math{y} satisfying @m{ax+by=\gcd(a@C{}b), a*x+b*y=gcd(a@C{}b)}. Lehmer's |
|
multi-step improvement of the extended Euclidean algorithm is used. See Knuth |
|
section 4.5.2 algorithm L, and @file{mpn/generic/gcdext.c}. This is an |
|
@math{O(N^2)} algorithm. |
|
|
|
The multipliers at each step are found using single limb calculations for |
|
sizes up to @code{GCDEXT_THRESHOLD}, or double limb calculations above that. |
|
The single limb code is faster but doesn't produce full-limb multipliers, |
|
hence not making full use of the @code{mpn_addmul_1} calls. |
|
|
|
When a CPU has a data-dependent multiplier, meaning one which is faster on |
|
operands with fewer bits, the extra work in the double-limb calculation might |
|
only save some looping overheads, leading to a large @code{GCDEXT_THRESHOLD}. |
|
|
|
Currently the single limb calculation doesn't optimize for the small quotients |
|
that often occur, and this can lead to unusually low values of |
|
@code{GCDEXT_THRESHOLD}, depending on the CPU. |
|
|
|
An analysis of double-limb calculations can be found in ``A Double-Digit |
|
Lehmer-Euclid Algorithm'' by Jebelean (@pxref{References}). The code in GMP |
|
was developed independently. |
|
|
|
It should be noted that when a double limb calculation is used, it's used for |
|
the whole of that GCD, it doesn't fall back to single limb part way through. |
|
This is because as the algorithm proceeds, the inputs @math{a} and @math{b} |
|
are reduced, but the cofactors @math{x} and @math{y} grow, so the multipliers |
|
at each step are applied to a roughly constant total number of limbs. |
|
|
|
|
|
@node Jacobi Symbol, , Extended GCD, Greatest Common Divisor Algorithms |
|
@subsection Jacobi Symbol |
|
|
|
@code{mpz_jacobi} and @code{mpz_kronecker} are currently implemented with a |
|
simple binary algorithm similar to that described for the GCDs (@pxref{Binary |
|
GCD}). They're not very fast when both inputs are large. Lehmer's multi-step |
|
improvement or a binary based multi-step algorithm is likely to be better. |
|
|
|
When one operand fits a single limb, and that includes @code{mpz_kronecker_ui} |
|
and friends, an initial reduction is done with either @code{mpn_mod_1} or |
|
@code{mpn_modexact_1_odd}, followed by the binary algorithm on a single limb. |
|
The binary algorithm is well suited to a single limb, and the whole |
|
calculation in this case is quite efficient. |
|
|
|
In all the routines sign changes for the result are accumulated using some bit |
|
twiddling, avoiding table lookups or conditional jumps. |
|
|
|
|
|
@need 1000 |
|
@node Powering Algorithms, Root Extraction Algorithms, Greatest Common Divisor Algorithms, Algorithms |
|
@section Powering Algorithms |
|
@cindex Powering algorithms |
|
|
|
@menu |
|
* Normal Powering Algorithm:: |
|
* Modular Powering Algorithm:: |
|
@end menu |
|
|
|
|
|
@node Normal Powering Algorithm, Modular Powering Algorithm, Powering Algorithms, Powering Algorithms |
|
@subsection Normal Powering |
|
|
|
Normal @code{mpz} or @code{mpf} powering uses a simple binary algorithm, |
|
successively squaring and then multiplying by the base when a 1 bit is seen in |
|
the exponent, as per Knuth section 4.6.3. The ``left to right'' |
|
variant described there is used rather than algorithm A, since it's just as |
|
easy and can be done with somewhat less temporary memory. |
|
|
|
|
|
@node Modular Powering Algorithm, , Normal Powering Algorithm, Powering Algorithms |
|
@subsection Modular Powering |
|
|
|
Modular powering is implemented using a @math{2^k}-ary sliding window |
|
algorithm, as per ``Handbook of Applied Cryptography'' algorithm 14.85 |
|
(@pxref{References}). @math{k} is chosen according to the size of the |
|
exponent. Larger exponents use larger values of @math{k}, the choice being |
|
made to minimize the average number of multiplications that must supplement |
|
the squaring. |
|
|
|
The modular multiplies and squares use either a simple division or the REDC |
|
method by Montgomery (@pxref{References}). REDC is a little faster, |
|
essentially saving N single limb divisions in a fashion similar to an exact |
|
remainder (@pxref{Exact Remainder}). The current REDC has some limitations. |
|
It's only @math{O(N^2)} so above @code{POWM_THRESHOLD} division becomes faster |
|
and is used. It doesn't attempt to detect small bases, but rather always uses |
|
a REDC form, which is usually a full size operand. And lastly it's only |
|
applied to odd moduli. |
|
|
|
|
|
@node Root Extraction Algorithms, Radix Conversion Algorithms, Powering Algorithms, Algorithms |
|
@section Root Extraction Algorithms |
|
@cindex Root extraction algorithms |
|
|
|
@menu |
|
* Square Root Algorithm:: |
|
* Nth Root Algorithm:: |
|
* Perfect Square Algorithm:: |
|
* Perfect Power Algorithm:: |
|
@end menu |
|
|
|
|
|
@node Square Root Algorithm, Nth Root Algorithm, Root Extraction Algorithms, Root Extraction Algorithms |
|
@subsection Square Root |
|
|
|
Square roots are taken using the ``Karatsuba Square Root'' algorithm by Paul |
|
Zimmermann (@pxref{References}). This is expressed in a divide and conquer |
|
form, but as noted in the paper it can also be viewed as a discrete variant of |
|
Newton's method. |
|
|
|
In the Karatsuba multiplication range this is an @m{O({3\over2} |
|
M(N/2)),O(1.5*M(N/2))} algorithm, where @math{M(n)} is the time to multiply |
|
two numbers of @math{n} limbs. In the FFT multiplication range this grows to |
|
a bound of @m{O(6 M(N/2)),O(6*M(N/2))}. In practice a factor of about 1.5 to |
|
1.8 is found in the Karatsuba and Toom-3 ranges, growing to 2 or 3 in the FFT |
|
range. |
|
|
|
The algorithm does all its calculations in integers and the resulting |
|
@code{mpn_sqrtrem} is used for both @code{mpz_sqrt} and @code{mpf_sqrt}. |
|
The extended precision given by @code{mpf_sqrt_ui} is obtained by |
|
padding with zero limbs. |
|
|
|
|
|
@node Nth Root Algorithm, Perfect Square Algorithm, Square Root Algorithm, Root Extraction Algorithms |
|
@subsection Nth Root |
|
|
|
Integer Nth roots are taken using Newton's method with the following |
|
iteration, where @math{A} is the input and @math{n} is the root to be taken. |
|
@tex |
|
$$a_{i+1} = {1\over n} \left({A \over a_i^{n-1}} + (n-1)a_i \right)$$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
1 A |
|
a[i+1] = - * ( --------- + (n-1)*a[i] ) |
|
n a[i]^(n-1) |
|
@end example |
|
|
|
@end ifnottex |
|
The initial approximation @m{a_1,a[1]} is generated bitwise by successively |
|
powering a trial root with or without new 1 bits, aiming to be just above the |
|
true root. The iteration converges quadratically when started from a good |
|
approximation. When @math{n} is large more initial bits are needed to get |
|
good convergence. The current implementation is not particularly well |
|
optimized. |
|
|
|
|
|
@node Perfect Square Algorithm, Perfect Power Algorithm, Nth Root Algorithm, Root Extraction Algorithms |
|
@subsection Perfect Square |
|
|
|
@code{mpz_perfect_square_p} is able to quickly exclude most non-squares by |
|
checking whether the input is a quadratic residue modulo some small integers. |
|
|
|
The first test is modulo 256 which means simply examining the least |
|
significant byte. Only 44 different values occur as the low byte of a square, |
|
so 82.8% of non-squares can be immediately excluded. Similar tests modulo |
|
primes from 3 to 29 exclude 99.5% of those remaining, or if a limb is 64 bits |
|
then primes up to 53 are used, excluding 99.99%. A single N@cross{}1 |
|
remainder using @code{PP} from @file{gmp-impl.h} quickly gives all these |
|
remainders. |
|
|
|
A square root must still be taken for any value that passes the residue tests, |
|
to verify it's really a square and not one of the 0.086% (or 0.000156% for 64 |
|
bits) non-squares that get through. @xref{Square Root Algorithm}. |
|
|
|
|
|
@node Perfect Power Algorithm, , Perfect Square Algorithm, Root Extraction Algorithms |
|
@subsection Perfect Power |
|
|
|
Detecting perfect powers is required by some factorization algorithms. |
|
Currently @code{mpz_perfect_power_p} is implemented using repeated Nth root |
|
extractions, though naturally only prime roots need to be considered. |
|
(@xref{Nth Root Algorithm}.) |
|
|
|
If a prime divisor @math{p} with multiplicity @math{e} can be found, then only |
|
roots which are divisors of @math{e} need to be considered, much reducing the |
|
work necessary. To this end divisibility by a set of small primes is checked. |
|
|
|
|
|
@node Radix Conversion Algorithms, Other Algorithms, Root Extraction Algorithms, Algorithms |
|
@section Radix Conversion |
|
@cindex Radix conversion algorithms |
|
|
|
Radix conversions are less important than other algorithms. A program |
|
dominated by conversions should probably use a different data representation. |
|
|
|
@menu |
|
* Binary to Radix:: |
|
* Radix to Binary:: |
|
@end menu |
|
|
|
|
|
@node Binary to Radix, Radix to Binary, Radix Conversion Algorithms, Radix Conversion Algorithms |
|
@subsection Binary to Radix |
|
|
|
Conversions from binary to a power-of-2 radix use a simple and fast |
|
@math{O(N)} bit extraction algorithm. |
|
|
|
Conversions from binary to other radices use one of two algorithms. Sizes |
|
below @code{GET_STR_PRECOMPUTE_THRESHOLD} use a basic @math{O(N^2)} method. |
|
Repeated divisions by @math{b^n} are made, where @math{b} is the radix and |
|
@math{n} is the biggest power that fits in a limb. But instead of simply |
|
using the remainder @math{r} from such divisions, an extra divide step is done |
|
to give a fractional limb representing @math{r/b^n}. The digits of @math{r} |
|
can then be extracted using multiplications by @math{b} rather than divisions. |
|
Special case code is provided for decimal, allowing multiplications by 10 to |
|
optimize to shifts and adds. |
|
|
|
Above @code{GET_STR_PRECOMPUTE_THRESHOLD} a sub-quadratic algorithm is used. |
|
For an input @math{t}, powers @m{b^{n2^i},b^(n*2^i)} of the radix are |
|
calculated, until a power between @math{t} and @m{\sqrt{t},sqrt(t)} is |
|
reached. @math{t} is then divided by that largest power, giving a quotient |
|
which is the digits above that power, and a remainder which is those below. |
|
These two parts are in turn divided by the second highest power, and so on |
|
recursively. When a piece has been divided down to less than |
|
@code{GET_STR_DC_THRESHOLD} limbs, the basecase algorithm described above is |
|
used. |
|
|
|
The advantage of this algorithm is that big divisions can make use of the |
|
sub-quadratic divide and conquer division (@pxref{Divide and Conquer |
|
Division}), and big divisions tend to have less overheads than lots of |
|
separate single limb divisions anyway. But in any case the cost of |
|
calculating the powers @m{b^{n2^i},b^(n*2^i)} must first be overcome. |
|
|
|
@code{GET_STR_PRECOMPUTE_THRESHOLD} and @code{GET_STR_DC_THRESHOLD} represent |
|
the same basic thing, the point where it becomes worth doing a big division to |
|
cut the input in half. @code{GET_STR_PRECOMPUTE_THRESHOLD} includes the cost |
|
of calculating the radix power required, whereas @code{GET_STR_DC_THRESHOLD} |
|
assumes that's already available, which is the case when recursing. |
|
|
|
Since the base case produces digits from least to most significant but they |
|
want to be stored from most to least, it's necessary to calculate in advance |
|
how many digits there will be, or at least be sure not to underestimate that. |
|
For GMP the number of input bits is multiplied by @code{chars_per_bit_exactly} |
|
from @code{mp_bases}, rounding up. The result is either correct or one too |
|
big. |
|
|
|
Examining some of the high bits of the input could increase the chance of |
|
getting the exact number of digits, but an exact result every time would not |
|
be practical, since in general the difference between numbers 100@dots{} and |
|
99@dots{} is only in the last few bits and the work to identify 99@dots{} |
|
might well be almost as much as a full conversion. |
|
|
|
@code{mpf_get_str} doesn't currently use the algorithm described here, it |
|
multiplies or divides by a power of @math{b} to move the radix point to the |
|
just above the highest non-zero digit (or at worst one above that location), |
|
then multiplies by @math{b^n} to bring out digits. This is @math{O(N^2)} and |
|
is certainly not optimal. |
|
|
|
The @math{r/b^n} scheme described above for using multiplications to bring out |
|
digits might be useful for more than a single limb. Some brief experiments |
|
with it on the base case when recursing didn't give a noticable improvement, |
|
but perhaps that was only due to the implementation. Something similar would |
|
work for the sub-quadratic divisions too, though there would be the cost of |
|
calculating a bigger radix power. |
|
|
|
Another possible improvement for the sub-quadratic part would be to arrange |
|
for radix powers that balanced the sizes of quotient and remainder produced, |
|
ie. the highest power would be an @m{b^{nk},b^(n*k)} approximately equal to |
|
@m{\sqrt{t},sqrt(t)}, not restricted to a @math{2^i} factor. That ought to |
|
smooth out a graph of times against sizes, but may or may not be a net |
|
speedup. |
|
|
|
|
|
@node Radix to Binary, , Binary to Radix, Radix Conversion Algorithms |
|
@subsection Radix to Binary |
|
|
|
Conversions from a power-of-2 radix into binary use a simple and fast |
|
@math{O(N)} bitwise concatenation algorithm. |
|
|
|
Conversions from other radices use one of two algorithms. Sizes below |
|
@code{SET_STR_THRESHOLD} use a basic @math{O(N^2)} method. Groups of @math{n} |
|
digits are converted to limbs, where @math{n} is the biggest power of the base |
|
@math{b} which will fit in a limb, then those groups are accumulated into the |
|
result by multiplying by @math{b^n} and adding. This saves multi-precision |
|
operations, as per Knuth section 4.4 part E (@pxref{References}). Some |
|
special case code is provided for decimal, giving the compiler a chance to |
|
optimize multiplications by 10. |
|
|
|
Above @code{SET_STR_THRESHOLD} a sub-quadratic algorithm is used. First |
|
groups of @math{n} digits are converted into limbs. Then adjacent limbs are |
|
combined into limb pairs with @m{xb^n+y,x*b^n+y}, where @math{x} and @math{y} |
|
are the limbs. Adjacent limb pairs are combined into quads similarly with |
|
@m{xb^{2n}+y,x*b^(2n)+y}. This continues until a single block remains, that |
|
being the result. |
|
|
|
The advantage of this method is that the multiplications for each @math{x} are |
|
big blocks, allowing Karatsuba and higher algorithms to be used. But the cost |
|
of calculating the powers @m{b^{n2^i},b^(n*2^i)} must be overcome. |
|
@code{SET_STR_THRESHOLD} usually ends up quite big, around 5000 digits, and on |
|
some processors much bigger still. |
|
|
|
@code{SET_STR_THRESHOLD} is based on the input digits (and tuned for decimal), |
|
though it might be better based on a limb count, so as to be independent of |
|
the base. But that sort of count isn't used by the base case and so would |
|
need some sort of initial calculation or estimate. |
|
|
|
The main reason @code{SET_STR_THRESHOLD} is so much bigger than the |
|
corresponding @code{GET_STR_PRECOMPUTE_THRESHOLD} is that @code{mpn_mul_1} is |
|
much faster than @code{mpn_divrem_1} (often by a factor of 10, or more). |
|
|
|
|
|
@need 1000 |
|
@node Other Algorithms, Assembler Coding, Radix Conversion Algorithms, Algorithms |
|
@section Other Algorithms |
|
|
|
@menu |
|
* Factorial Algorithm:: |
|
* Binomial Coefficients Algorithm:: |
|
* Fibonacci Numbers Algorithm:: |
|
* Lucas Numbers Algorithm:: |
|
@end menu |
|
|
|
|
|
@node Factorial Algorithm, Binomial Coefficients Algorithm, Other Algorithms, Other Algorithms |
|
@subsection Factorial |
|
|
|
Factorials @math{n!} are calculated by a simple product from @math{1} to |
|
@math{n}, but arranged into certain sub-products. |
|
|
|
First as many factors as fit in a limb are accumulated, then two of those |
|
multiplied to give a 2-limb product. When two 2-limb products are ready |
|
they're multiplied to a 4-limb product, and when two 4-limbs are ready they're |
|
multiplied to an 8-limb product, etc. A stack of outstanding products is |
|
built up, with two of the same size multiplied together when ready. |
|
|
|
Arranging for multiplications to have operands the same (or nearly the same) |
|
size means the Karatsuba and higher multiplication algorithms can be used. |
|
And even on sizes below the Karatsuba threshold an N@cross{}N multiply will |
|
give a basecase multiply more to work on. |
|
|
|
An obvious improvement not currently implemented would be to strip factors of |
|
2 from the products and apply them at the end with a bit shift. Another |
|
possibility would be to determine the prime factorization of the result (which |
|
can be done easily), and use a powering method, at each stage squaring then |
|
multiplying in those primes with a 1 in their exponent at that point. The |
|
advantage would be some multiplies turned into squares. |
|
|
|
|
|
@node Binomial Coefficients Algorithm, Fibonacci Numbers Algorithm, Factorial Algorithm, Other Algorithms |
|
@subsection Binomial Coefficients |
|
|
|
Binomial coefficients @m{\left({n}\atop{k}\right), C(n@C{}k)} are calculated |
|
by first arranging @math{k @le{} n/2} using @m{\left({n}\atop{k}\right) = |
|
\left({n}\atop{n-k}\right), C(n@C{}k) = C(n@C{}n-k)} if necessary, and then |
|
evaluating the following product simply from @math{i=2} to @math{i=k}. |
|
@tex |
|
$$ \left({n}\atop{k}\right) = (n-k+1) \prod_{i=2}^{k} {{n-k+i} \over i} $$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
k (n-k+i) |
|
C(n,k) = (n-k+1) * prod ------- |
|
i=2 i |
|
@end example |
|
|
|
@end ifnottex |
|
It's easy to show that each denominator @math{i} will divide the product so |
|
far, so the exact division algorithm is used (@pxref{Exact Division}). |
|
|
|
The numerators @math{n-k+i} and denominators @math{i} are first accumulated |
|
into as many fit a limb, to save multi-precision operations, though for |
|
@code{mpz_bin_ui} this applies only to the divisors, since @math{n} is an |
|
@code{mpz_t} and @math{n-k+i} in general won't fit in a limb at all. |
|
|
|
An obvious improvement would be to strip factors of 2 from each multiplier and |
|
divisor and count them separately, to be applied with a bit shift at the end. |
|
Factors of 3 and perhaps 5 could even be handled similarly. Another |
|
possibility, if @math{n} is not too big, would be to determine the prime |
|
factorization of the result based on the factorials involved, and power up |
|
those primes appropriately. This would help most when @math{k} is near |
|
@math{n/2}. |
|
|
|
|
|
@node Fibonacci Numbers Algorithm, Lucas Numbers Algorithm, Binomial Coefficients Algorithm, Other Algorithms |
|
@subsection Fibonacci Numbers |
|
|
|
The Fibonacci functions @code{mpz_fib_ui} and @code{mpz_fib2_ui} are designed |
|
for calculating isolated @m{F_n,F[n]} or @m{F_n,F[n]},@m{F_{n-1},F[n-1]} |
|
values efficiently. |
|
|
|
For small @math{n}, a table of single limb values in @code{__gmp_fib_table} is |
|
used. On a 32-bit limb this goes up to @m{F_{47},F[47]}, or on a 64-bit limb |
|
up to @m{F_{93},F[93]}. For convenience the table starts at @m{F_{-1},F[-1]}. |
|
|
|
Beyond the table, values are generated with a binary powering algorithm, |
|
calculating a pair @m{F_n,F[n]} and @m{F_{n-1},F[n-1]} working from high to |
|
low across the bits of @math{n}. The formulas used are |
|
@tex |
|
$$\eqalign{ |
|
F_{2k+1} &= 4F_k^2 - F_{k-1}^2 + 2(-1)^k \cr |
|
F_{2k-1} &= F_k^2 + F_{k-1}^2 \cr |
|
F_{2k} &= F_{2k+1} - F_{2k-1} |
|
}$$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
F[2k+1] = 4*F[k]^2 - F[k-1]^2 + 2*(-1)^k |
|
F[2k-1] = F[k]^2 + F[k-1]^2 |
|
|
|
F[2k] = F[2k+1] - F[2k-1] |
|
@end example |
|
|
|
@end ifnottex |
|
At each step, @math{k} is the high @math{b} bits of @math{n}. If the next bit |
|
of @math{n} is 0 then @m{F_{2k},F[2k]},@m{F_{2k-1},F[2k-1]} is used, or if |
|
it's a 1 then @m{F_{2k+1},F[2k+1]},@m{F_{2k},F[2k]} is used, and the process |
|
repeated until all bits of @math{n} are incorporated. Notice these formulas |
|
require just two squares per bit of @math{n}. |
|
|
|
It'd be possible to handle the first few @math{n} above the single limb table |
|
with simple additions, using the defining Fibonacci recurrence @m{F_{k+1} = |
|
F_k + F_{k-1}, F[k+1]=F[k]+F[k-1]}, but this is not done since it usually |
|
turns out to be faster for only about 10 or 20 values of @math{n}, and |
|
including a block of code for just those doesn't seem worthwhile. If they |
|
really mattered it'd be better to extend the data table. |
|
|
|
Using a table avoids lots of calculations on small numbers, and makes small |
|
@math{n} go fast. A bigger table would make more small @math{n} go fast, it's |
|
just a question of balancing size against desired speed. For GMP the code is |
|
kept compact, with the emphasis primarily on a good powering algorithm. |
|
|
|
@code{mpz_fib2_ui} returns both @m{F_n,F[n]} and @m{F_{n-1},F[n-1]}, but |
|
@code{mpz_fib_ui} is only interested in @m{F_n,F[n]}. In this case the last |
|
step of the algorithm can become one multiply instead of two squares. One of |
|
the following two formulas is used, according as @math{n} is odd or even. |
|
@tex |
|
$$\eqalign{ |
|
F_{2k} &= F_k (F_k + 2F_{k-1}) \cr |
|
F_{2k+1} &= (2F_k + F_{k-1}) (2F_k - F_{k-1}) + 2(-1)^k |
|
}$$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
F[2k] = F[k]*(F[k]+2F[k-1]) |
|
|
|
F[2k+1] = (2F[k]+F[k-1])*(2F[k]-F[k-1]) + 2*(-1)^k |
|
@end example |
|
|
|
@end ifnottex |
|
@m{F_{2k+1},F[2k+1]} here is the same as above, just rearranged to be a |
|
multiply. For interest, the @m{2(-1)^k, 2*(-1)^k} term both here and above |
|
can be applied just to the low limb of the calculation, without a carry or |
|
borrow into further limbs, which saves some code size. See comments with |
|
@code{mpz_fib_ui} and the internal @code{mpn_fib2_ui} for how this is done. |
|
|
|
|
|
@node Lucas Numbers Algorithm, , Fibonacci Numbers Algorithm, Other Algorithms |
|
@subsection Lucas Numbers |
|
|
|
@code{mpz_lucnum2_ui} derives a pair of Lucas numbers from a pair of Fibonacci |
|
numbers with the following simple formulas. |
|
@tex |
|
$$\eqalign{ |
|
L_k &= F_k + 2F_{k-1} \cr |
|
L_{k-1} &= 2F_k - F_{k-1} |
|
}$$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
L[k] = F[k] + 2*F[k-1] |
|
L[k-1] = 2*F[k] - F[k-1] |
|
@end example |
|
|
|
@end ifnottex |
|
@code{mpz_lucnum_ui} is only interested in @m{L_n,L[n]}, and some work can be |
|
saved. Trailing zero bits on @math{n} can be handled with a single square |
|
each. |
|
@tex |
|
$$ L_{2k} = L_k^2 - 2(-1)^k $$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
L[2k] = L[k]^2 - 2*(-1)^k |
|
@end example |
|
|
|
@end ifnottex |
|
And the lowest 1 bit can be handled with one multiply of a pair of Fibonacci |
|
numbers, similar to what @code{mpz_fib_ui} does. |
|
@tex |
|
$$ L_{2k+1} = 5F_{k-1} (2F_k + F_{k-1}) - 4(-1)^k $$ |
|
@end tex |
|
@ifnottex |
|
|
|
@example |
|
L[2k+1] = 5*F[k-1]*(2*F[k]+F[k-1]) - 4*(-1)^k |
|
@end example |
|
|
|
@end ifnottex |
|
|
|
|
|
@node Assembler Coding, , Other Algorithms, Algorithms |
|
@section Assembler Coding |
|
|
|
The assembler subroutines in GMP are the most significant source of speed at |
|
small to moderate sizes. At larger sizes algorithm selection becomes more |
|
important, but of course speedups in low level routines will still speed up |
|
everything proportionally. |
|
|
|
Carry handling and widening multiplies that are important for GMP can't be |
|
easily expressed in C. GCC @code{asm} blocks help a lot and are provided in |
|
@file{longlong.h}, but hand coding low level routines invariably offers a |
|
speedup over generic C by a factor of anything from 2 to 10. |
|
|
|
@menu |
|
* Assembler Code Organisation:: |
|
* Assembler Basics:: |
|
* Assembler Carry Propagation:: |
|
* Assembler Cache Handling:: |
|
* Assembler Floating Point:: |
|
* Assembler SIMD Instructions:: |
|
* Assembler Software Pipelining:: |
|
* Assembler Loop Unrolling:: |
|
@end menu |
|
|
|
|
|
@node Assembler Code Organisation, Assembler Basics, Assembler Coding, Assembler Coding |
|
@subsection Code Organisation |
|
|
|
The various @file{mpn} subdirectories contain machine-dependent code, written |
|
in C or assembler. The @file{mpn/generic} subdirectory contains default code, |
|
used when there's no machine-specific version of a particular file. |
|
|
|
Each @file{mpn} subdirectory is for an ISA family. Generally 32-bit and |
|
64-bit variants in a family cannot share code and will have separate |
|
directories. Within a family further subdirectories may exist for CPU |
|
variants. |
|
|
|
|
|
@node Assembler Basics, Assembler Carry Propagation, Assembler Code Organisation, Assembler Coding |
|
@subsection Assembler Basics |
|
|
|
@code{mpn_addmul_1} and @code{mpn_submul_1} are the most important routines |
|
for overall GMP performance. All multiplications and divisions come down to |
|
repeated calls to these. @code{mpn_add_n}, @code{mpn_sub_n}, |
|
@code{mpn_lshift} and @code{mpn_rshift} are next most important. |
|
|
|
On some CPUs assembler versions of the internal functions |
|
@code{mpn_mul_basecase} and @code{mpn_sqr_basecase} give significant speedups, |
|
mainly through avoiding function call overheads. They can also potentially |
|
make better use of a wide superscalar processor. |
|
|
|
The restrictions on overlaps between sources and destinations |
|
(@pxref{Low-level Functions}) are designed to facilitate a variety of |
|
implementations. For example, knowing @code{mpn_add_n} won't have partly |
|
overlapping sources and destination means reading can be done far ahead of |
|
writing on superscalar processors, and loops can be vectorized on a vector |
|
processor, depending on the carry handling. |
|
|
|
|
|
@node Assembler Carry Propagation, Assembler Cache Handling, Assembler Basics, Assembler Coding |
|
@subsection Carry Propagation |
|
|
|
The problem that presents most challenges in GMP is propagating carries from |
|
one limb to the next. In functions like @code{mpn_addmul_1} and |
|
@code{mpn_add_n}, carries are the only dependencies between limb operations. |
|
|
|
On processors with carry flags, a straightforward CISC style @code{adc} is |
|
generally best. AMD K6 @code{mpn_addmul_1} however is an example of an |
|
unusual set of circumstances where a branch works out better. |
|
|
|
On RISC processors generally an add and compare for overflow is used. This |
|
sort of thing can be seen in @file{mpn/generic/aors_n.c}. Some carry |
|
propagation schemes require 4 instructions, meaning at least 4 cycles per |
|
limb, but other schemes may use just 1 or 2. On wide superscalar processors |
|
performance may be completely determined by the number of dependent |
|
instructions between carry-in and carry-out for each limb. |
|
|
|
On vector processors good use can be made of the fact that a carry bit only |
|
very rarely propagates more than one limb. When adding a single bit to a |
|
limb, there's only a carry out if that limb was @code{0xFF...FF} which on |
|
random data will be only 1 in @m{2\GMPraise{@code{mp\_bits\_per\_limb}}, |
|
2^mp_bits_per_limb}. @file{mpn/cray/add_n.c} is an example of this, it adds |
|
all limbs in parallel, adds one set of carry bits in parallel and then only |
|
rarely needs to fall through to a loop propagating further carries. |
|
|
|
On the x86s, GCC (as of version 2.95.2) doesn't generate particularly good code |
|
for the RISC style idioms that are necessary to handle carry bits in |
|
C. Often conditional jumps are generated where @code{adc} or @code{sbb} forms |
|
would be better. And so unfortunately almost any loop involving carry bits |
|
needs to be coded in assembler for best results. |
|
|
|
|
|
@node Assembler Cache Handling, Assembler Floating Point, Assembler Carry Propagation, Assembler Coding |
|
@subsection Cache Handling |
|
|
|
GMP aims to perform well both on operands that fit entirely in L1 cache and |
|
those which don't. |
|
|
|
Basic routines like @code{mpn_add_n} or @code{mpn_lshift} are often used on |
|
large operands, so L2 and main memory performance is important for them. |
|
@code{mpn_mul_1} and @code{mpn_addmul_1} are mostly used for multiply and |
|
square basecases, so L1 performance matters most for them, unless assembler |
|
versions of @code{mpn_mul_basecase} and @code{mpn_sqr_basecase} exist, in |
|
which case the remaining uses are mostly for larger operands. |
|
|
|
For L2 or main memory operands, memory access times will almost certainly be |
|
more than the calculation time. The aim therefore is to maximize memory |
|
throughput, by starting a load of the next cache line which processing the |
|
contents of the previous one. Clearly this is only possible if the chip has a |
|
lock-up free cache or some sort of prefetch instruction. Most current chips |
|
have both these features. |
|
|
|
Prefetching sources combines well with loop unrolling, since a prefetch can be |
|
initiated once per unrolled loop (or more than once if the loop covers more |
|
than one cache line). |
|
|
|
On CPUs without write-allocate caches, prefetching destinations will ensure |
|
individual stores don't go further down the cache hierarchy, limiting |
|
bandwidth. Of course for calculations which are slow anyway, like |
|
@code{mpn_divrem_1}, write-throughs might be fine. |
|
|
|
The distance ahead to prefetch will be determined by memory latency versus |
|
throughput. The aim of course is to have data arriving continuously, at peak |
|
throughput. Some CPUs have limits on the number of fetches or prefetches in |
|
progress. |
|
|
|
If a special prefetch instruction doesn't exist then a plain load can be used, |
|
but in that case care must be taken not to attempt to read past the end of an |
|
operand, since that might produce a segmentation violation. |
|
|
|
Some CPUs or systems have hardware that detects sequential memory accesses and |
|
initiates suitable cache movements automatically, making life easy. |
|
|
|
|
|
@node Assembler Floating Point, Assembler SIMD Instructions, Assembler Cache Handling, Assembler Coding |
|
@subsection Floating Point |
|
|
|
Floating point arithmetic is used in GMP for multiplications on CPUs with poor |
|
integer multipliers. It's mostly useful for @code{mpn_mul_1}, |
|
@code{mpn_addmul_1} and @code{mpn_submul_1} on 64-bit machines, and |
|
@code{mpn_mul_basecase} on both 32-bit and 64-bit machines. |
|
|
|
With IEEE 53-bit double precision floats, integer multiplications producing up |
|
to 53 bits will give exact results. Breaking a 64@cross{}64 multiplication |
|
into eight 16@cross{}@math{32@rightarrow{}48} bit pieces is convenient. With |
|
some care though six 21@cross{}@math{32@rightarrow{}53} bit products can be |
|
used, if one of the lower two 21-bit pieces also uses the sign bit. |
|
|
|
For the @code{mpn_mul_1} family of functions on a 64-bit machine, the |
|
invariant single limb is split at the start, into 3 or 4 pieces. Inside the |
|
loop, the bignum operand is split into 32-bit pieces. Fast conversion of |
|
these unsigned 32-bit pieces to floating point is highly machine-dependent. |
|
In some cases, reading the data into the integer unit, zero-extending to |
|
64-bits, then transferring to the floating point unit back via memory is the |
|
only option. |
|
|
|
Converting partial products back to 64-bit limbs is usually best done as a |
|
signed conversion. Since all values are smaller than @m{2^{53},2^53}, signed |
|
and unsigned are the same, but most processors lack unsigned conversions. |
|
|
|
@sp 2 |
|
|
|
Here is a diagram showing 16@cross{}32 bit products for an @code{mpn_mul_1} or |
|
@code{mpn_addmul_1} with a 64-bit limb. The single limb operand V is split |
|
into four 16-bit parts. The multi-limb operand U is split in the loop into |
|
two 32-bit parts. |
|
|
|
@tex |
|
\global\newdimen\GMPbits \global\GMPbits=0.18em |
|
\def\GMPbox#1#2#3{% |
|
\hbox{% |
|
\hbox to 128\GMPbits{\hfil |
|
\vbox{% |
|
\hrule |
|
\hbox to 48\GMPbits {\GMPvrule \hfil$#2$\hfil \vrule}% |
|
\hrule}% |
|
\hskip #1\GMPbits}% |
|
\raise \GMPboxdepth \hbox{\hskip 2em #3}}} |
|
% |
|
\GMPdisplay{% |
|
\vbox{% |
|
\hbox{% |
|
\hbox to 128\GMPbits {\hfil |
|
\vbox{% |
|
\hrule |
|
\hbox to 64\GMPbits{% |
|
\GMPvrule \hfil$v48$\hfil |
|
\vrule \hfil$v32$\hfil |
|
\vrule \hfil$v16$\hfil |
|
\vrule \hfil$v00$\hfil |
|
\vrule} |
|
\hrule}}% |
|
\raise \GMPboxdepth \hbox{\hskip 2em V Operand}} |
|
\vskip 0.5ex |
|
\hbox{% |
|
\hbox to 128\GMPbits {\hfil |
|
\raise \GMPboxdepth \hbox{$\times$\hskip 1.5em}% |
|
\vbox{% |
|
\hrule |
|
\hbox to 64\GMPbits {% |
|
\GMPvrule \hfil$u32$\hfil |
|
\vrule \hfil$u00$\hfil |
|
\vrule}% |
|
\hrule}}% |
|
\raise \GMPboxdepth \hbox{\hskip 2em U Operand (one limb)}}% |
|
\vskip 0.5ex |
|
\hbox{\vbox to 2ex{\hrule width 128\GMPbits}}% |
|
\GMPbox{0}{u00 \times v00}{$p00$\hskip 1.5em 48-bit products}% |
|
\vskip 0.5ex |
|
\GMPbox{16}{u00 \times v16}{$p16$} |
|
\vskip 0.5ex |
|
\GMPbox{32}{u00 \times v32}{$p32$} |
|
\vskip 0.5ex |
|
\GMPbox{48}{u00 \times v48}{$p48$} |
|
\vskip 0.5ex |
|
\GMPbox{32}{u32 \times v00}{$r32$} |
|
\vskip 0.5ex |
|
\GMPbox{48}{u32 \times v16}{$r48$} |
|
\vskip 0.5ex |
|
\GMPbox{64}{u32 \times v32}{$r64$} |
|
\vskip 0.5ex |
|
\GMPbox{80}{u32 \times v48}{$r80$} |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
+---+---+---+---+ |
|
|v48|v32|v16|v00| V operand |
|
+---+---+---+---+ |
|
|
|
+-------+---+---+ |
|
x | u32 | u00 | U operand (one limb) |
|
+---------------+ |
|
|
|
--------------------------------- |
|
|
|
+-----------+ |
|
| u00 x v00 | p00 48-bit products |
|
+-----------+ |
|
+-----------+ |
|
| u00 x v16 | p16 |
|
+-----------+ |
|
+-----------+ |
|
| u00 x v32 | p32 |
|
+-----------+ |
|
+-----------+ |
|
| u00 x v48 | p48 |
|
+-----------+ |
|
+-----------+ |
|
| u32 x v00 | r32 |
|
+-----------+ |
|
+-----------+ |
|
| u32 x v16 | r48 |
|
+-----------+ |
|
+-----------+ |
|
| u32 x v32 | r64 |
|
+-----------+ |
|
+-----------+ |
|
| u32 x v48 | r80 |
|
+-----------+ |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
@math{p32} and @math{r32} can be summed using floating-point addition, and |
|
likewise @math{p48} and @math{r48}. @math{p00} and @math{p16} can be summed |
|
with @math{r64} and @math{r80} from the previous iteration. |
|
|
|
For each loop then, four 49-bit quantities are transfered to the integer unit, |
|
aligned as follows, |
|
|
|
@tex |
|
% GMPbox here should be 49 bits wide, but use 51 to better show p16+r80' |
|
% crossing into the upper 64 bits. |
|
\def\GMPbox#1#2#3{% |
|
\hbox{% |
|
\hbox to 128\GMPbits {% |
|
\hfil |
|
\vbox{% |
|
\hrule |
|
\hbox to 51\GMPbits {\GMPvrule \hfil$#2$\hfil \vrule}% |
|
\hrule}% |
|
\hskip #1\GMPbits}% |
|
\raise \GMPboxdepth \hbox{\hskip 1.5em $#3$\hfil}% |
|
}} |
|
\newbox\b \setbox\b\hbox{64 bits}% |
|
\newdimen\bw \bw=\wd\b \advance\bw by 2em |
|
\newdimen\x \x=128\GMPbits |
|
\advance\x by -2\bw |
|
\divide\x by4 |
|
\GMPdisplay{% |
|
\vbox{% |
|
\hbox to 128\GMPbits {% |
|
\GMPvrule |
|
\raise 0.5ex \vbox{\hrule \hbox to \x {}}% |
|
\hfil 64 bits\hfil |
|
\raise 0.5ex \vbox{\hrule \hbox to \x {}}% |
|
\vrule |
|
\raise 0.5ex \vbox{\hrule \hbox to \x {}}% |
|
\hfil 64 bits\hfil |
|
\raise 0.5ex \vbox{\hrule \hbox to \x {}}% |
|
\vrule}% |
|
\vskip 0.7ex |
|
\GMPbox{0}{p00+r64'}{i00} |
|
\vskip 0.5ex |
|
\GMPbox{16}{p16+r80'}{i16} |
|
\vskip 0.5ex |
|
\GMPbox{32}{p32+r32}{i32} |
|
\vskip 0.5ex |
|
\GMPbox{48}{p48+r48}{i48} |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
@group |
|
|-----64bits----|-----64bits----| |
|
+------------+ |
|
| p00 + r64' | i00 |
|
+------------+ |
|
+------------+ |
|
| p16 + r80' | i16 |
|
+------------+ |
|
+------------+ |
|
| p32 + r32 | i32 |
|
+------------+ |
|
+------------+ |
|
| p48 + r48 | i48 |
|
+------------+ |
|
@end group |
|
@end example |
|
@end ifnottex |
|
|
|
The challenge then is to sum these efficiently and add in a carry limb, |
|
generating a low 64-bit result limb and a high 33-bit carry limb (@math{i48} |
|
extends 33 bits into the high half). |
|
|
|
|
|
@node Assembler SIMD Instructions, Assembler Software Pipelining, Assembler Floating Point, Assembler Coding |
|
@subsection SIMD Instructions |
|
|
|
The single-instruction multiple-data support in current microprocessors is |
|
aimed at signal processing algorithms where each data point can be treated |
|
more or less independently. There's generally not much support for |
|
propagating the sort of carries that arise in GMP. |
|
|
|
SIMD multiplications of say four 16@cross{}16 bit multiplies only do as much |
|
work as one 32@cross{}32 from GMP's point of view, and need some shifts and |
|
adds besides. But of course if say the SIMD form is fully pipelined and uses |
|
less instruction decoding then it may still be worthwhile. |
|
|
|
On the 80x86 chips, MMX has so far found a use in @code{mpn_rshift} and |
|
@code{mpn_lshift} since it allows 64-bit operations, and is used in a special |
|
case for 16-bit multipliers in the P55 @code{mpn_mul_1}. 3DNow and SSE |
|
haven't found a use so far. |
|
|
|
|
|
@node Assembler Software Pipelining, Assembler Loop Unrolling, Assembler SIMD Instructions, Assembler Coding |
|
@subsection Software Pipelining |
|
|
|
Software pipelining consists of scheduling instructions around the branch |
|
point in a loop. For example a loop taking a checksum of an array of limbs |
|
might have a load and an add, but the load wouldn't be for that add, rather |
|
for the one next time around the loop. Each load then is effectively |
|
scheduled back in the previous iteration, allowing latency to be hidden. |
|
|
|
Naturally this is wanted only when doing things like loads or multiplies that |
|
take a few cycles to complete, and only where a CPU has multiple functional |
|
units so that other work can be done while waiting. |
|
|
|
A pipeline with several stages will have a data value in progress at each |
|
stage and each loop iteration moves them along one stage. This is like |
|
juggling. |
|
|
|
Within the loop some moves between registers may be necessary to have the |
|
right values in the right places for each iteration. Loop unrolling can help |
|
this, with each unrolled block able to use different registers for different |
|
values, even if some shuffling is still needed just before going back to the |
|
top of the loop. |
|
|
|
|
|
@node Assembler Loop Unrolling, , Assembler Software Pipelining, Assembler Coding |
|
@subsection Loop Unrolling |
|
|
|
Loop unrolling consists of replicating code so that several limbs are |
|
processed in each loop. At a minimum this reduces loop overheads by a |
|
corresponding factor, but it can also allow better register usage, for example |
|
alternately using one register combination and then another. Judicious use of |
|
@command{m4} macros can help avoid lots of duplication in the source code. |
|
|
|
Unrolling is commonly done to a power of 2 multiple so the number of unrolled |
|
loops and the number of remaining limbs can be calculated with a shift and |
|
mask. But other multiples can be used too, just by subtracting each @var{n} |
|
limbs processed from a counter and waiting for less than @var{n} remaining (or |
|
offsetting the counter by @var{n} so it goes negative when there's less than |
|
@var{n} remaining). |
|
|
|
The limbs not a multiple of the unrolling can be handled in various ways, for |
|
example |
|
|
|
@itemize @bullet |
|
@item |
|
A simple loop at the end (or the start) to process the excess. Care will be |
|
wanted that it isn't too much slower than the unrolled part. |
|
|
|
@item |
|
A set of binary tests, for example after an 8-limb unrolling, test for 4 more |
|
limbs to process, then a further 2 more or not, and finally 1 more or not. |
|
This will probably take more code space than a simple loop. |
|
|
|
@item |
|
A @code{switch} statement, providing separate code for each possible excess, |
|
for example an 8-limb unrolling would have separate code for 0 remaining, 1 |
|
remaining, etc, up to 7 remaining. This might take a lot of code, but may be |
|
the best way to optimize all cases in combination with a deep pipelined loop. |
|
|
|
@item |
|
A computed jump into the middle of the loop, thus making the first iteration |
|
handle the excess. This should make times smoothly increase with size, which |
|
is attractive, but setups for the jump and adjustments for pointers can be |
|
tricky and could become quite difficult in combination with deep pipelining. |
|
@end itemize |
|
|
|
One way to write the setups and finishups for a pipelined unrolled loop is |
|
simply to duplicate the loop at the start and the end, then delete |
|
instructions at the start which have no valid antecedents, and delete |
|
instructions at the end whose results are unwanted. Sizes not a multiple of |
|
the unrolling can then be handled as desired. |
|
|
|
|
|
@node Internals, Contributors, Algorithms, Top |
|
@chapter Internals |
|
|
|
@strong{This chapter is provided only for informational purposes and the |
|
various internals described here may change in future GMP releases. |
|
Applications expecting to be compatible with future releases should use only |
|
the documented interfaces described in previous chapters.} |
|
|
|
@menu |
|
* Integer Internals:: |
|
* Rational Internals:: |
|
* Float Internals:: |
|
* Raw Output Internals:: |
|
* C++ Interface Internals:: |
|
@end menu |
|
|
|
@node Integer Internals, Rational Internals, Internals, Internals |
|
@section Integer Internals |
|
|
|
@code{mpz_t} variables represent integers using sign and magnitude, in space |
|
dynamically allocated and reallocated. The fields are as follows. |
|
|
|
@table @asis |
|
@item @code{_mp_size} |
|
The number of limbs, or the negative of that when representing a negative |
|
integer. Zero is represented by @code{_mp_size} set to zero, in which case |
|
the @code{_mp_d} data is unused. |
|
|
|
@item @code{_mp_d} |
|
A pointer to an array of limbs which is the magnitude. These are stored |
|
``little endian'' as per the @code{mpn} functions, so @code{_mp_d[0]} is the |
|
least significant limb and @code{_mp_d[ABS(_mp_size)-1]} is the most |
|
significant. Whenever @code{_mp_size} is non-zero, the most significant limb |
|
is non-zero. |
|
|
|
Currently there's always at least one limb allocated, so for instance |
|
@code{mpz_set_ui} never needs to reallocate, and @code{mpz_get_ui} can fetch |
|
@code{_mp_d[0]} unconditionally (though its value is then only wanted if |
|
@code{_mp_size} is non-zero). |
|
|
|
@item @code{_mp_alloc} |
|
@code{_mp_alloc} is the number of limbs currently allocated at @code{_mp_d}, |
|
and naturally @code{_mp_alloc >= ABS(_mp_size)}. When an @code{mpz} routine |
|
is about to (or might be about to) increase @code{_mp_size}, it checks |
|
@code{_mp_alloc} to see whether there's enough space, and reallocates if not. |
|
@code{MPZ_REALLOC} is generally used for this. |
|
@end table |
|
|
|
The various bitwise logical functions like @code{mpz_and} behave as if |
|
negative values were twos complement. But sign and magnitude is always used |
|
internally, and necessary adjustments are made during the calculations. |
|
Sometimes this isn't pretty, but sign and magnitude are best for other |
|
routines. |
|
|
|
Some internal temporary variables are setup with @code{MPZ_TMP_INIT} and these |
|
have @code{_mp_d} space obtained from @code{TMP_ALLOC} rather than the memory |
|
allocation functions. Care is taken to ensure that these are big enough that |
|
no reallocation is necessary (since it would have unpredictable consequences). |
|
|
|
|
|
@node Rational Internals, Float Internals, Integer Internals, Internals |
|
@section Rational Internals |
|
|
|
@code{mpq_t} variables represent rationals using an @code{mpz_t} numerator and |
|
denominator (@pxref{Integer Internals}). |
|
|
|
The canonical form adopted is denominator positive (and non-zero), no common |
|
factors between numerator and denominator, and zero uniquely represented as |
|
0/1. |
|
|
|
It's believed that casting out common factors at each stage of a calculation |
|
is best in general. A GCD is an @math{O(N^2)} operation so it's better to do |
|
a few small ones immediately than to delay and have to do a big one later. |
|
Knowing the numerator and denominator have no common factors can be used for |
|
example in @code{mpq_mul} to make only two cross GCDs necessary, not four. |
|
|
|
This general approach to common factors is badly sub-optimal in the presence |
|
of simple factorizations or little prospect for cancellation, but GMP has no |
|
way to know when this will occur. As per @ref{Efficiency}, that's left to |
|
applications. The @code{mpq_t} framework might still suit, with |
|
@code{mpq_numref} and @code{mpq_denref} for direct access to the numerator and |
|
denominator, or of course @code{mpz_t} variables can be used directly. |
|
|
|
|
|
@node Float Internals, Raw Output Internals, Rational Internals, Internals |
|
@section Float Internals |
|
|
|
Efficient calculation is the primary aim of GMP floats and the use of whole |
|
limbs and simple rounding facilitates this. |
|
|
|
@code{mpf_t} floats have a variable precision mantissa and a single machine |
|
word signed exponent. The mantissa is represented using sign and magnitude. |
|
|
|
@c FIXME: The arrow heads don't join to the lines exactly. |
|
@tex |
|
\global\newdimen\GMPboxwidth \GMPboxwidth=5em |
|
\global\newdimen\GMPboxheight \GMPboxheight=3ex |
|
\def\centreline{\hbox{\raise 0.8ex \vbox{\hrule \hbox{\hfil}}}} |
|
\GMPdisplay{% |
|
\vbox{% |
|
\hbox to 5\GMPboxwidth {most significant limb \hfil least significant limb} |
|
\vskip 0.7ex |
|
\def\GMPcentreline#1{\hbox{\raise 0.5 ex \vbox{\hrule \hbox to #1 {}}}} |
|
\hbox { |
|
\hbox to 3\GMPboxwidth {% |
|
\setbox 0 = \hbox{@code{\_mp\_exp}}% |
|
\dimen0=3\GMPboxwidth |
|
\advance\dimen0 by -\wd0 |
|
\divide\dimen0 by 2 |
|
\advance\dimen0 by -1em |
|
\setbox1 = \hbox{$\rightarrow$}% |
|
\dimen1=\dimen0 |
|
\advance\dimen1 by -\wd1 |
|
\GMPcentreline{\dimen0}% |
|
\hfil |
|
\box0% |
|
\hfil |
|
\GMPcentreline{\dimen1{}}% |
|
\box1} |
|
\hbox to 2\GMPboxwidth {\hfil @code{\_mp\_d}}} |
|
\vskip 0.5ex |
|
\vbox {% |
|
\hrule |
|
\hbox{% |
|
\vrule height 2ex depth 1ex |
|
\hbox to \GMPboxwidth {}% |
|
\vrule |
|
\hbox to \GMPboxwidth {}% |
|
\vrule |
|
\hbox to \GMPboxwidth {}% |
|
\vrule |
|
\hbox to \GMPboxwidth {}% |
|
\vrule |
|
\hbox to \GMPboxwidth {}% |
|
\vrule} |
|
\hrule |
|
} |
|
\hbox {% |
|
\hbox to 0.8 pt {} |
|
\hbox to 3\GMPboxwidth {% |
|
\hfil $\cdot$} \hbox {$\leftarrow$ radix point\hfil}} |
|
\hbox to 5\GMPboxwidth{% |
|
\setbox 0 = \hbox{@code{\_mp\_size}}% |
|
\dimen0 = 5\GMPboxwidth |
|
\advance\dimen0 by -\wd0 |
|
\divide\dimen0 by 2 |
|
\advance\dimen0 by -1em |
|
\dimen1 = \dimen0 |
|
\setbox1 = \hbox{$\leftarrow$}% |
|
\setbox2 = \hbox{$\rightarrow$}% |
|
\advance\dimen0 by -\wd1 |
|
\advance\dimen1 by -\wd2 |
|
\hbox to 0.3 em {}% |
|
\box1 |
|
\GMPcentreline{\dimen0}% |
|
\hfil |
|
\box0 |
|
\hfil |
|
\GMPcentreline{\dimen1}% |
|
\box2} |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
most least |
|
significant significant |
|
limb limb |
|
|
|
_mp_d |
|
|---- _mp_exp ---> | |
|
_____ _____ _____ _____ _____ |
|
|_____|_____|_____|_____|_____| |
|
. <------------ radix point |
|
|
|
<-------- _mp_size ---------> |
|
@sp 1 |
|
@end example |
|
@end ifnottex |
|
|
|
@noindent |
|
The fields are as follows. |
|
|
|
@table @asis |
|
@item @code{_mp_size} |
|
The number of limbs currently in use, or the negative of that when |
|
representing a negative value. Zero is represented by @code{_mp_size} and |
|
@code{_mp_exp} both set to zero, and in that case the @code{_mp_d} data is |
|
unused. (In the future @code{_mp_exp} might be undefined when representing |
|
zero.) |
|
|
|
@item @code{_mp_prec} |
|
The precision of the mantissa, in limbs. In any calculation the aim is to |
|
produce @code{_mp_prec} limbs of result (the most significant being non-zero). |
|
|
|
@item @code{_mp_d} |
|
A pointer to the array of limbs which is the absolute value of the mantissa. |
|
These are stored ``little endian'' as per the @code{mpn} functions, so |
|
@code{_mp_d[0]} is the least significant limb and |
|
@code{_mp_d[ABS(_mp_size)-1]} the most significant. |
|
|
|
The most significant limb is always non-zero, but there are no other |
|
restrictions on its value, in particular the highest 1 bit can be anywhere |
|
within the limb. |
|
|
|
@code{_mp_prec+1} limbs are allocated to @code{_mp_d}, the extra limb being |
|
for convenience (see below). There are no reallocations during a calculation, |
|
only in a change of precision with @code{mpf_set_prec}. |
|
|
|
@item @code{_mp_exp} |
|
The exponent, in limbs, determining the location of the implied radix point. |
|
Zero means the radix point is just above the most significant limb. Positive |
|
values mean a radix point offset towards the lower limbs and hence a value |
|
@math{@ge{} 1}, as for example in the diagram above. Negative exponents mean |
|
a radix point further above the highest limb. |
|
|
|
Naturally the exponent can be any value, it doesn't have to fall within the |
|
limbs as the diagram shows, it can be a long way above or a long way below. |
|
Limbs other than those included in the @code{@{_mp_d,_mp_size@}} data |
|
are treated as zero. |
|
@end table |
|
|
|
@sp 1 |
|
@noindent |
|
The following various points should be noted. |
|
|
|
@table @asis |
|
@item Low Zeros |
|
The least significant limbs @code{_mp_d[0]} etc can be zero, though such low |
|
zeros can always be ignored. Routines likely to produce low zeros check and |
|
avoid them to save time in subsequent calculations, but for most routines |
|
they're quite unlikely and aren't checked. |
|
|
|
@item Mantissa Size Range |
|
The @code{_mp_size} count of limbs in use can be less than @code{_mp_prec} if |
|
the value can be represented in less. This means low precision values or |
|
small integers stored in a high precision @code{mpf_t} can still be operated |
|
on efficiently. |
|
|
|
@code{_mp_size} can also be greater than @code{_mp_prec}. Firstly a value is |
|
allowed to use all of the @code{_mp_prec+1} limbs available at @code{_mp_d}, |
|
and secondly when @code{mpf_set_prec_raw} lowers @code{_mp_prec} it leaves |
|
@code{_mp_size} unchanged and so the size can be arbitrarily bigger than |
|
@code{_mp_prec}. |
|
|
|
@item Rounding |
|
All rounding is done on limb boundaries. Calculating @code{_mp_prec} limbs |
|
with the high non-zero will ensure the application requested minimum precision |
|
is obtained. |
|
|
|
The use of simple ``trunc'' rounding towards zero is efficient, since there's |
|
no need to examine extra limbs and increment or decrement. |
|
|
|
@item Bit Shifts |
|
Since the exponent is in limbs, there are no bit shifts in basic operations |
|
like @code{mpf_add} and @code{mpf_mul}. When differing exponents are |
|
encountered all that's needed is to adjust pointers to line up the relevant |
|
limbs. |
|
|
|
Of course @code{mpf_mul_2exp} and @code{mpf_div_2exp} will require bit shifts, |
|
but the choice is between an exponent in limbs which requires shifts there, or |
|
one in bits which requires them almost everywhere else. |
|
|
|
@item Use of @code{_mp_prec+1} Limbs |
|
The extra limb on @code{_mp_d} (@code{_mp_prec+1} rather than just |
|
@code{_mp_prec}) helps when an @code{mpf} routine might get a carry from its |
|
operation. @code{mpf_add} for instance will do an @code{mpn_add} of |
|
@code{_mp_prec} limbs. If there's no carry then that's the result, but if |
|
there is a carry then it's stored in the extra limb of space and |
|
@code{_mp_size} becomes @code{_mp_prec+1}. |
|
|
|
Whenever @code{_mp_prec+1} limbs are held in a variable, the low limb is not |
|
needed for the intended precision, only the @code{_mp_prec} high limbs. But |
|
zeroing it out or moving the rest down is unnecessary. Subsequent routines |
|
reading the value will simply take the high limbs they need, and this will be |
|
@code{_mp_prec} if their target has that same precision. This is no more than |
|
a pointer adjustment, and must be checked anyway since the destination |
|
precision can be different from the sources. |
|
|
|
Copy functions like @code{mpf_set} will retain a full @code{_mp_prec+1} limbs |
|
if available. This ensures that a variable which has @code{_mp_size} equal to |
|
@code{_mp_prec+1} will get its full exact value copied. Strictly speaking |
|
this is unnecessary since only @code{_mp_prec} limbs are needed for the |
|
application's requested precision, but it's considered that an @code{mpf_set} |
|
from one variable into another of the same precision ought to produce an exact |
|
copy. |
|
|
|
@item Application Precisions |
|
@code{__GMPF_BITS_TO_PREC} converts an application requested precision to an |
|
@code{_mp_prec}. The value in bits is rounded up to a whole limb then an |
|
extra limb is added since the most significant limb of @code{_mp_d} is only |
|
non-zero and therefore might contain only one bit. |
|
|
|
@code{__GMPF_PREC_TO_BITS} does the reverse conversion, and removes the extra |
|
limb from @code{_mp_prec} before converting to bits. The net effect of |
|
reading back with @code{mpf_get_prec} is simply the precision rounded up to a |
|
multiple of @code{mp_bits_per_limb}. |
|
|
|
Note that the extra limb added here for the high only being non-zero is in |
|
addition to the extra limb allocated to @code{_mp_d}. For example with a |
|
32-bit limb, an application request for 250 bits will be rounded up to 8 |
|
limbs, then an extra added for the high being only non-zero, giving an |
|
@code{_mp_prec} of 9. @code{_mp_d} then gets 10 limbs allocated. Reading |
|
back with @code{mpf_get_prec} will take @code{_mp_prec} subtract 1 limb and |
|
multiply by 32, giving 256 bits. |
|
|
|
Strictly speaking, the fact the high limb has at least one bit means that a |
|
float with, say, 3 limbs of 32-bits each will be holding at least 65 bits, but |
|
for the purposes of @code{mpf_t} it's considered simply to be 64 bits, a nice |
|
multiple of the limb size. |
|
@end table |
|
|
|
|
|
@node Raw Output Internals, C++ Interface Internals, Float Internals, Internals |
|
@section Raw Output Internals |
|
|
|
@noindent |
|
@code{mpz_out_raw} uses the following format. |
|
|
|
@tex |
|
\global\newdimen\GMPboxwidth \GMPboxwidth=5em |
|
\global\newdimen\GMPboxheight \GMPboxheight=3ex |
|
\def\centreline{\hbox{\raise 0.8ex \vbox{\hrule \hbox{\hfil}}}} |
|
\GMPdisplay{% |
|
\vbox{% |
|
\def\GMPcentreline#1{\hbox{\raise 0.5 ex \vbox{\hrule \hbox to #1 {}}}} |
|
\vbox {% |
|
\hrule |
|
\hbox{% |
|
\vrule height 2.5ex depth 1.5ex |
|
\hbox to \GMPboxwidth {\hfil size\hfil}% |
|
\vrule |
|
\hbox to 3\GMPboxwidth {\hfil data bytes\hfil}% |
|
\vrule} |
|
\hrule} |
|
}} |
|
@end tex |
|
@ifnottex |
|
@example |
|
+------+------------------------+ |
|
| size | data bytes | |
|
+------+------------------------+ |
|
@end example |
|
@end ifnottex |
|
|
|
The size is 4 bytes written most significant byte first, being the number of |
|
subsequent data bytes, or the twos complement negative of that when a negative |
|
integer is represented. The data bytes are the absolute value of the integer, |
|
written most significant byte first. |
|
|
|
The most significant data byte is always non-zero, so the output is the same |
|
on all systems, irrespective of limb size. |
|
|
|
In GMP 1, leading zero bytes were written to pad the data bytes to a multiple |
|
of the limb size. @code{mpz_inp_raw} will still accept this, for |
|
compatibility. |
|
|
|
The use of ``big endian'' for both the size and data fields is deliberate, it |
|
makes the data easy to read in a hex dump of a file. Unfortunately it also |
|
means that the limb data must be reversed when reading or writing, so neither |
|
a big endian nor little endian system can just read and write @code{_mp_d}. |
|
|
|
|
|
@node C++ Interface Internals, , Raw Output Internals, Internals |
|
@section C++ Interface Internals |
|
|
|
A system of expression templates is used to ensure something like @code{a=b+c} |
|
turns into a simple call to @code{mpz_add} etc. For @code{mpf_class} and |
|
@code{mpfr_class} the scheme also ensures the precision of the final |
|
destination is used for any temporaries within a statement like |
|
@code{f=w*x+y*z}. These are important features which a naive implementation |
|
cannot provide. |
|
|
|
A simplified description of the scheme follows. The true scheme is |
|
complicated by the fact that expressions have different return types. For |
|
detailed information, refer to the source code. |
|
|
|
To perform an operation, say, addition, we first define a ``function object'' |
|
evaluating it, |
|
|
|
@example |
|
struct __gmp_binary_plus |
|
@{ |
|
static void eval(mpf_t f, mpf_t g, mpf_t h) @{ mpf_add(f, g, h); @} |
|
@}; |
|
@end example |
|
|
|
@noindent |
|
And an ``additive expression'' object, |
|
|
|
@example |
|
__gmp_expr<__gmp_binary_expr<mpf_class, mpf_class, __gmp_binary_plus> > |
|
operator+(const mpf_class &f, const mpf_class &g) |
|
@{ |
|
return __gmp_expr |
|
<__gmp_binary_expr<mpf_class, mpf_class, __gmp_binary_plus> >(f, g); |
|
@} |
|
@end example |
|
|
|
The seemingly redundant @code{__gmp_expr<__gmp_binary_expr<...>>} is used to |
|
encapsulate any possible kind of expression into a single template type. In |
|
fact even @code{mpf_class} etc are @code{typedef} specializations of |
|
@code{__gmp_expr}. |
|
|
|
Next we define assignment of @code{__gmp_expr} to @code{mpf_class}. |
|
|
|
@example |
|
template <class T> |
|
mpf_class & mpf_class::operator=(const __gmp_expr<T> &expr) |
|
@{ |
|
expr.eval(this->get_mpf_t(), this->precision()); |
|
return *this; |
|
@} |
|
|
|
template <class Op> |
|
void __gmp_expr<__gmp_binary_expr<mpf_class, mpf_class, Op> >::eval |
|
(mpf_t f, unsigned long int precision) |
|
@{ |
|
Op::eval(f, expr.val1.get_mpf_t(), expr.val2.get_mpf_t()); |
|
@} |
|
@end example |
|
|
|
where @code{expr.val1} and @code{expr.val2} are references to the expression's |
|
operands (here @code{expr} is the @code{__gmp_binary_expr} stored within the |
|
@code{__gmp_expr}). |
|
|
|
This way, the expression is actually evaluated only at the time of assignment, |
|
when the required precision (that of @code{f}) is known. Furthermore the |
|
target @code{mpf_t} is now available, thus we can call @code{mpf_add} directly |
|
with @code{f} as the output argument. |
|
|
|
Compound expressions are handled by defining operators taking subexpressions |
|
as their arguments, like this: |
|
|
|
@example |
|
template <class T, class U> |
|
__gmp_expr |
|
<__gmp_binary_expr<__gmp_expr<T>, __gmp_expr<U>, __gmp_binary_plus> > |
|
operator+(const __gmp_expr<T> &expr1, const __gmp_expr<U> &expr2) |
|
@{ |
|
return __gmp_expr |
|
<__gmp_binary_expr<__gmp_expr<T>, __gmp_expr<U>, __gmp_binary_plus> > |
|
(expr1, expr2); |
|
@} |
|
@end example |
|
|
|
And the corresponding specializations of @code{__gmp_expr::eval}: |
|
|
|
@example |
|
template <class T, class U, class Op> |
|
void __gmp_expr |
|
<__gmp_binary_expr<__gmp_expr<T>, __gmp_expr<U>, Op> >::eval |
|
(mpf_t f, unsigned long int precision) |
|
@{ |
|
// declare two temporaries |
|
mpf_class temp1(expr.val1, precision), temp2(expr.val2, precision); |
|
Op::eval(f, temp1.get_mpf_t(), temp2.get_mpf_t()); |
|
@} |
|
@end example |
|
|
|
The expression is thus recursively evaluated to any level of complexity and |
|
all subexpressions are evaluated to the precision of @code{f}. |
|
|
|
|
|
@node Contributors, References, Internals, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@unnumbered Contributors |
@appendix Contributors |
@cindex Contributors |
@cindex Contributors |
|
|
Torbjorn Granlund wrote the original GMP library and is still developing and |
Torbjorn Granlund wrote the original GMP library and is still developing and |
|
|
Joachim Hollman was involved in the design of the @code{mpf} interface, and in |
Joachim Hollman was involved in the design of the @code{mpf} interface, and in |
the @code{mpz} design revisions for version 2. |
the @code{mpz} design revisions for version 2. |
|
|
Bennet Yee contributed the functions @code{mpz_jacobi} and @code{mpz_legendre}. |
Bennet Yee contributed the initial versions of @code{mpz_jacobi} and |
|
@code{mpz_legendre}. |
|
|
Andreas Schwab contributed the files @file{mpn/m68k/lshift.S} and |
Andreas Schwab contributed the files @file{mpn/m68k/lshift.S} and |
@file{mpn/m68k/rshift.S}. |
@file{mpn/m68k/rshift.S} (now in @file{.asm} form). |
|
|
The development of floating point functions of GNU MP 2, were supported in part |
The development of floating point functions of GNU MP 2, were supported in part |
by the ESPRIT-BRA (Basic Research Activities) 6846 project POSSO (POlynomial |
by the ESPRIT-BRA (Basic Research Activities) 6846 project POSSO (POlynomial |
System SOlving). |
System SOlving). |
|
|
GNU MP 2 was finished and released by SWOX AB (formerly known as TMG |
GNU MP 2 was finished and released by SWOX AB, SWEDEN, in cooperation with the |
Datakonsult), Swedenborgsgatan 23, SE-118 27 STOCKHOLM, SWEDEN, in |
IDA Center for Computing Sciences, USA. |
cooperation with the IDA Center for Computing Sciences, USA. |
|
|
|
Robert Harley of Inria, France and David Seal of ARM, England, suggested clever |
Robert Harley of Inria, France and David Seal of ARM, England, suggested clever |
improvements for population count. |
improvements for population count. |
Line 3867 Torsten Ekedahl of the Mathematical department of Stoc |
|
Line 9079 Torsten Ekedahl of the Mathematical department of Stoc |
|
significant inspiration during several phases of the GMP development. His |
significant inspiration during several phases of the GMP development. His |
mathematical expertise helped improve several algorithms. |
mathematical expertise helped improve several algorithms. |
|
|
Paul Zimmermann wrote the Burnikel-Ziegler division code, the REDC code, the |
Paul Zimmermann wrote the Divide and Conquer division code, the REDC code, the |
REDC-based mpz_powm code, and the FFT multiply code. The ECMNET project Paul |
REDC-based mpz_powm code, the FFT multiply code, and the Karatsuba square |
is organizing has been a driving force behind many of the optimization of GMP |
root. The ECMNET project Paul is organizing was a driving force behind many |
3. |
of the optimizations in GMP 3. |
|
|
Linus Nordberg wrote the new configure system based on autoconf and |
Linus Nordberg wrote the new configure system based on autoconf and |
implemented the new random functions. |
implemented the new random functions. |
|
|
Kent Boortz made the Macintosh port. |
Kent Boortz made the Macintosh port. |
|
|
Kevin Ryde wrote a lot of very high quality x86 code, optimized for most CPU |
Kevin Ryde worked on a number of things: optimized x86 code, m4 asm macros, |
variants. He also made countless other valuable contributions. |
parameter tuning, speed measuring, the configure system, function inlining, |
|
divisibility tests, bit scanning, Jacobi symbols, Fibonacci and Lucas number |
|
functions, printf and scanf functions, perl interface, demo expression parser, |
|
the algorithms chapter in the manual, @file{gmpasm-mode.el}, and various |
|
miscellaneous improvements elsewhere. |
|
|
Steve Root helped write the optimized alpha 21264 assembly code. |
Steve Root helped write the optimized alpha 21264 assembly code. |
|
|
GNU MP 3.1 was finished and released by Torbjorn Granlund and Kevin Ryde. |
Gerardo Ballabio wrote the @file{gmpxx.h} C++ class interface and the C++ |
|
@code{istream} input routines. |
|
|
|
GNU MP 4.0 was finished and released by Torbjorn Granlund and Kevin Ryde. |
Torbjorn's work was partially funded by the IDA Center for Computing Sciences, |
Torbjorn's work was partially funded by the IDA Center for Computing Sciences, |
USA. |
USA. |
|
|
|
|
contributed to GMP but are not listed above, please tell @email{tege@@swox.com} |
contributed to GMP but are not listed above, please tell @email{tege@@swox.com} |
about the omission!) |
about the omission!) |
|
|
@node References, Concept Index, Contributors, Top |
Thanks goes to Hans Thorsen for donating an SGI system for the GMP test system |
|
environment. |
|
|
|
@node References, GNU Free Documentation License, Contributors, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@unnumbered References |
@appendix References |
@cindex References |
@cindex References |
|
|
|
@c FIXME: In tex, the @uref's are unhyphenated, which is good for clarity, |
|
@c but being long words they upset paragraph formatting (the preceding line |
|
@c can get badly stretched). Would like an conditional @* style line break |
|
@c if the uref is too long to fit on the last line of the paragraph, but it's |
|
@c not clear how to do that. For now explicit @texlinebreak{}s are used on |
|
@c paragraphs that come out bad. |
|
|
|
@section Books |
|
|
@itemize @bullet |
@itemize @bullet |
|
@item |
|
Jonathan M. Borwein and Peter B. Borwein, ``Pi and the AGM: A Study in |
|
Analytic Number Theory and Computational Complexity'', Wiley, John & Sons, |
|
1998. |
|
|
@item |
@item |
Donald E. Knuth, "The Art of Computer Programming", vol 2, |
Henri Cohen, ``A Course in Computational Algebraic Number Theory'', Graduate |
"Seminumerical Algorithms", 3rd edition, Addison-Wesley, 1988. |
Texts in Mathematics number 138, Springer-Verlag, 1993. |
|
@texlinebreak{} @uref{http://www.math.u-bordeaux.fr/~cohen} |
|
|
@item |
@item |
John D. Lipson, "Elements of Algebra and Algebraic Computing", |
Donald E. Knuth, ``The Art of Computer Programming'', volume 2, |
|
``Seminumerical Algorithms'', 3rd edition, Addison-Wesley, 1998. |
|
@texlinebreak{} @uref{http://www-cs-faculty.stanford.edu/~knuth/taocp.html} |
|
|
|
@item |
|
John D. Lipson, ``Elements of Algebra and Algebraic Computing'', |
The Benjamin Cummings Publishing Company Inc, 1981. |
The Benjamin Cummings Publishing Company Inc, 1981. |
|
|
@item |
@item |
Richard M. Stallman, "Using and Porting GCC", Free Software Foundation, 1999, |
Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone, ``Handbook of |
|
Applied Cryptography'', @uref{http://www.cacr.math.uwaterloo.ca/hac/} |
|
|
|
@item |
|
Richard M. Stallman, ``Using and Porting GCC'', Free Software Foundation, 1999, |
available online @uref{http://www.gnu.org/software/gcc/onlinedocs/}, and in |
available online @uref{http://www.gnu.org/software/gcc/onlinedocs/}, and in |
the GCC package @uref{ftp://ftp.gnu.org/pub/gnu/gcc/}. |
the GCC package @uref{ftp://ftp.gnu.org/gnu/gcc/} |
|
@end itemize |
|
|
|
@section Papers |
|
|
|
@itemize @bullet |
@item |
@item |
Peter L. Montgomery, "Modular Multiplication Without Trial Division", in |
Christoph Burnikel and Joachim Ziegler, ``Fast Recursive Division'', |
Mathematics of Computation, volume 44, number 170, April 1985. |
Max-Planck-Institut fuer Informatik Research Report MPI-I-98-1-022, @texlinebreak{} |
|
@uref{http://data.mpi-sb.mpg.de/internet/reports.nsf/NumberView/1998-1-022} |
|
|
@item |
@item |
Torbjorn Granlund and Peter L. Montgomery, "Division by Invariant |
Torbjorn Granlund and Peter L. Montgomery, ``Division by Invariant Integers |
Integers using Multiplication", in Proceedings of the SIGPLAN |
using Multiplication'', in Proceedings of the SIGPLAN PLDI'94 Conference, June |
PLDI'94 Conference, June 1994. Available online, @* |
1994. Also available @uref{ftp://ftp.cwi.nl/pub/pmontgom/divcnst.psa4.gz} |
@uref{ftp://ftp.cwi.nl/pub/pmontgom/divcnst.psa4.gz} (and .psl.gz too). |
(and .psl.gz). |
|
|
@item |
@item |
|
Peter L. Montgomery, ``Modular Multiplication Without Trial Division'', in |
|
Mathematics of Computation, volume 44, number 170, April 1985. |
|
|
|
@item |
Tudor Jebelean, |
Tudor Jebelean, |
"An algorithm for exact division", |
``An algorithm for exact division'', |
Journal of Symbolic Computation, |
Journal of Symbolic Computation, |
v. 15, 1993, pp. 169-180. |
volume 15, 1993, pp. 169-180. |
Research report version available online @* |
Research report version available @texlinebreak{} |
@uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-35.ps.gz} |
@uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-35.ps.gz} |
|
|
@item |
@item |
Kenneth Weber, "The accelerated integer GCD algorithm", |
Tudor Jebelean, ``Exact Division with Karatsuba Complexity - Extended |
|
Abstract'', RISC-Linz technical report 96-31, @texlinebreak{} |
|
@uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1996/96-31.ps.gz} |
|
|
|
@item |
|
Tudor Jebelean, ``Practical Integer Division with Karatsuba Complexity'', |
|
ISSAC 97, pp. 339-341. Technical report available @texlinebreak{} |
|
@uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1996/96-29.ps.gz} |
|
|
|
@item |
|
Tudor Jebelean, ``A Generalization of the Binary GCD Algorithm'', ISSAC 93, |
|
pp. 111-116. Technical report version available @texlinebreak{} |
|
@uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1993/93-01.ps.gz} |
|
|
|
@item |
|
Tudor Jebelean, ``A Double-Digit Lehmer-Euclid Algorithm for Finding the GCD |
|
of Long Integers'', Journal of Symbolic Computation, volume 19, 1995, |
|
pp. 145-157. Technical report version also available @texlinebreak{} |
|
@uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1992/92-69.ps.gz} |
|
|
|
@item |
|
Werner Krandick and Tudor Jebelean, ``Bidirectional Exact Integer Division'', |
|
Journal of Symbolic Computation, volume 21, 1996, pp. 441-455. Early |
|
technical report version also available |
|
@uref{ftp://ftp.risc.uni-linz.ac.at/pub/techreports/1994/94-50.ps.gz} |
|
|
|
@item |
|
R. Moenck and A. Borodin, ``Fast Modular Transforms via Division'', |
|
Proceedings of the 13th Annual IEEE Symposium on Switching and Automata |
|
Theory, October 1972, pp. 90-96. Reprinted as ``Fast Modular Transforms'', |
|
Journal of Computer and System Sciences, volume 8, number 3, June 1974, |
|
pp. 366-386. |
|
|
|
@item |
|
Arnold Sch@"onhage and Volker Strassen, ``Schnelle Multiplikation grosser |
|
Zahlen'', Computing 7, 1971, pp. 281-292. |
|
|
|
@item |
|
Kenneth Weber, ``The accelerated integer GCD algorithm'', |
ACM Transactions on Mathematical Software, |
ACM Transactions on Mathematical Software, |
v. 21 (March), 1995, pp. 111-122. |
volume 21, number 1, March 1995, pp. 111-122. |
|
|
@item |
@item |
Christoph Burnikel and Joachim Ziegler, "Fast Recursive Division", |
Paul Zimmermann, ``Karatsuba Square Root'', INRIA Research Report 3805, |
Max-Planck-Institut fuer Informatik Research Report MPI-I-98-1-022, @* |
November 1999, @uref{http://www.inria.fr/RRRT/RR-3805.html} |
@uref{http://www.mpi-sb.mpg.de/~ziegler/TechRep.ps.gz}. |
|
|
|
@item |
@item |
Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone, "Handbook of |
Paul Zimmermann, ``A Proof of GMP Fast Division and Square Root |
Applied Cryptography", @uref{http://cacr.math.uwaterloo.ca/hac/}. |
Implementations'', @texlinebreak{} |
|
@uref{http://www.loria.fr/~zimmerma/papers/proof-div-sqrt.ps.gz} |
|
|
@item |
@item |
Henri Cohen, "A Course in Computational Algebraic Number Theory", Graduate |
Dan Zuras, ``On Squaring and Multiplying Large Integers'', ARITH-11: IEEE |
Texts in Mathematics number 138, Springer-Verlag, 1993. Errata available |
Symposium on Computer Arithmetic, 1993, pp. 260 to 271. Reprinted as ``More |
online @* @uref{http://www.math.u-bordeaux.fr/~cohen} |
on Multiplying and Squaring Large Integers'', IEEE Transactions on Computers, |
|
volume 43, number 8, August 1994, pp. 899-908. |
@end itemize |
@end itemize |
|
|
@node Concept Index, Function Index, References, Top |
|
|
@node GNU Free Documentation License, Concept Index, References, Top |
|
@appendix GNU Free Documentation License |
|
@cindex GNU Free Documentation License |
|
@include fdl.texi |
|
|
|
|
|
@node Concept Index, Function Index, GNU Free Documentation License, Top |
@comment node-name, next, previous, up |
@comment node-name, next, previous, up |
@unnumbered Concept Index |
@unnumbered Concept Index |
@printindex cp |
@printindex cp |
Line 3958 online @* @uref{http://www.math.u-bordeaux.fr/~cohen} |
|
Line 9258 online @* @uref{http://www.math.u-bordeaux.fr/~cohen} |
|
@unnumbered Function and Type Index |
@unnumbered Function and Type Index |
@printindex fn |
@printindex fn |
|
|
|
|
@contents |
|
@bye |
@bye |
|
|
@c Local variables: |
@c Local variables: |
@c fill-column: 78 |
@c fill-column: 78 |
|
@c compile-command: "make gmp.info" |
@c End: |
@c End: |