/[dtapublic]/projs/trunk/shared_source/c_datd/gmp_ralg.h
ViewVC logotype

Diff of /projs/trunk/shared_source/c_datd/gmp_ralg.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 70 by dashley, Sat Oct 29 01:53:01 2016 UTC revision 71 by dashley, Sat Nov 5 11:07:06 2016 UTC
# Line 1  Line 1 
1  //$Header$  //$Header$
2  //-------------------------------------------------------------------------------------------------  //-------------------------------------------------------------------------------------------------
3  //This file is part of "David T. Ashley's Shared Source Code", a set of shared components  //This file is part of "David T. Ashley's Shared Source Code", a set of shared components
4  //integrated into many of David T. Ashley's projects.  //integrated into many of David T. Ashley's projects.
5  //-------------------------------------------------------------------------------------------------  //-------------------------------------------------------------------------------------------------
6  //This source code and any program in which it is compiled/used is provided under the MIT License,  //This source code and any program in which it is compiled/used is provided under the MIT License,
7  //reproduced below.  //reproduced below.
8  //-------------------------------------------------------------------------------------------------  //-------------------------------------------------------------------------------------------------
9  //Permission is hereby granted, free of charge, to any person obtaining a copy of  //Permission is hereby granted, free of charge, to any person obtaining a copy of
10  //this software and associated documentation files(the "Software"), to deal in the  //this software and associated documentation files(the "Software"), to deal in the
11  //Software without restriction, including without limitation the rights to use,  //Software without restriction, including without limitation the rights to use,
12  //copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the  //copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the
13  //Software, and to permit persons to whom the Software is furnished to do so,  //Software, and to permit persons to whom the Software is furnished to do so,
14  //subject to the following conditions :  //subject to the following conditions :
15  //  //
16  //The above copyright notice and this permission notice shall be included in all  //The above copyright notice and this permission notice shall be included in all
17  //copies or substantial portions of the Software.  //copies or substantial portions of the Software.
18  //  //
19  //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20  //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21  //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE  //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
22  //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23  //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24  //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25  //SOFTWARE.  //SOFTWARE.
26  //-------------------------------------------------------------------------------------------------  //-------------------------------------------------------------------------------------------------
27  /* GNU multiple precision rational number algorithms  /* GNU multiple precision rational number algorithms
28  ** (and some extras).  ** (and some extras).
29  */  */
30    
31  #ifndef GMP_RALG_H_INCLUDED  #ifndef GMP_RALG_H_INCLUDED
32     #define GMP_RALG_H_INCLUDED     #define GMP_RALG_H_INCLUDED
33    
34     #ifdef MODULE_GMP_RALG     #ifdef MODULE_GMP_RALG
35        #define DECMOD_GMP_RALG        #define DECMOD_GMP_RALG
36     #else     #else
37        #define DECMOD_GMP_RALG extern        #define DECMOD_GMP_RALG extern
38     #endif     #endif
39    
40     typedef struct     typedef struct
41        {        {
42        int n;        int n;
43           //The number of continued fraction partial quotients           //The number of continued fraction partial quotients
44           //and convergents included in this structure.  Indices           //and convergents included in this structure.  Indices
45           //are only valid until one less than this value.           //are only valid until one less than this value.
46        int nallocd;        int nallocd;
47           //The number of slots allocated for partial quotients,           //The number of slots allocated for partial quotients,
48           //convergents, etc.  This goes in blocks of the size           //convergents, etc.  This goes in blocks of the size
49           //below to avoid numerous reallocation calls.           //below to avoid numerous reallocation calls.
50           #define  GMP_RALG_CF_ALLOC_INCREMENT  (10)           #define  GMP_RALG_CF_ALLOC_INCREMENT  (10)
51        GMP_INTS_mpz_struct num;        GMP_INTS_mpz_struct num;
52           //The numerator of the rational number whose continued           //The numerator of the rational number whose continued
53           //fraction decomposition is contained in this structure.           //fraction decomposition is contained in this structure.
54           //It must be non-negative.  The fraction is not           //It must be non-negative.  The fraction is not
55           //required to be reduced.           //required to be reduced.
56        GMP_INTS_mpz_struct den;        GMP_INTS_mpz_struct den;
57           //The denominator.  It must be positive.           //The denominator.  It must be positive.
58        GMP_INTS_mpz_struct *a;        GMP_INTS_mpz_struct *a;
59           //Pointer to array of arbitrary integers.  Each           //Pointer to array of arbitrary integers.  Each
60           //is one of the partial quotients.  This array           //is one of the partial quotients.  This array
61           //is allocated out to nallocd items but only n           //is allocated out to nallocd items but only n
62           //are used.           //are used.
63        GMP_INTS_mpz_struct *dividend;        GMP_INTS_mpz_struct *dividend;
64           //The dividend of each division round.           //The dividend of each division round.
65        GMP_INTS_mpz_struct *divisor;        GMP_INTS_mpz_struct *divisor;
66           //The divisor at each round.           //The divisor at each round.
67        GMP_INTS_mpz_struct *remainder;        GMP_INTS_mpz_struct *remainder;
68           //The remainder of each round.           //The remainder of each round.
69        GMP_INTS_mpz_struct *p;        GMP_INTS_mpz_struct *p;
70        GMP_INTS_mpz_struct *q;        GMP_INTS_mpz_struct *q;
71           //The convergents.           //The convergents.
72        } GMP_RALG_cf_app_struct;        } GMP_RALG_cf_app_struct;
73    
74    
75     //This structure type holds a single neighbor to a rational number we wish     //This structure type holds a single neighbor to a rational number we wish
76     //to approximate in either the Farey series of a certain order or     //to approximate in either the Farey series of a certain order or
77     //in a rectangular region of the integer lattice.  These neighbors     //in a rectangular region of the integer lattice.  These neighbors
78     //are manipulated in potentially large arrays.     //are manipulated in potentially large arrays.
79     typedef struct {     typedef struct {
80        int index;        int index;
81           //The relative index of the neighbor.  0 means that it is           //The relative index of the neighbor.  0 means that it is
82           //the reduced and normalized form of the number to be           //the reduced and normalized form of the number to be
83           //approximated (although at the present time the number to be           //approximated (although at the present time the number to be
84           //approximated is never included among the neighbors),           //approximated is never included among the neighbors),
85           //"1" means nearest neighbor to the right,           //"1" means nearest neighbor to the right,
86           //"2" means second nearest neighbor to the right, "-1" means           //"2" means second nearest neighbor to the right, "-1" means
87           //neighbor to the left, etc.           //neighbor to the left, etc.
88        GMP_RATS_mpq_struct neighbor;        GMP_RATS_mpq_struct neighbor;
89           //The neighbor itself, fully reduced and normalized.           //The neighbor itself, fully reduced and normalized.
90        } GMP_RALG_fab_neighbor_struct;        } GMP_RALG_fab_neighbor_struct;
91    
92     //This structure type holds a collection of neighbors which were     //This structure type holds a collection of neighbors which were
93     //produced on demand to a rational number, either in a Farey series     //produced on demand to a rational number, either in a Farey series
94     //or in a rectangular region of the integer lattice.  The collection     //or in a rectangular region of the integer lattice.  The collection
95     //contains the neighbors plus a great deal of other information.     //contains the neighbors plus a great deal of other information.
96     typedef struct {     typedef struct {
97        GMP_RATS_mpq_struct rn_in;        GMP_RATS_mpq_struct rn_in;
98           //The rational number which was supplied to have its neighbors           //The rational number which was supplied to have its neighbors
99           //found.  This number is raw as supplied by the caller and           //found.  This number is raw as supplied by the caller and
100           //not necessarily normalized.           //not necessarily normalized.
101        GMP_INTS_mpz_struct kmax_in;        GMP_INTS_mpz_struct kmax_in;
102           //The value of KMAX supplied.           //The value of KMAX supplied.
103        int hmax_supplied;        int hmax_supplied;
104           //TRUE if the problem includes a bound on the numerator, i.e.           //TRUE if the problem includes a bound on the numerator, i.e.
105           //rectangular region of integer lattice rather than Farey series.           //rectangular region of integer lattice rather than Farey series.
106        GMP_INTS_mpz_struct hmax_in;        GMP_INTS_mpz_struct hmax_in;
107           //The value of HMAX if it was supplied, or zero otherwise.           //The value of HMAX if it was supplied, or zero otherwise.
108        char *error;        char *error;
109           //NULL if no error occured in finding the neighbors.  If non-NULL,           //NULL if no error occured in finding the neighbors.  If non-NULL,
110           //points to a descriptive string explaining the error.             //points to a descriptive string explaining the error.  
111           //If this error flag is set, contents of this structure           //If this error flag is set, contents of this structure
112           //below this point should not be used--they are not           //below this point should not be used--they are not
113           //necessarily valid.           //necessarily valid.
114        GMP_RATS_mpq_struct corner_point;        GMP_RATS_mpq_struct corner_point;
115           //The normalized (reduced) version of the "corner point"           //The normalized (reduced) version of the "corner point"
116           //(HMAX/KMAX).  This will only be filled in if           //(HMAX/KMAX).  This will only be filled in if
117           //HMAX is specified, or it will be 0/1 otherwise.           //HMAX is specified, or it will be 0/1 otherwise.
118        GMP_RATS_mpq_struct corner_point_minus_one;        GMP_RATS_mpq_struct corner_point_minus_one;
119        GMP_RATS_mpq_struct corner_point_plus_one;        GMP_RATS_mpq_struct corner_point_plus_one;
120           //The points just before and just above the corner point           //The points just before and just above the corner point
121           //in the rectangular region of interest.                 //in the rectangular region of interest.      
122        GMP_RATS_mpq_struct hmax_over_one;        GMP_RATS_mpq_struct hmax_over_one;
123           //If HMAX is supplied, the rational number which is           //If HMAX is supplied, the rational number which is
124           //HMAX/1.  Used for comparisons if we are asked           //HMAX/1.  Used for comparisons if we are asked
125           //to approximate a number out of range.           //to approximate a number out of range.
126        GMP_RATS_mpq_struct norm_rn;        GMP_RATS_mpq_struct norm_rn;
127           //The normalized form of the rational number supplied.           //The normalized form of the rational number supplied.
128        GMP_RATS_mpq_struct abs_norm_rn;        GMP_RATS_mpq_struct abs_norm_rn;
129           //The absolute value of the normalized form of the rational           //The absolute value of the normalized form of the rational
130           //number supplied.           //number supplied.
131        int rn_is_neg;        int rn_is_neg;
132           //Set TRUE if the rational number supplied was negative.  This is           //Set TRUE if the rational number supplied was negative.  This is
133           //not a problem, because symmetry is exploited.  For the purposes           //not a problem, because symmetry is exploited.  For the purposes
134           //of this structure, the Farey series extends on both sides of zero           //of this structure, the Farey series extends on both sides of zero
135           //forever, and a rectangular region of the integer lattice extends           //forever, and a rectangular region of the integer lattice extends
136           //from -HMAX/1 to HMAX/1.           //from -HMAX/1 to HMAX/1.
137        int n_left_in;        int n_left_in;
138        int n_right_in;        int n_right_in;
139           //The number of left neighbors to the rational number supplied           //The number of left neighbors to the rational number supplied
140           //requested, and the number of right neighbors.  Note that if           //requested, and the number of right neighbors.  Note that if
141           //one of the bounds of the series of interest is encountered,           //one of the bounds of the series of interest is encountered,
142           //the actual number supplied may be less.           //the actual number supplied may be less.
143        GMP_RALG_cf_app_struct rn_abs_cf_rep;        GMP_RALG_cf_app_struct rn_abs_cf_rep;
144           //The CF representation of the absolute value of the           //The CF representation of the absolute value of the
145           //rational number supplied.  This always has to be           //rational number supplied.  This always has to be
146           //formed, because it is the only way to immediately           //formed, because it is the only way to immediately
147           //get neighbors.           //get neighbors.
148        int rn_abs_cf_rep_formed;        int rn_abs_cf_rep_formed;
149           //Boolean flag to indicate if above has been formed.           //Boolean flag to indicate if above has been formed.
150           //This is necessary because otherwise don't have           //This is necessary because otherwise don't have
151           //any obvious clues about whether to free this.           //any obvious clues about whether to free this.
152        GMP_RALG_cf_app_struct rn_abs_recip_cf_rep;        GMP_RALG_cf_app_struct rn_abs_recip_cf_rep;
153           //The CF representation of the reciprocal of the           //The CF representation of the reciprocal of the
154           //absolute value of the rational number supplied.           //absolute value of the rational number supplied.
155           //If HMAX is supplied, this may need to be formed,           //If HMAX is supplied, this may need to be formed,
156           //because it will allow us to zero in on neighbors           //because it will allow us to zero in on neighbors
157           //where HMAX is the dominant constraint.           //where HMAX is the dominant constraint.
158        int rn_abs_recip_cf_rep_formed;        int rn_abs_recip_cf_rep_formed;
159           //Boolean flag to indicate if above has been formed.           //Boolean flag to indicate if above has been formed.
160           //This is necessary because otherwise don't have           //This is necessary because otherwise don't have
161           //any obvious clues about whether to free this.           //any obvious clues about whether to free this.
162        GMP_RALG_cf_app_struct corner_point_cf_rep;        GMP_RALG_cf_app_struct corner_point_cf_rep;
163           //The CF representation of the corner point.  This is           //The CF representation of the corner point.  This is
164           //necessary to find the predecessor to the corner point           //necessary to find the predecessor to the corner point
165           //in F_KMAX.  This will only be calculated if HMAX           //in F_KMAX.  This will only be calculated if HMAX
166           //is specified.           //is specified.
167        int corner_point_cf_rep_formed;        int corner_point_cf_rep_formed;
168           //Boolean flag to indicate if above has been formed.           //Boolean flag to indicate if above has been formed.
169           //This is necessary because otherwise don't have           //This is necessary because otherwise don't have
170           //any obvious clues about whether to free this.           //any obvious clues about whether to free this.
171        GMP_RALG_cf_app_struct corner_point_recip_cf_rep;        GMP_RALG_cf_app_struct corner_point_recip_cf_rep;
172           //The CF representation of the reciprocal of the           //The CF representation of the reciprocal of the
173           //corner point.  This is necessary to find the           //corner point.  This is necessary to find the
174           //successor to the corner point along the HMAX constaint           //successor to the corner point along the HMAX constaint
175           //in the rectangular region of the integer lattice.           //in the rectangular region of the integer lattice.
176           //This will only be calculated if HMAX is specified.           //This will only be calculated if HMAX is specified.
177        int corner_point_recip_cf_rep_formed;        int corner_point_recip_cf_rep_formed;
178           //Boolean flag to indicate if above has been formed.           //Boolean flag to indicate if above has been formed.
179           //This is necessary because otherwise don't have           //This is necessary because otherwise don't have
180           //any obvious clues about whether to free this.           //any obvious clues about whether to free this.
181        int equality;        int equality;
182           //TRUE if the number supplied was already in the series of interest,           //TRUE if the number supplied was already in the series of interest,
183           //or FALSE otherwise.                 //or FALSE otherwise.      
184        int n_left_out;        int n_left_out;
185        int n_right_out;        int n_right_out;
186           //The actual number of neighbors supplied.  These may be less           //The actual number of neighbors supplied.  These may be less
187           //than the number requested only if a boundary of the series of interest           //than the number requested only if a boundary of the series of interest
188           //was encountered.           //was encountered.
189        GMP_RALG_fab_neighbor_struct *lefts;        GMP_RALG_fab_neighbor_struct *lefts;
190        GMP_RALG_fab_neighbor_struct *rights;        GMP_RALG_fab_neighbor_struct *rights;
191           //Arrays of neighbors in the series of interest.  These are           //Arrays of neighbors in the series of interest.  These are
192           //only stuffed as indicated by "n_left_out" and "n_right_out"--anything           //only stuffed as indicated by "n_left_out" and "n_right_out"--anything
193           //else will hit on dynamic memory that is not initialized.  The           //else will hit on dynamic memory that is not initialized.  The
194           //left array begins -1 and proceeds leftward through increasingly           //left array begins -1 and proceeds leftward through increasingly
195           //negative indices.  The right begins with 1 and           //negative indices.  The right begins with 1 and
196           //proceeds through increasingly positive indices.  Each neighbor is           //proceeds through increasingly positive indices.  Each neighbor is
197           //irreducible and normalized.  The rational number to be approximated           //irreducible and normalized.  The rational number to be approximated
198           //is NEVER included among the neighbors.           //is NEVER included among the neighbors.
199        } GMP_RALG_fab_neighbor_collection_struct;        } GMP_RALG_fab_neighbor_collection_struct;
200    
201     /******************************************************************/     /******************************************************************/
202     /***  INITIALIZATION AND DESTRUCTION FUNCTIONS  *******************/     /***  INITIALIZATION AND DESTRUCTION FUNCTIONS  *******************/
203     /******************************************************************/     /******************************************************************/
204     //Decomposes a rational number into its partial quotients     //Decomposes a rational number into its partial quotients
205     //and convergents.  This initializes the "decomp" structure     //and convergents.  This initializes the "decomp" structure
206     //by allocating space, etc.  The numerator must be non-negative     //by allocating space, etc.  The numerator must be non-negative
207     //and the denominator must be positive, or else there will be     //and the denominator must be positive, or else there will be
208     //a failure.  To make the interface simpler, the destruction     //a failure.  To make the interface simpler, the destruction
209     //call must ALWAYS be made, even in the event of a failure.     //call must ALWAYS be made, even in the event of a failure.
210     //If a failure occurs, the rational number will be decomposed     //If a failure occurs, the rational number will be decomposed
211     //as if it were 0/1.  This means that if the failure flag     //as if it were 0/1.  This means that if the failure flag
212     //is missed, it will still seem to be a valid rational number.     //is missed, it will still seem to be a valid rational number.
213     //It is not required that the rational number be reduced.     //It is not required that the rational number be reduced.
214     //The two integers passed are not changed at all, but they     //The two integers passed are not changed at all, but they
215     //are copied into the decomp structure without modification.     //are copied into the decomp structure without modification.
216     //After this operation, the destruction call must be made.     //After this operation, the destruction call must be made.
217     DECMOD_GMP_RALG void GMP_RALG_cfdecomp_init(     DECMOD_GMP_RALG void GMP_RALG_cfdecomp_init(
218              GMP_RALG_cf_app_struct *decomp,              GMP_RALG_cf_app_struct *decomp,
219              int                    *failure,              int                    *failure,
220              GMP_INTS_mpz_struct    *num,              GMP_INTS_mpz_struct    *num,
221              GMP_INTS_mpz_struct    *den);              GMP_INTS_mpz_struct    *den);
222     //Destroys all the the data allocated.     //Destroys all the the data allocated.
223     DECMOD_GMP_RALG void GMP_RALG_cfdecomp_destroy(     DECMOD_GMP_RALG void GMP_RALG_cfdecomp_destroy(
224              GMP_RALG_cf_app_struct *decomp              GMP_RALG_cf_app_struct *decomp
225              );              );
226    
227     /******************************************************************/     /******************************************************************/
228     /***  INITIALIZATION AND DESTRUCTION FUNCTIONS  *******************/     /***  INITIALIZATION AND DESTRUCTION FUNCTIONS  *******************/
229     /******************************************************************/     /******************************************************************/
230     //Prints out a continued fraction decomposition.  The banner parameter     //Prints out a continued fraction decomposition.  The banner parameter
231     //may be NULL, which indicates no banner.  nf flags whether to     //may be NULL, which indicates no banner.  nf flags whether to
232     //print with "no format", i.e. unformatted strings, separated by     //print with "no format", i.e. unformatted strings, separated by
233     //newlines.  dap indicates whether to include decimal approximation     //newlines.  dap indicates whether to include decimal approximation
234     //information.  The dap_denominator only needs to be non-NULL if     //information.  The dap_denominator only needs to be non-NULL if
235     //"dap" is selected.     //"dap" is selected.
236     DECMOD_GMP_RALG     DECMOD_GMP_RALG
237     void GMP_RALG_cfdecomp_emit(     void GMP_RALG_cfdecomp_emit(
238                                 FILE                   *s,                                 FILE                   *s,
239                                 char                   *banner,                                 char                   *banner,
240                                 GMP_RALG_cf_app_struct *decomp,                                 GMP_RALG_cf_app_struct *decomp,
241                                 int                    nf,                                 int                    nf,
242                                 int                    dap,                                 int                    dap,
243                                 const GMP_INTS_mpz_struct    *dap_denominator);                                 const GMP_INTS_mpz_struct    *dap_denominator);
244    
245     /******************************************************************/     /******************************************************************/
246     /***  FAREY SERIES PREDECESSOR AND SUCCESSOR FUNCTIONS  ***********/     /***  FAREY SERIES PREDECESSOR AND SUCCESSOR FUNCTIONS  ***********/
247     /******************************************************************/     /******************************************************************/
248     //The two functions below compute Farey predecessors and     //The two functions below compute Farey predecessors and
249     //successors.  These are straight sequences of arithmetic     //successors.  These are straight sequences of arithmetic
250     //operations--no checking for overflow is done.  The behavior     //operations--no checking for overflow is done.  The behavior
251     //below zero will probably not be correct, so these should     //below zero will probably not be correct, so these should
252     //not be used to go below 0/1 or with operands below 0/1.     //not be used to go below 0/1 or with operands below 0/1.
253     DECMOD_GMP_RALG     DECMOD_GMP_RALG
254     void GMP_RALG_farey_predecessor(     void GMP_RALG_farey_predecessor(
255                         GMP_RATS_mpq_struct *result,                         GMP_RATS_mpq_struct *result,
256                   const GMP_RATS_mpq_struct *plus_two,                   const GMP_RATS_mpq_struct *plus_two,
257                   const GMP_RATS_mpq_struct *plus_one,                   const GMP_RATS_mpq_struct *plus_one,
258                   const GMP_INTS_mpz_struct *N);                   const GMP_INTS_mpz_struct *N);
259     DECMOD_GMP_RALG     DECMOD_GMP_RALG
260     void GMP_RALG_farey_successor(     void GMP_RALG_farey_successor(
261                         GMP_RATS_mpq_struct *result,                         GMP_RATS_mpq_struct *result,
262                   const GMP_RATS_mpq_struct *minus_two,                   const GMP_RATS_mpq_struct *minus_two,
263                   const GMP_RATS_mpq_struct *minus_one,                   const GMP_RATS_mpq_struct *minus_one,
264                   const GMP_INTS_mpz_struct *N);                   const GMP_INTS_mpz_struct *N);
265        
266     //Finds the enclosing Farey neighbors to an arbitrary positive,     //Finds the enclosing Farey neighbors to an arbitrary positive,
267     //zero, or negative rational number which may or may not be in     //zero, or negative rational number which may or may not be in
268     //the Farey series of order N.     //the Farey series of order N.
269     //     //
270     //INPUTS     //INPUTS
271     //          rn: Rational number whose neighbors to find.  MUST     //          rn: Rational number whose neighbors to find.  MUST
272     //              be normalized, meaning reduced and sign adjusted     //              be normalized, meaning reduced and sign adjusted
273     //              so numerator contains the sign.     //              so numerator contains the sign.
274     //           N: Order of series.  MUST be positive.     //           N: Order of series.  MUST be positive.
275     //      cf_rep: The continued fraction representation of the     //      cf_rep: The continued fraction representation of the
276     //              non-negative version of the rational number     //              non-negative version of the rational number
277     //              whose neighbors to find.  The rational number     //              whose neighbors to find.  The rational number
278     //              need not have been reduced when the continued     //              need not have been reduced when the continued
279     //              fraction representation was formed, i.e. only     //              fraction representation was formed, i.e. only
280     //              partial quotients and convergents are used.     //              partial quotients and convergents are used.
281     //OUTPUTS     //OUTPUTS
282     //    equality: Set TRUE if the rational number is in the Farey     //    equality: Set TRUE if the rational number is in the Farey
283     //              series, or FALSE otherwise.  This affects the     //              series, or FALSE otherwise.  This affects the
284     //              generation of neighbors.  If the number is     //              generation of neighbors.  If the number is
285     //              already in the Farey series its other neighbor     //              already in the Farey series its other neighbor
286     //              is generated, i.e. the rational number of     //              is generated, i.e. the rational number of
287     //              interest is never one of the neighbors returned.     //              interest is never one of the neighbors returned.
288     //        left: The left neighbor.     //        left: The left neighbor.
289     //       right: The right neighbor.     //       right: The right neighbor.
290     DECMOD_GMP_RALG     DECMOD_GMP_RALG
291     void GMP_RALG_enclosing_farey_neighbors(     void GMP_RALG_enclosing_farey_neighbors(
292                   const GMP_RATS_mpq_struct    *rn,                   const GMP_RATS_mpq_struct    *rn,
293                   const GMP_INTS_mpz_struct    *N,                   const GMP_INTS_mpz_struct    *N,
294                   const GMP_RALG_cf_app_struct *cf_rep,                   const GMP_RALG_cf_app_struct *cf_rep,
295                   int                          *equality,                   int                          *equality,
296                         GMP_RATS_mpq_struct    *left,                         GMP_RATS_mpq_struct    *left,
297                         GMP_RATS_mpq_struct    *right);                         GMP_RATS_mpq_struct    *right);
298    
299     //Provides up to 2**24 - 1 (in concept--we don't recommend this!) terms in either     //Provides up to 2**24 - 1 (in concept--we don't recommend this!) terms in either
300     //the Farey series or in a rectangular region of the integer lattice.  The caller     //the Farey series or in a rectangular region of the integer lattice.  The caller
301     //must provide the space to be used, and must free it afterwards--this function     //must provide the space to be used, and must free it afterwards--this function
302     //performs no dynamic allocation.     //performs no dynamic allocation.
303     DECMOD_GMP_RALG     DECMOD_GMP_RALG
304     void GMP_RALG_consecutive_fab_terms(     void GMP_RALG_consecutive_fab_terms(
305        const GMP_RATS_mpq_struct *rn_in,        const GMP_RATS_mpq_struct *rn_in,
306           //The rational number whose neighbors are to be found.           //The rational number whose neighbors are to be found.
307        const GMP_INTS_mpz_struct *kmax,        const GMP_INTS_mpz_struct *kmax,
308           //Maximum denominator.           //Maximum denominator.
309        const GMP_INTS_mpz_struct *hmax,        const GMP_INTS_mpz_struct *hmax,
310           //Maximum numerator, or a NULL pointer or a non-null pointer but           //Maximum numerator, or a NULL pointer or a non-null pointer but
311           //an arbitrary integer value of 0 if only the Farey series is being           //an arbitrary integer value of 0 if only the Farey series is being
312           //considered.           //considered.
313        int n_left_in,        int n_left_in,
314           //The number of left neighbors requested.  Must be non-negative.           //The number of left neighbors requested.  Must be non-negative.
315        int n_right_in,        int n_right_in,
316           //The number of right neighbors requested.  Must be non-negative.           //The number of right neighbors requested.  Must be non-negative.
317        GMP_RALG_fab_neighbor_collection_struct *result        GMP_RALG_fab_neighbor_collection_struct *result
318           //The structure containing all results.  Even if there is an error           //The structure containing all results.  Even if there is an error
319           //condition, this must be freed when done by the caller.           //condition, this must be freed when done by the caller.
320        );        );
321    
322     //Frees the dynamic memory consumed by an earlier call to generate the     //Frees the dynamic memory consumed by an earlier call to generate the
323     //neighbor information.     //neighbor information.
324     DECMOD_GMP_RALG     DECMOD_GMP_RALG
325     void GMP_RALG_consecutive_fab_terms_result_free(     void GMP_RALG_consecutive_fab_terms_result_free(
326        GMP_RALG_fab_neighbor_collection_struct *arg        GMP_RALG_fab_neighbor_collection_struct *arg
327           //The structure whose members to free up.  After this call,           //The structure whose members to free up.  After this call,
328           //the structure must be considered invalid.           //the structure must be considered invalid.
329        );        );
330    
331     //Debugging function.  Dumps the contents of the neighbor structure to the indicated     //Debugging function.  Dumps the contents of the neighbor structure to the indicated
332     //stream for analysis.     //stream for analysis.
333     DECMOD_GMP_RALG     DECMOD_GMP_RALG
334     void GMP_RALG_consecutive_fab_terms_result_dump(     void GMP_RALG_consecutive_fab_terms_result_dump(
335           FILE *s,           FILE *s,
336           GMP_RALG_fab_neighbor_collection_struct *arg);           GMP_RALG_fab_neighbor_collection_struct *arg);
337    
338     /******************************************************************/     /******************************************************************/
339     /***  VERSION CONTROL REPORTING FUNCTIONS  ************************/     /***  VERSION CONTROL REPORTING FUNCTIONS  ************************/
340     /******************************************************************/     /******************************************************************/
341     DECMOD_GMP_RALG const char *GMP_RALG_cvcinfo(void);     DECMOD_GMP_RALG const char *GMP_RALG_cvcinfo(void);
342     DECMOD_GMP_RALG const char *GMP_RALG_hvcinfo(void);     DECMOD_GMP_RALG const char *GMP_RALG_hvcinfo(void);
343     #define GMP_RALG_H_VERSION ("$Header$")     #define GMP_RALG_H_VERSION ("$Header$")
344  #endif  #endif
345    
346  //End of gmp_ralg.h.  //End of gmp_ralg.h.

Legend:
Removed from v.70  
changed lines
  Added in v.71

dashley@gmail.com
ViewVC Help
Powered by ViewVC 1.1.25