diff options
Diffstat (limited to 'gsl-1.9/doc/combination.texi')
-rw-r--r-- | gsl-1.9/doc/combination.texi | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/gsl-1.9/doc/combination.texi b/gsl-1.9/doc/combination.texi new file mode 100644 index 0000000..d9ef7e1 --- /dev/null +++ b/gsl-1.9/doc/combination.texi @@ -0,0 +1,221 @@ +@cindex combinations + +This chapter describes functions for creating and manipulating +combinations. A combination @math{c} is represented by an array of +@math{k} integers in the range 0 to @math{n-1}, where each value +@math{c_i} occurs at most once. The combination @math{c} corresponds to +indices of @math{k} elements chosen from an @math{n} element vector. +Combinations are useful for iterating over all @math{k}-element subsets +of a set. + +The functions described in this chapter are defined in the header file +@file{gsl_combination.h}. + +@menu +* The Combination struct:: +* Combination allocation:: +* Accessing combination elements:: +* Combination properties:: +* Combination functions:: +* Reading and writing combinations:: +* Combination Examples:: +* Combination References and Further Reading:: +@end menu + +@node The Combination struct +@section The Combination struct + +A combination is defined by a structure containing three components, the +values of @math{n} and @math{k}, and a pointer to the combination array. +The elements of the combination array are all of type @code{size_t}, and +are stored in increasing order. The @code{gsl_combination} structure +looks like this, + +@example +typedef struct +@{ + size_t n; + size_t k; + size_t *data; +@} gsl_combination; +@end example +@comment + +@noindent + +@node Combination allocation +@section Combination allocation + +@deftypefun {gsl_combination *} gsl_combination_alloc (size_t @var{n}, size_t @var{k}) +This function allocates memory for a new combination with parameters +@var{n}, @var{k}. The combination is not initialized and its elements +are undefined. Use the function @code{gsl_combination_calloc} if you +want to create a combination which is initialized to the +lexicographically first combination. A null pointer is returned if +insufficient memory is available to create the combination. +@end deftypefun + +@deftypefun {gsl_combination *} gsl_combination_calloc (size_t @var{n}, size_t @var{k}) +This function allocates memory for a new combination with parameters +@var{n}, @var{k} and initializes it to the lexicographically first +combination. A null pointer is returned if insufficient memory is +available to create the combination. +@end deftypefun + +@deftypefun void gsl_combination_init_first (gsl_combination * @var{c}) +This function initializes the combination @var{c} to the +lexicographically first combination, i.e. @math{(0,1,2,@dots{},k-1)}. +@end deftypefun + +@deftypefun void gsl_combination_init_last (gsl_combination * @var{c}) +This function initializes the combination @var{c} to the +lexicographically last combination, i.e. @math{(n-k,n-k+1,@dots{},n-1)}. +@end deftypefun + +@deftypefun void gsl_combination_free (gsl_combination * @var{c}) +This function frees all the memory used by the combination @var{c}. +@end deftypefun + +@deftypefun int gsl_combination_memcpy (gsl_combination * @var{dest}, const gsl_combination * @var{src}) +This function copies the elements of the combination @var{src} into the +combination @var{dest}. The two combinations must have the same size. +@end deftypefun + + +@node Accessing combination elements +@section Accessing combination elements + +The following function can be used to access the elements of a combination. + +@deftypefun size_t gsl_combination_get (const gsl_combination * @var{c}, const size_t @var{i}) +This function returns the value of the @var{i}-th element of the +combination @var{c}. If @var{i} lies outside the allowed range of 0 to +@math{@var{k}-1} then the error handler is invoked and 0 is returned. +@end deftypefun + +@node Combination properties +@section Combination properties + +@deftypefun size_t gsl_combination_n (const gsl_combination * @var{c}) +This function returns the range (@math{n}) of the combination @var{c}. +@end deftypefun + +@deftypefun size_t gsl_combination_k (const gsl_combination * @var{c}) +This function returns the number of elements (@math{k}) in the combination @var{c}. +@end deftypefun + +@deftypefun {size_t *} gsl_combination_data (const gsl_combination * @var{c}) +This function returns a pointer to the array of elements in the +combination @var{c}. +@end deftypefun + +@deftypefun int gsl_combination_valid (gsl_combination * @var{c}) +@cindex checking combination for validity +@cindex testing combination for validity +This function checks that the combination @var{c} is valid. The @var{k} +elements should lie in the range 0 to @math{@var{n}-1}, with each +value occurring once at most and in increasing order. +@end deftypefun + +@node Combination functions +@section Combination functions + +@deftypefun int gsl_combination_next (gsl_combination * @var{c}) +@cindex iterating through combinations +This function advances the combination @var{c} to the next combination +in lexicographic order and returns @code{GSL_SUCCESS}. If no further +combinations are available it returns @code{GSL_FAILURE} and leaves +@var{c} unmodified. Starting with the first combination and +repeatedly applying this function will iterate through all possible +combinations of a given order. +@end deftypefun + +@deftypefun int gsl_combination_prev (gsl_combination * @var{c}) +This function steps backwards from the combination @var{c} to the +previous combination in lexicographic order, returning +@code{GSL_SUCCESS}. If no previous combination is available it returns +@code{GSL_FAILURE} and leaves @var{c} unmodified. +@end deftypefun + + +@node Reading and writing combinations +@section Reading and writing combinations + +The library provides functions for reading and writing combinations to a +file as binary data or formatted text. + +@deftypefun int gsl_combination_fwrite (FILE * @var{stream}, const gsl_combination * @var{c}) +This function writes the elements of the combination @var{c} to the +stream @var{stream} in binary format. The function returns +@code{GSL_EFAILED} if there was a problem writing to the file. Since the +data is written in the native binary format it may not be portable +between different architectures. +@end deftypefun + +@deftypefun int gsl_combination_fread (FILE * @var{stream}, gsl_combination * @var{c}) +This function reads elements from the open stream @var{stream} into the +combination @var{c} in binary format. The combination @var{c} must be +preallocated with correct values of @math{n} and @math{k} since the +function uses the size of @var{c} to determine how many bytes to read. +The function returns @code{GSL_EFAILED} if there was a problem reading +from the file. The data is assumed to have been written in the native +binary format on the same architecture. +@end deftypefun + +@deftypefun int gsl_combination_fprintf (FILE * @var{stream}, const gsl_combination * @var{c}, const char * @var{format}) +This function writes the elements of the combination @var{c} +line-by-line to the stream @var{stream} using the format specifier +@var{format}, which should be suitable for a type of @var{size_t}. On a +GNU system the type modifier @code{Z} represents @code{size_t}, so +@code{"%Zu\n"} is a suitable format. The function returns +@code{GSL_EFAILED} if there was a problem writing to the file. +@end deftypefun + +@deftypefun int gsl_combination_fscanf (FILE * @var{stream}, gsl_combination * @var{c}) +This function reads formatted data from the stream @var{stream} into the +combination @var{c}. The combination @var{c} must be preallocated with +correct values of @math{n} and @math{k} since the function uses the size of @var{c} to +determine how many numbers to read. The function returns +@code{GSL_EFAILED} if there was a problem reading from the file. +@end deftypefun + + +@node Combination Examples +@section Examples +The example program below prints all subsets of the set +@math{@{0,1,2,3@}} ordered by size. Subsets of the same size are +ordered lexicographically. + +@example +@verbatiminclude examples/combination.c +@end example + +@noindent +Here is the output from the program, + +@example +$ ./a.out +@verbatiminclude examples/combination.out +@end example + +@noindent +All 16 subsets are generated, and the subsets of each size are sorted +lexicographically. + + +@node Combination References and Further Reading +@section References and Further Reading + +@noindent +Further information on combinations can be found in, + +@itemize @asis +@item +Donald L. Kreher, Douglas R. Stinson, @cite{Combinatorial Algorithms: +Generation, Enumeration and Search}, 1998, CRC Press LLC, ISBN +084933988X +@end itemize + +@noindent + + |