1292 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			1292 lines
		
	
	
		
			51 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| \input texinfo    @c -*-texinfo-*-
 | |
| @comment %**start of header
 | |
| @setfilename gmp.info
 | |
| @settitle GNU MP 1.3.2
 | |
| @synindex tp fn
 | |
| @c footnotestyle separate
 | |
| @c paragraphindent 2
 | |
| @comment %**end of header
 | |
| 
 | |
| @c smallbook
 | |
| 
 | |
| @iftex
 | |
| @finalout
 | |
| @end iftex
 | |
| 
 | |
| @c Note: the edition number is listed in *three* places; please update
 | |
| @c all three.  Also, update the month and year where appropriate.
 | |
| 
 | |
| @c ==> Update edition number for settitle and subtitle, and in the
 | |
| @c ==> following paragraph; update date, too.
 | |
| 
 | |
| @ifinfo
 | |
| This file documents GNU MP, a library for arbitrary-precision integer
 | |
| and rational number arithmetic.
 | |
| 
 | |
| This is a draft edition of the documentation, last updated May 20 1993.
 | |
| 
 | |
| Copyright (C) 1991, 1993 Free Software Foundation, Inc.
 | |
| 
 | |
| 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.
 | |
| 
 | |
| @ignore
 | |
| Permission is granted to process this file through TeX and print the
 | |
| results, provided the printed document carries copying permission
 | |
| 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 ifinfo
 | |
| 
 | |
| @setchapternewpage odd
 | |
| @titlepage
 | |
| @c  use the new format for titles
 | |
| 
 | |
| @title GNU MP
 | |
| @subtitle The GNU Multiple Precision Arithmetic Library
 | |
| @subtitle Edition 1.3.2
 | |
| @subtitle May 1993
 | |
| 
 | |
| @author by Torbj@"orn Granlund
 | |
| 
 | |
| @comment   Include the Distribution inside the titlepage so
 | |
| @c that headings are turned off.
 | |
| 
 | |
| @page
 | |
| @vskip 0pt plus 1filll
 | |
| Copyright @copyright{} 1991, 1993 Free Software Foundation, Inc.
 | |
| 
 | |
| @sp 2
 | |
| 
 | |
| Published by the Free Software Foundation @*
 | |
| 675 Massachusetts Avenue, @*
 | |
| Cambridge, MA 02139 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
 | |
| 
 | |
| @ifinfo
 | |
| @node Top, Copying, (dir), (dir)
 | |
| @end ifinfo
 | |
| 
 | |
| @menu
 | |
| * Copying::                  GMP Copying Conditions.
 | |
| * Intro::                    Introduction to GMP.
 | |
| * Nomenclature::             Terminology and basic data types.
 | |
| * Initialization::           Initialization of multi-precision number objects.
 | |
| * Integer Functions::        Functions for arithmetic on signed integers.
 | |
| * Rational Number Functions:: Functions for arithmetic on rational numbers.
 | |
| * Low-level Functions::      Fast functions for natural numbers.
 | |
| * BSD Compatible Functions:: All functions found in BSD MP (somewhat faster).
 | |
| * Miscellaneous Functions::  Functions that do particular things.
 | |
| * Custom Allocation::        How to customize the internal allocation.
 | |
| * Reporting Bugs::           Help us to improve this library.
 | |
| 
 | |
| * References::
 | |
| * Concept Index::
 | |
| * Function Index::
 | |
| @end menu
 | |
| 
 | |
| @node Copying, Intro, Top, Top
 | |
| @comment  node-name, next, previous,  up
 | |
| @unnumbered GNU MP Copying Conditions
 | |
| @cindex Copying conditions
 | |
| @cindex Conditions for copying GNU MP
 | |
| 
 | |
| 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 domain; it is copyrighted and there are restrictions on its
 | |
| distribution, but these restrictions are designed to permit everything
 | |
| that a good cooperating citizen would want to do.  What is not allowed
 | |
| is to try to prevent others from further sharing any version of this
 | |
| library that they might get from you.@refill
 | |
| 
 | |
|   Specifically, we want to make sure that you have the right to give
 | |
| away copies of the library, that you receive source code or else can get
 | |
| it if you want it, that you can change this library or use pieces of it
 | |
| in new free programs, and that you know you can do these things.@refill
 | |
| 
 | |
|   To make sure that everyone has such rights, we have to forbid you to
 | |
| deprive anyone else of these rights.  For example, if you distribute
 | |
| copies of the GMP library, you must give the recipients all the rights
 | |
| that you have.  You must make sure that they, too, receive or can get
 | |
| the source code.  And you must tell them their rights.@refill
 | |
| 
 | |
|   Also, for our own protection, we must make certain that everyone finds
 | |
| out that there is no warranty for the GMP library.  If it is modified by
 | |
| someone else and passed on, we want their recipients to know that what
 | |
| they have is not what we distributed, so that any problems introduced by
 | |
| others will not reflect on our reputation.@refill
 | |
| 
 | |
|   The precise conditions of the license for the GMP library are found in
 | |
| the General Public License that accompany the source code.@refill
 | |
| 
 | |
| @node Intro, Initialization, Copying, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Introduction to MP
 | |
| @cindex Introduction
 | |
| @cindex Overview
 | |
| 
 | |
| GNU MP is a portable library for arbitrary precision integer and
 | |
| rational number arithmetic.@footnote{The limit of the precision is set by the
 | |
| available memory in your computer.}  It aims to provide the fastest
 | |
| possible arithmetic for all applications that need more than two words
 | |
| of integer precision.
 | |
| 
 | |
| Most often, applications tend to use just a few words of precision;
 | |
| but some applications may need thousands of words.  GNU MP is designed
 | |
| to give good performance for both kinds of applications, by choosing
 | |
| algorithms based on the sizes of the operands.
 | |
| 
 | |
| There are five groups of functions in the MP library:
 | |
| 
 | |
| @enumerate
 | |
| @item
 | |
| Functions for signed integer arithmetic, with names
 | |
| beginning with @code{mpz_}.
 | |
| 
 | |
| @item
 | |
| Functions for rational number arithmetic, with names beginning with
 | |
| @code{mpq_}.
 | |
| 
 | |
| @item
 | |
| Functions compatible with Berkeley MP, such as @code{itom}, @code{madd},
 | |
| and @code{mult}.
 | |
| 
 | |
| @item
 | |
| Fast low-level functions that operate on natural numbers.  These are
 | |
| used by the functions in the preceding groups, and you can also call
 | |
| them directly from very time-critical user programs.  These functions'
 | |
| names begin with @code{mpn_}.
 | |
| 
 | |
| @item
 | |
| Miscellaneous functions.
 | |
| @end enumerate
 | |
| 
 | |
| As a general rule, all MP functions expect output arguments before input
 | |
| arguments.  This notation is based on an analogy with the assignment
 | |
| operator.  (The BSD MP compatibility functions disobey this rule, having
 | |
| the output argument(s) last.)  Multi-precision numbers, whether
 | |
| output or input, are always passed as addresses to the declared type.
 | |
| 
 | |
| @menu
 | |
| * Nomenclature::
 | |
| * Thanks::
 | |
| @end menu
 | |
| 
 | |
| @node Nomenclature, Thanks, Intro, Intro
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @section Nomenclature and Data Types
 | |
| @cindex nomenclature
 | |
| 
 | |
| @cindex integer
 | |
| @tindex @code{MP_INT}
 | |
| In this manual, @dfn{integer} means a multiple precision integer, as
 | |
| used in the MP package.  The C data type for such integers is
 | |
| @code{MP_INT}.  For example:
 | |
| 
 | |
| @example
 | |
| MP_INT sum;
 | |
| 
 | |
| struct foo @{ MP_INT x, y; @};
 | |
| 
 | |
| MP_INT vec[20];
 | |
| @end example
 | |
| 
 | |
| @cindex rational number
 | |
| @tindex @code{MP_RAT}
 | |
| @dfn{Rational number} means a multiple precision fraction.  The C data
 | |
| type for these fractions is @code{MP_RAT}.  For example:
 | |
| 
 | |
| @example
 | |
| MP_RAT quotient;
 | |
| @end example
 | |
| 
 | |
| @cindex limb
 | |
| 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 digit, only larger, and containing several digits.)
 | |
| Normally a limb contains 32 bits.
 | |
| 
 | |
| @node Thanks,, Nomenclature, Intro
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @section Thanks
 | |
| 
 | |
| I would like to thank Gunnar Sjoedin and Hans Riesel for their help with
 | |
| mathematical problems, Richard Stallman for his help with design issues
 | |
| and for revising this manual, Brian Beuning and Doug Lea for their
 | |
| testing of various versions of the library, and Joachim Hollman for
 | |
| his many valuable suggestions.
 | |
| 
 | |
| Special thanks to Brian Beuning, he has shaked out many bugs from early
 | |
| versions of the code!
 | |
| 
 | |
| John Amanatides of York University in Canada contributed the function
 | |
| @code{mpz_probab_prime_p}.
 | |
| 
 | |
| @node Initialization, Integer Functions, Intro, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Initialization
 | |
| 
 | |
| Before you can use a variable or object of type @code{MP_INT} or
 | |
| @code{MP_RAT}, you must initialize it.  This fills in the components
 | |
| that point to dynamically allocated space for the limbs of the number.
 | |
| 
 | |
| When you are finished using the object, you should clear out the object.
 | |
| This frees the dynamic space that it points to, so the space can be used
 | |
| again.
 | |
| 
 | |
| Once you have initialized the object, you need not be concerned about
 | |
| allocating additional space.  The functions in the MP package
 | |
| automatically allocate additional space when the object does not already
 | |
| have enough space.  They do not, however, reduce the space in use when a
 | |
| smaller number is stored in the object.  Most of the time, this policy
 | |
| is best, since it avoids frequent re-allocation.  If you want to reduce
 | |
| the space in an object to the minimum needed, you can do
 | |
| @code{_mpz_realloc (&@var{object}, mpz_size (&@var{object}))}.
 | |
| 
 | |
| The functions to initialize numbers are @code{mpz_init} (for @code{MP_INT}) and
 | |
| @code{mpq_init} (for @code{MP_RAT}).
 | |
| 
 | |
| @code{mpz_init} allocates space for the limbs, and stores a pointer
 | |
| to that space in the @code{MP_INT} object.  It also stores the value 0
 | |
| in the object.
 | |
| 
 | |
| In the same manner, @code{mpq_init} allocates space for the numerator
 | |
| and denominator limbs, and stores pointers to these spaces in the @code{MP_RAT}
 | |
| object.
 | |
| 
 | |
| To clear out a number object, use @code{mpz_clear} and @code{mpq_clear},
 | |
| respectively.
 | |
| 
 | |
| Here is an example of use:
 | |
| 
 | |
| @example
 | |
| @{
 | |
|   MP_INT temp;
 | |
|   mpz_init (&temp);
 | |
| 
 | |
|   @dots{} @r{store and read values in @code{temp} zero or more times} @dots{}
 | |
| 
 | |
|   mpz_clear (&temp):
 | |
| @}
 | |
| @end example
 | |
| 
 | |
| You might be tempted to copy an integer from one object to another like
 | |
| this:
 | |
| 
 | |
| @example
 | |
| MP_INT x, y;
 | |
| 
 | |
| x = y;
 | |
| @end example
 | |
| 
 | |
| Although valid C, @strong{this is an error.} Rather than copying the
 | |
| integer value from @code{y} to @code{x} it will make the two variables
 | |
| share storage.  Subsequent assignments to one variable would change the
 | |
| other mysteriously.  And if you were to clear out both variables
 | |
| subsequently, you would confuse @code{malloc} and cause your program to
 | |
| crash.
 | |
| 
 | |
| To copy the value properly, you must use the function @code{mpz_set}.
 | |
| (@pxref{Assigning Integers})
 | |
| 
 | |
| @node Integer Functions, Rational Number Functions, Initialization, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Integer Functions
 | |
| @cindex Integer functions
 | |
| 
 | |
| This chapter describes the MP functions for performing integer arithmetic.
 | |
| 
 | |
| The integer functions use arguments and values of type
 | |
| pointer-to-@code{MP_INT} (@pxref{Nomenclature}).  The type @code{MP_INT}
 | |
| is a structure, but applications should not refer directly to its
 | |
| components.  Include the header @file{gmp.h} to get the definition of
 | |
| @code{MP_INT}.
 | |
| 
 | |
| @menu
 | |
| * Initializing Integers::
 | |
| * Assigning Integers::
 | |
| * Simultaneous Integer Init & Assign::
 | |
| * Converting Integers::
 | |
| * Integer Arithmetic::
 | |
| * Logic on Integers::
 | |
| * I/O of Integers::
 | |
| @end menu
 | |
| 
 | |
| @node Initializing Integers, Assigning Integers, , Integer Functions
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @section Initializing Integer Objects
 | |
| 
 | |
| Most of the functions for integer arithmetic assume that the output is
 | |
| stored in an object already initialized.  For example, @code{mpz_add}
 | |
| stores the result of addition (@pxref{Integer Arithmetic}).  Thus, you
 | |
| must initialize the object before storing the first value in it.  You
 | |
| can do this separately by calling the function @code{mpz_init}.
 | |
| 
 | |
| @deftypefun void mpz_init (MP_INT *@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
 | |
| @{
 | |
|   MP_INT integ;
 | |
|   mpz_init (&integ);
 | |
|   @dots{}
 | |
|   mpz_add (&integ, @dots{});
 | |
|   @dots{}
 | |
|   mpz_sub (&integ, @dots{});
 | |
| 
 | |
|   /* Unless you are now exiting the program, do ... */
 | |
|   mpz_clear (&integ);
 | |
| @}
 | |
| @end example
 | |
| 
 | |
| @noindent
 | |
| As you can see, you can store new values any number of times, once an
 | |
| object is initialized.
 | |
| 
 | |
| @deftypefun void mpz_clear (MP_INT *@var{integer})
 | |
| Free the limb space occupied by @var{integer}.  Make sure to call this
 | |
| function for all @code{MP_INT} variables when you are done with them.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun {void *} _mpz_realloc (MP_INT *@var{integer}, mp_size @var{new_alloc})
 | |
| Change the limb space allocation to @var{new_alloc} limbs.  This
 | |
| function is not normally called from user code, but it can be used to
 | |
| give memory back to the heap, or to increase the space of a variable to
 | |
| avoid repeated automatic re-allocation.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_array_init (MP_INT @var{integer_array}[], size_t @var{array_size}, mp_size @var{fixed_num_limbs})
 | |
| Allocate @strong{fixed} limb space for all @var{array_size} integers in
 | |
| @var{integer_array}.  The fixed allocation for each integer in the array
 | |
| is @var{fixed_num_limbs}.  This function is useful for decreasing the
 | |
| working set for some algorithms that use large integer arrays.  If the
 | |
| fixed space will be insufficient for storing the result of a subsequent
 | |
| calculation, the result is unpredictable.
 | |
| 
 | |
| There is no way to de-allocate the storage allocated by this function.  Don't
 | |
| call @code{mpz_clear}!
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node Assigning Integers, Simultaneous Integer Init & Assign, Initializing Integers, Integer Functions
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @subsection Integer Assignment Functions
 | |
| @cindex Integer assignment functions
 | |
| 
 | |
| These functions assign new values to already initialized integers
 | |
| (@pxref{Initializing Integers}).
 | |
| 
 | |
| @deftypefun void mpz_set (MP_INT *@var{dest_integer}, MP_INT *@var{src_integer})
 | |
| Assign @var{dest_integer} from @var{src_integer}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_set_ui (MP_INT *@var{integer}, unsigned long int @var{initial_value})
 | |
| Set the value of @var{integer} from @var{initial_value}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_set_si (MP_INT *@var{integer}, signed long int @var{initial_value})
 | |
| Set the value of @var{integer} from @var{initial_value}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int mpz_set_str (MP_INT *@var{integer}, char *@var{initial_value}, int @var{base})
 | |
| Set the value of @var{integer} from @var{initial_value},
 | |
| a '\0'-terminated C string in base @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 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 assumed, otherwise
 | |
| decimal is assumed.
 | |
| 
 | |
| This function returns 0 if the entire string up to the '\0' is a valid
 | |
| number in base @var{base}.  Otherwise it returns @minus{}1.
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node Simultaneous Integer Init & Assign, Converting Integers, Assigning Integers, Integer Functions
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @subsection Combined Initialization and Assignment Functions
 | |
| @cindex Initialization and assignment functions, combined
 | |
| 
 | |
| For your convenience, MP provides a parallel series of
 | |
| initialize-and-set arithmetic functions which initialize the output and
 | |
| then store the value there.  These functions' names have the form
 | |
| @code{mpz_init_set@dots{}}.
 | |
| 
 | |
| Here is an example of using one:
 | |
| 
 | |
| @example
 | |
| @{
 | |
|   MP_INT integ;
 | |
|   mpz_init_set_str (&integ, "3141592653589793238462643383279502884", 10);
 | |
|   @dots{}
 | |
|   mpz_sub (&integ, @dots{});
 | |
| 
 | |
|   mpz_clear (&integ);
 | |
| @}
 | |
| @end example
 | |
| 
 | |
| Once the integer has been initialized by any of the
 | |
| @code{mpz_init_set@dots{}} functions, it can be used as the source or
 | |
| destination operand for the ordinary integer functions.  Don't use an
 | |
| initialize-and-set function on a variable already initialized!
 | |
| 
 | |
| @deftypefun void mpz_init_set (MP_INT *@var{dest_integer}, MP_INT *@var{src_integer})
 | |
| Initialize @var{dest_integer} with limb space and set the initial numeric
 | |
| value from @var{src_integer}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_init_set_ui (MP_INT *@var{dest_integer}, unsigned long int @var{src_ulong})
 | |
| Initialize @var{dest_integer} with limb space and set the initial numeric
 | |
| value from @var{src_ulong}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_init_set_si (MP_INT *@var{dest_integer}, signed long int @var{src_slong})
 | |
| Initialize @var{dest_integer} with limb space and set the initial numeric
 | |
| value from @var{src_slong}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int mpz_init_set_str (MP_INT *@var{dest_integer}, char *@var{src_cstring}, int @var{base})
 | |
| Initialize @var{dest_integer} with limb space and set the initial
 | |
| numeric value from @var{src_cstring}, a '\0'-terminated C string in base
 | |
| @var{base}.  The base may vary from 2 to 36.  There may be white space
 | |
| in the string.
 | |
| 
 | |
| If the string is a correct base @var{base} number, the function returns
 | |
| 0; if an error occurs it returns @minus{}1.  @var{dest_integer} is
 | |
| initialized even if an error occurs.  (I.e., you have to call mpz_clear
 | |
| for it.)
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node Converting Integers,  Integer Arithmetic, Simultaneous Integer Init & Assign, Integer Functions
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @section Conversion Functions
 | |
| @cindex Conversion functions
 | |
| 
 | |
| @deftypefun {unsigned long int} mpz_get_ui (MP_INT *@var{src_integer})
 | |
| Return the least significant limb from @var{src_integer}.  This
 | |
| function together with @*
 | |
| @code{mpz_div_2exp(@dots{}, @var{src_integer}, CHAR_BIT*sizeof(unsigned
 | |
| long int))} can be used to extract the limbs of an integer efficiently.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun {signed long int} mpz_get_si (MP_INT *@var{src_integer})
 | |
| If @var{src_integer} fits into a @code{signed long int} return the value
 | |
| of @var{src_integer}.  Otherwise return the least significant bits of
 | |
| @var{src_integer}, with the same sign as @var{src_integer}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun {char *} mpz_get_str (char *@var{string}, int @var{base}, MP_INT *@var{integer})
 | |
| Convert @var{integer} to a '\0'-terminated C string in @var{string},
 | |
| using base @var{base}.  The base may vary from 2 to 36.  If @var{string}
 | |
| is NULL, space for the string is allocated using the default allocation
 | |
| function.
 | |
| 
 | |
| If @var{string} is not NULL, it should point to a block of storage
 | |
| enough large for the result.  To find out the right amount of space to
 | |
| provide for @var{string}, use @code{mpz_sizeinbase (@var{integer},
 | |
| @var{base}) + 2}.  The "+ 2" is for a possible minus sign, and for the
 | |
| terminating null character.  (@pxref{Miscellaneous Functions}).
 | |
| 
 | |
| This function returns a pointer to the result string.
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node     Integer Arithmetic, Logic on Integers, Converting Integers, Integer Functions
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @section Integer Arithmetic Functions
 | |
| @cindex Integer arithmetic functions
 | |
| @cindex Arithmetic functions
 | |
| 
 | |
| @deftypefun void mpz_add (MP_INT *@var{sum}, MP_INT *@var{addend1}, MP_INT *@var{addend2})
 | |
| @end deftypefun
 | |
| @deftypefun void mpz_add_ui (MP_INT *@var{sum}, MP_INT *@var{addend1}, unsigned long int @var{addend2})
 | |
| Set @var{sum} to @var{addend1} + @var{addend2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_sub (MP_INT *@var{difference}, MP_INT *@var{minuend}, MP_INT *@var{subtrahend})
 | |
| @end deftypefun
 | |
| @deftypefun void mpz_sub_ui (MP_INT *@var{difference}, MP_INT *@var{minuend}, unsigned long int @var{subtrahend})
 | |
| Set @var{difference} to @var{minuend} @minus{} @var{subtrahend}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_mul (MP_INT *@var{product}, MP_INT *@var{multiplicator}, MP_INT *@var{multiplicand})
 | |
| @end deftypefun
 | |
| @deftypefun void mpz_mul_ui (MP_INT *@var{product}, MP_INT *@var{multiplicator}, unsigned long int @var{multiplicand})
 | |
| Set @var{product} to @var{multiplicator} times @var{multiplicand}.
 | |
| @end deftypefun
 | |
| 
 | |
| Division is undefined if the divisor is zero, and passing a zero divisor
 | |
| to the divide or modulo functions, as well passing a zero mod argument
 | |
| to the powm functions, will make these functions intentionally divide by
 | |
| zero.  This gives the user the possibility to handle arithmetic
 | |
| exceptions in these functions in the same manner as other arithmetic
 | |
| exceptions.
 | |
| 
 | |
| @deftypefun void mpz_div (MP_INT *@var{quotient}, MP_INT *@var{dividend}, MP_INT *@var{divisor})
 | |
| @end deftypefun
 | |
| @deftypefun void mpz_div_ui (MP_INT *@var{quotient}, MP_INT *@var{dividend}, unsigned long int @var{divisor})
 | |
| Set @var{quotient} to @var{dividend} / @var{divisor}.  The quotient is
 | |
| rounded towards 0.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_mod (MP_INT *@var{remainder}, MP_INT *@var{divdend}, MP_INT *@var{divisor})
 | |
| @end deftypefun
 | |
| @deftypefun void mpz_mod_ui (MP_INT *@var{remainder}, MP_INT *@var{divdend}, unsigned long int @var{divisor})
 | |
| Divide @var{dividend} and @var{divisor} and put the remainder in
 | |
| @var{remainder}.  The remainder has the same sign as the dividend, and
 | |
| its absolute value is less than the absolute value of the divisor.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_divmod (MP_INT *@var{quotient}, MP_INT *@var{remainder}, MP_INT *@var{dividend}, MP_INT *@var{divisor})
 | |
| @end deftypefun
 | |
| @deftypefun void mpz_divmod_ui (MP_INT *@var{quotient}, MP_INT *@var{remainder}, MP_INT *@var{dividend}, unsigned long int @var{divisor})
 | |
| Divide @var{dividend} and @var{divisor} and put the quotient in
 | |
| @var{quotient} and the remainder in @var{remainder}.  The quotient is
 | |
| rounded towards 0.  The remainder has the same sign as the dividend,
 | |
| and its absolute value is less than the absolute value of the divisor.
 | |
| 
 | |
| If @var{quotient} and @var{remainder} are the same variable, the results
 | |
| are not defined.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_mdiv (MP_INT *@var{quotient}, MP_INT *@var{dividend}, MP_INT *@var{divisor})
 | |
| @end deftypefun
 | |
| @deftypefun void mpz_mdiv_ui (MP_INT *@var{quotient}, MP_INT *@var{dividend}, unsigned long int @var{divisor})
 | |
| Set @var{quotient} to @var{dividend} / @var{divisor}.  The quotient is
 | |
| rounded towards @minus{}infinity.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_mmod (MP_INT *@var{remainder}, MP_INT *@var{divdend}, MP_INT *@var{divisor})
 | |
| @end deftypefun
 | |
| @deftypefun {unsigned long int} mpz_mmod_ui (MP_INT *@var{remainder}, MP_INT *@var{divdend}, unsigned long int @var{divisor})
 | |
| Divide @var{dividend} and @var{divisor} and put the remainder in
 | |
| @var{remainder}.  The remainder is always positive, and its value is
 | |
| less than the value of the divisor.
 | |
| 
 | |
| For @code{mpz_mmod_ui} the remainder is returned, and if @var{remainder} is
 | |
| not NULL, also stored there.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_mdivmod (MP_INT *@var{quotient}, MP_INT *@var{remainder}, MP_INT *@var{dividend}, MP_INT *@var{divisor})
 | |
| @end deftypefun
 | |
| @deftypefun {unsigned long int} mpz_mdivmod_ui (MP_INT *@var{quotient}, MP_INT *@var{remainder}, MP_INT *@var{dividend}, unsigned long int @var{divisor})
 | |
| Divide @var{dividend} and @var{divisor} and put the quotient in
 | |
| @var{quotient} and the remainder in @var{remainder}.  The quotient is
 | |
| rounded towards @minus{}infinity.  The remainder is always positive, and its
 | |
| value is less than the value of the divisor.
 | |
| 
 | |
| For @code{mpz_mdivmod_ui} the remainder is small enough to fit in an
 | |
| @code{unsigned long int}, and is therefore returned.  If @var{remainder}
 | |
| is not NULL, the remainder is also stored there.
 | |
| 
 | |
| If @var{quotient} and @var{remainder} are the same variable, the results
 | |
| are not defined.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_sqrt (MP_INT *@var{root}, MP_INT *@var{operand})
 | |
| Set @var{root} to the square root of @var{operand}.  The result is
 | |
| rounded towards zero.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_sqrtrem (MP_INT *@var{root}, MP_INT *@var{remainder}, MP_INT *@var{operand})
 | |
| Set @var{root} to the square root of @var{operand}, as with
 | |
| @code{mpz_sqrt}.  Set @var{remainder} to
 | |
| @ifinfo
 | |
| @var{operand}@minus{}@var{root}*@var{root},
 | |
| @end ifinfo
 | |
| @iftex
 | |
| @tex
 | |
| $operand - root^2$,
 | |
| @end tex
 | |
| @end iftex
 | |
| (i.e@. zero if @var{operand} is a perfect square).
 | |
| 
 | |
| If @var{root} and @var{remainder} are the same variable, the results are
 | |
| not defined.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int mpz_perfect_square_p (MP_INT *@var{square})
 | |
| Return non-zero if @var{square} is perfect, i.e@. if the square root of
 | |
| @var{square} is integral.  Return zero otherwise.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int mpz_probab_prime_p (MP_INT *@var{n}, int @var{reps})
 | |
| An implementation of the probabilistic primality test found in Knuth's
 | |
| Seminumerical Algorithms book.  If the function
 | |
| @code{mpz_probab_prime_p(@var{n}, @var{reps})} returns 0 then @var{n} is
 | |
| not prime.  If it returns 1, then @var{n} is `probably' prime.  The
 | |
| probability of a false positive is (1/4)**@var{reps}, where @var{reps}
 | |
| is the number of internal passes of the probabilistic algorithm.  Knuth
 | |
| indicates that 25 passes are reasonable.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_powm (MP_INT *@var{res}, MP_INT *@var{base}, MP_INT *@var{exp}, MP_INT *@var{mod})
 | |
| @end deftypefun
 | |
| @deftypefun void mpz_powm_ui (MP_INT *@var{res}, MP_INT *@var{base}, unsigned long int @var{exp}, MP_INT *@var{mod})
 | |
| Set @var{res} to (@var{base} raised to @var{exp}) modulo @var{mod}.
 | |
| If @var{exp} is negative, the result is undefined.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_pow_ui (MP_INT *@var{res}, MP_INT *@var{base}, unsigned long int @var{exp})
 | |
| Set @var{res} to @var{base} raised to @var{exp}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_fac_ui (MP_INT *@var{res}, unsigned long int @var{n})
 | |
| Set @var{res} @var{n}!, the factorial of n.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_gcd (MP_INT *@var{res}, MP_INT *@var{operand1}, MP_INT *@var{operand2})
 | |
| Set @var{res} to the greatest common divisor of @var{operand1} and
 | |
| @var{operand2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_gcdext (MP_INT *@var{g}, MP_INT *@var{s}, MP_INT *@var{t}, MP_INT *@var{a}, MP_INT *@var{b})
 | |
| Compute @var{g}, @var{s}, and @var{t}, such that @var{a}@var{s} +
 | |
| @var{b}@var{t} = @var{g} = @code{gcd} (@var{a}, @var{b}).  If @var{t} is
 | |
| NULL, that argument is not computed.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_neg (MP_INT *@var{negated_operand}, MP_INT *@var{operand})
 | |
| Set @var{negated_operand} to @minus{}@var{operand}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_abs (MP_INT *@var{positive_operand}, MP_INT *@var{signed_operand})
 | |
| Set @var{positive_operand} to the absolute value of @var{signed_operand}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int mpz_cmp (MP_INT *@var{operand1}, MP_INT *@var{operand2})
 | |
| @end deftypefun
 | |
| @deftypefun int mpz_cmp_ui (MP_INT *@var{operand1}, unsigned long int @var{operand2})
 | |
| @end deftypefun
 | |
| @deftypefun int mpz_cmp_si (MP_INT *@var{operand1}, signed long int @var{operand2})
 | |
| Compare @var{operand1} and @var{operand2}.  Return a positive value if
 | |
| @var{operand1} > @var{operand2}, zero if @var{operand1} = @var{operand2},
 | |
| and a negative value if @var{operand1} < @var{operand2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_mul_2exp (MP_INT *@var{product}, MP_INT *@var{multiplicator}, unsigned long int @var{exponent_of_2})
 | |
| Set @var{product} to @var{multiplicator} times 2 raised to
 | |
| @var{exponent_of_2}.  This operation can also be defined as a left shift,
 | |
| @var{exponent_of_2} steps.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_div_2exp (MP_INT *@var{quotient}, MP_INT *@var{dividend}, unsigned long int @var{exponent_of_2})
 | |
| Set @var{quotient} to @var{dividend} divided by 2 raised to
 | |
| @var{exponent_of_2}.  This operation can also be defined as a right
 | |
| shift, @var{exponent_of_2} steps, but unlike the >> operator in
 | |
| C, the result is rounded towards 0.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_mod_2exp (MP_INT *@var{remainder}, MP_INT *@var{dividend}, unsigned long int @var{exponent_of_2})
 | |
| Set @var{remainder} to @var{dividend} mod (2 raised to
 | |
| @var{exponent_of_2}).  The sign of @var{remainder} will have the same sign
 | |
| as @var{dividend}.
 | |
| 
 | |
| This operation can also be defined as a masking of the
 | |
| @var{exponent_of_2} least significant bits.
 | |
| @end deftypefun
 | |
| 
 | |
| @node Logic on Integers, I/O of Integers, Integer Arithmetic, Integer Functions
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @section Logical Functions
 | |
| @cindex Logical functions
 | |
| 
 | |
| @deftypefun void mpz_and (MP_INT *@var{conjunction}, MP_INT *@var{operand1}, MP_INT *@var{operand2})
 | |
| Set @var{conjunction} to @var{operand1} logical-and @var{operand2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_ior (MP_INT *@var{disjunction}, MP_INT *@var{operand1}, MP_INT *@var{operand2})
 | |
| Set @var{disjunction} to @var{operand1} inclusive-or @var{operand2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_xor (MP_INT *@var{disjunction}, MP_INT *@var{operand1}, MP_INT *@var{operand2})
 | |
| Set @var{disjunction} to @var{operand1} exclusive-or @var{operand2}.
 | |
| 
 | |
| This function is missing in the current release.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_com (MP_INT *@var{complemented_operand}, MP_INT *@var{operand})
 | |
| Set @var{complemented_operand} to the one's complement of @var{operand}.
 | |
| @end deftypefun
 | |
| 
 | |
| @node I/O of Integers,, Logic on Integers, Integer Functions
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @section Input and Output Functions
 | |
| @cindex Input and output functions
 | |
| @cindex Output functions
 | |
| @cindex I/O functions
 | |
| 
 | |
| Functions that perform input from a standard I/O stream, and functions for
 | |
| output conversion.
 | |
| 
 | |
| @deftypefun void mpz_inp_raw (MP_INT *@var{integer}, FILE *@var{stream})
 | |
| Input from standard I/O stream @var{stream} in the format written by
 | |
| @code{mpz_out_raw}, and put the result in @var{integer}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_inp_str (MP_INT *@var{integer}, FILE *@var{stream}, int @var{base})
 | |
| Input a string in base @var{base} from standard I/O stream @var{stream},
 | |
| and put the read integer in @var{integer}.  The 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', hexadecimal is
 | |
| assumed, otherwise if the first character is `0', octal is assumed,
 | |
| otherwise decimal is assumed.
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @deftypefun void mpz_out_raw (FILE *@var{stream}, MP_INT *@var{integer})
 | |
| Output @var{integer} on standard I/O stream @var{stream}, in raw binary
 | |
| format.  The integer is written in a portable format, with 4 bytes of
 | |
| size information, and that many bytes of limbs.  Both the size and the
 | |
| limbs are written in decreasing significance order.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_out_str (FILE *@var{stream}, int @var{base}, MP_INT *@var{integer})
 | |
| Output @var{integer} on standard I/O stream @var{stream}, as a string of
 | |
| digits in base @var{base}.  The base may vary from 2 to 36.
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node Rational Number Functions, Low-level Functions, Integer Functions, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Rational Number Functions
 | |
| @cindex Rational number functions
 | |
| 
 | |
| All rational arithmetic functions canonicalize the result, so that the
 | |
| denominator and the numerator have no common factors.  Zero has the
 | |
| unique representation 0/1.
 | |
| 
 | |
| The set of functions is quite small.  Maybe it will be extended in a
 | |
| future release.
 | |
| 
 | |
| @deftypefun void mpq_init (MP_RAT *@var{dest_rational})
 | |
| Initialize @var{dest_rational} with limb space and set the initial
 | |
| numeric value to 0/1.  Each variable should normally only be initialized
 | |
| once, or at least cleared out (using the function @code{mpq_clear})
 | |
| between each initialization.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_clear (MP_RAT *@var{rational_number})
 | |
| Free the limb space occupied by @var{rational_number}.  Make sure to
 | |
| call this function for all @code{MP_RAT} variables when you are done
 | |
| with them.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_set (MP_RAT *@var{dest_rational}, MP_RAT *@var{src_rational})
 | |
| Assign @var{dest_rational} from @var{src_rational}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_set_ui (MP_RAT *@var{rational_number}, unsigned long int @var{numerator}, unsigned long int @var{denominator})
 | |
| Set the value of @var{rational_number} to
 | |
| @var{numerator}/@var{denominator}.  If @var{numerator} and
 | |
| @var{denominator} have common factors, they are divided out before
 | |
| @var{rational_number} is assigned.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_set_si (MP_RAT *@var{rational_number}, signed long int @var{numerator}, unsigned long int @var{denominator})
 | |
| Like @code{mpq_set_ui}, but @var{numerator} is signed.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_add (MP_RAT *@var{sum}, MP_RAT *@var{addend1}, MP_RAT *@var{addend2})
 | |
| Set @var{sum} to @var{addend1} + @var{addend2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_sub (MP_RAT *@var{difference}, MP_RAT *@var{minuend}, MP_RAT *@var{subtrahend})
 | |
| Set @var{difference} to @var{minuend} @minus{} @var{subtrahend}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_mul (MP_RAT *@var{product}, MP_RAT *@var{multiplicator}, MP_RAT *@var{multiplicand})
 | |
| Set @var{product} to @var{multiplicator} * @var{multiplicand}
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_div (MP_RAT *@var{quotient}, MP_RAT *@var{dividend}, MP_RAT *@var{divisor})
 | |
| Set @var{quotient} to @var{dividend} / @var{divisor}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_neg (MP_RAT *@var{negated_operand}, MP_RAT *@var{operand})
 | |
| Set @var{negated_operand} to @minus{}@var{operand}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int mpq_cmp (MP_RAT *@var{operand1}, MP_RAT *@var{operand2})
 | |
| Compare @var{operand1} and @var{operand2}.  Return a positive value if
 | |
| @var{operand1} > @var{operand2}, zero if @var{operand1} = @var{operand2},
 | |
| and a negative value if @var{operand1} < @var{operand2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_inv (MP_RAT *@var{inverted_number}, MP_RAT *@var{number})
 | |
| Invert @var{number} by swapping the numerator and denominator.  If the
 | |
| new denominator becomes zero, this routine will divide by zero.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_set_num (MP_RAT *@var{rational_number}, MP_INT *@var{numerator})
 | |
| Make @var{numerator} become the numerator of @var{rational_number} by
 | |
| copying.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_set_den (MP_RAT *@var{rational_number}, MP_INT *@var{denominator})
 | |
| Make @var{denominator} become the denominator of @var{rational_number}
 | |
| by copying.  If @var{denominator} < 0 the denominator of
 | |
| @var{rational_number} is set to the absolute value of @var{denominator},
 | |
| and the sign of the numerator of @var{rational_number} is changed.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_get_num (MP_INT *@var{numerator}, MP_RAT *@var{rational_number})
 | |
| Copy the numerator of @var{rational_number} to the integer
 | |
| @var{numerator}, to prepare for integer operations on the numerator.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpq_get_den (MP_INT *@var{denominator}, MP_RAT *@var{rational_number})
 | |
| Copy the denominator of @var{rational_number} to the integer
 | |
| @var{denominator}, to prepare for integer operations on the denominator.
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node Low-level Functions, BSD Compatible Functions, Rational Number Functions, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Low-level Functions
 | |
| @cindex Low-level functions
 | |
| 
 | |
| @c 1. Some of these function clobber input operands.
 | |
| @c 
 | |
| 
 | |
| @strong{The next release of the GNU MP library (2.0) will include
 | |
| changes to some mpn functions.  Programs that use these functions
 | |
| according to the descriptions below will therefore not work with the
 | |
| next release.}
 | |
| 
 | |
| The low-level function layer is designed to be as fast as possible,
 | |
| @strong{not} to provide a coherent calling interface.  The different
 | |
| functions have similar interfaces, but there are variations that might
 | |
| be confusing.  These functions do as little as possible apart from the
 | |
| real multiple precision computation, so that no time is spent on things
 | |
| that not all callers need.
 | |
| 
 | |
| A source operand is specified by a pointer to the least significant limb
 | |
| and a limb count.  A destination operand is specified by just a pointer.
 | |
| It is the responsability of the caller to ensure that the destination
 | |
| has enough space for storing the result.
 | |
| 
 | |
| With this way of specifying source operands, it is possible to perform
 | |
| computations on subranges of an argument, and store the result into a
 | |
| subrange of a destination.
 | |
| 
 | |
| All these functions require that the operands are normalized in the
 | |
| sense that the most significant limb must be non-zero.  (A future release
 | |
| of might drop this requirement.)
 | |
| 
 | |
| The low-level layer is the base for the implementation of the
 | |
| @code{mpz_} and @code{mpq_} layers.
 | |
| 
 | |
| The code below adds the number beginning at @var{src1_ptr} and the
 | |
| number beginning at @var{src2_ptr} and writes the sum at @var{dest_ptr}.
 | |
| A constraint for @code{mpn_add} is that @var{src1_size} must not be
 | |
| smaller that @var{src2_size}.
 | |
| 
 | |
| @example
 | |
| mpn_add (dest_ptr, src1_ptr, src1_size, src2_ptr, src2_size)
 | |
| @end example
 | |
| 
 | |
| In the description below, a source operand is identified by the pointer
 | |
| to the least significant limb, and the limb count in braces.
 | |
| 
 | |
| @deftypefun mp_size mpn_add (mp_ptr @var{dest_ptr}, mp_srcptr @var{src1_ptr}, mp_size @var{src1_size}, mp_srcptr @var{src2_ptr}, mp_size @var{src2_size})
 | |
| Add @{@var{src1_ptr}, @var{src1_size}@} and @{@var{src2_ptr},
 | |
| @var{src2_size}@}, and write the @var{src1_size} least significant limbs
 | |
| of the result to @var{dest_ptr}.  Carry-out, either 0 or 1, is returned.
 | |
| 
 | |
| This function requires that @var{src1_size} is greater than or equal to
 | |
| @var{src2_size}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun mp_size mpn_sub (mp_ptr @var{dest_ptr}, mp_srcptr @var{src1_ptr}, mp_size @var{src1_size}, mp_srcptr @var{src2_ptr}, mp_size @var{src2_size})
 | |
| Subtarct @{@var{src2_ptr}, @var{src2_size}@} from @{@var{src1_ptr},
 | |
| @var{src1_size}@}, and write the result to @var{dest_ptr}.
 | |
| 
 | |
| Return 1 if the minuend < the subtrahend.  Otherwise, return the
 | |
| negative difference between the number of words in the result and the
 | |
| minuend.  I.e@. return 0 if the result has @var{src1_size} words, @minus{}1 if
 | |
| it has @var{src1_size} @minus{} 1 words, etc.
 | |
| 
 | |
| This function requires that @var{src1_size} is greater than or equal to
 | |
| @var{src2_size}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun mp_size mpn_mul (mp_ptr @var{dest_ptr}, mp_srcptr @var{src1_ptr}, mp_size @var{src1_size}, mp_srcptr @var{src2_ptr}, mp_size @var{src2_size})
 | |
| Multiply @{@var{src1_ptr}, @var{src1_size}@} and @{@var{src2_ptr},
 | |
| @var{src2_size}@}, and write the result to @var{dest_ptr}.  The exact
 | |
| size of the result is returned.
 | |
| 
 | |
| The destination has to have space for @var{src1_size} + @var{src1_size}
 | |
| limbs, even if the result might be one limb smaller.
 | |
| 
 | |
| This function requires that @var{src1_size} is greater than or equal to
 | |
| @var{src2_size}.  The destination must be distinct from either input
 | |
| operands.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun mp_size mpn_div (mp_ptr @var{dest_ptr}, mp_ptr @var{src1_ptr}, mp_size @var{src1_size}, mp_srcptr @var{src2_ptr}, mp_size @var{src2_size})
 | |
| Divide @{@var{src1_ptr}, @var{src1_size}@} by @{@var{src2_ptr},
 | |
| @var{src2_size}@}, and write the quotient to @var{dest_ptr}, and the
 | |
| remainder to @var{src1_ptr}.
 | |
| 
 | |
| Return 0 if the quotient size is at most (@var{src1_size} @minus{}
 | |
| @var{src2_size}), and 1 if the quotient size is at most (@var{src1_size}
 | |
| @minus{} @var{src2_size} + 1).  The caller has to check the most significant limb
 | |
| to find out the exact size.
 | |
| 
 | |
| The most significant bit of the most significant limb of the divisor
 | |
| has to be set.
 | |
| 
 | |
| This function requires that @var{src1_size} is greater than or equal to
 | |
| @var{src2_size}.  The quotient, pointed to by @var{dest_ptr}, must be
 | |
| distinct from either input operands.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun mp_limb mpn_lshift (mp_ptr @var{dest_ptr}, mp_srcptr @var{src_ptr}, mp_size @var{src_size}, unsigned long int @var{count})
 | |
| Shift @{@var{src_ptr}, @var{src_size}@} @var{count} bits to the left, and
 | |
| write the @var{src_size} least significant limbs of the result to
 | |
| @var{dest_ptr}.  @var{count} might be in the range 1 to n @minus{} 1, on an n-bit
 | |
| machine. The limb shifted out is returned.
 | |
| 
 | |
| Overlapping of the destination space and the source space is allowed in this
 | |
| function, provdied @var{dest_ptr} >= @var{src_ptr}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun mp_size mpn_rshift (mp_ptr @var{dest_ptr}, mp_srcptr @var{src_ptr}, mp_size @var{src_size}, unsigned long int @var{count})
 | |
| Shift @{@var{src_ptr}, @var{src_size}@} @var{count} bits to the right, and
 | |
| write the @var{src_size} least significant limbs of the result to
 | |
| @var{dest_ptr}.  @var{count} might be in the range 1 to n @minus{} 1, on an n-bit
 | |
| machine. The size of the result is returned.
 | |
| 
 | |
| Overlaping of the destination space and the source space is allowed in this
 | |
| function, provdied @var{dest_ptr} <= @var{src_ptr}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun mp_size mpn_rshiftci (mp_ptr @var{dest_ptr}, mp_srcptr @var{src_ptr}, mp_size @var{src_size}, unsigned long int @var{count}, mp_limb @var{inlimb})
 | |
| Like mpn_rshift, but use @var{inlimb} to feed the least significant end
 | |
| of the destination.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int mpn_cmp (mp_srcptr @var{src1_ptr}, mp_srcptr @var{src2_ptr}, mp_size @var{size})
 | |
| Compare @{@var{src1_ptr}, @var{size}@} and @{@var{src2_ptr}, @var{size}@}
 | |
| and return a positive value if src1 > src2, 0 of they are equal,
 | |
| and a negative value if src1 < src2.
 | |
| @end deftypefun
 | |
| 
 | |
| 
 | |
| @node BSD Compatible Functions, Miscellaneous Functions, Low-level Functions, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Berkeley MP Compatible Functions
 | |
| @cindex BSD MP compatible functions
 | |
| 
 | |
| These functions are intended to be fully compatible with the Berkeley MP
 | |
| library which is available on many BSD derived U*ix systems.
 | |
| 
 | |
| The original Berkeley MP library has a usage restriction: you cannot use
 | |
| the same variable as both source and destination in a single function
 | |
| call.  The compatible functions in GNU MP do not share this
 | |
| restriction---inputs and outputs may overlap.
 | |
| 
 | |
| It is not recommended that new programs are written using these
 | |
| functions.  Apart from the incomplete set of functions, the interface
 | |
| for initializing @code{MINT} objects is more error prone, and the
 | |
| @code{pow} function collides with @code{pow} in @file{libm.a}.
 | |
| 
 | |
| Include the header @file{mp.h} to get the definition of the necessary
 | |
| types and 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 you program.  This means that you probably need to give the -I<dir>
 | |
| option to the compiler, where <dir> is the directory where you have GNU
 | |
| @file{mp.h}.
 | |
| 
 | |
| @deftypefun {MINT *} itom (signed short int @var{initial_value})
 | |
| Allocate an integer consisting of a @code{MINT} object and dynamic limb
 | |
| space.  Initialize the integer to @var{initial_value}.  Return a pointer
 | |
| to the @code{MINT} object.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun {MINT *} xtom (char *@var{initial_value})
 | |
| Allocate an integer consisting of a @code{MINT} object and dynamic limb
 | |
| space.  Initialize the integer from @var{initial_value}, a hexadecimal,
 | |
| '\0'-terminate C string.  Return a pointer to the @code{MINT} object.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void move (MINT *@var{src}, MINT *@var{dest})
 | |
| Set @var{dest} to @var{src} by copying.  Both variables must be
 | |
| previously initialized.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void madd (MINT *@var{src_1}, MINT *@var{src_2}, MINT *@var{destination})
 | |
| Add @var{src_1} and @var{src_2} and put the sum in @var{destination}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void msub (MINT *@var{src_1}, MINT *@var{src_2}, MINT *@var{destination})
 | |
| Subtract @var{src_2} from @var{src_1} and put the difference in
 | |
| @var{destination}.
 | |
| @end deftypefun
 | |
| 
 | |
| @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
 | |
| @var{destination}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mdiv (MINT *@var{dividend}, MINT *@var{divisor}, MINT *@var{quotient}, MINT *@var{remainder})
 | |
| @end deftypefun
 | |
| @deftypefun void sdiv (MINT *@var{dividend}, signed short int @var{divisor}, MINT *@var{quotient}, signed short int *@var{remainder})
 | |
| Set @var{quotient} to @var{dividend} / @var{divisor}, and
 | |
| @var{remainder} to @var{dividend} mod @var{divisor}.  The quotient is
 | |
| rounded towards zero; the remainder has the same sign as the dividend.
 | |
| 
 | |
| Some implementations of this function return a remainder whose sign is
 | |
| inverted if the divisor is negative.  Such a definition makes little
 | |
| sense from a mathematical point of view.  GNU MP might be considered
 | |
| incompatible with the traditional MP in this respect.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void msqrt (MINT *@var{operand}, MINT *@var{root}, MINT *@var{remainder})
 | |
| Set @var{root} to the square root of @var{operand}, as with
 | |
| @code{mpz_sqrt}.  Set @var{remainder} to
 | |
| @ifinfo
 | |
| @var{operand}-@var{root}*@var{root},
 | |
| @end ifinfo
 | |
| @iftex
 | |
| @tex
 | |
| $operand - root^2$,
 | |
| @end tex
 | |
| @end iftex
 | |
| (i.e@. zero if @var{operand} is a perfect square).
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void pow (MINT *@var{base}, MINT *@var{exp}, MINT *@var{mod}, MINT *@var{dest})
 | |
| Set @var{dest} to (@var{base} raised to @var{exp}) modulo @var{mod}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void rpow (MINT *@var{base}, signed short int @var{exp}, MINT *@var{dest})
 | |
| Set @var{dest} to @var{base} raised to @var{exp}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void gcd (MINT *@var{operand1}, MINT *@var{operand2}, MINT *@var{res})
 | |
| Set @var{res} to the greatest common divisor of @var{operand1} and
 | |
| @var{operand2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun int mcmp (MINT *@var{operand1}, MINT *@var{operand2})
 | |
| Compare @var{operand1} and @var{operand2}.  Return a positive value if
 | |
| @var{operand1} > @var{operand2}, zero if @var{operand1} =
 | |
| @var{operand2}, and a negative value if @var{operand1} < @var{operand2}.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void min (MINT *@var{dest})
 | |
| Input a decimal string from stdin, and put the read integer in
 | |
| @var{dest}.  SPC and TAB are allowed in the number string, and are
 | |
| ignored.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mout (MINT *@var{src})
 | |
| Output @var{src} to stdout, as a decimal string.  Also output a newline.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun {char *} mtox (MINT *@var{operand})
 | |
| Convert @var{operand} to a hexadecimal string, and return a pointer to
 | |
| the string.  The returned string is allocated using the default memory
 | |
| allocation function, @code{malloc} by default. (@xref{Initialization},
 | |
| for an explanation of the memory allocation in MP).
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mfree (MINT *@var{operand})
 | |
| De-allocate, the space used by @var{operand}.  @strong{This function
 | |
| should only be passed a value returned by @code{itom} or @code{xtom}.}
 | |
| @end deftypefun
 | |
| 
 | |
| @node Miscellaneous Functions, Custom Allocation, BSD Compatible Functions, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Miscellaneous Functions
 | |
| @cindex Miscellaneous functions
 | |
| 
 | |
| @deftypefun void mpz_random (MP_INT *@var{random_integer}, mp_size @var{max_size})
 | |
| Generate a random integer of at most @var{max_size} limbs.  The generated
 | |
| random number doesn't satisfy any particular requirements of randomness.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun void mpz_random2 (MP_INT *@var{random_integer}, mp_size @var{max_size})
 | |
| Generate a random integer of at most @var{max_size} limbs, with long
 | |
| strings of zeros and ones in the binary representation.  Useful for
 | |
| testing functions and algorithms, since this kind of random numbers have
 | |
| proven to be more likely to trigger bugs.
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun size_t mpz_size (MP_INT *@var{integer})
 | |
| Return the size of @var{integer} measured in number of limbs.  If
 | |
| @var{integer} is zero, the returned value will be zero, if @var{integer}
 | |
| has one limb, the returned value will be one, etc.
 | |
| (@xref{Nomenclature}, for an explanation of the concept @dfn{limb}.)
 | |
| @end deftypefun
 | |
| 
 | |
| @deftypefun size_t mpz_sizeinbase (MP_INT *@var{integer}, int @var{base})
 | |
| Return the size of @var{integer} 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 big.  If @var{base} is a power of 2, the returned value
 | |
| will always be exact.
 | |
| 
 | |
| This function is useful in order to allocate the right amount of space
 | |
| before converting @var{integer} to a string.  The right amount of
 | |
| allocation is normally two more than the value returned by
 | |
| @code{mpz_sizeinbase} (one extra for a minus sign and one for the
 | |
| terminating '\0').
 | |
| @end deftypefun
 | |
| 
 | |
| @node Custom Allocation, Reporting Bugs, Miscellaneous Functions, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @section Custom Allocation
 | |
| 
 | |
| By default, the initialization functions use @code{malloc},
 | |
| @code{realloc}, and @code{free} to do their work.  If @code{malloc} or
 | |
| @code{realloc} fails, the MP package terminates execution after a
 | |
| printing fatal error message on standard error.
 | |
| 
 | |
| In some applications, you may wish to allocate memory in other ways, or
 | |
| you may not want to have a fatal error when there is no more memory
 | |
| available.  To accomplish this, you can specify alternative functions
 | |
| for allocating and de-allocating memory.  Use
 | |
| @code{mp_set_memory_functions} to do this.
 | |
| 
 | |
| @findex mp_set_memory_functions
 | |
| @code{mp_set_memory_functions} has three arguments,
 | |
| @var{allocate_function}, @var{reallocate_function}, and
 | |
| @var{deallocate_function}, in that order.  If an argument is NULL,
 | |
| the corresponding default function is retained.
 | |
| 
 | |
| The functions you supply should fit the following declarations:
 | |
| 
 | |
| @table @code
 | |
| @item void * @var{allocate_function} (size_t @var{alloc_size})
 | |
| This function should return a pointer to newly allocated space with at
 | |
| least @var{alloc_size} storage units.
 | |
| 
 | |
| @item void * @var{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 @var{new_size} storage units, after copying the first
 | |
| @var{old_size} 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 formely returned from
 | |
| @var{allocate_function} or @var{reallocate_function}, for a
 | |
| request for @var{old_size} storage units.
 | |
| 
 | |
| @item void @var{deallocate_function} (void *@var{ptr}, size_t @var{size})
 | |
| De-allocate the space pointed to by @var{ptr}.
 | |
| 
 | |
| You can assume that the space at @var{ptr} was formely returned from
 | |
| @var{allocate_function} or @var{reallocate_function}, for a
 | |
| request for @var{size} storage units.
 | |
| @end table
 | |
| 
 | |
| (A @dfn{storage unit} is the unit in which the @code{sizeof} operator
 | |
| returns the size of an object, normally an 8 bit byte.)
 | |
| 
 | |
| @strong{NOTE: call @code{mp_set_memory_functions} only before calling
 | |
| any other MP functions.} Otherwise, the user-defined allocation
 | |
| functions may be asked to re-allocate or de-allocate something
 | |
| previously allocated by the default allocation functions.
 | |
| 
 | |
| @node Reporting Bugs, , Custom Allocation, Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @chapter Reporting Bugs
 | |
| @cindex Reporting bugs
 | |
| 
 | |
| If you think you have found a bug in the GNU MP library, please
 | |
| investigate it and report it.  We have made this library available to
 | |
| you, and it is not to ask too much from you, to ask you to report the
 | |
| bugs that you find.
 | |
| 
 | |
| Please make sure that the bug is really in the GNU MP library.
 | |
| 
 | |
| You have to send us a test case that makes it possible for us to
 | |
| reproduce the bug.
 | |
| 
 | |
| You also have to explain what is wrong; if you get a crash, or if the
 | |
| results printed are not good and in that case, in what way.
 | |
| 
 | |
| Make sure that the bug report includes all information you would
 | |
| need to fix this kind of bug for someone else.  Think twice.
 | |
| 
 | |
| If your bug report is good, we will do our best to help you to get a
 | |
| corrected version of the library; if the bug report is poor, we won't do
 | |
| anything about it (aside of chiding you to send better bug reports).
 | |
| 
 | |
| Send your bug report to: tege@@gnu.ai.mit.edu.
 | |
| 
 | |
| If you think something in this manual is unclear, or downright
 | |
| incorrect, or if the language needs to be improved, please send a note
 | |
| to the same address.
 | |
| 
 | |
| 
 | |
| @node References, , , Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @unnumbered References
 | |
| 
 | |
| @itemize @bullet
 | |
| 
 | |
| @item
 | |
| Donald E@. Knuth, "The Art of Computer Programming", vol 2,
 | |
| "Seminumerical Algorithms", 2nd edition, Addison-Wesley, 1981.
 | |
| 
 | |
| @item
 | |
| John D@. Lipson, "Elements of Algebra and Algebraic Computing",
 | |
| The Benjamin Cummins Publishing Company Inc, 1981.
 | |
| 
 | |
| @item
 | |
| Richard M@. Stallman, "Using and Porting GCC", Free Software Foundation,
 | |
| 1993.
 | |
| 
 | |
| @item
 | |
| Peter L@. Montgomery, "Modular Multiplication Without Trial Division",
 | |
| Mathematics of Computation, volume 44, number 170, April 1985.
 | |
| 
 | |
| @end itemize
 | |
| 
 | |
| @node Concept Index, , , Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @unnumbered Concept Index
 | |
| @printindex cp
 | |
| 
 | |
| @node Function Index, , , Top
 | |
| @comment  node-name,  next,  previous,  up
 | |
| @unnumbered Function and Type Index
 | |
| @printindex fn
 | |
| 
 | |
| 
 | |
| @contents
 | |
| @bye
 |