Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
Loading...
Searching...
No Matches
gmpfrxx.h
Go to the documentation of this file.
1
2
3/*
4 Aleph_w
5
6 Data structures & Algorithms
7 version 2.0.0b
8 https://github.com/lrleon/Aleph-w
9
10 This file is part of Aleph-w library
11
12 Copyright (c) 2002-2026 Leandro Rabindranath Leon
13
14 Permission is hereby granted, free of charge, to any person obtaining a copy
15 of this software and associated documentation files (the "Software"), to deal
16 in the Software without restriction, including without limitation the rights
17 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
18 copies of the Software, and to permit persons to whom the Software is
19 furnished to do so, subject to the following conditions:
20
21 The above copyright notice and this permission notice shall be included in all
22 copies or substantial portions of the Software.
23
24 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 SOFTWARE.
31*/
32
33/* gmpfrxx.h -- C++ class wrapper for GMP and MPFR types.
34
35this is a re-write of gmpxx.h to replace mpf with mpfr
36and add all the features of mpfr that aren't in mpf
37(modified by Jon Wilkening)
38
39CVS version: 1.18
40
41The original gmpxx.h file is part of the GNU MP Library.
42
43Copyright 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
44
45The GNU MP Library is free software; you can redistribute it and/or modify
46it under the terms of the GNU Lesser General Public License as published by
47the Free Software Foundation; either version 2.1 of the License, or (at your
48option) any later version.
49
50The GNU MP Library is distributed in the hope that it will be useful, but
51WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
52or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
53License for more details.
54
55You should have received a copy of the GNU Lesser General Public License
56along with the GNU MP Library; see the file COPYING.LIB. If not, write to
57the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
58MA 02110-1301, USA. */
59
60/* the C++ compiler must implement the following features:
61 - member templates
62 - partial specialization of templates
63 - namespace support
64 for g++, this means version 2.91 or higher
65 for other compilers, I don't know */
66
67#ifdef __GNUC__
68#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 91)
69#error gmpxx.h requires g++ version 2.91 (egcs 1.1.2) or higher
70#endif
71#endif
72
73#ifdef __GMP_PLUSPLUS__
74#ifndef __GMPFR_PLUSPLUS__
75#error gmpfrxx.h cannot be used together with gmpxx.h
76#endif
77#endif
78
79#ifndef __GMP_PLUSPLUS__
80#define __GMP_PLUSPLUS__
81#define __GMPFR_PLUSPLUS__
82
83#include <cstddef>
84#include <iosfwd>
85#include <iostream>
86#include <cstring> /* for strlen */
87#include <new>
88#include <string>
89#include <stdexcept>
90#include <gmp.h>
91#include <mpfr.h>
92#include "mpfr_mul_d.h"
93
94// routines in gmpfrxx.cpp
95std::istream& operator>> (std::istream &, mpfr_ptr);
96std::ostream& operator<< (std::ostream &, mpfr_srcptr);
97void mpz_set_mpfr(mpz_ptr w, mpfr_srcptr u);
98void mpq_set_mpfr(mpq_ptr w, mpfr_srcptr u);
99
100// access these as mpfr_class::get_base(), etc.
101class MpFrC {
102 static mpfr_rnd_t rnd;
103 static int base;
104public:
105 static int get_base() { return base; }
106 static void set_base(int b=10) { base = b; }
107 static inline mpfr_rnd_t get_rnd() { return rnd; }
108 static void set_rnd(mpfr_rnd_t r=GMP_RNDN)
109 { mpfr_set_default_rounding_mode(r); rnd = r; }
110 static mpfr_prec_t get_dprec() { return mpfr_get_default_prec(); }
111 static void set_dprec(mpfr_prec_t p=53)
112 { mpfr_set_default_prec(p); }
113};
114
115/**************** Function objects ****************/
116/* Any evaluation of a __gmp_expr ends up calling one of these functions
117 all intermediate functions being inline, the evaluation should optimize
118 to a direct call to the relevant function, thus yielding no overhead
119 over the C interface. */
120
122{
123 static void eval(mpz_ptr z, mpz_srcptr w) { mpz_set(z, w); }
124 static void eval(mpq_ptr q, mpq_srcptr r) { mpq_set(q, r); }
125 static void eval(mpfr_ptr f, mpfr_srcptr g)
126 { mpfr_set(f, g, MpFrC::get_rnd()); }
127};
128
130{
131 static void eval(mpz_ptr z, mpz_srcptr w) { mpz_neg(z, w); }
132 static void eval(mpq_ptr q, mpq_srcptr r) { mpq_neg(q, r); }
133 static void eval(mpfr_ptr f, mpfr_srcptr g)
134 { mpfr_neg(f, g, MpFrC::get_rnd()); }
135};
136
138{
139 static void eval(mpz_ptr z, mpz_srcptr w) { mpz_com(z, w); }
140};
141
143{
144 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
145 { mpz_add(z, w, v); }
146
147 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
148 { mpz_add_ui(z, w, l); }
149 static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
150 { mpz_add_ui(z, w, l); }
151 static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
152 {
153 if (l >= 0)
154 mpz_add_ui(z, w, l);
155 else
156 mpz_sub_ui(z, w, -l);
157 }
158 static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
159 {
160 if (l >= 0)
161 mpz_add_ui(z, w, l);
162 else
163 mpz_sub_ui(z, w, -l);
164 }
165 static void eval(mpz_ptr z, mpz_srcptr w, double d)
166 {
167 mpz_t temp;
168 mpz_init_set_d(temp, d);
169 mpz_add(z, w, temp);
170 mpz_clear(temp);
171 }
172 static void eval(mpz_ptr z, double d, mpz_srcptr w)
173 {
174 mpz_t temp;
175 mpz_init_set_d(temp, d);
176 mpz_add(z, temp, w);
177 mpz_clear(temp);
178 }
179
180 static void eval(mpq_ptr q, mpq_srcptr r, mpq_srcptr s)
181 { mpq_add(q, r, s); }
182
183 static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
184 { mpq_set(q, r); mpz_addmul_ui(mpq_numref(q), mpq_denref(q), l); }
185 static void eval(mpq_ptr q, unsigned long int l, mpq_srcptr r)
186 { mpq_set(q, r); mpz_addmul_ui(mpq_numref(q), mpq_denref(q), l); }
187 static void eval(mpq_ptr q, mpq_srcptr r, signed long int l)
188 {
189 mpq_set(q, r);
190 if (l >= 0)
191 mpz_addmul_ui(mpq_numref(q), mpq_denref(q), l);
192 else
193 mpz_submul_ui(mpq_numref(q), mpq_denref(q), -l);
194 }
195 static void eval(mpq_ptr q, signed long int l, mpq_srcptr r)
196 {
197 mpq_set(q, r);
198 if (l >= 0)
199 mpz_addmul_ui(mpq_numref(q), mpq_denref(q), l);
200 else
201 mpz_submul_ui(mpq_numref(q), mpq_denref(q), -l);
202 }
203 static void eval(mpq_ptr q, mpq_srcptr r, double d)
204 {
205 mpq_t temp;
206 mpq_init(temp);
207 mpq_set_d(temp, d);
208 mpq_add(q, r, temp);
209 mpq_clear(temp);
210 }
211 static void eval(mpq_ptr q, double d, mpq_srcptr r)
212 {
213 mpq_t temp;
214 mpq_init(temp);
215 mpq_set_d(temp, d);
216 mpq_add(q, temp, r);
217 mpq_clear(temp);
218 }
219
220 static void eval(mpq_ptr q, mpq_srcptr r, mpz_srcptr z)
221 { mpq_set(q, r); mpz_addmul(mpq_numref(q), mpq_denref(q), z); }
222 static void eval(mpq_ptr q, mpz_srcptr z, mpq_srcptr r)
223 { mpq_set(q, r); mpz_addmul(mpq_numref(q), mpq_denref(q), z); }
224
225 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
226 { mpfr_add(f, g, h, MpFrC::get_rnd()); }
227 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
228 { mpfr_add_ui(f, g, l, MpFrC::get_rnd()); }
229 static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
230 { mpfr_add_ui(f, g, l, MpFrC::get_rnd()); }
231 static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
232 { mpfr_add_si(f, g, l, MpFrC::get_rnd()); }
233 static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
234 { mpfr_add_si(f, g, l, MpFrC::get_rnd()); }
235 static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
236 { mpfr_add_d(f, g, d, MpFrC::get_rnd()); }
237 static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
238 { mpfr_add_d(f, g, d, MpFrC::get_rnd()); }
239};
240
242{
243 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
244 { mpz_sub(z, w, v); }
245
246 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
247 { mpz_sub_ui(z, w, l); }
248 static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
249 { mpz_ui_sub(z, l, w); }
250 static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
251 {
252 if (l >= 0)
253 mpz_sub_ui(z, w, l);
254 else
255 mpz_add_ui(z, w, -l);
256 }
257 static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
258 {
259 if (l >= 0)
260 mpz_ui_sub(z, l, w);
261 else
262 {
263 mpz_add_ui(z, w, -l);
264 mpz_neg(z, z);
265 }
266 }
267 static void eval(mpz_ptr z, mpz_srcptr w, double d)
268 {
269 mpz_t temp;
270 mpz_init_set_d(temp, d);
271 mpz_sub(z, w, temp);
272 mpz_clear(temp);
273 }
274 static void eval(mpz_ptr z, double d, mpz_srcptr w)
275 {
276 mpz_t temp;
277 mpz_init_set_d(temp, d);
278 mpz_sub(z, temp, w);
279 mpz_clear(temp);
280 }
281
282 static void eval(mpq_ptr q, mpq_srcptr r, mpq_srcptr s)
283 { mpq_sub(q, r, s); }
284
285 static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
286 { mpq_set(q, r); mpz_submul_ui(mpq_numref(q), mpq_denref(q), l); }
287 static void eval(mpq_ptr q, unsigned long int l, mpq_srcptr r)
288 { mpq_neg(q, r); mpz_addmul_ui(mpq_numref(q), mpq_denref(q), l); }
289 static void eval(mpq_ptr q, mpq_srcptr r, signed long int l)
290 {
291 mpq_set(q, r);
292 if (l >= 0)
293 mpz_submul_ui(mpq_numref(q), mpq_denref(q), l);
294 else
295 mpz_addmul_ui(mpq_numref(q), mpq_denref(q), -l);
296 }
297 static void eval(mpq_ptr q, signed long int l, mpq_srcptr r)
298 {
299 mpq_neg(q, r);
300 if (l >= 0)
301 mpz_addmul_ui(mpq_numref(q), mpq_denref(q), l);
302 else
303 mpz_submul_ui(mpq_numref(q), mpq_denref(q), -l);
304 }
305 static void eval(mpq_ptr q, mpq_srcptr r, double d)
306 {
307 mpq_t temp;
308 mpq_init(temp);
309 mpq_set_d(temp, d);
310 mpq_sub(q, r, temp);
311 mpq_clear(temp);
312 }
313 static void eval(mpq_ptr q, double d, mpq_srcptr r)
314 {
315 mpq_t temp;
316 mpq_init(temp);
317 mpq_set_d(temp, d);
318 mpq_sub(q, temp, r);
319 mpq_clear(temp);
320 }
321
322 static void eval(mpq_ptr q, mpq_srcptr r, mpz_srcptr z)
323 { mpq_set(q, r); mpz_submul(mpq_numref(q), mpq_denref(q), z); }
324 static void eval(mpq_ptr q, mpz_srcptr z, mpq_srcptr r)
325 { mpq_neg(q, r); mpz_addmul(mpq_numref(q), mpq_denref(q), z); }
326
327 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
328 { mpfr_sub(f, g, h, MpFrC::get_rnd()); }
329
330 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
331 { mpfr_sub_ui(f, g, l, MpFrC::get_rnd()); }
332 static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
333 { mpfr_ui_sub(f, l, g, MpFrC::get_rnd()); }
334 static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
335 { mpfr_sub_si(f, g, l, MpFrC::get_rnd()); }
336 static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
337 { mpfr_ui_sub(f, l, g, MpFrC::get_rnd()); }
338 static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
339 { mpfr_sub_d(f, g, d, MpFrC::get_rnd()); }
340 static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
341 { mpfr_d_sub(f, d, g, MpFrC::get_rnd()); }
342};
343
345{
346 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
347 { mpz_mul(z, w, v); }
348
349 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
350 { mpz_mul_ui(z, w, l); }
351 static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
352 { mpz_mul_ui(z, w, l); }
353 static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
354 { mpz_mul_si (z, w, l); }
355 static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
356 { mpz_mul_si (z, w, l); }
357 static void eval(mpz_ptr z, mpz_srcptr w, double d)
358 {
359 mpz_t temp;
360 mpz_init_set_d(temp, d);
361 mpz_mul(z, w, temp);
362 mpz_clear(temp);
363 }
364 static void eval(mpz_ptr z, double d, mpz_srcptr w)
365 {
366 mpz_t temp;
367 mpz_init_set_d(temp, d);
368 mpz_mul(z, temp, w);
369 mpz_clear(temp);
370 }
371
372 static void eval(mpq_ptr q, mpq_srcptr r, mpq_srcptr s)
373 { mpq_mul(q, r, s); }
374
375 static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
376 {
377 mpq_t temp;
378 mpq_init(temp);
379 mpq_set_ui(temp, l, 1);
380 mpq_mul(q, r, temp);
381 mpq_clear(temp);
382 }
383 static void eval(mpq_ptr q, unsigned long int l, mpq_srcptr r)
384 {
385 mpq_t temp;
386 mpq_init(temp);
387 mpq_set_ui(temp, l, 1);
388 mpq_mul(q, temp, r);
389 mpq_clear(temp);
390 }
391 static void eval(mpq_ptr q, mpq_srcptr r, signed long int l)
392 {
393 mpq_t temp;
394 mpq_init(temp);
395 mpq_set_si(temp, l, 1);
396 mpq_mul(q, r, temp);
397 mpq_clear(temp);
398 }
399 static void eval(mpq_ptr q, signed long int l, mpq_srcptr r)
400 {
401 mpq_t temp;
402 mpq_init(temp);
403 mpq_set_si(temp, l, 1);
404 mpq_mul(q, temp, r);
405 mpq_clear(temp);
406 }
407 static void eval(mpq_ptr q, mpq_srcptr r, double d)
408 {
409 mpq_t temp;
410 mpq_init(temp);
411 mpq_set_d(temp, d);
412 mpq_mul(q, r, temp);
413 mpq_clear(temp);
414 }
415 static void eval(mpq_ptr q, double d, mpq_srcptr r)
416 {
417 mpq_t temp;
418 mpq_init(temp);
419 mpq_set_d(temp, d);
420 mpq_mul(q, temp, r);
421 mpq_clear(temp);
422 }
423
424 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
425 { mpfr_mul(f, g, h, MpFrC::get_rnd()); }
426
427 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
428 { mpfr_mul_ui(f, g, l, MpFrC::get_rnd()); }
429 static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
430 { mpfr_mul_ui(f, g, l, MpFrC::get_rnd()); }
431 static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
432 { mpfr_mul_si(f, g, l, MpFrC::get_rnd()); }
433 static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
434 { mpfr_mul_si(f, g, l, MpFrC::get_rnd()); }
435 static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
436 { mpfr_mul_d(f, g, d, MpFrC::get_rnd()); }
437 static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
438 { mpfr_mul_d(f, g, d, MpFrC::get_rnd()); }
439};
440
442{
443 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
444 { mpz_tdiv_q(z, w, v); }
445
446 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
447 { mpz_tdiv_q_ui(z, w, l); }
448 static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
449 {
450 if (mpz_sgn(w) >= 0)
451 {
452 if (mpz_fits_ulong_p(w))
453 mpz_set_ui(z, l / mpz_get_ui(w));
454 else
455 mpz_set_ui(z, 0);
456 }
457 else
458 {
459 mpz_neg(z, w);
460 if (mpz_fits_ulong_p(z))
461 {
462 mpz_set_ui(z, l / mpz_get_ui(z));
463 mpz_neg(z, z);
464 }
465 else
466 mpz_set_ui(z, 0);
467 }
468 }
469 static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
470 {
471 if (l >= 0)
472 mpz_tdiv_q_ui(z, w, l);
473 else
474 {
475 mpz_tdiv_q_ui(z, w, -l);
476 mpz_neg(z, z);
477 }
478 }
479 static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
480 {
481 if (mpz_fits_slong_p(w))
482 mpz_set_si(z, l / mpz_get_si(w));
483 else
484 {
485 /* if w is bigger than a long then the quotient must be zero, unless
486 l==LONG_MIN and w==-LONG_MIN in which case the quotient is -1 */
487 mpz_set_si (z, (mpz_cmpabs_ui (w, (l >= 0 ? l : -l)) == 0 ? -1 : 0));
488 }
489 }
490 static void eval(mpz_ptr z, mpz_srcptr w, double d)
491 {
492 mpz_t temp;
493 mpz_init_set_d(temp, d);
494 mpz_tdiv_q(z, w, temp);
495 mpz_clear(temp);
496 }
497 static void eval(mpz_ptr z, double d, mpz_srcptr w)
498 {
499 mpz_t temp;
500 mpz_init_set_d(temp, d);
501 mpz_tdiv_q(z, temp, w);
502 mpz_clear(temp);
503 }
504
505 static void eval(mpq_ptr q, mpq_srcptr r, mpq_srcptr s)
506 { mpq_div(q, r, s); }
507
508 static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
509 {
510 mpq_t temp;
511 mpq_init(temp);
512 mpq_set_ui(temp, l, 1);
513 mpq_div(q, r, temp);
514 mpq_clear(temp);
515 }
516 static void eval(mpq_ptr q, unsigned long int l, mpq_srcptr r)
517 {
518 mpq_t temp;
519 mpq_init(temp);
520 mpq_set_ui(temp, l, 1);
521 mpq_div(q, temp, r);
522 mpq_clear(temp);
523 }
524 static void eval(mpq_ptr q, mpq_srcptr r, signed long int l)
525 {
526 mpq_t temp;
527 mpq_init(temp);
528 mpq_set_si(temp, l, 1);
529 mpq_div(q, r, temp);
530 mpq_clear(temp);
531 }
532 static void eval(mpq_ptr q, signed long int l, mpq_srcptr r)
533 {
534 mpq_t temp;
535 mpq_init(temp);
536 mpq_set_si(temp, l, 1);
537 mpq_div(q, temp, r);
538 mpq_clear(temp);
539 }
540 static void eval(mpq_ptr q, mpq_srcptr r, double d)
541 {
542 mpq_t temp;
543 mpq_init(temp);
544 mpq_set_d(temp, d);
545 mpq_div(q, r, temp);
546 mpq_clear(temp);
547 }
548 static void eval(mpq_ptr q, double d, mpq_srcptr r)
549 {
550 mpq_t temp;
551 mpq_init(temp);
552 mpq_set_d(temp, d);
553 mpq_div(q, temp, r);
554 mpq_clear(temp);
555 }
556
557 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
558 { mpfr_div(f, g, h, MpFrC::get_rnd()); }
559
560 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
561 { mpfr_div_ui(f, g, l, MpFrC::get_rnd()); }
562 static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
563 { mpfr_ui_div(f, l, g, MpFrC::get_rnd()); }
564 static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
565 { mpfr_div_si(f, g, l, MpFrC::get_rnd()); }
566 static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
567 { mpfr_si_div(f, l, g, MpFrC::get_rnd()); }
568 static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
569 { mpfr_div_d(f, g, d, MpFrC::get_rnd()); }
570 static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
571 { mpfr_d_div(f, d, g, MpFrC::get_rnd()); }
572};
573
575{
576 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
577 { mpz_tdiv_r(z, w, v); }
578
579 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
580 { mpz_tdiv_r_ui(z, w, l); }
581 static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
582 {
583 if (mpz_sgn(w) >= 0)
584 {
585 if (mpz_fits_ulong_p(w))
586 mpz_set_ui(z, l % mpz_get_ui(w));
587 else
588 mpz_set_ui(z, l);
589 }
590 else
591 {
592 mpz_neg(z, w);
593 if (mpz_fits_ulong_p(z))
594 mpz_set_ui(z, l % mpz_get_ui(z));
595 else
596 mpz_set_ui(z, l);
597 }
598 }
599 static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
600 {
601 mpz_tdiv_r_ui (z, w, (l >= 0 ? l : -l));
602 }
603 static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
604 {
605 if (mpz_fits_slong_p(w))
606 mpz_set_si(z, l % mpz_get_si(w));
607 else
608 {
609 /* if w is bigger than a long then the remainder is l unchanged,
610 unless l==LONG_MIN and w==-LONG_MIN in which case it's 0 */
611 mpz_set_si (z, mpz_cmpabs_ui (w, (l >= 0 ? l : -l)) == 0 ? 0 : l);
612 }
613 }
614 static void eval(mpz_ptr z, mpz_srcptr w, double d)
615 {
616 mpz_t temp;
617 mpz_init_set_d(temp, d);
618 mpz_tdiv_r(z, w, temp);
619 mpz_clear(temp);
620 }
621 static void eval(mpz_ptr z, double d, mpz_srcptr w)
622 {
623 mpz_t temp;
624 mpz_init_set_d(temp, d);
625 mpz_tdiv_r(z, temp, w);
626 mpz_clear(temp);
627 }
628};
629
631{
632 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
633 { mpz_and(z, w, v); }
634};
635
637{
638 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
639 { mpz_ior(z, w, v); }
640};
641
643{
644 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
645 { mpz_xor(z, w, v); }
646};
647
649{
650 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
651 { mpz_mul_2exp(z, w, l); }
652 static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
653 { mpq_mul_2exp(q, r, l); }
654 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
655 { mpfr_mul_2ui(f, g, l, MpFrC::get_rnd()); }
656};
657
659{
660 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
661 { mpz_tdiv_q_2exp(z, w, l); }
662 static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
663 { mpq_div_2exp(q, r, l); }
664 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
665 { mpfr_div_2ui(f, g, l, MpFrC::get_rnd()); }
666};
667
669{
670 static bool eval(mpz_srcptr z, mpz_srcptr w) { return mpz_cmp(z, w) == 0; }
671
672 static bool eval(mpz_srcptr z, unsigned long int l)
673 { return mpz_cmp_ui(z, l) == 0; }
674 static bool eval(unsigned long int l, mpz_srcptr z)
675 { return mpz_cmp_ui(z, l) == 0; }
676 static bool eval(mpz_srcptr z, signed long int l)
677 { return mpz_cmp_si(z, l) == 0; }
678 static bool eval(signed long int l, mpz_srcptr z)
679 { return mpz_cmp_si(z, l) == 0; }
680 static bool eval(mpz_srcptr z, double d)
681 { return mpz_cmp_d(z, d) == 0; }
682 static bool eval(double d, mpz_srcptr z)
683 { return mpz_cmp_d(z, d) == 0; }
684
685 static bool eval(mpq_srcptr q, mpq_srcptr r)
686 { return mpq_equal(q, r) != 0; }
687
688 static bool eval(mpq_srcptr q, unsigned long int l)
689 { return mpq_cmp_ui(q, l, 1) == 0; }
690 static bool eval(unsigned long int l, mpq_srcptr q)
691 { return mpq_cmp_ui(q, l, 1) == 0; }
692 static bool eval(mpq_srcptr q, signed long int l)
693 { return mpq_cmp_si(q, l, 1) == 0; }
694 static bool eval(signed long int l, mpq_srcptr q)
695 { return mpq_cmp_si(q, l, 1) == 0; }
696 static bool eval(mpq_srcptr q, double d)
697 {
698 bool b;
699 mpq_t temp;
700 mpq_init(temp);
701 mpq_set_d(temp, d);
702 b = (mpq_equal(q, temp) != 0);
703 mpq_clear(temp);
704 return b;
705 }
706 static bool eval(double d, mpq_srcptr q)
707 {
708 bool b;
709 mpq_t temp;
710 mpq_init(temp);
711 mpq_set_d(temp, d);
712 b = (mpq_equal(temp, q) != 0);
713 mpq_clear(temp);
714 return b;
715 }
716
717 static bool eval(mpfr_srcptr f, mpfr_srcptr g)
718 { return mpfr_cmp(f, g) == 0; }
719
720 static bool eval(mpfr_srcptr f, unsigned long int l)
721 { return mpfr_cmp_ui(f, l) == 0; }
722 static bool eval(unsigned long int l, mpfr_srcptr f)
723 { return mpfr_cmp_ui(f, l) == 0; }
724 static bool eval(mpfr_srcptr f, signed long int l)
725 { return mpfr_cmp_si(f, l) == 0; }
726 static bool eval(signed long int l, mpfr_srcptr f)
727 { return mpfr_cmp_si(f, l) == 0; }
728 static bool eval(mpfr_srcptr f, double d)
729 { return mpfr_cmp_d(f, d) == 0; }
730 static bool eval(double d, mpfr_srcptr f)
731 { return mpfr_cmp_d(f, d) == 0; }
732};
733
735{
736 static bool eval(mpz_srcptr z, mpz_srcptr w)
737 { return mpz_cmp(z, w) != 0; }
738
739 static bool eval(mpz_srcptr z, unsigned long int l)
740 { return mpz_cmp_ui(z, l) != 0; }
741 static bool eval(unsigned long int l, mpz_srcptr z)
742 { return mpz_cmp_ui(z, l) != 0; }
743 static bool eval(mpz_srcptr z, signed long int l)
744 { return mpz_cmp_si(z, l) != 0; }
745 static bool eval(signed long int l, mpz_srcptr z)
746 { return mpz_cmp_si(z, l) != 0; }
747 static bool eval(mpz_srcptr z, double d)
748 { return mpz_cmp_d(z, d) != 0; }
749 static bool eval(double d, mpz_srcptr z)
750 { return mpz_cmp_d(z, d) != 0; }
751
752 static bool eval(mpq_srcptr q, mpq_srcptr r)
753 { return mpq_equal(q, r) == 0; }
754
755 static bool eval(mpq_srcptr q, unsigned long int l)
756 { return mpq_cmp_ui(q, l, 1) != 0; }
757 static bool eval(unsigned long int l, mpq_srcptr q)
758 { return mpq_cmp_ui(q, l, 1) != 0; }
759 static bool eval(mpq_srcptr q, signed long int l)
760 { return mpq_cmp_si(q, l, 1) != 0; }
761 static bool eval(signed long int l, mpq_srcptr q)
762 { return mpq_cmp_si(q, l, 1) != 0; }
763 static bool eval(mpq_srcptr q, double d)
764 {
765 bool b;
766 mpq_t temp;
767 mpq_init(temp);
768 mpq_set_d(temp, d);
769 b = (mpq_equal(q, temp) == 0);
770 mpq_clear(temp);
771 return b;
772 }
773 static bool eval(double d, mpq_srcptr q)
774 {
775 bool b;
776 mpq_t temp;
777 mpq_init(temp);
778 mpq_set_d(temp, d);
779 b = (mpq_equal(temp, q) == 0);
780 mpq_clear(temp);
781 return b;
782 }
783
784 static bool eval(mpfr_srcptr f, mpfr_srcptr g) { return mpfr_cmp(f, g) != 0; }
785
786 static bool eval(mpfr_srcptr f, unsigned long int l)
787 { return mpfr_cmp_ui(f, l) != 0; }
788 static bool eval(unsigned long int l, mpfr_srcptr f)
789 { return mpfr_cmp_ui(f, l) != 0; }
790 static bool eval(mpfr_srcptr f, signed long int l)
791 { return mpfr_cmp_si(f, l) != 0; }
792 static bool eval(signed long int l, mpfr_srcptr f)
793 { return mpfr_cmp_si(f, l) != 0; }
794 static bool eval(mpfr_srcptr f, double d)
795 { return mpfr_cmp_d(f, d) != 0; }
796 static bool eval(double d, mpfr_srcptr f)
797 { return mpfr_cmp_d(f, d) != 0; }
798};
799
801{
802 static bool eval(mpz_srcptr z, mpz_srcptr w) { return mpz_cmp(z, w) < 0; }
803
804 static bool eval(mpz_srcptr z, unsigned long int l)
805 { return mpz_cmp_ui(z, l) < 0; }
806 static bool eval(unsigned long int l, mpz_srcptr z)
807 { return mpz_cmp_ui(z, l) > 0; }
808 static bool eval(mpz_srcptr z, signed long int l)
809 { return mpz_cmp_si(z, l) < 0; }
810 static bool eval(signed long int l, mpz_srcptr z)
811 { return mpz_cmp_si(z, l) > 0; }
812 static bool eval(mpz_srcptr z, double d)
813 { return mpz_cmp_d(z, d) < 0; }
814 static bool eval(double d, mpz_srcptr z)
815 { return mpz_cmp_d(z, d) > 0; }
816
817 static bool eval(mpq_srcptr q, mpq_srcptr r) { return mpq_cmp(q, r) < 0; }
818
819 static bool eval(mpq_srcptr q, unsigned long int l)
820 { return mpq_cmp_ui(q, l, 1) < 0; }
821 static bool eval(unsigned long int l, mpq_srcptr q)
822 { return mpq_cmp_ui(q, l, 1) > 0; }
823 static bool eval(mpq_srcptr q, signed long int l)
824 { return mpq_cmp_si(q, l, 1) < 0; }
825 static bool eval(signed long int l, mpq_srcptr q)
826 { return mpq_cmp_si(q, l, 1) > 0; }
827 static bool eval(mpq_srcptr q, double d)
828 {
829 bool b;
830 mpq_t temp;
831 mpq_init(temp);
832 mpq_set_d(temp, d);
833 b = (mpq_cmp(q, temp) < 0);
834 mpq_clear(temp);
835 return b;
836 }
837 static bool eval(double d, mpq_srcptr q)
838 {
839 bool b;
840 mpq_t temp;
841 mpq_init(temp);
842 mpq_set_d(temp, d);
843 b = (mpq_cmp(temp, q) < 0);
844 mpq_clear(temp);
845 return b;
846 }
847
848 static bool eval(mpfr_srcptr f, mpfr_srcptr g) { return mpfr_cmp(f, g) < 0; }
849
850 static bool eval(mpfr_srcptr f, unsigned long int l)
851 { return mpfr_cmp_ui(f, l) < 0; }
852 static bool eval(unsigned long int l, mpfr_srcptr f)
853 { return mpfr_cmp_ui(f, l) > 0; }
854 static bool eval(mpfr_srcptr f, signed long int l)
855 { return mpfr_cmp_si(f, l) < 0; }
856 static bool eval(signed long int l, mpfr_srcptr f)
857 { return mpfr_cmp_si(f, l) > 0; }
858 static bool eval(mpfr_srcptr f, double d)
859 { return mpfr_cmp_d(f, d) < 0; }
860 static bool eval(double d, mpfr_srcptr f)
861 { return mpfr_cmp_d(f, d) > 0; }
862};
863
865{
866 static bool eval(mpz_srcptr z, mpz_srcptr w) { return mpz_cmp(z, w) <= 0; }
867
868 static bool eval(mpz_srcptr z, unsigned long int l)
869 { return mpz_cmp_ui(z, l) <= 0; }
870 static bool eval(unsigned long int l, mpz_srcptr z)
871 { return mpz_cmp_ui(z, l) >= 0; }
872 static bool eval(mpz_srcptr z, signed long int l)
873 { return mpz_cmp_si(z, l) <= 0; }
874 static bool eval(signed long int l, mpz_srcptr z)
875 { return mpz_cmp_si(z, l) >= 0; }
876 static bool eval(mpz_srcptr z, double d)
877 { return mpz_cmp_d(z, d) <= 0; }
878 static bool eval(double d, mpz_srcptr z)
879 { return mpz_cmp_d(z, d) >= 0; }
880
881 static bool eval(mpq_srcptr q, mpq_srcptr r) { return mpq_cmp(q, r) <= 0; }
882
883 static bool eval(mpq_srcptr q, unsigned long int l)
884 { return mpq_cmp_ui(q, l, 1) <= 0; }
885 static bool eval(unsigned long int l, mpq_srcptr q)
886 { return mpq_cmp_ui(q, l, 1) >= 0; }
887 static bool eval(mpq_srcptr q, signed long int l)
888 { return mpq_cmp_si(q, l, 1) <= 0; }
889 static bool eval(signed long int l, mpq_srcptr q)
890 { return mpq_cmp_si(q, l, 1) >= 0; }
891 static bool eval(mpq_srcptr q, double d)
892 {
893 bool b;
894 mpq_t temp;
895 mpq_init(temp);
896 mpq_set_d(temp, d);
897 b = (mpq_cmp(q, temp) <= 0);
898 mpq_clear(temp);
899 return b;
900 }
901 static bool eval(double d, mpq_srcptr q)
902 {
903 bool b;
904 mpq_t temp;
905 mpq_init(temp);
906 mpq_set_d(temp, d);
907 b = (mpq_cmp(temp, q) <= 0);
908 mpq_clear(temp);
909 return b;
910 }
911
912 static bool eval(mpfr_srcptr f, mpfr_srcptr g) { return mpfr_cmp(f, g) <= 0; }
913
914 static bool eval(mpfr_srcptr f, unsigned long int l)
915 { return mpfr_cmp_ui(f, l) <= 0; }
916 static bool eval(unsigned long int l, mpfr_srcptr f)
917 { return mpfr_cmp_ui(f, l) >= 0; }
918 static bool eval(mpfr_srcptr f, signed long int l)
919 { return mpfr_cmp_si(f, l) <= 0; }
920 static bool eval(signed long int l, mpfr_srcptr f)
921 { return mpfr_cmp_si(f, l) >= 0; }
922 static bool eval(mpfr_srcptr f, double d)
923 { return mpfr_cmp_d(f, d) <= 0; }
924 static bool eval(double d, mpfr_srcptr f)
925 { return mpfr_cmp_d(f, d) >= 0; }
926};
927
929{
930 static bool eval(mpz_srcptr z, mpz_srcptr w) { return mpz_cmp(z, w) > 0; }
931
932 static bool eval(mpz_srcptr z, unsigned long int l)
933 { return mpz_cmp_ui(z, l) > 0; }
934 static bool eval(unsigned long int l, mpz_srcptr z)
935 { return mpz_cmp_ui(z, l) < 0; }
936 static bool eval(mpz_srcptr z, signed long int l)
937 { return mpz_cmp_si(z, l) > 0; }
938 static bool eval(signed long int l, mpz_srcptr z)
939 { return mpz_cmp_si(z, l) < 0; }
940 static bool eval(mpz_srcptr z, double d)
941 { return mpz_cmp_d(z, d) > 0; }
942 static bool eval(double d, mpz_srcptr z)
943 { return mpz_cmp_d(z, d) < 0; }
944
945 static bool eval(mpq_srcptr q, mpq_srcptr r) { return mpq_cmp(q, r) > 0; }
946
947 static bool eval(mpq_srcptr q, unsigned long int l)
948 { return mpq_cmp_ui(q, l, 1) > 0; }
949 static bool eval(unsigned long int l, mpq_srcptr q)
950 { return mpq_cmp_ui(q, l, 1) < 0; }
951 static bool eval(mpq_srcptr q, signed long int l)
952 { return mpq_cmp_si(q, l, 1) > 0; }
953 static bool eval(signed long int l, mpq_srcptr q)
954 { return mpq_cmp_si(q, l, 1) < 0; }
955 static bool eval(mpq_srcptr q, double d)
956 {
957 bool b;
958 mpq_t temp;
959 mpq_init(temp);
960 mpq_set_d(temp, d);
961 b = (mpq_cmp(q, temp) > 0);
962 mpq_clear(temp);
963 return b;
964 }
965 static bool eval(double d, mpq_srcptr q)
966 {
967 bool b;
968 mpq_t temp;
969 mpq_init(temp);
970 mpq_set_d(temp, d);
971 b = (mpq_cmp(temp, q) > 0);
972 mpq_clear(temp);
973 return b;
974 }
975
976 static bool eval(mpfr_srcptr f, mpfr_srcptr g) { return mpfr_cmp(f, g) > 0; }
977
978 static bool eval(mpfr_srcptr f, unsigned long int l)
979 { return mpfr_cmp_ui(f, l) > 0; }
980 static bool eval(unsigned long int l, mpfr_srcptr f)
981 { return mpfr_cmp_ui(f, l) < 0; }
982 static bool eval(mpfr_srcptr f, signed long int l)
983 { return mpfr_cmp_si(f, l) > 0; }
984 static bool eval(signed long int l, mpfr_srcptr f)
985 { return mpfr_cmp_si(f, l) < 0; }
986 static bool eval(mpfr_srcptr f, double d)
987 { return mpfr_cmp_d(f, d) > 0; }
988 static bool eval(double d, mpfr_srcptr f)
989 { return mpfr_cmp_d(f, d) < 0; }
990};
991
992// not in gmpxx.h
994{
995 static int eval(mpfr_srcptr f, mpfr_srcptr g)
996 { return mpfr_cmpabs(f, g); }
997};
998
1000{
1001 static bool eval(mpz_srcptr z, mpz_srcptr w) { return mpz_cmp(z, w) >= 0; }
1002
1003 static bool eval(mpz_srcptr z, unsigned long int l)
1004 { return mpz_cmp_ui(z, l) >= 0; }
1005 static bool eval(unsigned long int l, mpz_srcptr z)
1006 { return mpz_cmp_ui(z, l) <= 0; }
1007 static bool eval(mpz_srcptr z, signed long int l)
1008 { return mpz_cmp_si(z, l) >= 0; }
1009 static bool eval(signed long int l, mpz_srcptr z)
1010 { return mpz_cmp_si(z, l) <= 0; }
1011 static bool eval(mpz_srcptr z, double d)
1012 { return mpz_cmp_d(z, d) >= 0; }
1013 static bool eval(double d, mpz_srcptr z)
1014 { return mpz_cmp_d(z, d) <= 0; }
1015
1016 static bool eval(mpq_srcptr q, mpq_srcptr r) { return mpq_cmp(q, r) >= 0; }
1017
1018 static bool eval(mpq_srcptr q, unsigned long int l)
1019 { return mpq_cmp_ui(q, l, 1) >= 0; }
1020 static bool eval(unsigned long int l, mpq_srcptr q)
1021 { return mpq_cmp_ui(q, l, 1) <= 0; }
1022 static bool eval(mpq_srcptr q, signed long int l)
1023 { return mpq_cmp_si(q, l, 1) >= 0; }
1024 static bool eval(signed long int l, mpq_srcptr q)
1025 { return mpq_cmp_si(q, l, 1) <= 0; }
1026 static bool eval(mpq_srcptr q, double d)
1027 {
1028 bool b;
1029 mpq_t temp;
1030 mpq_init(temp);
1031 mpq_set_d(temp, d);
1032 b = (mpq_cmp(q, temp) >= 0);
1033 mpq_clear(temp);
1034 return b;
1035 }
1036 static bool eval(double d, mpq_srcptr q)
1037 {
1038 bool b;
1039 mpq_t temp;
1040 mpq_init(temp);
1041 mpq_set_d(temp, d);
1042 b = (mpq_cmp(temp, q) >= 0);
1043 mpq_clear(temp);
1044 return b;
1045 }
1046
1047 static bool eval(mpfr_srcptr f, mpfr_srcptr g) { return mpfr_cmp(f, g) >= 0; }
1048
1049 static bool eval(mpfr_srcptr f, unsigned long int l)
1050 { return mpfr_cmp_ui(f, l) >= 0; }
1051 static bool eval(unsigned long int l, mpfr_srcptr f)
1052 { return mpfr_cmp_ui(f, l) <= 0; }
1053 static bool eval(mpfr_srcptr f, signed long int l)
1054 { return mpfr_cmp_si(f, l) >= 0; }
1055 static bool eval(signed long int l, mpfr_srcptr f)
1056 { return mpfr_cmp_si(f, l) <= 0; }
1057 static bool eval(mpfr_srcptr f, double d)
1058 { return mpfr_cmp_d(f, d) >= 0; }
1059 static bool eval(double d, mpfr_srcptr f)
1060 { return mpfr_cmp_d(f, d) <= 0; }
1061};
1062
1064{
1065 static void eval(mpz_ptr z) { mpz_add_ui(z, z, 1); }
1066 static void eval(mpq_ptr q)
1067 { mpz_add(mpq_numref(q), mpq_numref(q), mpq_denref(q)); }
1068 static void eval(mpfr_ptr f) { mpfr_add_ui(f, f, 1, MpFrC::get_rnd()); }
1069};
1070
1072{
1073 static void eval(mpz_ptr z) { mpz_sub_ui(z, z, 1); }
1074 static void eval(mpq_ptr q)
1075 { mpz_sub(mpq_numref(q), mpq_numref(q), mpq_denref(q)); }
1076 static void eval(mpfr_ptr f) { mpfr_sub_ui(f, f, 1, MpFrC::get_rnd()); }
1077};
1078
1080{
1081 static void eval(mpz_ptr z, mpz_srcptr w) { mpz_abs(z, w); }
1082 static void eval(mpq_ptr q, mpq_srcptr r) { mpq_abs(q, r); }
1083 static void eval(mpfr_ptr f, mpfr_srcptr g)
1084 { mpfr_abs(f, g, MpFrC::get_rnd()); }
1085};
1086
1087struct __gmp_dim_function // not in gmpxx
1088{
1089 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
1090 { mpfr_dim(f, g, h, MpFrC::get_rnd()); }
1091};
1092
1093struct __gmp_rint_function // not in gmpxx
1094{
1095 static void eval(mpfr_ptr f, mpfr_srcptr g)
1096 { mpfr_rint(f, g, MpFrC::get_rnd()); }
1097};
1098
1100{
1101 static void eval(mpfr_ptr f, mpfr_srcptr g) { mpfr_trunc(f, g); }
1102};
1103
1105{
1106 static void eval(mpfr_ptr f, mpfr_srcptr g) { mpfr_floor(f, g); }
1107};
1108
1110{
1111 static void eval(mpfr_ptr f, mpfr_srcptr g) { mpfr_ceil(f, g); }
1112};
1113
1114struct __gmp_sqr_function // not in gmpxx
1115{
1116 static void eval(mpfr_ptr f, mpfr_srcptr g)
1117 { mpfr_sqr(f, g, MpFrC::get_rnd()); }
1118};
1119
1121{
1122 static void eval(mpz_ptr z, mpz_srcptr w) { mpz_sqrt(z, w); }
1123 static void eval(mpfr_ptr f, mpfr_srcptr g)
1124 { mpfr_sqrt(f, g, MpFrC::get_rnd()); }
1125};
1126
1127struct __gmp_cbrt_function // not in gmpxx
1128{
1129 static void eval(mpfr_ptr f, mpfr_srcptr g)
1130 { mpfr_cbrt(f, g, MpFrC::get_rnd()); }
1131};
1132
1133struct __gmp_root_function // not in gmpxx
1134{
1135 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
1136 {
1137#if MPFR_VERSION_MAJOR >= 4
1138 mpfr_rootn_ui(f, g, l, MpFrC::get_rnd()); // New API (MPFR >= 4.0)
1139#else
1140 mpfr_root(f, g, l, MpFrC::get_rnd()); // Legacy API (MPFR < 4.0)
1141#endif
1142 }
1143};
1144
1145struct __gmp_pow_function // not in gmpxx
1146{
1147 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
1148 { mpfr_pow(f, g, h, MpFrC::get_rnd()); }
1149 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
1150 { mpfr_pow_ui(f, g, l, MpFrC::get_rnd()); }
1151 static void eval(mpfr_ptr f, mpfr_srcptr g, long int l)
1152 { mpfr_pow_si(f, g, l, MpFrC::get_rnd()); }
1153 static void eval(mpfr_ptr f, mpfr_srcptr g, mpz_srcptr z)
1154 { mpfr_pow_z(f, g, z, MpFrC::get_rnd()); }
1155 static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr h)
1156 { mpfr_ui_pow(f, l, h, MpFrC::get_rnd()); }
1157 static void eval(mpfr_ptr f, unsigned long int l, unsigned long int h)
1158 { mpfr_ui_pow_ui(f, l, h, MpFrC::get_rnd()); }
1159};
1160
1161struct __gmp_log_function // not in gmpxx
1162{
1163 static void eval(mpfr_ptr f, mpfr_srcptr g)
1164 { mpfr_log(f, g, MpFrC::get_rnd()); }
1165};
1166
1167struct __gmp_log2_function // not in gmpxx
1168{
1169 static void eval(mpfr_ptr f, mpfr_srcptr g)
1170 { mpfr_log2(f, g, MpFrC::get_rnd()); }
1171};
1172
1173struct __gmp_log10_function // not in gmpxx
1174{
1175 static void eval(mpfr_ptr f, mpfr_srcptr g)
1176 { mpfr_log10(f, g, MpFrC::get_rnd()); }
1177};
1178
1179struct __gmp_exp_function // not in gmpxx
1180{
1181 static void eval(mpfr_ptr f, mpfr_srcptr g)
1182 { mpfr_exp(f, g, MpFrC::get_rnd()); }
1183};
1184
1185struct __gmp_exp2_function // not in gmpxx
1186{
1187 static void eval(mpfr_ptr f, mpfr_srcptr g)
1188 { mpfr_exp2(f, g, MpFrC::get_rnd()); }
1189};
1190
1191struct __gmp_exp10_function // not in gmpxx
1192{
1193 static void eval(mpfr_ptr f, mpfr_srcptr g)
1194 { mpfr_exp10(f, g, MpFrC::get_rnd()); }
1195};
1196
1197struct __gmp_cos_function // not in gmpxx
1198{
1199 static void eval(mpfr_ptr f, mpfr_srcptr g)
1200 { mpfr_cos(f, g, MpFrC::get_rnd()); }
1201};
1202
1203struct __gmp_sin_function // not in gmpxx
1204{
1205 static void eval(mpfr_ptr f, mpfr_srcptr g)
1206 { mpfr_sin(f, g, MpFrC::get_rnd()); }
1207};
1208
1209struct __gmp_tan_function // not in gmpxx
1210{
1211 static void eval(mpfr_ptr f, mpfr_srcptr g)
1212 { mpfr_tan(f, g, MpFrC::get_rnd()); }
1213};
1214
1215struct __gmp_sec_function // not in gmpxx
1216{
1217 static void eval(mpfr_ptr f, mpfr_srcptr g)
1218 { mpfr_sec(f, g, MpFrC::get_rnd()); }
1219};
1220
1221struct __gmp_csc_function // not in gmpxx
1222{
1223 static void eval(mpfr_ptr f, mpfr_srcptr g)
1224 { mpfr_csc(f, g, MpFrC::get_rnd()); }
1225};
1226
1227struct __gmp_cot_function // not in gmpxx
1228{
1229 static void eval(mpfr_ptr f, mpfr_srcptr g)
1230 { mpfr_cot(f, g, MpFrC::get_rnd()); }
1231};
1232
1233struct __gmp_acos_function // not in gmpxx
1234{
1235 static void eval(mpfr_ptr f, mpfr_srcptr g)
1236 { mpfr_acos(f, g, MpFrC::get_rnd()); }
1237};
1238
1239struct __gmp_asin_function // not in gmpxx
1240{
1241 static void eval(mpfr_ptr f, mpfr_srcptr g)
1242 { mpfr_asin(f, g, MpFrC::get_rnd()); }
1243};
1244
1245struct __gmp_atan_function // not in gmpxx
1246{
1247 static void eval(mpfr_ptr f, mpfr_srcptr g)
1248 { mpfr_atan(f, g, MpFrC::get_rnd()); }
1249};
1250
1251struct __gmp_atan2_function // not in gmpxx
1252{
1253 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
1254 { mpfr_atan2(f, g, h, MpFrC::get_rnd()); }
1255};
1256
1257struct __gmp_cosh_function // not in gmpxx
1258{
1259 static void eval(mpfr_ptr f, mpfr_srcptr g)
1260 { mpfr_cosh(f, g, MpFrC::get_rnd()); }
1261};
1262
1263struct __gmp_sinh_function // not in gmpxx
1264{
1265 static void eval(mpfr_ptr f, mpfr_srcptr g)
1266 { mpfr_sinh(f, g, MpFrC::get_rnd()); }
1267};
1268
1269struct __gmp_tanh_function // not in gmpxx
1270{
1271 static void eval(mpfr_ptr f, mpfr_srcptr g)
1272 { mpfr_tanh(f, g, MpFrC::get_rnd()); }
1273};
1274
1275struct __gmp_sech_function // not in gmpxx
1276{
1277 static void eval(mpfr_ptr f, mpfr_srcptr g)
1278 { mpfr_sech(f, g, MpFrC::get_rnd()); }
1279};
1280
1281struct __gmp_csch_function // not in gmpxx
1282{
1283 static void eval(mpfr_ptr f, mpfr_srcptr g)
1284 { mpfr_csch(f, g, MpFrC::get_rnd()); }
1285};
1286
1287struct __gmp_coth_function // not in gmpxx
1288{
1289 static void eval(mpfr_ptr f, mpfr_srcptr g)
1290 { mpfr_coth(f, g, MpFrC::get_rnd()); }
1291};
1292
1293struct __gmp_acosh_function // not in gmpxx
1294{
1295 static void eval(mpfr_ptr f, mpfr_srcptr g)
1296 { mpfr_acosh(f, g, MpFrC::get_rnd()); }
1297};
1298
1299struct __gmp_asinh_function // not in gmpxx
1300{
1301 static void eval(mpfr_ptr f, mpfr_srcptr g)
1302 { mpfr_asinh(f, g, MpFrC::get_rnd()); }
1303};
1304
1305struct __gmp_atanh_function // not in gmpxx
1306{
1307 static void eval(mpfr_ptr f, mpfr_srcptr g)
1308 { mpfr_atanh(f, g, MpFrC::get_rnd()); }
1309};
1310
1311struct __gmp_fac_ui_function // not in gmpxx
1312{
1313 static void eval(mpfr_ptr f, unsigned long int l)
1314 { mpfr_fac_ui(f, l, MpFrC::get_rnd()); }
1315};
1316
1317struct __gmp_log1p_function // not in gmpxx
1318{
1319 static void eval(mpfr_ptr f, mpfr_srcptr g)
1320 { mpfr_log1p(f, g, MpFrC::get_rnd()); }
1321};
1322
1323struct __gmp_expm1_function // not in gmpxx
1324{
1325 static void eval(mpfr_ptr f, mpfr_srcptr g)
1326 { mpfr_expm1(f, g, MpFrC::get_rnd()); }
1327};
1328
1329struct __gmp_eint_function // not in gmpxx
1330{
1331 static void eval(mpfr_ptr f, mpfr_srcptr g)
1332 { mpfr_eint(f, g, MpFrC::get_rnd()); }
1333};
1334
1335struct __gmp_gamma_function // not in gmpxx
1336{
1337 static void eval(mpfr_ptr f, mpfr_srcptr g)
1338 { mpfr_gamma(f, g, MpFrC::get_rnd()); }
1339};
1340
1341struct __gmp_lngamma_function // not in gmpxx
1342{
1343 static void eval(mpfr_ptr f, mpfr_srcptr g)
1344 { mpfr_lngamma(f, g, MpFrC::get_rnd()); }
1345};
1346
1347struct __gmp_lgamma_function // not in gmpxx
1348{
1349 static void eval(mpfr_ptr f, mpfr_srcptr g)
1350 { int sgnp; // discarded
1351 mpfr_lgamma(f, &sgnp, g, MpFrC::get_rnd()); }
1352};
1353
1354struct __gmp_zeta_function // not in gmpxx
1355{
1356 static void eval(mpfr_ptr f, mpfr_srcptr g)
1357 { mpfr_zeta(f, g, MpFrC::get_rnd()); }
1358 static void eval(mpfr_ptr f, unsigned long int l)
1359 { mpfr_zeta_ui(f, l, MpFrC::get_rnd()); }
1360};
1361
1362struct __gmp_erf_function // not in gmpxx
1363{
1364 static void eval(mpfr_ptr f, mpfr_srcptr g)
1365 { mpfr_erf(f, g, MpFrC::get_rnd()); }
1366};
1367
1368struct __gmp_erfc_function // not in gmpxx
1369{
1370 static void eval(mpfr_ptr f, mpfr_srcptr g)
1371 { mpfr_erfc(f, g, MpFrC::get_rnd()); }
1372};
1373
1374struct __gmp_j0_function // not in gmpxx
1375{
1376 static void eval(mpfr_ptr f, mpfr_srcptr g)
1377 { mpfr_j0(f, g, MpFrC::get_rnd()); }
1378};
1379
1380struct __gmp_j1_function // not in gmpxx
1381{
1382 static void eval(mpfr_ptr f, mpfr_srcptr g)
1383 { mpfr_j1(f, g, MpFrC::get_rnd()); }
1384};
1385
1386struct __gmp_jn_function // not in gmpxx
1387{
1388// static void eval(mpfr_ptr f, mpfr_srcptr g, long h)
1389// { mpfr_jn(f, h, g, MpFrC::get_rnd()); }
1390 static void eval(mpfr_ptr f, long h, mpfr_srcptr g)
1391 { mpfr_jn(f, h, g, MpFrC::get_rnd()); }
1392};
1393
1394struct __gmp_y0_function // not in gmpxx
1395{
1396 static void eval(mpfr_ptr f, mpfr_srcptr g)
1397 { mpfr_y0(f, g, MpFrC::get_rnd()); }
1398};
1399
1400struct __gmp_y1_function // not in gmpxx
1401{
1402 static void eval(mpfr_ptr f, mpfr_srcptr g)
1403 { mpfr_y1(f, g, MpFrC::get_rnd()); }
1404};
1405
1406struct __gmp_yn_function // not in gmpxx
1407{
1408// static void eval(mpfr_ptr f, mpfr_srcptr g, long h)
1409// { mpfr_yn(f, h, g, MpFrC::get_rnd()); }
1410 static void eval(mpfr_ptr f, long h, mpfr_srcptr g)
1411 { mpfr_yn(f, h, g, MpFrC::get_rnd()); }
1412};
1413
1414struct __gmp_agm_function // not in gmpxx
1415{
1416 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
1417 { mpfr_agm(f, g, h, MpFrC::get_rnd()); }
1418};
1419
1420struct __gmp_const_log2_function // not in gmpxx
1421{
1422 static void eval(mpfr_ptr f)
1423 { mpfr_const_log2(f, MpFrC::get_rnd()); }
1424};
1425
1426struct __gmp_const_pi_function // not in gmpxx
1427{
1428 static void eval(mpfr_ptr f)
1429 { mpfr_const_pi(f, MpFrC::get_rnd()); }
1430};
1431
1432struct __gmp_const_euler_function // not in gmpxx
1433{
1434 static void eval(mpfr_ptr f)
1435 { mpfr_const_euler(f, MpFrC::get_rnd()); }
1436};
1437
1438struct __gmp_const_catalan_function // not in gmpxx
1439{
1440 static void eval(mpfr_ptr f)
1441 { mpfr_const_catalan(f, MpFrC::get_rnd()); }
1442};
1443
1444struct __gmp_max_function // not in gmpxx
1445{
1446 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
1447 { mpfr_max(f, g, h, MpFrC::get_rnd()); }
1448};
1449
1450struct __gmp_min_function // not in gmpxx
1451{
1452 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
1453 { mpfr_min(f, g, h, MpFrC::get_rnd()); }
1454};
1455
1457{
1458 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
1459 {
1460 mpfr_hypot(f, g, h, MpFrC::get_rnd());
1461 }
1462
1463 static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
1464 {
1465 mpfr_set_ui(f, l, MpFrC::get_rnd());
1466 mpfr_hypot(f, g, f, MpFrC::get_rnd());
1467 }
1468 static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
1469 {
1470 mpfr_set_ui(f, l, MpFrC::get_rnd());
1471 mpfr_hypot(f, g, f, MpFrC::get_rnd());
1472 }
1473 static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
1474 {
1475 mpfr_set_si(f, l, MpFrC::get_rnd());
1476 mpfr_hypot(f, g, f, MpFrC::get_rnd());
1477 }
1478 static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
1479 {
1480 mpfr_set_si(f, l, MpFrC::get_rnd());
1481 mpfr_hypot(f, g, f, MpFrC::get_rnd());
1482 }
1483 static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
1484 {
1485 mpfr_set_d(f, d, MpFrC::get_rnd());
1486 mpfr_hypot(f, g, f, MpFrC::get_rnd());
1487 }
1488 static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
1489 {
1490 mpfr_set_d(f, d, MpFrC::get_rnd());
1491 mpfr_hypot(f, g, f, MpFrC::get_rnd());
1492 }
1493};
1494
1495struct __gmp_frac_function // not in gmpxx
1496{
1497 static void eval(mpfr_ptr f, mpfr_srcptr g)
1498 { mpfr_frac(f, g, MpFrC::get_rnd()); }
1499};
1500
1501struct __gmp_remainder_function // not in gmpxx
1502{
1503 static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
1504 { mpfr_remainder(f, g, h, MpFrC::get_rnd()); }
1505};
1506
1508{
1509 static int eval(mpz_srcptr z) { return mpz_sgn(z); }
1510 static int eval(mpq_srcptr q) { return mpq_sgn(q); }
1511 static int eval(mpfr_srcptr f) { return mpfr_sgn(f); }
1512};
1513
1515{
1516 static int eval(mpz_srcptr z, mpz_srcptr w) { return mpz_cmp(z, w); }
1517
1518 static int eval(mpz_srcptr z, unsigned long int l)
1519 { return mpz_cmp_ui(z, l); }
1520 static int eval(unsigned long int l, mpz_srcptr z)
1521 { return -mpz_cmp_ui(z, l); }
1522 static int eval(mpz_srcptr z, signed long int l)
1523 { return mpz_cmp_si(z, l); }
1524 static int eval(signed long int l, mpz_srcptr z)
1525 { return -mpz_cmp_si(z, l); }
1526 static int eval(mpz_srcptr z, double d)
1527 { return mpz_cmp_d(z, d); }
1528 static int eval(double d, mpz_srcptr z)
1529 { return -mpz_cmp_d(z, d); }
1530
1531 static int eval(mpq_srcptr q, mpq_srcptr r) { return mpq_cmp(q, r); }
1532
1533 static int eval(mpq_srcptr q, unsigned long int l)
1534 { return mpq_cmp_ui(q, l, 1); }
1535 static int eval(unsigned long int l, mpq_srcptr q)
1536 { return -mpq_cmp_ui(q, l, 1); }
1537 static int eval(mpq_srcptr q, signed long int l)
1538 { return mpq_cmp_si(q, l, 1); }
1539 static int eval(signed long int l, mpq_srcptr q)
1540 { return -mpq_cmp_si(q, l, 1); }
1541 static int eval(mpq_srcptr q, double d)
1542 {
1543 int i;
1544 mpq_t temp;
1545 mpq_init(temp);
1546 mpq_set_d(temp, d);
1547 i = mpq_cmp(q, temp);
1548 mpq_clear(temp);
1549 return i;
1550 }
1551 static int eval(double d, mpq_srcptr q)
1552 {
1553 int i;
1554 mpq_t temp;
1555 mpq_init(temp);
1556 mpq_set_d(temp, d);
1557 i = mpq_cmp(temp, q);
1558 mpq_clear(temp);
1559 return i;
1560 }
1561
1562 static int eval(mpfr_srcptr f, mpfr_srcptr g) { return mpfr_cmp(f, g); }
1563
1564 static int eval(mpfr_srcptr f, unsigned long int l)
1565 { return mpfr_cmp_ui(f, l); }
1566 static int eval(unsigned long int l, mpfr_srcptr f)
1567 { return -mpfr_cmp_ui(f, l); }
1568 static int eval(mpfr_srcptr f, signed long int l)
1569 { return mpfr_cmp_si(f, l); }
1570 static int eval(signed long int l, mpfr_srcptr f)
1571 { return -mpfr_cmp_si(f, l); }
1572 static int eval(mpfr_srcptr f, double d)
1573 { return mpfr_cmp_d(f, d); }
1574 static int eval(double d, mpfr_srcptr f)
1575 { return -mpfr_cmp_d(f, d); }
1576};
1577
1578struct __gmp_ternary_addmul // z = w + v * u
1579{
1580 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, mpz_srcptr u)
1581 { mpz_set(z, w); mpz_addmul(z, v, u); }
1582
1583 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, unsigned long int l)
1584 { mpz_set(z, w); mpz_addmul_ui(z, v, l); }
1585 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l, mpz_srcptr v)
1586 { mpz_set(z, w); mpz_addmul_ui(z, v, l); }
1587 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, signed long int l)
1588 {
1589 mpz_set(z, w);
1590 if (l >= 0)
1591 mpz_addmul_ui(z, v, l);
1592 else
1593 mpz_submul_ui(z, v, -l);
1594 }
1595 static void eval(mpz_ptr z, mpz_srcptr w, signed long int l, mpz_srcptr v)
1596 {
1597 mpz_set(z, w);
1598 if (l >= 0)
1599 mpz_addmul_ui(z, v, l);
1600 else
1601 mpz_submul_ui(z, v, -l);
1602 }
1603 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, double d)
1604 {
1605 mpz_t temp;
1606 mpz_init_set_d(temp, d);
1607 mpz_set(z, w);
1608 mpz_addmul(z, v, temp);
1609 mpz_clear(temp);
1610 }
1611 static void eval(mpz_ptr z, mpz_srcptr w, double d, mpz_srcptr v)
1612 {
1613 mpz_t temp;
1614 mpz_init_set_d(temp, d);
1615 mpz_set(z, w);
1616 mpz_addmul(z, temp, v);
1617 mpz_clear(temp);
1618 }
1619};
1620
1621struct __gmp_ternary_submul // z = w - v * u
1622{
1623 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, mpz_srcptr u)
1624 { mpz_set(z, w); mpz_submul(z, v, u); }
1625
1626 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, unsigned long int l)
1627 { mpz_set(z, w); mpz_submul_ui(z, v, l); }
1628 static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l, mpz_srcptr v)
1629 { mpz_set(z, w); mpz_submul_ui(z, v, l); }
1630 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, signed long int l)
1631 {
1632 mpz_set(z, w);
1633 if (l >= 0)
1634 mpz_submul_ui(z, v, l);
1635 else
1636 mpz_addmul_ui(z, v, -l);
1637 }
1638 static void eval(mpz_ptr z, mpz_srcptr w, signed long int l, mpz_srcptr v)
1639 {
1640 mpz_set(z, w);
1641 if (l >= 0)
1642 mpz_submul_ui(z, v, l);
1643 else
1644 mpz_addmul_ui(z, v, -l);
1645 }
1646 static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, double d)
1647 {
1648 mpz_t temp;
1649 mpz_init_set_d(temp, d);
1650 mpz_set(z, w);
1651 mpz_submul(z, v, temp);
1652 mpz_clear(temp);
1653 }
1654 static void eval(mpz_ptr z, mpz_srcptr w, double d, mpz_srcptr v)
1655 {
1656 mpz_t temp;
1657 mpz_init_set_d(temp, d);
1658 mpz_set(z, w);
1659 mpz_submul(z, temp, v);
1660 mpz_clear(temp);
1661 }
1662};
1663
1665{
1666 static void eval(mpz_ptr z, gmp_randstate_t s, unsigned long int l)
1667 { mpz_urandomb(z, s, l); }
1668 static void eval(mpz_ptr z, gmp_randstate_t s, mpz_srcptr w)
1669 { mpz_urandomm(z, s, w); }
1670 static void eval(mpfr_ptr f, gmp_randstate_t s, unsigned long int prec)
1671 {
1672 // note code change from gmpxx.h
1673 unsigned long int precf = mpfr_get_prec(f);
1674 if (prec == precf) {
1675 mpfr_urandomb(f, s);
1676 }
1677 else {
1678 mpfr_set_prec(f, prec);
1679 mpfr_urandomb(f, s);
1680 mpfr_prec_round(f, precf, MpFrC::get_rnd());
1681 }
1682 }
1683};
1684
1685
1686/**************** Auxiliary classes ****************/
1687
1688/* this is much the same as gmp_allocated_string in gmp-impl.h
1689 since gmp-impl.h is not publicly available, I redefine it here
1690 I use a different name to avoid possible clashes */
1692{
1693 char *str;
1694 __gmp_alloc_cstring(char *s) { str = s; }
1696 {
1697 if (str == nullptr)
1698 return;
1699
1700 void (*freefunc) (void *, size_t);
1701 mp_get_memory_functions (nullptr, nullptr, &freefunc);
1702 (*freefunc) (str, std::strlen(str)+1);
1703 }
1704
1705 const char * c_str() const
1706 {
1707 if (str == nullptr)
1708 throw std::bad_alloc();
1709 return str;
1710 }
1711};
1712
1713
1714// general expression template class
1715template <class T, class U>
1717
1718
1719// templates for resolving expression types
1720template <class T>
1722{
1723 typedef T ref_type;
1724};
1725
1726template <class T, class U>
1728{
1730};
1731
1732
1733template <class T, class U = T>
1735
1736template <>
1738{
1739 typedef mpz_t value_type;
1740 typedef mpz_ptr ptr_type;
1741};
1742
1743template <>
1745{
1746 typedef mpq_t value_type;
1747 typedef mpq_ptr ptr_type;
1748};
1749
1750template <>
1752{
1753 typedef mpfr_t value_type;
1754 typedef mpfr_ptr ptr_type;
1755};
1756
1757template <>
1758struct __gmp_resolve_expr<mpz_t, mpq_t>
1759{
1760 typedef mpq_t value_type;
1761};
1762
1763template <>
1764struct __gmp_resolve_expr<mpq_t, mpz_t>
1765{
1766 typedef mpq_t value_type;
1767};
1768
1769template <>
1770struct __gmp_resolve_expr<mpz_t, mpfr_t>
1771{
1772 typedef mpfr_t value_type;
1773};
1774
1775template <>
1776struct __gmp_resolve_expr<mpfr_t, mpz_t>
1777{
1778 typedef mpfr_t value_type;
1779};
1780
1781template <>
1782struct __gmp_resolve_expr<mpq_t, mpfr_t>
1783{
1784 typedef mpfr_t value_type;
1785};
1786
1787template <>
1788struct __gmp_resolve_expr<mpfr_t, mpq_t>
1789{
1790 typedef mpfr_t value_type;
1791};
1792
1793
1794
1795template <class T, class U, class V>
1800
1801template <class T>
1802struct __gmp_resolve_temp<T, T, T>
1803{
1805};
1806
1807
1808// classes for evaluating unary and binary expressions
1809template <class T, class Op>
1811{
1812 // const T &val; // <-- gmpxx implementation
1813 typename __gmp_resolve_ref<T>::ref_type val; // modification
1814
1815 __gmp_unary_expr(const T &v) : val(v) { }
1816private:
1818};
1819
1820template <class T, class U, class Op>
1822{
1825
1826 __gmp_binary_expr(const T &v1, const U &v2) : val1(v1), val2(v2) { }
1827private:
1829};
1830
1831// not in gmpxx
1832template <class Op>
1834{
1836};
1837
1838
1839// functions for evaluating expressions
1840template <class T, class U>
1841void __gmp_set_expr(mpz_ptr, const __gmp_expr<T, U> &);
1842template <class T, class U>
1843void __gmp_set_expr(mpq_ptr, const __gmp_expr<T, U> &);
1844template <class T, class U>
1845void __gmp_set_expr(mpfr_ptr, const __gmp_expr<T, U> &);
1846
1847
1848/**************** Macros for in-class declarations ****************/
1849/* This is just repetitive code that is easier to maintain if it's written
1850 only once */
1851
1852#define __GMPP_DECLARE_COMPOUND_OPERATOR(fun) \
1853 template <class T, class U> \
1854 __gmp_expr<value_type, value_type> & fun(const __gmp_expr<T, U> &);
1855
1856#define __GMPN_DECLARE_COMPOUND_OPERATOR(fun) \
1857 __gmp_expr & fun(signed char); \
1858 __gmp_expr & fun(unsigned char); \
1859 __gmp_expr & fun(signed int); \
1860 __gmp_expr & fun(unsigned int); \
1861 __gmp_expr & fun(signed short int); \
1862 __gmp_expr & fun(unsigned short int); \
1863 __gmp_expr & fun(signed long int); \
1864 __gmp_expr & fun(unsigned long int); \
1865 __gmp_expr & fun(float); \
1866 __gmp_expr & fun(double); \
1867 __gmp_expr & fun(long double);
1868
1869#define __GMP_DECLARE_COMPOUND_OPERATOR(fun) \
1870__GMPP_DECLARE_COMPOUND_OPERATOR(fun) \
1871__GMPN_DECLARE_COMPOUND_OPERATOR(fun)
1872
1873#define __GMP_DECLARE_COMPOUND_OPERATOR_UI(fun) \
1874 __gmp_expr & fun(unsigned long int);
1875
1876#define __GMP_DECLARE_INCREMENT_OPERATOR(fun) \
1877 inline __gmp_expr & fun(); \
1878 inline __gmp_expr fun(int);
1879
1880
1881/**************** mpz_class -- wrapper for mpz_t ****************/
1882
1883template <>
1884class __gmp_expr<mpz_t, mpz_t>
1885{
1886private:
1887 typedef mpz_t value_type;
1889public:
1890 unsigned long int get_prec() const { return mpfr_get_default_prec(); }
1891
1892 // constructors and destructor
1893 __gmp_expr() { mpz_init(mp); }
1894
1895 __gmp_expr(const __gmp_expr &z) { mpz_init_set(mp, z.mp); }
1896 template <class T, class U>
1898 { mpz_init(mp); __gmp_set_expr(mp, expr); }
1899
1900 __gmp_expr(signed char c) { mpz_init_set_si(mp, c); }
1901 __gmp_expr(unsigned char c) { mpz_init_set_ui(mp, c); }
1902
1903 __gmp_expr(signed int i) { mpz_init_set_si(mp, i); }
1904 __gmp_expr(unsigned int i) { mpz_init_set_ui(mp, i); }
1905
1906 __gmp_expr(signed short int s) { mpz_init_set_si(mp, s); }
1907 __gmp_expr(unsigned short int s) { mpz_init_set_ui(mp, s); }
1908
1909 __gmp_expr(signed long int l) { mpz_init_set_si(mp, l); }
1910 __gmp_expr(unsigned long int l) { mpz_init_set_ui(mp, l); }
1911
1912 __gmp_expr(float f) { mpz_init_set_d(mp, f); }
1913 __gmp_expr(double d) { mpz_init_set_d(mp, d); }
1914 // __gmp_expr(long double ld) { mpz_init_set_d(mp, ld); }
1915
1916 explicit __gmp_expr(const char *s)
1917 {
1918 if (mpz_init_set_str (mp, s, 0) != 0)
1919 {
1920 mpz_clear (mp);
1921 throw std::invalid_argument ("mpz_set_str");
1922 }
1923 }
1924 __gmp_expr(const char *s, int base)
1925 {
1926 if (mpz_init_set_str (mp, s, base) != 0)
1927 {
1928 mpz_clear (mp);
1929 throw std::invalid_argument ("mpz_set_str");
1930 }
1931 }
1932 explicit __gmp_expr(const std::string &s)
1933 {
1934 if (mpz_init_set_str (mp, s.c_str(), 0) != 0)
1935 {
1936 mpz_clear (mp);
1937 throw std::invalid_argument ("mpz_set_str");
1938 }
1939 }
1940 __gmp_expr(const std::string &s, int base)
1941 {
1942 if (mpz_init_set_str(mp, s.c_str(), base) != 0)
1943 {
1944 mpz_clear (mp);
1945 throw std::invalid_argument ("mpz_set_str");
1946 }
1947 }
1948
1949 explicit __gmp_expr(mpz_srcptr z) { mpz_init_set(mp, z); }
1950
1951 ~__gmp_expr() { mpz_clear(mp); }
1952
1953 // assignment operators
1955 { mpz_set(mp, z.mp); return *this; }
1956 template <class T, class U>
1958 { __gmp_set_expr(mp, expr); return *this; }
1959
1960 __gmp_expr & operator=(signed char c) { mpz_set_si(mp, c); return *this; }
1961 __gmp_expr & operator=(unsigned char c) { mpz_set_ui(mp, c); return *this; }
1962
1963 __gmp_expr & operator=(signed int i) { mpz_set_si(mp, i); return *this; }
1964 __gmp_expr & operator=(unsigned int i) { mpz_set_ui(mp, i); return *this; }
1965
1966 __gmp_expr & operator=(signed short int s)
1967 { mpz_set_si(mp, s); return *this; }
1968 __gmp_expr & operator=(unsigned short int s)
1969 { mpz_set_ui(mp, s); return *this; }
1970
1971 __gmp_expr & operator=(signed long int l)
1972 { mpz_set_si(mp, l); return *this; }
1973 __gmp_expr & operator=(unsigned long int l)
1974 { mpz_set_ui(mp, l); return *this; }
1975
1976 __gmp_expr & operator=(float f) { mpz_set_d(mp, f); return *this; }
1977 __gmp_expr & operator=(double d) { mpz_set_d(mp, d); return *this; }
1978 // __gmp_expr & operator=(long double ld)
1979 // { mpz_set_ld(mp, ld); return *this; }
1980
1981 __gmp_expr & operator=(const char *s)
1982 {
1983 if (mpz_set_str (mp, s, 0) != 0)
1984 throw std::invalid_argument ("mpz_set_str");
1985 return *this;
1986 }
1987 __gmp_expr & operator=(const std::string &s)
1988 {
1989 if (mpz_set_str(mp, s.c_str(), 0) != 0)
1990 throw std::invalid_argument ("mpz_set_str");
1991 return *this;
1992 }
1993
1994 // string input/output functions
1995 int set_str(const char *s, int base)
1996 { return mpz_set_str(mp, s, base); }
1997 int set_str(const std::string &s, int base)
1998 { return mpz_set_str(mp, s.c_str(), base); }
1999 std::string get_str(int base = 10) const
2000 {
2001 __gmp_alloc_cstring temp(mpz_get_str(0, base, mp));
2002 return std::string(temp.c_str());
2003 }
2004
2005 // conversion functions
2006 mpz_srcptr __get_mp() const { return mp; }
2007 mpz_ptr __get_mp() { return mp; }
2008 mpz_srcptr get_mpz_t() const { return mp; }
2009 mpz_ptr get_mpz_t() { return mp; }
2010
2011 signed long int get_si() const { return mpz_get_si(mp); }
2012 unsigned long int get_ui() const { return mpz_get_ui(mp); }
2013 double get_d() const { return mpz_get_d(mp); }
2014
2015 // bool fits_schar_p() const { return mpz_fits_schar_p(mp); }
2016 // bool fits_uchar_p() const { return mpz_fits_uchar_p(mp); }
2017 bool fits_sint_p() const { return mpz_fits_sint_p(mp); }
2018 bool fits_uint_p() const { return mpz_fits_uint_p(mp); }
2019 bool fits_sshort_p() const { return mpz_fits_sshort_p(mp); }
2020 bool fits_ushort_p() const { return mpz_fits_ushort_p(mp); }
2021 bool fits_slong_p() const { return mpz_fits_slong_p(mp); }
2022 bool fits_ulong_p() const { return mpz_fits_ulong_p(mp); }
2023 // bool fits_float_p() const { return mpz_fits_float_p(mp); }
2024 // bool fits_double_p() const { return mpz_fits_double_p(mp); }
2025 // bool fits_ldouble_p() const { return mpz_fits_ldouble_p(mp); }
2026
2027 // member operators
2033
2037
2040
2043};
2044
2045typedef __gmp_expr<mpz_t, mpz_t> mpz_class;
2046
2047
2048/**************** mpq_class -- wrapper for mpq_t ****************/
2049
2050template <>
2051class __gmp_expr<mpq_t, mpq_t>
2052{
2053private:
2054 typedef mpq_t value_type;
2056public:
2057 unsigned long int get_prec() const { return mpfr_get_default_prec(); }
2058 void canonicalize() { mpq_canonicalize(mp); }
2059
2060 // constructors and destructor
2061 __gmp_expr() { mpq_init(mp); }
2062
2063 __gmp_expr(const __gmp_expr &q) { mpq_init(mp); mpq_set(mp, q.mp); }
2064 template <class T, class U>
2066 { mpq_init(mp); __gmp_set_expr(mp, expr); }
2067
2068 __gmp_expr(signed char c) { mpq_init(mp); mpq_set_si(mp, c, 1); }
2069 __gmp_expr(unsigned char c) { mpq_init(mp); mpq_set_ui(mp, c, 1); }
2070
2071 __gmp_expr(signed int i) { mpq_init(mp); mpq_set_si(mp, i, 1); }
2072 __gmp_expr(unsigned int i) { mpq_init(mp); mpq_set_ui(mp, i, 1); }
2073
2074 __gmp_expr(signed short int s) { mpq_init(mp); mpq_set_si(mp, s, 1); }
2075 __gmp_expr(unsigned short int s) { mpq_init(mp); mpq_set_ui(mp, s, 1); }
2076
2077 __gmp_expr(signed long int l) { mpq_init(mp); mpq_set_si(mp, l, 1); }
2078 __gmp_expr(unsigned long int l) { mpq_init(mp); mpq_set_ui(mp, l, 1); }
2079
2080 __gmp_expr(float f) { mpq_init(mp); mpq_set_d(mp, f); }
2081 __gmp_expr(double d) { mpq_init(mp); mpq_set_d(mp, d); }
2082 // __gmp_expr(long double ld) { mpq_init(mp); mpq_set_ld(mp, ld); }
2083
2084 explicit __gmp_expr(const char *s)
2085 {
2086 mpq_init (mp);
2087 if (mpq_set_str (mp, s, 0) != 0)
2088 {
2089 mpq_clear (mp);
2090 throw std::invalid_argument ("mpq_set_str");
2091 }
2092 }
2093 __gmp_expr(const char *s, int base)
2094 {
2095 mpq_init (mp);
2096 if (mpq_set_str(mp, s, base) != 0)
2097 {
2098 mpq_clear (mp);
2099 throw std::invalid_argument ("mpq_set_str");
2100 }
2101 }
2102 explicit __gmp_expr(const std::string &s)
2103 {
2104 mpq_init (mp);
2105 if (mpq_set_str (mp, s.c_str(), 0) != 0)
2106 {
2107 mpq_clear (mp);
2108 throw std::invalid_argument ("mpq_set_str");
2109 }
2110 }
2111 __gmp_expr(const std::string &s, int base)
2112 {
2113 mpq_init(mp);
2114 if (mpq_set_str (mp, s.c_str(), base) != 0)
2115 {
2116 mpq_clear (mp);
2117 throw std::invalid_argument ("mpq_set_str");
2118 }
2119 }
2120 explicit __gmp_expr(mpq_srcptr q) { mpq_init(mp); mpq_set(mp, q); }
2121
2122 __gmp_expr(const mpz_class &num, const mpz_class &den)
2123 {
2124 mpq_init(mp);
2125 mpz_set(mpq_numref(mp), num.get_mpz_t());
2126 mpz_set(mpq_denref(mp), den.get_mpz_t());
2127 }
2128
2129 ~__gmp_expr() { mpq_clear(mp); }
2130
2131 // assignment operators
2133 { mpq_set(mp, q.mp); return *this; }
2134 template <class T, class U>
2136 { __gmp_set_expr(mp, expr); return *this; }
2137
2138 __gmp_expr & operator=(signed char c)
2139 { mpq_set_si(mp, c, 1); return *this; }
2140 __gmp_expr & operator=(unsigned char c)
2141 { mpq_set_ui(mp, c, 1); return *this; }
2142
2143 __gmp_expr & operator=(signed int i) { mpq_set_si(mp, i, 1); return *this; }
2144 __gmp_expr & operator=(unsigned int i)
2145 { mpq_set_ui(mp, i, 1); return *this; }
2146
2147 __gmp_expr & operator=(signed short int s)
2148 { mpq_set_si(mp, s, 1); return *this; }
2149 __gmp_expr & operator=(unsigned short int s)
2150 { mpq_set_ui(mp, s, 1); return *this; }
2151
2152 __gmp_expr & operator=(signed long int l)
2153 { mpq_set_si(mp, l, 1); return *this; }
2154 __gmp_expr & operator=(unsigned long int l)
2155 { mpq_set_ui(mp, l, 1); return *this; }
2156
2157 __gmp_expr & operator=(float f) { mpq_set_d(mp, f); return *this; }
2158 __gmp_expr & operator=(double d) { mpq_set_d(mp, d); return *this; }
2159 // __gmp_expr & operator=(long double ld)
2160 // { mpq_set_ld(mp, ld); return *this; }
2161
2162 __gmp_expr & operator=(const char *s)
2163 {
2164 if (mpq_set_str (mp, s, 0) != 0)
2165 throw std::invalid_argument ("mpq_set_str");
2166 return *this;
2167 }
2168 __gmp_expr & operator=(const std::string &s)
2169 {
2170 if (mpq_set_str(mp, s.c_str(), 0) != 0)
2171 throw std::invalid_argument ("mpq_set_str");
2172 return *this;
2173 }
2174
2175 // string input/output functions
2176 int set_str(const char *s, int base)
2177 { return mpq_set_str(mp, s, base); }
2178 int set_str(const std::string &s, int base)
2179 { return mpq_set_str(mp, s.c_str(), base); }
2180 std::string get_str(int base = 10) const
2181 {
2182 __gmp_alloc_cstring temp(mpq_get_str(0, base, mp));
2183 return std::string(temp.c_str());
2184 }
2185
2186 // conversion functions
2187
2188 // casting a reference to an mpz_t to mpz_class & is a dirty hack,
2189 // but works because the internal representation of mpz_class is
2190 // exactly an mpz_t
2191 const mpz_class & get_num() const
2192 { return reinterpret_cast<const mpz_class &>(*mpq_numref(mp)); }
2194 { return reinterpret_cast<mpz_class &>(*mpq_numref(mp)); }
2195 const mpz_class & get_den() const
2196 { return reinterpret_cast<const mpz_class &>(*mpq_denref(mp)); }
2198 { return reinterpret_cast<mpz_class &>(*mpq_denref(mp)); }
2199
2200 mpq_srcptr __get_mp() const { return mp; }
2201 mpq_ptr __get_mp() { return mp; }
2202 mpq_srcptr get_mpq_t() const { return mp; }
2203 mpq_ptr get_mpq_t() { return mp; }
2204
2205 mpz_srcptr get_num_mpz_t() const { return mpq_numref(mp); }
2206 mpz_ptr get_num_mpz_t() { return mpq_numref(mp); }
2207 mpz_srcptr get_den_mpz_t() const { return mpq_denref(mp); }
2208 mpz_ptr get_den_mpz_t() { return mpq_denref(mp); }
2209
2210 double get_d() const { return mpq_get_d(mp); }
2211
2212 // compound assignments
2217
2220
2223};
2224
2225typedef __gmp_expr<mpq_t, mpq_t> mpq_class;
2226
2227
2228/**************** mpfr_class -- wrapper for mpfr_t ****************/
2229
2230template <>
2231class __gmp_expr<mpfr_t, mpfr_t> : public MpFrC
2232{
2233private:
2234 typedef mpfr_t value_type;
2236public:
2237 unsigned long int get_prec() const { return mpfr_get_prec(mp); }
2238
2239 void set_prec(unsigned long int prec) { mpfr_set_prec(mp, prec); }
2240 void set_prec_raw(unsigned long int prec) { mpfr_set_prec_raw(mp, prec); }
2241 void prec_round(unsigned long int prec)
2242 { mpfr_prec_round(mp, prec, MpFrC::get_rnd()); }
2243
2244 // constructors and destructor
2245 // note that I have the default constructor be zero rather than NaN
2246 __gmp_expr() { mpfr_init(mp); mpfr_set_d(mp, 0.0, MpFrC::get_rnd()); }
2247
2249 { mpfr_init2(mp, f.get_prec()); mpfr_set(mp, f.mp, MpFrC::get_rnd()); }
2250 __gmp_expr(const __gmp_expr &f, unsigned long int prec)
2251 { mpfr_init2(mp, prec); mpfr_set(mp, f.mp, MpFrC::get_rnd()); }
2252 template <class T, class U>
2254 { mpfr_init2(mp, expr.get_prec()); __gmp_set_expr(mp, expr); }
2255 template <class T, class U>
2256 __gmp_expr(const __gmp_expr<T, U> &expr, unsigned long int prec)
2257 { mpfr_init2(mp, prec); __gmp_set_expr(mp, expr); }
2258
2259 __gmp_expr(signed char c)
2260 { mpfr_init_set_si(mp, c, MpFrC::get_rnd()); }
2261 __gmp_expr(signed char c, unsigned long int prec)
2262 { mpfr_init2(mp, prec); mpfr_set_si(mp, c, MpFrC::get_rnd()); }
2263 __gmp_expr(unsigned char c)
2264 { mpfr_init_set_ui(mp, c, MpFrC::get_rnd()); }
2265 __gmp_expr(unsigned char c, unsigned long int prec)
2266 { mpfr_init2(mp, prec); mpfr_set_ui(mp, c, MpFrC::get_rnd()); }
2267
2268 __gmp_expr(signed int i)
2269 { mpfr_init_set_si(mp, i, MpFrC::get_rnd()); }
2270 __gmp_expr(signed int i, unsigned long int prec)
2271 { mpfr_init2(mp, prec); mpfr_set_si(mp, i, MpFrC::get_rnd()); }
2272 __gmp_expr(unsigned int i)
2273 { mpfr_init_set_ui(mp, i, MpFrC::get_rnd()); }
2274 __gmp_expr(unsigned int i, unsigned long int prec)
2275 { mpfr_init2(mp, prec); mpfr_set_ui(mp, i, MpFrC::get_rnd()); }
2276
2277 __gmp_expr(signed short int s)
2278 { mpfr_init_set_si(mp, s, MpFrC::get_rnd()); }
2279 __gmp_expr(signed short int s, unsigned long int prec)
2280 { mpfr_init2(mp, prec); mpfr_set_si(mp, s, MpFrC::get_rnd()); }
2281 __gmp_expr(unsigned short int s)
2282 { mpfr_init_set_ui(mp, s, MpFrC::get_rnd()); }
2283 __gmp_expr(unsigned short int s, unsigned long int prec)
2284 { mpfr_init2(mp, prec); mpfr_set_ui(mp, s, MpFrC::get_rnd()); }
2285
2286 __gmp_expr(signed long int l)
2287 { mpfr_init_set_si(mp, l, MpFrC::get_rnd()); }
2288 __gmp_expr(signed long int l, unsigned long int prec)
2289 { mpfr_init2(mp, prec); mpfr_set_si(mp, l, MpFrC::get_rnd()); }
2290 __gmp_expr(unsigned long int l)
2291 { mpfr_init_set_ui(mp, l, MpFrC::get_rnd()); }
2292 __gmp_expr(unsigned long int l, unsigned long int prec)
2293 { mpfr_init2(mp, prec); mpfr_set_ui(mp, l, MpFrC::get_rnd()); }
2294
2295 __gmp_expr(float f)
2296 { mpfr_init_set_d(mp, f, MpFrC::get_rnd()); }
2297 __gmp_expr(float f, unsigned long int prec)
2298 { mpfr_init2(mp, prec); mpfr_set_d(mp, f, MpFrC::get_rnd()); }
2299 __gmp_expr(double d)
2300 { mpfr_init_set_d(mp, d, MpFrC::get_rnd()); }
2301 __gmp_expr(double d, unsigned long int prec)
2302 { mpfr_init2(mp, prec); mpfr_set_d(mp, d, MpFrC::get_rnd()); }
2303 // __gmp_expr(long double ld)
2304 // { mpfr_init_set_d(mp, ld, MpFrC::get_rnd()); }
2305 // __gmp_expr(long double ld, unsigned long int prec)
2306 // { mpfr_init2(mp, prec); mpfr_set_d(mp, ld, MpFrC::get_rnd()); }
2307
2308 explicit __gmp_expr(const char *s)
2309 {
2310 if (mpfr_init_set_str (mp, s, MpFrC::get_base(), MpFrC::get_rnd()) != 0)
2311 {
2312 mpfr_clear (mp);
2313 throw std::invalid_argument ("mpfr_set_str");
2314 }
2315 }
2316 __gmp_expr(const char *s, unsigned long int prec, int base = 0)
2317 {
2318 mpfr_init2(mp, prec);
2319 if (mpfr_set_str(mp, s, base, MpFrC::get_rnd()) != 0)
2320 {
2321 mpfr_clear (mp);
2322 throw std::invalid_argument ("mpfr_set_str");
2323 }
2324 }
2325 explicit __gmp_expr(const std::string &s)
2326 {
2327 if (mpfr_init_set_str(mp, s.c_str(),
2329 {
2330 mpfr_clear (mp);
2331 throw std::invalid_argument ("mpfr_set_str");
2332 }
2333 }
2334 __gmp_expr(const std::string &s, unsigned long int prec, int base = 0)
2335 {
2336 mpfr_init2(mp, prec);
2337 if (mpfr_set_str(mp, s.c_str(), base, MpFrC::get_rnd()) != 0)
2338 {
2339 mpfr_clear (mp);
2340 throw std::invalid_argument ("mpfr_set_str");
2341 }
2342 }
2343
2344 explicit __gmp_expr(mpfr_srcptr f)
2345 { mpfr_init2(mp, mpfr_get_prec(f)); mpfr_set(mp, f, MpFrC::get_rnd()); }
2346 __gmp_expr(mpfr_srcptr f, unsigned long int prec)
2347 { mpfr_init2(mp, prec); mpfr_set(mp, f, MpFrC::get_rnd()); }
2348
2349 ~__gmp_expr() { mpfr_clear(mp); }
2350
2351 // assignment operators
2353 { mpfr_set(mp, f.mp, MpFrC::get_rnd()); return *this; }
2354 template <class T, class U>
2356 { __gmp_set_expr(mp, expr); return *this; }
2357
2358 __gmp_expr & operator=(signed char c)
2359 { mpfr_set_si(mp, c, MpFrC::get_rnd()); return *this; }
2360 __gmp_expr & operator=(unsigned char c)
2361 { mpfr_set_ui(mp, c, MpFrC::get_rnd()); return *this; }
2362
2363 __gmp_expr & operator=(signed int i)
2364 { mpfr_set_si(mp, i, MpFrC::get_rnd()); return *this; }
2365 __gmp_expr & operator=(unsigned int i)
2366 { mpfr_set_ui(mp, i, MpFrC::get_rnd()); return *this; }
2367
2368 __gmp_expr & operator=(signed short int s)
2369 { mpfr_set_si(mp, s, MpFrC::get_rnd()); return *this; }
2370 __gmp_expr & operator=(unsigned short int s)
2371 { mpfr_set_ui(mp, s, MpFrC::get_rnd()); return *this; }
2372
2373 __gmp_expr & operator=(signed long int l)
2374 { mpfr_set_si(mp, l, MpFrC::get_rnd()); return *this; }
2375 __gmp_expr & operator=(unsigned long int l)
2376 { mpfr_set_ui(mp, l, MpFrC::get_rnd()); return *this; }
2377
2379 { mpfr_set_d(mp, f, MpFrC::get_rnd()); return *this; }
2381 { mpfr_set_d(mp, d, MpFrC::get_rnd()); return *this; }
2382 // __gmp_expr & operator=(long double ld)
2383 // { mpfr_set_ld(mp, ld); return *this; }
2384
2385 __gmp_expr & operator=(const char *s)
2386 {
2387 if (mpfr_set_str (mp, s, MpFrC::get_base(), MpFrC::get_rnd()) != 0)
2388 throw std::invalid_argument ("mpfr_set_str");
2389 return *this;
2390 }
2391 __gmp_expr & operator=(const std::string &s)
2392 {
2393 if (mpfr_set_str(mp, s.c_str(), MpFrC::get_base(), MpFrC::get_rnd()) != 0)
2394 throw std::invalid_argument ("mpfr_set_str");
2395 return *this;
2396 }
2397
2398 // string input/output functions
2399 int set_str(const char *s, int base)
2400 { return mpfr_set_str(mp, s, base, MpFrC::get_rnd()); }
2401 int set_str(const std::string &s, int base)
2402 { return mpfr_set_str(mp, s.c_str(), base, MpFrC::get_rnd()); }
2403 std::string get_str(mp_exp_t &expo, int base = 10, size_t size = 0) const
2404 {
2405 __gmp_alloc_cstring temp(mpfr_get_str(0, &expo, base, size, mp,
2406 MpFrC::get_rnd()));
2407 return std::string(temp.c_str());
2408 }
2409
2410 // conversion functions
2411 mpfr_srcptr __get_mp() const { return mp; }
2412 mpfr_ptr __get_mp() { return mp; }
2413 mpfr_srcptr get_mpfr_t() const { return mp; }
2414 mpfr_ptr get_mpfr_t() { return mp; }
2415
2416 signed long int get_si() const
2417 { return mpfr_get_si(mp, MpFrC::get_rnd()); }
2418 unsigned long int get_ui() const
2419 { return mpfr_get_ui(mp, MpFrC::get_rnd()); }
2420 double get_d() const
2421 { return mpfr_get_d(mp, MpFrC::get_rnd()); }
2422
2423 // bool fits_schar_p() const { return mpfr_fits_schar_p(mp, MpFrC::get_rnd()); }
2424 // bool fits_uchar_p() const { return mpfr_fits_uchar_p(mp, MpFrC::get_rnd()); }
2425 bool fits_sint_p() const
2426 { return mpfr_fits_sint_p(mp, MpFrC::get_rnd()); }
2427 bool fits_uint_p() const
2428 { return mpfr_fits_uint_p(mp, MpFrC::get_rnd()); }
2429 bool fits_sshort_p() const
2430 { return mpfr_fits_sshort_p(mp, MpFrC::get_rnd()); }
2431 bool fits_ushort_p() const
2432 { return mpfr_fits_ushort_p(mp, MpFrC::get_rnd()); }
2433 bool fits_slong_p() const
2434 { return mpfr_fits_slong_p(mp, MpFrC::get_rnd()); }
2435 bool fits_ulong_p() const
2436 { return mpfr_fits_ulong_p(mp, MpFrC::get_rnd()); }
2437 // bool fits_float_p() const
2438 // { return mpfr_fits_float_p(mp, MpFrC::get_rnd()); }
2439 // bool fits_double_p() const
2440 // { return mpfr_fits_double_p(mp, MpFrC::get_rnd()); }
2441 // bool fits_ldouble_p() const
2442 // { return mpfr_fits_ldouble_p(mp, MpFrC::get_rnd()); }
2443
2444 // compound assignments
2449
2452
2455};
2456
2457typedef __gmp_expr<mpfr_t, mpfr_t> mpfr_class;
2458
2459
2460
2461/**************** I/O operators ****************/
2462
2463// these are provided separately in libgmpxx and mpfrxx.cpp
2464
2465template <class T>
2466inline std::ostream & operator<<
2467(std::ostream &o, const __gmp_expr<T, T> &expr)
2468{
2469 return o << expr.__get_mp();
2470}
2471
2472template <class T, class U>
2473inline std::ostream & operator<<
2474(std::ostream &o, const __gmp_expr<T, U> &expr)
2475{
2476 __gmp_expr<T, T> temp(expr);
2477 return o << temp.__get_mp();
2478}
2479
2480
2481template <class T>
2482inline std::istream & operator>>(std::istream &i, __gmp_expr<T, T> &expr)
2483{
2484 return i >> expr.__get_mp();
2485}
2486
2487inline std::istream & operator>>(std::istream &i, mpq_class &q)
2488{
2489 i >> q.get_mpq_t();
2490 // q.canonicalize(); // you might want to uncomment this
2491 return i;
2492}
2493
2494
2495/**************** Functions for type conversion ****************/
2496
2497template <>
2498inline void __gmp_set_expr(mpz_ptr z, const mpz_class &w)
2499{
2500 mpz_set(z, w.get_mpz_t());
2501}
2502
2503template <class T>
2504inline void __gmp_set_expr(mpz_ptr z, const __gmp_expr<mpz_t, T> &expr)
2505{
2506 expr.eval(z);
2507}
2508
2509template <>
2510inline void __gmp_set_expr(mpz_ptr z, const mpq_class &q)
2511{
2512 mpz_set_q(z, q.get_mpq_t());
2513}
2514
2515template <class T>
2516inline void __gmp_set_expr(mpz_ptr z, const __gmp_expr<mpq_t, T> &expr)
2517{
2518 mpq_class temp(expr);
2519 mpz_set_q(z, temp.get_mpq_t());
2520}
2521
2522template <class T>
2523inline void __gmp_set_expr(mpz_ptr z, const mpfr_class &f)
2524{
2525 mpz_set_mpfr(z, f.get_mpfr_t());
2526}
2527
2528template <class T>
2529inline void __gmp_set_expr(mpz_ptr z, const __gmp_expr<mpfr_t, T> &expr)
2530{
2531 mpfr_class temp(expr);
2532 mpz_set_mpfr(z, temp.get_mpfr_t());
2533}
2534
2535template <>
2536inline void __gmp_set_expr(mpq_ptr q, const mpz_class &z)
2537{
2538 mpq_set_z(q, z.get_mpz_t());
2539}
2540
2541template <class T>
2542inline void __gmp_set_expr(mpq_ptr q, const __gmp_expr<mpz_t, T> &expr)
2543{
2544 mpz_class temp(expr);
2545 mpq_set_z(q, temp.get_mpz_t());
2546}
2547
2548template <>
2549inline void __gmp_set_expr(mpq_ptr q, const mpq_class &r)
2550{
2551 mpq_set(q, r.get_mpq_t());
2552}
2553
2554template <class T>
2555inline void __gmp_set_expr(mpq_ptr q, const __gmp_expr<mpq_t, T> &expr)
2556{
2557 expr.eval(q);
2558}
2559
2560template <class T>
2561inline void __gmp_set_expr(mpq_ptr q, const mpfr_class &f)
2562{
2563 mpq_set_mpfr(q, f.get_mpfr_t());
2564}
2565
2566template <class T>
2567inline void __gmp_set_expr(mpq_ptr q, const __gmp_expr<mpfr_t, T> &expr)
2568{
2569 mpfr_class temp(expr);
2570 mpq_set_mpfr(q, temp.get_mpfr_t());
2571}
2572
2573template <class T>
2574inline void __gmp_set_expr(mpfr_ptr f, const mpz_class &z)
2575{
2576 mpfr_set_z(f, z.get_mpz_t(), MpFrC::get_rnd());
2577}
2578
2579template <class T>
2580inline void __gmp_set_expr(mpfr_ptr f, const __gmp_expr<mpz_t, T> &expr)
2581{
2582 mpz_class temp(expr);
2583 mpfr_set_z(f, temp.get_mpz_t(), MpFrC::get_rnd());
2584}
2585
2586template <class T>
2587inline void __gmp_set_expr(mpfr_ptr f, const mpq_class &q)
2588{
2589 mpfr_set_q(f, q.get_mpq_t(), MpFrC::get_rnd());
2590}
2591
2592template <class T>
2593inline void __gmp_set_expr(mpfr_ptr f, const __gmp_expr<mpq_t, T> &expr)
2594{
2595 mpq_class temp(expr);
2596 mpfr_set_q(f, temp.get_mpq_t(), MpFrC::get_rnd());
2597}
2598
2599template <>
2600inline void __gmp_set_expr(mpfr_ptr f, const mpfr_class &g)
2601{
2602 mpfr_set(f, g.get_mpfr_t(), MpFrC::get_rnd());
2603}
2604
2605template <class T>
2606inline void __gmp_set_expr(mpfr_ptr f, const __gmp_expr<mpfr_t, T> &expr)
2607{
2608 expr.eval(f, mpfr_get_prec(f));
2609}
2610
2611
2612/**************** Specializations of __gmp_expr ****************/
2613/* The eval() method of __gmp_expr<T, U> evaluates the corresponding
2614 expression and assigns the result to its argument, which is either an
2615 mpz_t, mpq_t, or mpfr_t as specified by the T argument.
2616 Compound expressions are evaluated recursively (temporaries are created
2617 to hold intermediate values), while for simple expressions the eval()
2618 method of the appropriate function object (available as the Op argument
2619 of either __gmp_unary_expr<T, Op> or __gmp_binary_expr<T, U, Op>) is
2620 called. */
2621
2622
2623/**************** Void expressions (not in gmpxx) ****************/
2624template <class T, class Op>
2626{
2627private:
2629public:
2630 __gmp_expr() : expr() { }
2632 unsigned long int = 0) const
2633 { Op::eval(p); }
2634 unsigned long int get_prec() const { return mpfr_get_default_prec(); }
2635};
2636
2637
2638
2639/**************** Unary expressions ****************/
2640/* cases:
2641 - simple: argument is mp*_class, that is, __gmp_expr<T, T>
2642 - compound: argument is __gmp_expr<T, U> (with U not equal to T) */
2643
2644
2645// simple expressions
2646
2647template <class T, class Op>
2649{
2650private:
2652
2654public:
2655 __gmp_expr(const val_type &val) : expr(val) { }
2657 unsigned long int = 0) const
2658 { Op::eval(p, expr.val.__get_mp()); }
2659 const val_type & get_val() const { return expr.val; }
2660 unsigned long int get_prec() const { return expr.val.get_prec(); }
2661};
2662
2663// not in gmpxx (argument is a built-in type)
2664template <class T, class U, class Op>
2666{
2667private:
2668 typedef U val_type;
2669
2671
2672public:
2673 __gmp_expr(const val_type &val) : expr(val) { }
2675 unsigned long int = 0) const
2676 { Op::eval(p, expr.val); }
2677 const val_type & get_val() const { return expr.val; }
2678 unsigned long int get_prec() const { return mpfr_get_default_prec(); }
2679};
2680
2681
2682// compound expressions
2683
2684template <class T, class U, class Op>
2686{
2687private:
2689
2691public:
2692 __gmp_expr(const val_type &val) : expr(val) { }
2694 { __gmp_expr<T, T> temp(expr.val); Op::eval(p, temp.__get_mp()); }
2696 unsigned long int prec) const
2697 { __gmp_expr<T, T> temp(expr.val, prec); Op::eval(p, temp.__get_mp()); }
2698 const val_type & get_val() const { return expr.val; }
2699 unsigned long int get_prec() const { return expr.val.get_prec(); }
2700};
2701
2702
2703/**************** Binary expressions ****************/
2704/* simple:
2705 - arguments are both mp*_class
2706 - one argument is mp*_class, one is a built-in type
2707 compound:
2708 - one is mp*_class, one is __gmp_expr<T, U>
2709 - one is __gmp_expr<T, U>, one is built-in
2710 - both arguments are __gmp_expr<...> */
2711
2712
2713// simple expressions
2714
2715template <class T, class Op>
2717<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, T>, Op> >
2718{
2719private:
2722
2724public:
2725 __gmp_expr(const val1_type &val1, const val2_type &val2)
2726 : expr(val1, val2) { }
2728 unsigned long int = 0) const
2729 { Op::eval(p, expr.val1.__get_mp(), expr.val2.__get_mp()); }
2730 const val1_type & get_val1() const { return expr.val1; }
2731 const val2_type & get_val2() const { return expr.val2; }
2732 unsigned long int get_prec() const
2733 {
2734 unsigned long int prec1 = expr.val1.get_prec(),
2735 prec2 = expr.val2.get_prec();
2736 return (prec1 > prec2) ? prec1 : prec2;
2737 }
2738};
2739
2740
2741// simple expressions, T is a built-in numerical type
2742
2743template <class T, class U, class Op>
2745{
2746private:
2748 typedef U val2_type;
2749
2751public:
2752 __gmp_expr(const val1_type &val1, const val2_type &val2)
2753 : expr(val1, val2) { }
2755 unsigned long int = 0) const
2756 { Op::eval(p, expr.val1.__get_mp(), expr.val2); }
2757 const val1_type & get_val1() const { return expr.val1; }
2758 const val2_type & get_val2() const { return expr.val2; }
2759 unsigned long int get_prec() const { return expr.val1.get_prec(); }
2760};
2761
2762template <class T, class U, class Op>
2764{
2765private:
2766 typedef U val1_type;
2768
2770public:
2771 __gmp_expr(const val1_type &val1, const val2_type &val2)
2772 : expr(val1, val2) { }
2774 unsigned long int = 0) const
2775 { Op::eval(p, expr.val1, expr.val2.__get_mp()); }
2776 const val1_type & get_val1() const { return expr.val1; }
2777 const val2_type & get_val2() const { return expr.val2; }
2778 unsigned long int get_prec() const { return expr.val2.get_prec(); }
2779};
2780
2781// not in gmpxx (both arguments are built-in type)
2782template <class T, class U, class V, class Op>
2784{
2785private:
2786 typedef U val1_type;
2787 typedef V val2_type;
2788
2790
2791public:
2792 __gmp_expr(const val1_type &val1, const val2_type &val2)
2793 : expr(val1, val2) { }
2795 unsigned long int = 0) const
2796 { Op::eval(p, expr.val1, expr.val2); }
2797 const val1_type & get_val1() const { return expr.val1; }
2798 const val2_type & get_val2() const { return expr.val2; }
2799 unsigned long int get_prec() const { return mpfr_get_default_prec(); }
2800};
2801
2802
2803// compound expressions, one argument is a subexpression
2804
2805template <class T, class U, class V, class Op>
2807<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<U, V>, Op> >
2808{
2809private:
2812
2814public:
2815 __gmp_expr(const val1_type &val1, const val2_type &val2)
2816 : expr(val1, val2) { }
2818 {
2819 __gmp_expr<T, T> temp(expr.val2);
2820 Op::eval(p, expr.val1.__get_mp(), temp.__get_mp());
2821 }
2823 unsigned long int prec) const
2824 {
2825 __gmp_expr<T, T> temp(expr.val2, prec);
2826 Op::eval(p, expr.val1.__get_mp(), temp.__get_mp());
2827 }
2828 const val1_type & get_val1() const { return expr.val1; }
2829 const val2_type & get_val2() const { return expr.val2; }
2830 unsigned long int get_prec() const
2831 {
2832 unsigned long int prec1 = expr.val1.get_prec(),
2833 prec2 = expr.val2.get_prec();
2834 return (prec1 > prec2) ? prec1 : prec2;
2835 }
2836};
2837
2838template <class T, class U, class V, class Op>
2840<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, T>, Op> >
2841{
2842private:
2845
2847public:
2848 __gmp_expr(const val1_type &val1, const val2_type &val2)
2849 : expr(val1, val2) { }
2851 {
2852 __gmp_expr<T, T> temp(expr.val1);
2853 Op::eval(p, temp.__get_mp(), expr.val2.__get_mp());
2854 }
2856 unsigned long int prec) const
2857 {
2858 __gmp_expr<T, T> temp(expr.val1, prec);
2859 Op::eval(p, temp.__get_mp(), expr.val2.__get_mp());
2860 }
2861 const val1_type & get_val1() const { return expr.val1; }
2862 const val2_type & get_val2() const { return expr.val2; }
2863 unsigned long int get_prec() const
2864 {
2865 unsigned long int prec1 = expr.val1.get_prec(),
2866 prec2 = expr.val2.get_prec();
2867 return (prec1 > prec2) ? prec1 : prec2;
2868 }
2869};
2870
2871template <class T, class U, class Op>
2873<T, __gmp_binary_expr<__gmp_expr<T, T>, __gmp_expr<T, U>, Op> >
2874{
2875private:
2878
2880public:
2881 __gmp_expr(const val1_type &val1, const val2_type &val2)
2882 : expr(val1, val2) { }
2884 {
2885 __gmp_expr<T, T> temp(expr.val2);
2886 Op::eval(p, expr.val1.__get_mp(), temp.__get_mp());
2887 }
2889 unsigned long int prec) const
2890 {
2891 __gmp_expr<T, T> temp(expr.val2, prec);
2892 Op::eval(p, expr.val1.__get_mp(), temp.__get_mp());
2893 }
2894 const val1_type & get_val1() const { return expr.val1; }
2895 const val2_type & get_val2() const { return expr.val2; }
2896 unsigned long int get_prec() const
2897 {
2898 unsigned long int prec1 = expr.val1.get_prec(),
2899 prec2 = expr.val2.get_prec();
2900 return (prec1 > prec2) ? prec1 : prec2;
2901 }
2902};
2903
2904template <class T, class U, class Op>
2906<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, T>, Op> >
2907{
2908private:
2911
2913public:
2914 __gmp_expr(const val1_type &val1, const val2_type &val2)
2915 : expr(val1, val2) { }
2917 {
2918 __gmp_expr<T, T> temp(expr.val1);
2919 Op::eval(p, temp.__get_mp(), expr.val2.__get_mp());
2920 }
2922 unsigned long int prec) const
2923 {
2924 __gmp_expr<T, T> temp(expr.val1, prec);
2925 Op::eval(p, temp.__get_mp(), expr.val2.__get_mp());
2926 }
2927 const val1_type & get_val1() const { return expr.val1; }
2928 const val2_type & get_val2() const { return expr.val2; }
2929 unsigned long int get_prec() const
2930 {
2931 unsigned long int prec1 = expr.val1.get_prec(),
2932 prec2 = expr.val2.get_prec();
2933 return (prec1 > prec2) ? prec1 : prec2;
2934 }
2935};
2936
2937
2938// one argument is a subexpression, one is a built-in
2939
2940template <class T, class U, class V, class Op>
2942{
2943private:
2945 typedef V val2_type;
2946
2948public:
2949 __gmp_expr(const val1_type &val1, const val2_type &val2)
2950 : expr(val1, val2) { }
2952 {
2953 __gmp_expr<T, T> temp(expr.val1);
2954 Op::eval(p, temp.__get_mp(), expr.val2);
2955 }
2957 unsigned long int prec) const
2958 {
2959 __gmp_expr<T, T> temp(expr.val1, prec);
2960 Op::eval(p, temp.__get_mp(), expr.val2);
2961 }
2962 const val1_type & get_val1() const { return expr.val1; }
2963 const val2_type & get_val2() const { return expr.val2; }
2964 unsigned long int get_prec() const { return expr.val1.get_prec(); }
2965};
2966
2967template <class T, class U, class V, class Op>
2969{
2970private:
2971 typedef U val1_type;
2973
2975public:
2976 __gmp_expr(const val1_type &val1, const val2_type &val2)
2977 : expr(val1, val2) { }
2979 {
2980 __gmp_expr<T, T> temp(expr.val2);
2981 Op::eval(p, expr.val1, temp.__get_mp());
2982 }
2984 unsigned long int prec) const
2985 {
2986 __gmp_expr<T, T> temp(expr.val2, prec);
2987 Op::eval(p, expr.val1, temp.__get_mp());
2988 }
2989 const val1_type & get_val1() const { return expr.val1; }
2990 const val2_type & get_val2() const { return expr.val2; }
2991 unsigned long int get_prec() const { return expr.val2.get_prec(); }
2992};
2993
2994
2995// both arguments are subexpressions
2996
2997template <class T, class U, class V, class W, class Op>
2999<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, Op> >
3000{
3001private:
3004
3006public:
3007 __gmp_expr(const val1_type &val1, const val2_type &val2)
3008 : expr(val1, val2) { }
3010 {
3011 __gmp_expr<T, T> temp1(expr.val1), temp2(expr.val2);
3012 Op::eval(p, temp1.__get_mp(), temp2.__get_mp());
3013 }
3015 unsigned long int prec) const
3016 {
3017 __gmp_expr<T, T> temp1(expr.val1, prec), temp2(expr.val2, prec);
3018 Op::eval(p, temp1.__get_mp(), temp2.__get_mp());
3019 }
3020 const val1_type & get_val1() const { return expr.val1; }
3021 const val2_type & get_val2() const { return expr.val2; }
3022 unsigned long int get_prec() const
3023 {
3024 unsigned long int prec1 = expr.val1.get_prec(),
3025 prec2 = expr.val2.get_prec();
3026 return (prec1 > prec2) ? prec1 : prec2;
3027 }
3028};
3029
3030template <class T, class U, class V, class W, class Op>
3032<T, __gmp_binary_expr<__gmp_expr<U, V>, __gmp_expr<T, W>, Op> >
3033{
3034private:
3037
3039public:
3040 __gmp_expr(const val1_type &val1, const val2_type &val2)
3041 : expr(val1, val2) { }
3043 {
3044 __gmp_expr<T, T> temp1(expr.val1), temp2(expr.val2);
3045 Op::eval(p, temp1.__get_mp(), temp2.__get_mp());
3046 }
3048 unsigned long int prec) const
3049 {
3050 __gmp_expr<T, T> temp1(expr.val1, prec), temp2(expr.val2, prec);
3051 Op::eval(p, temp1.__get_mp(), temp2.__get_mp());
3052 }
3053 const val1_type & get_val1() const { return expr.val1; }
3054 const val2_type & get_val2() const { return expr.val2; }
3055 unsigned long int get_prec() const
3056 {
3057 unsigned long int prec1 = expr.val1.get_prec(),
3058 prec2 = expr.val2.get_prec();
3059 return (prec1 > prec2) ? prec1 : prec2;
3060 }
3061};
3062
3063template <class T, class U, class V, class Op>
3065<T, __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, V>, Op> >
3066{
3067private:
3070
3072public:
3073 __gmp_expr(const val1_type &val1, const val2_type &val2)
3074 : expr(val1, val2) { }
3076 {
3077 __gmp_expr<T, T> temp1(expr.val1), temp2(expr.val2);
3078 Op::eval(p, temp1.__get_mp(), temp2.__get_mp());
3079 }
3081 unsigned long int prec) const
3082 {
3083 __gmp_expr<T, T> temp1(expr.val1, prec), temp2(expr.val2, prec);
3084 Op::eval(p, temp1.__get_mp(), temp2.__get_mp());
3085 }
3086 const val1_type & get_val1() const { return expr.val1; }
3087 const val2_type & get_val2() const { return expr.val2; }
3088 unsigned long int get_prec() const
3089 {
3090 unsigned long int prec1 = expr.val1.get_prec(),
3091 prec2 = expr.val2.get_prec();
3092 return (prec1 > prec2) ? prec1 : prec2;
3093 }
3094};
3095
3096
3097/**************** Special cases ****************/
3098
3099/* Some operations (i.e., add and subtract) with mixed mpz/mpq arguments
3100 can be done directly without first converting the mpz to mpq.
3101 Appropriate specializations of __gmp_expr are required. */
3102
3103
3104#define __GMPZQ_DEFINE_EXPR(eval_fun) \
3105 \
3106template <> \
3107class __gmp_expr<mpq_t, __gmp_binary_expr<mpz_class, mpq_class, eval_fun> > \
3108{ \
3109private: \
3110 typedef mpz_class val1_type; \
3111 typedef mpq_class val2_type; \
3112 \
3113 __gmp_binary_expr<val1_type, val2_type, eval_fun> expr; \
3114public: \
3115 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3116 : expr(val1, val2) { } \
3117 void eval(mpq_ptr q) const \
3118 { eval_fun::eval(q, expr.val1.get_mpz_t(), expr.val2.get_mpq_t()); } \
3119 const val1_type & get_val1() const { return expr.val1; } \
3120 const val2_type & get_val2() const { return expr.val2; } \
3121 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3122}; \
3123 \
3124template <> \
3125class __gmp_expr<mpq_t, __gmp_binary_expr<mpq_class, mpz_class, eval_fun> > \
3126{ \
3127private: \
3128 typedef mpq_class val1_type; \
3129 typedef mpz_class val2_type; \
3130 \
3131 __gmp_binary_expr<val1_type, val2_type, eval_fun> expr; \
3132public: \
3133 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3134 : expr(val1, val2) { } \
3135 void eval(mpq_ptr q) const \
3136 { eval_fun::eval(q, expr.val1.get_mpq_t(), expr.val2.get_mpz_t()); } \
3137 const val1_type & get_val1() const { return expr.val1; } \
3138 const val2_type & get_val2() const { return expr.val2; } \
3139 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3140}; \
3141 \
3142template <class T> \
3143class __gmp_expr \
3144<mpq_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpq_t, T>, eval_fun> > \
3145{ \
3146private: \
3147 typedef mpz_class val1_type; \
3148 typedef __gmp_expr<mpq_t, T> val2_type; \
3149 \
3150 __gmp_binary_expr<val1_type, val2_type, eval_fun> expr; \
3151public: \
3152 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3153 : expr(val1, val2) { } \
3154 void eval(mpq_ptr q) const \
3155 { \
3156 mpq_class temp(expr.val2); \
3157 eval_fun::eval(q, expr.val1.get_mpz_t(), temp.get_mpq_t()); \
3158 } \
3159 const val1_type & get_val1() const { return expr.val1; } \
3160 const val2_type & get_val2() const { return expr.val2; } \
3161 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3162}; \
3163 \
3164template <class T> \
3165class __gmp_expr \
3166<mpq_t, __gmp_binary_expr<mpq_class, __gmp_expr<mpz_t, T>, eval_fun> > \
3167{ \
3168private: \
3169 typedef mpq_class val1_type; \
3170 typedef __gmp_expr<mpz_t, T> val2_type; \
3171 \
3172 __gmp_binary_expr<val1_type, val2_type, eval_fun> expr; \
3173public: \
3174 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3175 : expr(val1, val2) { } \
3176 void eval(mpq_ptr q) const \
3177 { \
3178 mpz_class temp(expr.val2); \
3179 eval_fun::eval(q, expr.val1.get_mpq_t(), temp.get_mpz_t()); \
3180 } \
3181 const val1_type & get_val1() const { return expr.val1; } \
3182 const val2_type & get_val2() const { return expr.val2; } \
3183 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3184}; \
3185 \
3186template <class T> \
3187class __gmp_expr \
3188<mpq_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, mpq_class, eval_fun> > \
3189{ \
3190private: \
3191 typedef __gmp_expr<mpz_t, T> val1_type; \
3192 typedef mpq_class val2_type; \
3193 \
3194 __gmp_binary_expr<val1_type, val2_type, eval_fun> expr; \
3195public: \
3196 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3197 : expr(val1, val2) { } \
3198 void eval(mpq_ptr q) const \
3199 { \
3200 mpz_class temp(expr.val1); \
3201 eval_fun::eval(q, temp.get_mpz_t(), expr.val2.get_mpq_t()); \
3202 } \
3203 const val1_type & get_val1() const { return expr.val1; } \
3204 const val2_type & get_val2() const { return expr.val2; } \
3205 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3206}; \
3207 \
3208template <class T> \
3209class __gmp_expr \
3210<mpq_t, __gmp_binary_expr<__gmp_expr<mpq_t, T>, mpz_class, eval_fun> > \
3211{ \
3212private: \
3213 typedef __gmp_expr<mpq_t, T> val1_type; \
3214 typedef mpz_class val2_type; \
3215 \
3216 __gmp_binary_expr<val1_type, val2_type, eval_fun> expr; \
3217public: \
3218 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3219 : expr(val1, val2) { } \
3220 void eval(mpq_ptr q) const \
3221 { \
3222 mpq_class temp(expr.val1); \
3223 eval_fun::eval(q, temp.get_mpq_t(), expr.val2.get_mpz_t()); \
3224 } \
3225 const val1_type & get_val1() const { return expr.val1; } \
3226 const val2_type & get_val2() const { return expr.val2; } \
3227 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3228}; \
3229 \
3230template <class T, class U> \
3231class __gmp_expr<mpq_t, __gmp_binary_expr \
3232<__gmp_expr<mpz_t, T>, __gmp_expr<mpq_t, U>, eval_fun> > \
3233{ \
3234private: \
3235 typedef __gmp_expr<mpz_t, T> val1_type; \
3236 typedef __gmp_expr<mpq_t, U> val2_type; \
3237 \
3238 __gmp_binary_expr<val1_type, val2_type, eval_fun> expr; \
3239public: \
3240 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3241 : expr(val1, val2) { } \
3242 void eval(mpq_ptr q) const \
3243 { \
3244 mpz_class temp1(expr.val1); \
3245 mpq_class temp2(expr.val2); \
3246 eval_fun::eval(q, temp1.get_mpz_t(), temp2.get_mpq_t()); \
3247 } \
3248 const val1_type & get_val1() const { return expr.val1; } \
3249 const val2_type & get_val2() const { return expr.val2; } \
3250 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3251}; \
3252 \
3253template <class T, class U> \
3254class __gmp_expr<mpq_t, __gmp_binary_expr \
3255<__gmp_expr<mpq_t, T>, __gmp_expr<mpz_t, U>, eval_fun> > \
3256{ \
3257private: \
3258 typedef __gmp_expr<mpq_t, T> val1_type; \
3259 typedef __gmp_expr<mpz_t, U> val2_type; \
3260 \
3261 __gmp_binary_expr<val1_type, val2_type, eval_fun> expr; \
3262public: \
3263 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3264 : expr(val1, val2) { } \
3265 void eval(mpq_ptr q) const \
3266 { \
3267 mpq_class temp1(expr.val1); \
3268 mpz_class temp2(expr.val2); \
3269 eval_fun::eval(q, temp1.get_mpq_t(), temp2.get_mpz_t()); \
3270 } \
3271 const val1_type & get_val1() const { return expr.val1; } \
3272 const val2_type & get_val2() const { return expr.val2; } \
3273 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3274};
3275
3276
3279
3280
3281/* Integer ternary expressions of the kind `a+b*c' or `a*b+c' can be
3282 evaluated directly via mpz_addmul */
3283
3284// a + b * c
3285#define __GMP_DEFINE_TERNARY_EXPR(eval_fun1, eval_fun2, eval_both) \
3286 \
3287template <> \
3288class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \
3289<mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> >, eval_fun2> > \
3290{ \
3291private: \
3292 typedef mpz_class val1_type; \
3293 typedef __gmp_expr \
3294 <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> > val2_type; \
3295 \
3296 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3297public: \
3298 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3299 : expr(val1, val2) { } \
3300 void eval(mpz_ptr z) const \
3301 { eval_both::eval \
3302 (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \
3303 expr.val2.get_val2().get_mpz_t()); } \
3304 const val1_type & get_val1() const { return expr.val1; } \
3305 const val2_type & get_val2() const { return expr.val2; } \
3306 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3307}; \
3308 \
3309template <class T> \
3310class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \
3311<mpz_t, __gmp_binary_expr<mpz_class, T, eval_fun1> >, eval_fun2> > \
3312{ \
3313private: \
3314 typedef mpz_class val1_type; \
3315 typedef __gmp_expr \
3316 <mpz_t, __gmp_binary_expr<mpz_class, T, eval_fun1> > val2_type; \
3317 \
3318 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3319public: \
3320 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3321 : expr(val1, val2) { } \
3322 void eval(mpz_ptr z) const \
3323 { eval_both::eval \
3324 (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \
3325 expr.val2.get_val2()); } \
3326 const val1_type & get_val1() const { return expr.val1; } \
3327 const val2_type & get_val2() const { return expr.val2; } \
3328 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3329}; \
3330 \
3331template <class T> \
3332class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \
3333<mpz_t, __gmp_binary_expr<T, mpz_class, eval_fun1> >, eval_fun2> > \
3334{ \
3335private: \
3336 typedef mpz_class val1_type; \
3337 typedef __gmp_expr \
3338 <mpz_t, __gmp_binary_expr<T, mpz_class, eval_fun1> > val2_type; \
3339 \
3340 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3341public: \
3342 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3343 : expr(val1, val2) { } \
3344 void eval(mpz_ptr z) const \
3345 { eval_both::eval \
3346 (z, expr.val1.get_mpz_t(), expr.val2.get_val1(), \
3347 expr.val2.get_val2().get_mpz_t()); } \
3348 const val1_type & get_val1() const { return expr.val1; } \
3349 const val2_type & get_val2() const { return expr.val2; } \
3350 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3351}; \
3352 \
3353template <class T> \
3354class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \
3355<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, T>, eval_fun1> >, \
3356 eval_fun2> > \
3357{ \
3358private: \
3359 typedef mpz_class val1_type; \
3360 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3361 <mpz_class, __gmp_expr<mpz_t, T>, eval_fun1> > val2_type; \
3362 \
3363 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3364public: \
3365 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3366 : expr(val1, val2) { } \
3367 void eval(mpz_ptr z) const \
3368 { \
3369 mpz_class temp(expr.val2.get_val2()); \
3370 eval_both::eval \
3371 (z, expr.val1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \
3372 temp.get_mpz_t()); \
3373 } \
3374 const val1_type & get_val1() const { return expr.val1; } \
3375 const val2_type & get_val2() const { return expr.val2; } \
3376 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3377}; \
3378 \
3379template <class T> \
3380class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \
3381<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, mpz_class, eval_fun1> >, \
3382 eval_fun2> > \
3383{ \
3384private: \
3385 typedef mpz_class val1_type; \
3386 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3387 <__gmp_expr<mpz_t, T>, mpz_class, eval_fun1> > val2_type; \
3388 \
3389 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3390public: \
3391 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3392 : expr(val1, val2) { } \
3393 void eval(mpz_ptr z) const \
3394 { \
3395 mpz_class temp(expr.val2.get_val1()); \
3396 eval_both::eval(z, expr.val1.get_mpz_t(), temp.get_mpz_t(), \
3397 expr.val2.get_val2().get_mpz_t()); \
3398 } \
3399 const val1_type & get_val1() const { return expr.val1; } \
3400 const val2_type & get_val2() const { return expr.val2; } \
3401 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3402}; \
3403 \
3404template <class T, class U> \
3405class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \
3406<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, U, eval_fun1> >, \
3407 eval_fun2> > \
3408{ \
3409private: \
3410 typedef mpz_class val1_type; \
3411 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3412 <__gmp_expr<mpz_t, T>, U, eval_fun1> > val2_type; \
3413 \
3414 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3415public: \
3416 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3417 : expr(val1, val2) { } \
3418 void eval(mpz_ptr z) const \
3419 { \
3420 mpz_class temp(expr.val2.get_val1()); \
3421 eval_both::eval \
3422 (z, expr.val1.get_mpz_t(), temp.get_mpz_t(), expr.val2.get_val2()); \
3423 } \
3424 const val1_type & get_val1() const { return expr.val1; } \
3425 const val2_type & get_val2() const { return expr.val2; } \
3426 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3427}; \
3428 \
3429template <class T, class U> \
3430class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \
3431<mpz_t, __gmp_binary_expr<T, __gmp_expr<mpz_t, U>, eval_fun1> >, \
3432 eval_fun2> > \
3433{ \
3434private: \
3435 typedef mpz_class val1_type; \
3436 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3437 <T, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type; \
3438 \
3439 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3440public: \
3441 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3442 : expr(val1, val2) { } \
3443 void eval(mpz_ptr z) const \
3444 { \
3445 mpz_class temp(expr.val2.get_val2()); \
3446 eval_both::eval \
3447 (z, expr.val1.get_mpz_t(), expr.val2.get_val1(), temp.get_mpz_t()); \
3448 } \
3449 const val1_type & get_val1() const { return expr.val1; } \
3450 const val2_type & get_val2() const { return expr.val2; } \
3451 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3452}; \
3453 \
3454template <class T, class U> \
3455class __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr \
3456<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, \
3457 eval_fun1> >, eval_fun2> > \
3458{ \
3459private: \
3460 typedef mpz_class val1_type; \
3461 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3462 <__gmp_expr<mpz_t, T>, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type; \
3463 \
3464 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3465public: \
3466 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3467 : expr(val1, val2) { } \
3468 void eval(mpz_ptr z) const \
3469 { \
3470 mpz_class temp1(expr.val2.get_val1()); \
3471 mpz_class temp2(expr.val2.get_val2()); \
3472 eval_both::eval \
3473 (z, expr.val1.get_mpz_t(), temp1.get_mpz_t(), temp2.get_mpz_t()); \
3474 } \
3475 const val1_type & get_val1() const { return expr.val1; } \
3476 const val2_type & get_val2() const { return expr.val2; } \
3477 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3478}; \
3479 \
3480template <class T> \
3481class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \
3482 __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> >, \
3483 eval_fun2> > \
3484{ \
3485private: \
3486 typedef __gmp_expr<mpz_t, T> val1_type; \
3487 typedef __gmp_expr \
3488 <mpz_t, __gmp_binary_expr<mpz_class, mpz_class, eval_fun1> > val2_type; \
3489 \
3490 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3491public: \
3492 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3493 : expr(val1, val2) { } \
3494 void eval(mpz_ptr z) const \
3495 { \
3496 mpz_class temp(expr.val1); \
3497 eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \
3498 expr.val2.get_val2().get_mpz_t()); \
3499 } \
3500 const val1_type & get_val1() const { return expr.val1; } \
3501 const val2_type & get_val2() const { return expr.val2; } \
3502 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3503}; \
3504 \
3505template <class T, class U> \
3506class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \
3507 __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, U, eval_fun1> >, \
3508 eval_fun2> > \
3509{ \
3510private: \
3511 typedef __gmp_expr<mpz_t, T> val1_type; \
3512 typedef __gmp_expr \
3513 <mpz_t, __gmp_binary_expr<mpz_class, U, eval_fun1> > val2_type; \
3514 \
3515 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3516public: \
3517 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3518 : expr(val1, val2) { } \
3519 void eval(mpz_ptr z) const \
3520 { \
3521 mpz_class temp(expr.val1); \
3522 eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \
3523 expr.val2.get_val2()); \
3524 } \
3525 const val1_type & get_val1() const { return expr.val1; } \
3526 const val2_type & get_val2() const { return expr.val2; } \
3527 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3528}; \
3529 \
3530template <class T, class U> \
3531class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \
3532 __gmp_expr<mpz_t, __gmp_binary_expr<U, mpz_class, eval_fun1> >, \
3533 eval_fun2> > \
3534{ \
3535private: \
3536 typedef __gmp_expr<mpz_t, T> val1_type; \
3537 typedef __gmp_expr \
3538 <mpz_t, __gmp_binary_expr<U, mpz_class, eval_fun1> > val2_type; \
3539 \
3540 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3541public: \
3542 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3543 : expr(val1, val2) { } \
3544 void eval(mpz_ptr z) const \
3545 { \
3546 mpz_class temp(expr.val1); \
3547 eval_both::eval(z, temp.get_mpz_t(), expr.val2.get_val1(), \
3548 expr.val2.get_val2().get_mpz_t()); \
3549 } \
3550 const val1_type & get_val1() const { return expr.val1; } \
3551 const val2_type & get_val2() const { return expr.val2; } \
3552 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3553}; \
3554 \
3555template <class T, class U> \
3556class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \
3557 __gmp_expr<mpz_t, __gmp_binary_expr<mpz_class, __gmp_expr<mpz_t, U>, \
3558 eval_fun1> >, eval_fun2> > \
3559{ \
3560private: \
3561 typedef __gmp_expr<mpz_t, T> val1_type; \
3562 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3563 <mpz_class, __gmp_expr<mpz_t, U>, eval_fun1> > val2_type; \
3564 \
3565 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3566public: \
3567 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3568 : expr(val1, val2) { } \
3569 void eval(mpz_ptr z) const \
3570 { \
3571 mpz_class temp1(expr.val1); \
3572 mpz_class temp2(expr.val2.get_val2()); \
3573 eval_both::eval \
3574 (z, temp1.get_mpz_t(), expr.val2.get_val1().get_mpz_t(), \
3575 temp2.get_mpz_t()); \
3576 } \
3577 const val1_type & get_val1() const { return expr.val1; } \
3578 const val2_type & get_val2() const { return expr.val2; } \
3579 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3580}; \
3581 \
3582template <class T, class U> \
3583class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \
3584 __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, mpz_class, \
3585 eval_fun1> >, eval_fun2> > \
3586{ \
3587private: \
3588 typedef __gmp_expr<mpz_t, T> val1_type; \
3589 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3590 <__gmp_expr<mpz_t, U>, mpz_class, eval_fun1> > val2_type; \
3591 \
3592 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3593public: \
3594 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3595 : expr(val1, val2) { } \
3596 void eval(mpz_ptr z) const \
3597 { \
3598 mpz_class temp1(expr.val1); \
3599 mpz_class temp2(expr.val2.get_val1()); \
3600 eval_both::eval(z, temp1.get_mpz_t(), temp2.get_mpz_t(), \
3601 expr.val2.get_val2().get_mpz_t()); \
3602 } \
3603 const val1_type & get_val1() const { return expr.val1; } \
3604 const val2_type & get_val2() const { return expr.val2; } \
3605 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3606}; \
3607 \
3608template <class T, class U, class V> \
3609class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \
3610 __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, V, \
3611 eval_fun1> >, eval_fun2> > \
3612{ \
3613private: \
3614 typedef __gmp_expr<mpz_t, T> val1_type; \
3615 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3616 <__gmp_expr<mpz_t, U>, V, eval_fun1> > val2_type; \
3617 \
3618 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3619public: \
3620 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3621 : expr(val1, val2) { } \
3622 void eval(mpz_ptr z) const \
3623 { \
3624 mpz_class temp1(expr.val1); \
3625 mpz_class temp2(expr.val2.get_val1()); \
3626 eval_both::eval \
3627 (z, temp1.get_mpz_t(), temp2.get_mpz_t(), expr.val2.get_val2()); \
3628 } \
3629 const val1_type & get_val1() const { return expr.val1; } \
3630 const val2_type & get_val2() const { return expr.val2; } \
3631 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3632}; \
3633 \
3634template <class T, class U, class V> \
3635class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \
3636 __gmp_expr<mpz_t, __gmp_binary_expr<U, __gmp_expr<mpz_t, V>, \
3637 eval_fun1> >, eval_fun2> > \
3638{ \
3639private: \
3640 typedef __gmp_expr<mpz_t, T> val1_type; \
3641 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3642 <U, __gmp_expr<mpz_t, V>, eval_fun1> > val2_type; \
3643 \
3644 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3645public: \
3646 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3647 : expr(val1, val2) { } \
3648 void eval(mpz_ptr z) const \
3649 { \
3650 mpz_class temp1(expr.val1); \
3651 mpz_class temp2(expr.val2.get_val2()); \
3652 eval_both::eval \
3653 (z, temp1.get_mpz_t(), expr.val2.get_val1(), temp2.get_mpz_t()); \
3654 } \
3655 const val1_type & get_val1() const { return expr.val1; } \
3656 const val2_type & get_val2() const { return expr.val2; } \
3657 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3658}; \
3659 \
3660template <class T, class U, class V> \
3661class __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, T>, \
3662 __gmp_expr<mpz_t, __gmp_binary_expr<__gmp_expr<mpz_t, U>, \
3663 __gmp_expr<mpz_t, V>, eval_fun1> >, eval_fun2> > \
3664{ \
3665private: \
3666 typedef __gmp_expr<mpz_t, T> val1_type; \
3667 typedef __gmp_expr<mpz_t, __gmp_binary_expr \
3668 <__gmp_expr<mpz_t, U>, __gmp_expr<mpz_t, V>, eval_fun1> > val2_type; \
3669 \
3670 __gmp_binary_expr<val1_type, val2_type, eval_fun2> expr; \
3671public: \
3672 __gmp_expr(const val1_type &val1, const val2_type &val2) \
3673 : expr(val1, val2) { } \
3674 void eval(mpz_ptr z) const \
3675 { \
3676 mpz_class temp1(expr.val1); \
3677 mpz_class temp2(expr.val2.get_val1()); \
3678 mpz_class temp3(expr.val2.get_val2()); \
3679 eval_both::eval \
3680 (z, temp1.get_mpz_t(), temp2.get_mpz_t(), temp3.get_mpz_t()); \
3681 } \
3682 const val1_type & get_val1() const { return expr.val1; } \
3683 const val2_type & get_val2() const { return expr.val2; } \
3684 unsigned long int get_prec() const { return mpfr_get_default_prec(); } \
3685};
3686
3687
3692
3693/**************** Macros for defining functions ****************/
3694/* Results of operators and functions are instances of __gmp_expr<T, U>.
3695 T determines the numerical type of the expression: it can be either
3696 mpz_t, mpq_t, or mpfr_t. When the arguments of a binary
3697 expression have different numerical types, __gmp_resolve_expr is used
3698 to determine the "larger" type.
3699 U is either __gmp_unary_expr<V, Op> or __gmp_binary_expr<V, W, Op>,
3700 where V and W are the arguments' types -- they can in turn be
3701 expressions, thus allowing to build compound expressions to any
3702 degree of complexity.
3703 Op is a function object that must have an eval() method accepting
3704 appropriate arguments.
3705 Actual evaluation of a __gmp_expr<T, U> object is done when it gets
3706 assigned to an mp*_class ("lazy" evaluation): this is done by calling
3707 its eval() method. */
3708
3709
3710// non-member void operators and functions (not in gmpxx)
3711
3712#define __GMP_DEFINE_VOID_FUNCTION(T, fun, eval_fun) \
3713 \
3714inline __gmp_expr \
3715<T, __gmp_void_expr<eval_fun> > \
3716fun() \
3717{ \
3718 return __gmp_expr<T, __gmp_void_expr \
3719 <eval_fun> >(); \
3720}
3721
3722
3723// non-member unary operators and functions
3724
3725#define __GMP_DEFINE_UNARY_FUNCTION(fun, eval_fun) \
3726 \
3727template <class T, class U> \
3728inline __gmp_expr<T, __gmp_unary_expr<__gmp_expr<T, U>, eval_fun> > \
3729fun(const __gmp_expr<T, U> &expr) \
3730{ \
3731 return __gmp_expr<T, __gmp_unary_expr<__gmp_expr<T, U>, eval_fun> >(expr); \
3732}
3733
3734
3735
3736#define __GMP_DEFINE_UNARY_TYPE_FUNCTION(type, fun, eval_fun) \
3737 \
3738template <class T, class U> \
3739inline type fun(const __gmp_expr<T, U> &expr) \
3740{ \
3741 typename __gmp_resolve_temp<T, T, U>::temp_type temp(expr); \
3742 return eval_fun::eval(temp.__get_mp()); \
3743}
3744
3745// not in gmpxx
3746#define __GMP_DEFINE_UNARY_FUNCTION_UI(T, fun, eval_fun) \
3747 \
3748inline __gmp_expr \
3749<T, __gmp_unary_expr<unsigned long int, eval_fun> > \
3750fun(unsigned long int l) \
3751{ \
3752 return __gmp_expr<T, __gmp_unary_expr \
3753 <unsigned long int, eval_fun> >(l); \
3754}
3755
3756
3757// non-member binary operators and functions
3758// the second (more specialized) template was not in gmpxx
3759// but seems to be necessary to avoid ambiguity with e.g. the
3760// max template in <algorithm>
3761
3762#define __GMPP_DEFINE_BINARY_FUNCTION(fun, eval_fun) \
3763 \
3764template <class T, class U, class V, class W> \
3765inline __gmp_expr<typename __gmp_resolve_expr<T, V>::value_type, \
3766__gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, eval_fun> > \
3767fun(const __gmp_expr<T, U> &expr1, const __gmp_expr<V, W> &expr2) \
3768{ \
3769 return __gmp_expr<typename __gmp_resolve_expr<T, V>::value_type, \
3770 __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<V, W>, eval_fun> > \
3771 (expr1, expr2); \
3772} \
3773 \
3774template <class T, class U> \
3775inline __gmp_expr<typename __gmp_resolve_expr<T, T>::value_type, \
3776__gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, U>, eval_fun> > \
3777fun(const __gmp_expr<T, U> &expr1, const __gmp_expr<T, U> &expr2) \
3778{ \
3779 return __gmp_expr<typename __gmp_resolve_expr<T, T>::value_type, \
3780 __gmp_binary_expr<__gmp_expr<T, U>, __gmp_expr<T, U>, eval_fun> > \
3781 (expr1, expr2); \
3782}
3783
3784#define __GMPNN_DEFINE_BINARY_FUNCTION(fun, eval_fun, type, bigtype) \
3785 \
3786template <class T, class U> \
3787inline __gmp_expr \
3788<T, __gmp_binary_expr<__gmp_expr<T, U>, bigtype, eval_fun> > \
3789fun(const __gmp_expr<T, U> &expr, type t) \
3790{ \
3791 return __gmp_expr \
3792 <T, __gmp_binary_expr<__gmp_expr<T, U>, bigtype, eval_fun> >(expr, t); \
3793} \
3794 \
3795template <class T, class U> \
3796inline __gmp_expr \
3797<T, __gmp_binary_expr<bigtype, __gmp_expr<T, U>, eval_fun> > \
3798fun(type t, const __gmp_expr<T, U> &expr) \
3799{ \
3800 return __gmp_expr \
3801 <T, __gmp_binary_expr<bigtype, __gmp_expr<T, U>, eval_fun> >(t, expr); \
3802}
3803
3804#define __GMPNS_DEFINE_BINARY_FUNCTION(fun, eval_fun, type) \
3805__GMPNN_DEFINE_BINARY_FUNCTION(fun, eval_fun, type, signed long int)
3806
3807#define __GMPNU_DEFINE_BINARY_FUNCTION(fun, eval_fun, type) \
3808__GMPNN_DEFINE_BINARY_FUNCTION(fun, eval_fun, type, unsigned long int)
3809
3810#define __GMPND_DEFINE_BINARY_FUNCTION(fun, eval_fun, type) \
3811__GMPNN_DEFINE_BINARY_FUNCTION(fun, eval_fun, type, double)
3812
3813#define __GMPNLD_DEFINE_BINARY_FUNCTION(fun, eval_fun, type) \
3814__GMPNN_DEFINE_BINARY_FUNCTION(fun, eval_fun, type, long double)
3815
3816#define __GMPN_DEFINE_BINARY_FUNCTION(fun, eval_fun) \
3817__GMPNS_DEFINE_BINARY_FUNCTION(fun, eval_fun, signed char) \
3818__GMPNU_DEFINE_BINARY_FUNCTION(fun, eval_fun, unsigned char) \
3819__GMPNS_DEFINE_BINARY_FUNCTION(fun, eval_fun, signed int) \
3820__GMPNU_DEFINE_BINARY_FUNCTION(fun, eval_fun, unsigned int) \
3821__GMPNS_DEFINE_BINARY_FUNCTION(fun, eval_fun, signed short int) \
3822__GMPNU_DEFINE_BINARY_FUNCTION(fun, eval_fun, unsigned short int) \
3823__GMPNS_DEFINE_BINARY_FUNCTION(fun, eval_fun, signed long int) \
3824__GMPNU_DEFINE_BINARY_FUNCTION(fun, eval_fun, unsigned long int) \
3825__GMPND_DEFINE_BINARY_FUNCTION(fun, eval_fun, float) \
3826__GMPND_DEFINE_BINARY_FUNCTION(fun, eval_fun, double) \
3827__GMPNLD_DEFINE_BINARY_FUNCTION(fun, eval_fun, long double)
3828
3829#define __GMP_DEFINE_BINARY_FUNCTION(fun, eval_fun) \
3830__GMPP_DEFINE_BINARY_FUNCTION(fun, eval_fun) \
3831__GMPN_DEFINE_BINARY_FUNCTION(fun, eval_fun)
3832
3833// the UI version is in gmpxx, but doesn't seem to be necessary unless
3834// the point is to generate a warning if you pass a negative integer
3835#define __GMP_DEFINE_BINARY_FUNCTION_UI(fun, eval_fun) \
3836 \
3837template <class T, class U> \
3838inline __gmp_expr \
3839<T, __gmp_binary_expr<__gmp_expr<T, U>, unsigned long int, eval_fun> > \
3840fun(const __gmp_expr<T, U> &expr, unsigned long int l) \
3841{ \
3842 return __gmp_expr<T, __gmp_binary_expr \
3843 <__gmp_expr<T, U>, unsigned long int, eval_fun> >(expr, l); \
3844}
3845
3846// not in gmpxx. I needed it for pow_ui
3847#define __GMP_DEFINE_BINARY_FUNCTION_UI_UI(T, fun, eval_fun) \
3848 \
3849inline __gmp_expr \
3850<T, __gmp_binary_expr<unsigned long int, unsigned long int, eval_fun> > \
3851fun(unsigned long int r, unsigned long int l) \
3852{ \
3853 return __gmp_expr<T, __gmp_binary_expr \
3854 <unsigned long int, unsigned long int, eval_fun> >(r, l); \
3855}
3856
3857
3858#define __GMPP_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun) \
3859 \
3860template <class T, class U, class V, class W> \
3861inline type fun(const __gmp_expr<T, U> &expr1, \
3862 const __gmp_expr<V, W> &expr2) \
3863{ \
3864 typedef typename __gmp_resolve_expr<T, V>::value_type eval_type; \
3865 typename __gmp_resolve_temp<eval_type, T, U>::temp_type temp1(expr1); \
3866 typename __gmp_resolve_temp<eval_type, V, W>::temp_type temp2(expr2); \
3867 return eval_fun::eval(temp1.__get_mp(), temp2.__get_mp()); \
3868}
3869
3870#define __GMPNN_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, \
3871 type2, bigtype) \
3872 \
3873template <class T, class U> \
3874inline type fun(const __gmp_expr<T, U> &expr, type2 t) \
3875{ \
3876 typename __gmp_resolve_temp<T, T, U>::temp_type temp(expr); \
3877 return eval_fun::eval(temp.__get_mp(), static_cast<bigtype>(t)); \
3878} \
3879 \
3880template <class T, class U> \
3881inline type fun(type2 t, const __gmp_expr<T, U> &expr) \
3882{ \
3883 typename __gmp_resolve_temp<T, T, U>::temp_type temp(expr); \
3884 return eval_fun::eval(static_cast<bigtype>(t), temp.__get_mp()); \
3885}
3886
3887#define __GMPNS_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, type2) \
3888__GMPNN_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, \
3889 type2, signed long int)
3890
3891#define __GMPNU_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, type2) \
3892__GMPNN_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, \
3893 type2, unsigned long int)
3894
3895#define __GMPND_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, type2) \
3896__GMPNN_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, type2, double)
3897
3898#define __GMPNLD_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, type2) \
3899__GMPNN_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, type2, long double)
3900
3901#define __GMPN_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun) \
3902__GMPNS_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, signed char) \
3903__GMPNU_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, unsigned char) \
3904__GMPNS_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, signed int) \
3905__GMPNU_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, unsigned int) \
3906__GMPNS_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, signed short int) \
3907__GMPNU_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, unsigned short int) \
3908__GMPNS_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, signed long int) \
3909__GMPNU_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, unsigned long int) \
3910__GMPND_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, float) \
3911__GMPND_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, double) \
3912__GMPNLD_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun, long double)
3913
3914#define __GMP_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun) \
3915__GMPP_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun) \
3916__GMPN_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun)
3917
3918
3919// member operators
3920
3921#define __GMPP_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun) \
3922 \
3923template <class T, class U> \
3924inline type##_class & type##_class::fun(const __gmp_expr<T, U> &expr) \
3925{ \
3926 __gmp_set_expr(mp, __gmp_expr<type##_t, __gmp_binary_expr \
3927 <type##_class, __gmp_expr<T, U>, eval_fun> >(*this, expr)); \
3928 return *this; \
3929}
3930
3931#define __GMPNN_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, \
3932 type2, bigtype) \
3933 \
3934inline type##_class & type##_class::fun(type2 t) \
3935{ \
3936 __gmp_set_expr(mp, __gmp_expr<type##_t, __gmp_binary_expr \
3937 <type##_class, bigtype, eval_fun> >(*this, t)); \
3938 return *this; \
3939}
3940
3941#define __GMPNS_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, type2) \
3942__GMPNN_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, \
3943 type2, signed long int)
3944
3945#define __GMPNU_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, type2) \
3946__GMPNN_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, \
3947 type2, unsigned long int)
3948
3949#define __GMPND_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, type2) \
3950__GMPNN_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, type2, double)
3951
3952#define __GMPNLD_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, type2) \
3953__GMPNN_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, type2, long double)
3954
3955#define __GMPN_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun) \
3956__GMPNS_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, signed char) \
3957__GMPNU_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, unsigned char) \
3958__GMPNS_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, signed int) \
3959__GMPNU_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, unsigned int) \
3960__GMPNS_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, signed short int) \
3961__GMPNU_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, unsigned short int) \
3962__GMPNS_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, signed long int) \
3963__GMPNU_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, unsigned long int) \
3964__GMPND_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, float) \
3965__GMPND_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, double) \
3966/* __GMPNLD_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun, long double) */
3967
3968#define __GMP_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun) \
3969__GMPP_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun) \
3970__GMPN_DEFINE_COMPOUND_OPERATOR(type, fun, eval_fun)
3971
3972#define __GMPZ_DEFINE_COMPOUND_OPERATOR(fun, eval_fun) \
3973__GMP_DEFINE_COMPOUND_OPERATOR(mpz, fun, eval_fun)
3974
3975#define __GMPZZ_DEFINE_COMPOUND_OPERATOR(fun, eval_fun) \
3976__GMPP_DEFINE_COMPOUND_OPERATOR(mpz, fun, eval_fun)
3977
3978#define __GMPQ_DEFINE_COMPOUND_OPERATOR(fun, eval_fun) \
3979__GMP_DEFINE_COMPOUND_OPERATOR(mpq, fun, eval_fun)
3980
3981#define __MPFR_DEFINE_COMPOUND_OPERATOR(fun, eval_fun) \
3982__GMP_DEFINE_COMPOUND_OPERATOR(mpfr, fun, eval_fun)
3983
3984
3985
3986#define __GMP_DEFINE_COMPOUND_OPERATOR_UI(type, fun, eval_fun) \
3987 \
3988inline type##_class & type##_class::fun(unsigned long int l) \
3989{ \
3990 __gmp_set_expr(mp, __gmp_expr<type##_t, __gmp_binary_expr \
3991 <type##_class, unsigned long int, eval_fun> >(*this, l)); \
3992 return *this; \
3993}
3994
3995#define __GMPZ_DEFINE_COMPOUND_OPERATOR_UI(fun, eval_fun) \
3996__GMP_DEFINE_COMPOUND_OPERATOR_UI(mpz, fun, eval_fun)
3997
3998#define __GMPQ_DEFINE_COMPOUND_OPERATOR_UI(fun, eval_fun) \
3999__GMP_DEFINE_COMPOUND_OPERATOR_UI(mpq, fun, eval_fun)
4000
4001#define __MPFR_DEFINE_COMPOUND_OPERATOR_UI(fun, eval_fun) \
4002__GMP_DEFINE_COMPOUND_OPERATOR_UI(mpfr, fun, eval_fun)
4003
4004
4005
4006#define __GMP_DEFINE_INCREMENT_OPERATOR(type, fun, eval_fun) \
4007 \
4008inline type##_class & type##_class::fun() \
4009{ \
4010 eval_fun::eval(mp); \
4011 return *this; \
4012} \
4013 \
4014inline type##_class type##_class::fun(int) \
4015{ \
4016 type##_class temp(*this); \
4017 eval_fun::eval(mp); \
4018 return temp; \
4019}
4020
4021#define __GMPZ_DEFINE_INCREMENT_OPERATOR(fun, eval_fun) \
4022__GMP_DEFINE_INCREMENT_OPERATOR(mpz, fun, eval_fun)
4023
4024#define __GMPQ_DEFINE_INCREMENT_OPERATOR(fun, eval_fun) \
4025__GMP_DEFINE_INCREMENT_OPERATOR(mpq, fun, eval_fun)
4026
4027#define __MPFR_DEFINE_INCREMENT_OPERATOR(fun, eval_fun) \
4028__GMP_DEFINE_INCREMENT_OPERATOR(mpfr, fun, eval_fun)
4029
4030
4031
4032/**************** Arithmetic operators and functions ****************/
4033
4034// non-member operators and functions
4035
4039
4051
4057__GMP_DEFINE_BINARY_TYPE_FUNCTION(bool, operator>=, \
4059
4061
4124
4127
4130
4131// member operators for mpz_class
4138
4142
4145
4149
4150// member operators for mpq_class
4156
4159
4163
4164// member operators for mpfr_class
4170
4173
4177
4178
4179
4180/**************** Class wrapper for gmp_randstate_t ****************/
4181
4184
4185template <>
4187{
4188private:
4189 __gmp_randstate_struct *state;
4190 unsigned long int bits;
4191public:
4192 __gmp_expr(gmp_randstate_t s, unsigned long int l) : state(s), bits(l) { }
4193 void eval(mpz_ptr z) const { __gmp_rand_function::eval(z, state, bits); }
4194 unsigned long int get_prec() const { return mpfr_get_default_prec(); }
4195};
4196
4197template <>
4199{
4200private:
4201 __gmp_randstate_struct *state;
4203public:
4204 __gmp_expr(gmp_randstate_t s, const mpz_class &z) : state(s), range(z) { }
4205 void eval(mpz_ptr z) const
4206 { __gmp_rand_function::eval(z, state, range.get_mpz_t()); }
4207 unsigned long int get_prec() const { return mpfr_get_default_prec(); }
4208};
4209
4210template <>
4212{
4213private:
4214 __gmp_randstate_struct *state;
4215 unsigned long int bits;
4216public:
4217 __gmp_expr(gmp_randstate_t s, unsigned long int l) : state(s), bits(l) { }
4218 void eval(mpfr_ptr f, unsigned long int prec) const
4219 { __gmp_rand_function::eval(f, state, (bits>0) ? get_prec() : prec); }
4220 unsigned long int get_prec() const
4221 {
4222 if (bits == 0)
4223 return mpfr_get_default_prec();
4224 else
4225 return bits;
4226 }
4227};
4228
4229extern "C" {
4230 typedef void __gmp_randinit_default_t (gmp_randstate_t);
4231 typedef void __gmp_randinit_lc_2exp_t (gmp_randstate_t, mpz_srcptr, unsigned long int, unsigned long int);
4232 typedef int __gmp_randinit_lc_2exp_size_t (gmp_randstate_t, unsigned long int);
4233}
4234
4236{
4237private:
4238 gmp_randstate_t state;
4239
4240 // copy construction and assignment not allowed
4243public:
4244 // constructors and destructor
4245 gmp_randclass(gmp_randalg_t alg, unsigned long int size)
4246 {
4247 switch (alg)
4248 {
4249 case GMP_RAND_ALG_LC: // no other cases for now
4250 default:
4251 gmp_randinit(state, alg, size);
4252 break;
4253 }
4254 }
4255
4256 // gmp_randinit_default
4258
4259 // gmp_randinit_lc_2exp
4261 mpz_class z, unsigned long int l1, unsigned long int l2)
4262 { f(state, z.get_mpz_t(), l1, l2); }
4263
4264 // gmp_randinit_lc_2exp_size
4266 unsigned long int size)
4267 {
4268 if (f (state, size) == 0)
4269 throw std::length_error ("gmp_randinit_lc_2exp_size");
4270 }
4271
4272 ~gmp_randclass() { gmp_randclear(state); }
4273
4274 // initialize
4275 void seed(); // choose a random seed some way (?)
4276 void seed(unsigned long int s) { gmp_randseed_ui(state, s); }
4277 void seed(const mpz_class &z) { gmp_randseed(state, z.get_mpz_t()); }
4278
4279 // get random number
4282
4284 { return get_z_bits(z.get_ui()); }
4285
4288
4290 { return __gmp_expr<mpfr_t, __gmp_urandomb_value>(state, prec); }
4291};
4292
4293
4294/**************** #undef all private macros ****************/
4295
4296#undef __GMPP_DECLARE_COMPOUND_OPERATOR
4297#undef __GMPN_DECLARE_COMPOUND_OPERATOR
4298#undef __GMP_DECLARE_COMPOUND_OPERATOR
4299#undef __GMP_DECLARE_COMPOUND_OPERATOR_UI
4300#undef __GMP_DECLARE_INCREMENT_OPERATOR
4301
4302#undef __GMPZQ_DEFINE_EXPR
4303#undef __GMP_DEFINE_TERNARY_EXPR
4304
4305#undef __GMP_DEFINE_VOID_FUNCTION
4306
4307#undef __GMP_DEFINE_UNARY_FUNCTION
4308#undef __GMP_DEFINE_UNARY_TYPE_FUNCTION
4309#undef __GMP_DEFINE_UNARY_FUNCTION_UI
4310
4311#undef __GMPP_DEFINE_BINARY_FUNCTION
4312#undef __GMPNN_DEFINE_BINARY_FUNCTION
4313#undef __GMPNS_DEFINE_BINARY_FUNCTION
4314#undef __GMPNU_DEFINE_BINARY_FUNCTION
4315#undef __GMPND_DEFINE_BINARY_FUNCTION
4316#undef __GMPNLD_DEFINE_BINARY_FUNCTION
4317#undef __GMPN_DEFINE_BINARY_FUNCTION
4318#undef __GMP_DEFINE_BINARY_FUNCTION
4319
4320#undef __GMP_DEFINE_BINARY_FUNCTION_UI
4321
4322#undef __GMPP_DEFINE_BINARY_TYPE_FUNCTION
4323#undef __GMPNN_DEFINE_BINARY_TYPE_FUNCTION
4324#undef __GMPNS_DEFINE_BINARY_TYPE_FUNCTION
4325#undef __GMPNU_DEFINE_BINARY_TYPE_FUNCTION
4326#undef __GMPND_DEFINE_BINARY_TYPE_FUNCTION
4327#undef __GMPNLD_DEFINE_BINARY_TYPE_FUNCTION
4328#undef __GMPN_DEFINE_BINARY_TYPE_FUNCTION
4329#undef __GMP_DEFINE_BINARY_TYPE_FUNCTION
4330
4331#undef __GMPP_DECLARE_COMPOUND_OPERATOR
4332#undef __GMPN_DECLARE_COMPOUND_OPERATOR
4333#undef __GMP_DECLARE_COMPOUND_OPERATOR
4334
4335#undef __GMP_DECLARE_COMPOUND_OPERATOR_UI
4336#undef __GMP_DECLARE_INCREMENT_OPERATOR
4337
4338#undef __GMPZ_DEFINE_COMPOUND_OPERATOR
4339#undef __GMPZZ_DEFINE_COMPOUND_OPERATOR
4340#undef __GMPZN_DEFINE_COMPOUND_OPERATOR
4341#undef __GMPZNN_DEFINE_COMPOUND_OPERATOR
4342#undef __GMPZNS_DEFINE_COMPOUND_OPERATOR
4343#undef __GMPZNU_DEFINE_COMPOUND_OPERATOR
4344#undef __GMPZND_DEFINE_COMPOUND_OPERATOR
4345#undef __GMPZNLD_DEFINE_COMPOUND_OPERATOR
4346
4347#undef __GMPP_DEFINE_COMPOUND_OPERATOR
4348#undef __GMPNN_DEFINE_COMPOUND_OPERATOR
4349#undef __GMPNS_DEFINE_COMPOUND_OPERATOR
4350#undef __GMPNU_DEFINE_COMPOUND_OPERATOR
4351#undef __GMPND_DEFINE_COMPOUND_OPERATOR
4352#undef __GMPNLD_DEFINE_COMPOUND_OPERATOR
4353#undef __GMPN_DEFINE_COMPOUND_OPERATOR
4354#undef __GMP_DEFINE_COMPOUND_OPERATOR
4355
4356#undef __GMPZ_DEFINE_COMPOUND_OPERATOR
4357#undef __GMPZZ_DEFINE_COMPOUND_OPERATOR
4358#undef __GMPQ_DEFINE_COMPOUND_OPERATOR
4359#undef __MPFR_DEFINE_COMPOUND_OPERATOR
4360
4361#undef __GMP_DEFINE_COMPOUND_OPERATOR_UI
4362#undef __GMPZ_DEFINE_COMPOUND_OPERATOR_UI
4363#undef __GMPQ_DEFINE_COMPOUND_OPERATOR_UI
4364#undef __MPFR_DEFINE_COMPOUND_OPERATOR_UI
4365
4366#undef __GMP_DEFINE_INCREMENT_OPERATOR
4367#undef __GMPZ_DEFINE_INCREMENT_OPERATOR
4368#undef __GMPQ_DEFINE_INCREMENT_OPERATOR
4369#undef __MPFR_DEFINE_INCREMENT_OPERATOR
4370
4371#endif /* __GMP_PLUSPLUS__ */
long double h
Definition btreepic.C:154
long double w
Definition btreepic.C:153
static void set_dprec(mpfr_prec_t p=53)
Definition gmpfrxx.h:111
static mpfr_prec_t get_dprec()
Definition gmpfrxx.h:110
static int base
Definition gmpfrxx.h:103
static void set_base(int b=10)
Definition gmpfrxx.h:106
static void set_rnd(mpfr_rnd_t r=GMP_RNDN)
Definition gmpfrxx.h:108
static int get_base()
Definition gmpfrxx.h:105
static mpfr_rnd_t get_rnd()
Definition gmpfrxx.h:107
static mpfr_rnd_t rnd
Definition gmpfrxx.h:102
__gmp_expr(const val1_type &val1, const val2_type &val2)
Definition gmpfrxx.h:2792
__gmp_binary_expr< val1_type, val2_type, Op > expr
Definition gmpfrxx.h:2789
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int=0) const
Definition gmpfrxx.h:2794
__gmp_expr(const val1_type &val1, const val2_type &val2)
Definition gmpfrxx.h:2771
__gmp_binary_expr< val1_type, val2_type, Op > expr
Definition gmpfrxx.h:2769
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int=0) const
Definition gmpfrxx.h:2773
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:2978
__gmp_expr(const val1_type &val1, const val2_type &val2)
Definition gmpfrxx.h:2976
__gmp_binary_expr< val1_type, val2_type, Op > expr
Definition gmpfrxx.h:2974
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:2983
__gmp_expr(const val1_type &val1, const val2_type &val2)
Definition gmpfrxx.h:2752
__gmp_binary_expr< val1_type, val2_type, Op > expr
Definition gmpfrxx.h:2750
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int=0) const
Definition gmpfrxx.h:2754
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int=0) const
Definition gmpfrxx.h:2727
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:2822
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:2817
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:2888
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:2883
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:2956
__gmp_binary_expr< val1_type, val2_type, Op > expr
Definition gmpfrxx.h:2947
__gmp_expr(const val1_type &val1, const val2_type &val2)
Definition gmpfrxx.h:2949
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:2951
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:3014
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:3009
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:2916
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:2921
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:3075
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:3080
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:2850
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:2855
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:3047
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:3042
__gmp_unary_expr< val_type, Op > expr
Definition gmpfrxx.h:2670
unsigned long int get_prec() const
Definition gmpfrxx.h:2678
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int=0) const
Definition gmpfrxx.h:2674
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int=0) const
Definition gmpfrxx.h:2656
void eval(typename __gmp_resolve_expr< T >::ptr_type p) const
Definition gmpfrxx.h:2693
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int prec) const
Definition gmpfrxx.h:2695
unsigned long int get_prec() const
Definition gmpfrxx.h:2634
void eval(typename __gmp_resolve_expr< T >::ptr_type p, unsigned long int=0) const
Definition gmpfrxx.h:2631
unsigned long int get_prec() const
Definition gmpfrxx.h:4220
__gmp_expr(gmp_randstate_t s, unsigned long int l)
Definition gmpfrxx.h:4217
void eval(mpfr_ptr f, unsigned long int prec) const
Definition gmpfrxx.h:4218
int set_str(const std::string &s, int base)
Definition gmpfrxx.h:2401
__gmp_expr(unsigned long int l)
Definition gmpfrxx.h:2290
__gmp_expr(const std::string &s)
Definition gmpfrxx.h:2325
int set_str(const char *s, int base)
Definition gmpfrxx.h:2399
__gmp_expr(const __gmp_expr &f)
Definition gmpfrxx.h:2248
__gmp_expr(signed short int s, unsigned long int prec)
Definition gmpfrxx.h:2279
__gmp_expr & operator=(const __gmp_expr &f)
Definition gmpfrxx.h:2352
void prec_round(unsigned long int prec)
Definition gmpfrxx.h:2241
__gmp_expr(mpfr_srcptr f, unsigned long int prec)
Definition gmpfrxx.h:2346
__gmp_expr(const __gmp_expr< T, U > &expr, unsigned long int prec)
Definition gmpfrxx.h:2256
__gmp_expr(signed long int l)
Definition gmpfrxx.h:2286
__gmp_expr(const __gmp_expr &f, unsigned long int prec)
Definition gmpfrxx.h:2250
__gmp_expr(signed char c)
Definition gmpfrxx.h:2259
__gmp_expr(unsigned char c, unsigned long int prec)
Definition gmpfrxx.h:2265
__gmp_expr< value_type, value_type > & operator=(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:2355
__gmp_expr & operator=(const std::string &s)
Definition gmpfrxx.h:2391
__gmp_expr(unsigned short int s)
Definition gmpfrxx.h:2281
signed long int get_si() const
Definition gmpfrxx.h:2416
__gmp_expr(unsigned int i)
Definition gmpfrxx.h:2272
__gmp_expr(signed char c, unsigned long int prec)
Definition gmpfrxx.h:2261
__gmp_expr(signed short int s)
Definition gmpfrxx.h:2277
__gmp_expr(const std::string &s, unsigned long int prec, int base=0)
Definition gmpfrxx.h:2334
__gmp_expr & operator=(unsigned char c)
Definition gmpfrxx.h:2360
__gmp_expr & operator=(unsigned long int l)
Definition gmpfrxx.h:2375
__gmp_expr & operator=(signed int i)
Definition gmpfrxx.h:2363
unsigned long int get_ui() const
Definition gmpfrxx.h:2418
mpfr_srcptr get_mpfr_t() const
Definition gmpfrxx.h:2413
unsigned long int get_prec() const
Definition gmpfrxx.h:2237
__gmp_expr(unsigned long int l, unsigned long int prec)
Definition gmpfrxx.h:2292
void set_prec(unsigned long int prec)
Definition gmpfrxx.h:2239
__gmp_expr(signed int i, unsigned long int prec)
Definition gmpfrxx.h:2270
__gmp_expr & operator=(signed long int l)
Definition gmpfrxx.h:2373
__gmp_expr(unsigned int i, unsigned long int prec)
Definition gmpfrxx.h:2274
std::string get_str(mp_exp_t &expo, int base=10, size_t size=0) const
Definition gmpfrxx.h:2403
__gmp_expr & operator=(unsigned short int s)
Definition gmpfrxx.h:2370
__gmp_expr(unsigned short int s, unsigned long int prec)
Definition gmpfrxx.h:2283
__gmp_expr & operator=(double d)
Definition gmpfrxx.h:2380
__gmp_expr(const char *s, unsigned long int prec, int base=0)
Definition gmpfrxx.h:2316
__gmp_expr(unsigned char c)
Definition gmpfrxx.h:2263
void set_prec_raw(unsigned long int prec)
Definition gmpfrxx.h:2240
mpfr_srcptr __get_mp() const
Definition gmpfrxx.h:2411
__gmp_expr & operator=(unsigned int i)
Definition gmpfrxx.h:2365
__gmp_expr(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:2253
__gmp_expr & operator=(signed short int s)
Definition gmpfrxx.h:2368
__gmp_expr & operator=(signed char c)
Definition gmpfrxx.h:2358
__gmp_expr(double d, unsigned long int prec)
Definition gmpfrxx.h:2301
__gmp_expr(signed long int l, unsigned long int prec)
Definition gmpfrxx.h:2288
__gmp_expr & operator=(const char *s)
Definition gmpfrxx.h:2385
__gmp_expr(mpfr_srcptr f)
Definition gmpfrxx.h:2344
__gmp_expr(const char *s)
Definition gmpfrxx.h:2308
__gmp_expr & operator=(float f)
Definition gmpfrxx.h:2378
__gmp_expr(float f, unsigned long int prec)
Definition gmpfrxx.h:2297
__gmp_expr(const char *s, int base)
Definition gmpfrxx.h:2093
__gmp_expr(unsigned short int s)
Definition gmpfrxx.h:2075
__gmp_expr & operator=(float f)
Definition gmpfrxx.h:2157
__gmp_expr< value_type, value_type > & operator=(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:2135
const mpz_class & get_num() const
Definition gmpfrxx.h:2191
__gmp_expr & operator=(unsigned long int l)
Definition gmpfrxx.h:2154
__gmp_expr(signed short int s)
Definition gmpfrxx.h:2074
__gmp_expr & operator=(signed char c)
Definition gmpfrxx.h:2138
__gmp_expr & operator=(signed int i)
Definition gmpfrxx.h:2143
__gmp_expr(signed long int l)
Definition gmpfrxx.h:2077
const mpz_class & get_den() const
Definition gmpfrxx.h:2195
__gmp_expr(signed int i)
Definition gmpfrxx.h:2071
__gmp_expr(const std::string &s, int base)
Definition gmpfrxx.h:2111
mpz_srcptr get_num_mpz_t() const
Definition gmpfrxx.h:2205
__gmp_expr & operator=(unsigned char c)
Definition gmpfrxx.h:2140
__gmp_expr & operator=(signed short int s)
Definition gmpfrxx.h:2147
__gmp_expr(unsigned long int l)
Definition gmpfrxx.h:2078
mpq_srcptr get_mpq_t() const
Definition gmpfrxx.h:2202
__gmp_expr(unsigned int i)
Definition gmpfrxx.h:2072
mpz_srcptr get_den_mpz_t() const
Definition gmpfrxx.h:2207
__gmp_expr & operator=(const std::string &s)
Definition gmpfrxx.h:2168
__gmp_expr(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:2065
int set_str(const char *s, int base)
Definition gmpfrxx.h:2176
__gmp_expr & operator=(double d)
Definition gmpfrxx.h:2158
__gmp_expr(const __gmp_expr &q)
Definition gmpfrxx.h:2063
unsigned long int get_prec() const
Definition gmpfrxx.h:2057
__gmp_expr & operator=(const char *s)
Definition gmpfrxx.h:2162
__gmp_expr(unsigned char c)
Definition gmpfrxx.h:2069
__gmp_expr(mpq_srcptr q)
Definition gmpfrxx.h:2120
mpq_srcptr __get_mp() const
Definition gmpfrxx.h:2200
__gmp_expr & operator=(unsigned short int s)
Definition gmpfrxx.h:2149
std::string get_str(int base=10) const
Definition gmpfrxx.h:2180
__gmp_expr & operator=(signed long int l)
Definition gmpfrxx.h:2152
__gmp_expr(signed char c)
Definition gmpfrxx.h:2068
__gmp_expr(const std::string &s)
Definition gmpfrxx.h:2102
__gmp_expr & operator=(unsigned int i)
Definition gmpfrxx.h:2144
__gmp_expr & operator=(const __gmp_expr &q)
Definition gmpfrxx.h:2132
__gmp_expr(const mpz_class &num, const mpz_class &den)
Definition gmpfrxx.h:2122
int set_str(const std::string &s, int base)
Definition gmpfrxx.h:2178
__gmp_expr(const char *s)
Definition gmpfrxx.h:2084
unsigned long int get_prec() const
Definition gmpfrxx.h:4194
__gmp_expr(gmp_randstate_t s, unsigned long int l)
Definition gmpfrxx.h:4192
__gmp_expr(gmp_randstate_t s, const mpz_class &z)
Definition gmpfrxx.h:4204
unsigned long int get_prec() const
Definition gmpfrxx.h:4207
__gmp_expr(signed int i)
Definition gmpfrxx.h:1903
int set_str(const std::string &s, int base)
Definition gmpfrxx.h:1997
__gmp_expr & operator=(unsigned short int s)
Definition gmpfrxx.h:1968
signed long int get_si() const
Definition gmpfrxx.h:2011
__gmp_expr(signed char c)
Definition gmpfrxx.h:1900
mpz_srcptr get_mpz_t() const
Definition gmpfrxx.h:2008
__gmp_expr(unsigned char c)
Definition gmpfrxx.h:1901
__gmp_expr & operator=(signed char c)
Definition gmpfrxx.h:1960
__gmp_expr(const char *s)
Definition gmpfrxx.h:1916
__gmp_expr(mpz_srcptr z)
Definition gmpfrxx.h:1949
__gmp_expr & operator=(unsigned int i)
Definition gmpfrxx.h:1964
__gmp_expr(const char *s, int base)
Definition gmpfrxx.h:1924
std::string get_str(int base=10) const
Definition gmpfrxx.h:1999
__gmp_expr & operator=(const __gmp_expr &z)
Definition gmpfrxx.h:1954
__gmp_expr & operator=(float f)
Definition gmpfrxx.h:1976
bool fits_sshort_p() const
Definition gmpfrxx.h:2019
__gmp_expr(const __gmp_expr &z)
Definition gmpfrxx.h:1895
__gmp_expr(const std::string &s)
Definition gmpfrxx.h:1932
__gmp_expr(unsigned long int l)
Definition gmpfrxx.h:1910
__gmp_expr(unsigned short int s)
Definition gmpfrxx.h:1907
bool fits_slong_p() const
Definition gmpfrxx.h:2021
__gmp_expr(unsigned int i)
Definition gmpfrxx.h:1904
__gmp_expr(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:1897
__gmp_expr< value_type, value_type > & operator=(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:1957
unsigned long int get_ui() const
Definition gmpfrxx.h:2012
__gmp_expr & operator=(unsigned long int l)
Definition gmpfrxx.h:1973
__gmp_expr & operator=(unsigned char c)
Definition gmpfrxx.h:1961
bool fits_ushort_p() const
Definition gmpfrxx.h:2020
__gmp_expr(signed long int l)
Definition gmpfrxx.h:1909
__gmp_expr(signed short int s)
Definition gmpfrxx.h:1906
__gmp_expr & operator=(signed int i)
Definition gmpfrxx.h:1963
__gmp_expr & operator=(const std::string &s)
Definition gmpfrxx.h:1987
__gmp_expr(const std::string &s, int base)
Definition gmpfrxx.h:1940
__gmp_expr & operator=(signed short int s)
Definition gmpfrxx.h:1966
__gmp_expr & operator=(double d)
Definition gmpfrxx.h:1977
int set_str(const char *s, int base)
Definition gmpfrxx.h:1995
bool fits_ulong_p() const
Definition gmpfrxx.h:2022
__gmp_expr & operator=(const char *s)
Definition gmpfrxx.h:1981
unsigned long int get_prec() const
Definition gmpfrxx.h:1890
mpz_srcptr __get_mp() const
Definition gmpfrxx.h:2006
__gmp_expr & operator=(signed long int l)
Definition gmpfrxx.h:1971
__gmp_expr< mpz_t, __gmp_urandomb_value > get_z_bits(const mpz_class &z)
Definition gmpfrxx.h:4283
__gmp_expr< mpz_t, __gmp_urandomm_value > get_z_range(const mpz_class &z)
Definition gmpfrxx.h:4286
void operator=(const gmp_randclass &)
gmp_randstate_t state
Definition gmpfrxx.h:4238
__gmp_expr< mpfr_t, __gmp_urandomb_value > get_f(unsigned long int prec=0)
Definition gmpfrxx.h:4289
gmp_randclass(gmp_randalg_t alg, unsigned long int size)
Definition gmpfrxx.h:4245
gmp_randclass(__gmp_randinit_default_t *f)
Definition gmpfrxx.h:4257
gmp_randclass(const gmp_randclass &)
gmp_randclass(__gmp_randinit_lc_2exp_t *f, mpz_class z, unsigned long int l1, unsigned long int l2)
Definition gmpfrxx.h:4260
void seed(const mpz_class &z)
Definition gmpfrxx.h:4277
__gmp_expr< mpz_t, __gmp_urandomb_value > get_z_bits(unsigned long int l)
Definition gmpfrxx.h:4280
gmp_randclass(__gmp_randinit_lc_2exp_size_t *f, unsigned long int size)
Definition gmpfrxx.h:4265
void seed(unsigned long int s)
Definition gmpfrxx.h:4276
istream & operator>>(istream &s, mpfr_ptr a)
Definition gmpfrxx.C:51
void mpz_set_mpfr(mpz_ptr w, mpfr_srcptr u)
Definition gmpfrxx.C:133
void mpq_set_mpfr(mpq_ptr w, mpfr_srcptr u)
Definition gmpfrxx.C:175
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_log10_function > > log10(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4076
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_hypot_function > > hypot(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4123
#define __GMPZQ_DEFINE_EXPR(eval_fun)
Definition gmpfrxx.h:3104
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_cot_function > > cot(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4085
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_jn_function > > jn(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4112
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_sec_function > > sec(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4083
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_log2_function > > log2(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4075
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_y1_function > > y1(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4114
#define __GMP_DEFINE_BINARY_FUNCTION_UI_UI(T, fun, eval_fun)
Definition gmpfrxx.h:3847
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_csch_function > > csch(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4094
void __gmp_randinit_lc_2exp_t(gmp_randstate_t, mpz_srcptr, unsigned long int, unsigned long int)
Definition gmpfrxx.h:4231
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_cos_function > > cos(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4080
__gmp_expr< mpfr_t, __gmp_void_expr< __gmp_const_pi_function > > const_pi()
Definition gmpfrxx.h:4118
int cmpabs(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4060
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_yn_function > > yn(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4115
__gmp_expr< mpfr_t, __gmp_void_expr< __gmp_const_euler_function > > const_euler()
Definition gmpfrxx.h:4119
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_sqr_function > > sqr(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4068
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_frac_function > > frac(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4125
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_acos_function > > acos(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4086
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_sech_function > > sech(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4093
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_exp_function > > exp(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4077
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_max_function > > max(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4121
void __gmp_set_expr(mpz_ptr, const __gmp_expr< T, U > &)
__gmp_expr< mpfr_t, __gmp_unary_expr< unsigned long int, __gmp_zeta_function > > zeta_ui(unsigned long int l)
Definition gmpfrxx.h:4107
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_dim_function > > dim(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4063
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_exp2_function > > exp2(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4078
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_asin_function > > asin(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4087
#define __GMPZ_DEFINE_COMPOUND_OPERATOR_UI(fun, eval_fun)
Definition gmpfrxx.h:3995
#define __GMPP_DECLARE_COMPOUND_OPERATOR(fun)
Definition gmpfrxx.h:1852
#define __GMP_DEFINE_BINARY_FUNCTION(fun, eval_fun)
Definition gmpfrxx.h:3829
__gmp_expr< mpfr_t, __gmp_unary_expr< unsigned long int, __gmp_fac_ui_function > > fac_ui(unsigned long int l)
Definition gmpfrxx.h:4099
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_log_function > > log(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4074
__gmp_expr< mpfr_t, __gmp_void_expr< __gmp_const_catalan_function > > const_catalan()
Definition gmpfrxx.h:4120
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_cosh_function > > cosh(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4090
#define __GMP_DECLARE_COMPOUND_OPERATOR(fun)
Definition gmpfrxx.h:1869
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_erf_function > > erf(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4108
#define __MPFR_DEFINE_COMPOUND_OPERATOR_UI(fun, eval_fun)
Definition gmpfrxx.h:4001
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_sin_function > > sin(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4081
__gmp_expr< mpfr_t, __gmp_void_expr< __gmp_const_log2_function > > const_log2()
Definition gmpfrxx.h:4117
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_erfc_function > > erfc(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4109
#define __GMP_DECLARE_COMPOUND_OPERATOR_UI(fun)
Definition gmpfrxx.h:1873
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_acosh_function > > acosh(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4096
#define __GMPQ_DEFINE_INCREMENT_OPERATOR(fun, eval_fun)
Definition gmpfrxx.h:4024
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_floor_function > > floor(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4066
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_remainder_function > > remainder(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4126
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_sqrt_function > > sqrt(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4069
void mpz_set_mpfr(mpz_ptr w, mpfr_srcptr u)
Definition gmpfrxx.C:133
#define __GMP_DEFINE_TERNARY_EXPR(eval_fun1, eval_fun2, eval_both)
Definition gmpfrxx.h:3285
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_abs_function > > abs(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4062
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_tanh_function > > tanh(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4092
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_csc_function > > csc(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4084
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_atan2_function > > atan2(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4089
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_atan_function > > atan(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4088
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_tan_function > > tan(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4082
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_atanh_function > > atanh(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4098
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_zeta_function > > zeta(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4106
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_coth_function > > coth(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4095
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_log1p_function > > log1p(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4100
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_gamma_function > > gamma(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4103
#define __GMP_DEFINE_UNARY_FUNCTION_UI(T, fun, eval_fun)
Definition gmpfrxx.h:3746
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_min_function > > min(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4122
void mpq_set_mpfr(mpq_ptr w, mpfr_srcptr u)
Definition gmpfrxx.C:175
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_agm_function > > agm(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4116
#define __GMPZ_DEFINE_INCREMENT_OPERATOR(fun, eval_fun)
Definition gmpfrxx.h:4021
#define __MPFR_DEFINE_COMPOUND_OPERATOR(fun, eval_fun)
Definition gmpfrxx.h:3981
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_cbrt_function > > cbrt(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4070
#define __GMP_DEFINE_UNARY_TYPE_FUNCTION(type, fun, eval_fun)
Definition gmpfrxx.h:3736
#define __GMPZZ_DEFINE_COMPOUND_OPERATOR(fun, eval_fun)
Definition gmpfrxx.h:3975
#define __GMPQ_DEFINE_COMPOUND_OPERATOR_UI(fun, eval_fun)
Definition gmpfrxx.h:3998
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_j0_function > > j0(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4110
#define __GMP_DEFINE_BINARY_TYPE_FUNCTION(type, fun, eval_fun)
Definition gmpfrxx.h:3914
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_ceil_function > > ceil(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4067
#define __GMPQ_DEFINE_COMPOUND_OPERATOR(fun, eval_fun)
Definition gmpfrxx.h:3978
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_y0_function > > y0(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4113
std::istream & operator>>(std::istream &, mpfr_ptr)
Definition gmpfrxx.C:51
__gmp_expr< typename __gmp_resolve_expr< T, V >::value_type, __gmp_binary_expr< __gmp_expr< T, U >, __gmp_expr< V, W >, __gmp_pow_function > > pow(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4072
__gmp_expr< T, __gmp_binary_expr< __gmp_expr< T, U >, unsigned long int, __gmp_root_function > > root(const __gmp_expr< T, U > &expr, unsigned long int l)
Definition gmpfrxx.h:4071
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_trunc_function > > trunc(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4065
#define __GMPZ_DEFINE_COMPOUND_OPERATOR(fun, eval_fun)
Definition gmpfrxx.h:3972
__gmp_expr< mpfr_t, __gmp_binary_expr< unsigned long int, unsigned long int, __gmp_pow_function > > pow_ui(unsigned long int r, unsigned long int l)
Definition gmpfrxx.h:4073
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_asinh_function > > asinh(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4097
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_j1_function > > j1(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4111
std::ostream & operator<<(std::ostream &, mpfr_srcptr)
Definition gmpfrxx.C:62
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_rint_function > > rint(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4064
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_sinh_function > > sinh(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4091
#define __GMP_DEFINE_VOID_FUNCTION(T, fun, eval_fun)
Definition gmpfrxx.h:3712
int __gmp_randinit_lc_2exp_size_t(gmp_randstate_t, unsigned long int)
Definition gmpfrxx.h:4232
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_expm1_function > > expm1(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4101
#define __MPFR_DEFINE_INCREMENT_OPERATOR(fun, eval_fun)
Definition gmpfrxx.h:4027
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_lngamma_function > > lngamma(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4104
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_eint_function > > eint(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4102
int cmp(const __gmp_expr< T, U > &expr1, const __gmp_expr< V, W > &expr2)
Definition gmpfrxx.h:4129
#define __GMP_DEFINE_UNARY_FUNCTION(fun, eval_fun)
Definition gmpfrxx.h:3725
#define __GMP_DECLARE_INCREMENT_OPERATOR(fun)
Definition gmpfrxx.h:1876
int sgn(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4128
void __gmp_randinit_default_t(gmp_randstate_t)
Definition gmpfrxx.h:4230
#define __GMP_DEFINE_BINARY_FUNCTION_UI(fun, eval_fun)
Definition gmpfrxx.h:3835
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_lgamma_function > > lgamma(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4105
__gmp_expr< T, __gmp_unary_expr< __gmp_expr< T, U >, __gmp_exp10_function > > exp10(const __gmp_expr< T, U > &expr)
Definition gmpfrxx.h:4079
int mpfr_d_sub(mpfr_ptr z, double a, mpfr_srcptr x, mpfr_rnd_t r)
Definition mpfr_mul_d.c:56
int mpfr_mul_d(mpfr_ptr z, mpfr_srcptr x, double a, mpfr_rnd_t r)
Definition mpfr_mul_d.c:6
int mpfr_div_d(mpfr_ptr z, mpfr_srcptr x, double a, mpfr_rnd_t r)
Definition mpfr_mul_d.c:16
int mpfr_add_d(mpfr_ptr z, mpfr_srcptr x, double a, mpfr_rnd_t r)
Definition mpfr_mul_d.c:36
int mpfr_d_div(mpfr_ptr z, double a, mpfr_srcptr x, mpfr_rnd_t r)
Definition mpfr_mul_d.c:26
int mpfr_sub_d(mpfr_ptr z, mpfr_srcptr x, double a, mpfr_rnd_t r)
Definition mpfr_mul_d.c:46
STL namespace.
static void eval(mpz_ptr z, mpz_srcptr w)
Definition gmpfrxx.h:1081
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1083
static void eval(mpq_ptr q, mpq_srcptr r)
Definition gmpfrxx.h:1082
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1235
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1295
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:1416
__gmp_alloc_cstring(char *s)
Definition gmpfrxx.h:1694
const char * c_str() const
Definition gmpfrxx.h:1705
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1241
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1301
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:1253
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1247
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1307
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
Definition gmpfrxx.h:632
static void eval(mpz_ptr z, mpz_srcptr w, double d)
Definition gmpfrxx.h:490
static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
Definition gmpfrxx.h:570
static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
Definition gmpfrxx.h:508
static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
Definition gmpfrxx.h:568
static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
Definition gmpfrxx.h:479
static void eval(mpq_ptr q, signed long int l, mpq_srcptr r)
Definition gmpfrxx.h:532
static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
Definition gmpfrxx.h:564
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
Definition gmpfrxx.h:443
static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
Definition gmpfrxx.h:448
static void eval(mpq_ptr q, mpq_srcptr r, double d)
Definition gmpfrxx.h:540
static void eval(mpz_ptr z, double d, mpz_srcptr w)
Definition gmpfrxx.h:497
static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
Definition gmpfrxx.h:562
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:560
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:557
static void eval(mpq_ptr q, unsigned long int l, mpq_srcptr r)
Definition gmpfrxx.h:516
static void eval(mpq_ptr q, mpq_srcptr r, signed long int l)
Definition gmpfrxx.h:524
static void eval(mpq_ptr q, double d, mpq_srcptr r)
Definition gmpfrxx.h:548
static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
Definition gmpfrxx.h:469
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
Definition gmpfrxx.h:446
static void eval(mpq_ptr q, mpq_srcptr r, mpq_srcptr s)
Definition gmpfrxx.h:505
static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
Definition gmpfrxx.h:566
static bool eval(mpq_srcptr q, unsigned long int l)
Definition gmpfrxx.h:688
static bool eval(mpz_srcptr z, signed long int l)
Definition gmpfrxx.h:676
static bool eval(double d, mpfr_srcptr f)
Definition gmpfrxx.h:730
static bool eval(mpz_srcptr z, double d)
Definition gmpfrxx.h:680
static bool eval(signed long int l, mpq_srcptr q)
Definition gmpfrxx.h:694
static bool eval(double d, mpq_srcptr q)
Definition gmpfrxx.h:706
static bool eval(unsigned long int l, mpq_srcptr q)
Definition gmpfrxx.h:690
static bool eval(mpq_srcptr q, mpq_srcptr r)
Definition gmpfrxx.h:685
static bool eval(signed long int l, mpz_srcptr z)
Definition gmpfrxx.h:678
static bool eval(double d, mpz_srcptr z)
Definition gmpfrxx.h:682
static bool eval(mpfr_srcptr f, double d)
Definition gmpfrxx.h:728
static bool eval(mpq_srcptr q, double d)
Definition gmpfrxx.h:696
static bool eval(unsigned long int l, mpfr_srcptr f)
Definition gmpfrxx.h:722
static bool eval(mpfr_srcptr f, signed long int l)
Definition gmpfrxx.h:724
static bool eval(mpz_srcptr z, unsigned long int l)
Definition gmpfrxx.h:672
static bool eval(mpfr_srcptr f, unsigned long int l)
Definition gmpfrxx.h:720
static bool eval(mpz_srcptr z, mpz_srcptr w)
Definition gmpfrxx.h:670
static bool eval(signed long int l, mpfr_srcptr f)
Definition gmpfrxx.h:726
static bool eval(mpfr_srcptr f, mpfr_srcptr g)
Definition gmpfrxx.h:717
static bool eval(mpq_srcptr q, signed long int l)
Definition gmpfrxx.h:692
static bool eval(unsigned long int l, mpz_srcptr z)
Definition gmpfrxx.h:674
__gmp_resolve_ref< U >::ref_type val2
Definition gmpfrxx.h:1824
__gmp_resolve_ref< T >::ref_type val1
Definition gmpfrxx.h:1823
__gmp_binary_expr(const T &v1, const U &v2)
Definition gmpfrxx.h:1826
static bool eval(signed long int l, mpq_srcptr q)
Definition gmpfrxx.h:1024
static bool eval(mpfr_srcptr f, double d)
Definition gmpfrxx.h:1057
static bool eval(signed long int l, mpz_srcptr z)
Definition gmpfrxx.h:1009
static bool eval(mpz_srcptr z, signed long int l)
Definition gmpfrxx.h:1007
static bool eval(mpq_srcptr q, double d)
Definition gmpfrxx.h:1026
static bool eval(signed long int l, mpfr_srcptr f)
Definition gmpfrxx.h:1055
static bool eval(double d, mpfr_srcptr f)
Definition gmpfrxx.h:1059
static bool eval(unsigned long int l, mpfr_srcptr f)
Definition gmpfrxx.h:1051
static bool eval(mpq_srcptr q, mpq_srcptr r)
Definition gmpfrxx.h:1016
static bool eval(mpfr_srcptr f, unsigned long int l)
Definition gmpfrxx.h:1049
static bool eval(double d, mpq_srcptr q)
Definition gmpfrxx.h:1036
static bool eval(mpz_srcptr z, unsigned long int l)
Definition gmpfrxx.h:1003
static bool eval(mpfr_srcptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1047
static bool eval(mpfr_srcptr f, signed long int l)
Definition gmpfrxx.h:1053
static bool eval(mpq_srcptr q, signed long int l)
Definition gmpfrxx.h:1022
static bool eval(mpz_srcptr z, double d)
Definition gmpfrxx.h:1011
static bool eval(unsigned long int l, mpq_srcptr q)
Definition gmpfrxx.h:1020
static bool eval(mpq_srcptr q, unsigned long int l)
Definition gmpfrxx.h:1018
static bool eval(double d, mpz_srcptr z)
Definition gmpfrxx.h:1013
static bool eval(mpz_srcptr z, mpz_srcptr w)
Definition gmpfrxx.h:1001
static bool eval(unsigned long int l, mpz_srcptr z)
Definition gmpfrxx.h:1005
static bool eval(mpfr_srcptr f, double d)
Definition gmpfrxx.h:986
static bool eval(signed long int l, mpq_srcptr q)
Definition gmpfrxx.h:953
static bool eval(signed long int l, mpz_srcptr z)
Definition gmpfrxx.h:938
static bool eval(mpq_srcptr q, signed long int l)
Definition gmpfrxx.h:951
static bool eval(mpfr_srcptr f, mpfr_srcptr g)
Definition gmpfrxx.h:976
static bool eval(mpq_srcptr q, double d)
Definition gmpfrxx.h:955
static bool eval(mpz_srcptr z, double d)
Definition gmpfrxx.h:940
static bool eval(mpz_srcptr z, mpz_srcptr w)
Definition gmpfrxx.h:930
static bool eval(mpz_srcptr z, unsigned long int l)
Definition gmpfrxx.h:932
static bool eval(unsigned long int l, mpz_srcptr z)
Definition gmpfrxx.h:934
static bool eval(signed long int l, mpfr_srcptr f)
Definition gmpfrxx.h:984
static bool eval(mpq_srcptr q, mpq_srcptr r)
Definition gmpfrxx.h:945
static bool eval(mpfr_srcptr f, unsigned long int l)
Definition gmpfrxx.h:978
static bool eval(double d, mpq_srcptr q)
Definition gmpfrxx.h:965
static bool eval(unsigned long int l, mpq_srcptr q)
Definition gmpfrxx.h:949
static bool eval(mpfr_srcptr f, signed long int l)
Definition gmpfrxx.h:982
static bool eval(mpz_srcptr z, signed long int l)
Definition gmpfrxx.h:936
static bool eval(double d, mpz_srcptr z)
Definition gmpfrxx.h:942
static bool eval(unsigned long int l, mpfr_srcptr f)
Definition gmpfrxx.h:980
static bool eval(mpq_srcptr q, unsigned long int l)
Definition gmpfrxx.h:947
static bool eval(double d, mpfr_srcptr f)
Definition gmpfrxx.h:988
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
Definition gmpfrxx.h:638
static bool eval(unsigned long int l, mpfr_srcptr f)
Definition gmpfrxx.h:916
static bool eval(mpfr_srcptr f, unsigned long int l)
Definition gmpfrxx.h:914
static bool eval(mpz_srcptr z, double d)
Definition gmpfrxx.h:876
static bool eval(double d, mpq_srcptr q)
Definition gmpfrxx.h:901
static bool eval(mpz_srcptr z, signed long int l)
Definition gmpfrxx.h:872
static bool eval(signed long int l, mpq_srcptr q)
Definition gmpfrxx.h:889
static bool eval(signed long int l, mpz_srcptr z)
Definition gmpfrxx.h:874
static bool eval(mpq_srcptr q, mpq_srcptr r)
Definition gmpfrxx.h:881
static bool eval(mpfr_srcptr f, double d)
Definition gmpfrxx.h:922
static bool eval(mpq_srcptr q, double d)
Definition gmpfrxx.h:891
static bool eval(double d, mpz_srcptr z)
Definition gmpfrxx.h:878
static bool eval(mpq_srcptr q, unsigned long int l)
Definition gmpfrxx.h:883
static bool eval(double d, mpfr_srcptr f)
Definition gmpfrxx.h:924
static bool eval(unsigned long int l, mpq_srcptr q)
Definition gmpfrxx.h:885
static bool eval(mpq_srcptr q, signed long int l)
Definition gmpfrxx.h:887
static bool eval(mpz_srcptr z, unsigned long int l)
Definition gmpfrxx.h:868
static bool eval(unsigned long int l, mpz_srcptr z)
Definition gmpfrxx.h:870
static bool eval(mpz_srcptr z, mpz_srcptr w)
Definition gmpfrxx.h:866
static bool eval(mpfr_srcptr f, signed long int l)
Definition gmpfrxx.h:918
static bool eval(signed long int l, mpfr_srcptr f)
Definition gmpfrxx.h:920
static bool eval(mpfr_srcptr f, mpfr_srcptr g)
Definition gmpfrxx.h:912
static bool eval(mpfr_srcptr f, unsigned long int l)
Definition gmpfrxx.h:850
static bool eval(signed long int l, mpz_srcptr z)
Definition gmpfrxx.h:810
static bool eval(double d, mpz_srcptr z)
Definition gmpfrxx.h:814
static bool eval(mpq_srcptr q, double d)
Definition gmpfrxx.h:827
static bool eval(mpfr_srcptr f, mpfr_srcptr g)
Definition gmpfrxx.h:848
static bool eval(double d, mpq_srcptr q)
Definition gmpfrxx.h:837
static bool eval(mpfr_srcptr f, double d)
Definition gmpfrxx.h:858
static bool eval(mpq_srcptr q, unsigned long int l)
Definition gmpfrxx.h:819
static bool eval(mpz_srcptr z, mpz_srcptr w)
Definition gmpfrxx.h:802
static bool eval(mpq_srcptr q, signed long int l)
Definition gmpfrxx.h:823
static bool eval(unsigned long int l, mpfr_srcptr f)
Definition gmpfrxx.h:852
static bool eval(unsigned long int l, mpz_srcptr z)
Definition gmpfrxx.h:806
static bool eval(mpfr_srcptr f, signed long int l)
Definition gmpfrxx.h:854
static bool eval(mpq_srcptr q, mpq_srcptr r)
Definition gmpfrxx.h:817
static bool eval(signed long int l, mpq_srcptr q)
Definition gmpfrxx.h:825
static bool eval(mpz_srcptr z, unsigned long int l)
Definition gmpfrxx.h:804
static bool eval(mpz_srcptr z, signed long int l)
Definition gmpfrxx.h:808
static bool eval(double d, mpfr_srcptr f)
Definition gmpfrxx.h:860
static bool eval(unsigned long int l, mpq_srcptr q)
Definition gmpfrxx.h:821
static bool eval(signed long int l, mpfr_srcptr f)
Definition gmpfrxx.h:856
static bool eval(mpz_srcptr z, double d)
Definition gmpfrxx.h:812
static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
Definition gmpfrxx.h:652
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:654
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
Definition gmpfrxx.h:650
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:327
static void eval(mpq_ptr q, signed long int l, mpq_srcptr r)
Definition gmpfrxx.h:297
static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
Definition gmpfrxx.h:334
static void eval(mpq_ptr q, double d, mpq_srcptr r)
Definition gmpfrxx.h:313
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
Definition gmpfrxx.h:243
static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
Definition gmpfrxx.h:336
static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
Definition gmpfrxx.h:248
static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
Definition gmpfrxx.h:338
static void eval(mpq_ptr q, mpq_srcptr r, mpz_srcptr z)
Definition gmpfrxx.h:322
static void eval(mpq_ptr q, mpz_srcptr z, mpq_srcptr r)
Definition gmpfrxx.h:324
static void eval(mpz_ptr z, mpz_srcptr w, double d)
Definition gmpfrxx.h:267
static void eval(mpq_ptr q, mpq_srcptr r, mpq_srcptr s)
Definition gmpfrxx.h:282
static void eval(mpz_ptr z, double d, mpz_srcptr w)
Definition gmpfrxx.h:274
static void eval(mpq_ptr q, unsigned long int l, mpq_srcptr r)
Definition gmpfrxx.h:287
static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
Definition gmpfrxx.h:340
static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
Definition gmpfrxx.h:285
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:330
static void eval(mpq_ptr q, mpq_srcptr r, signed long int l)
Definition gmpfrxx.h:289
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
Definition gmpfrxx.h:246
static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
Definition gmpfrxx.h:332
static void eval(mpq_ptr q, mpq_srcptr r, double d)
Definition gmpfrxx.h:305
static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
Definition gmpfrxx.h:257
static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
Definition gmpfrxx.h:250
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
Definition gmpfrxx.h:576
static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
Definition gmpfrxx.h:581
static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
Definition gmpfrxx.h:603
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
Definition gmpfrxx.h:579
static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
Definition gmpfrxx.h:599
static void eval(mpz_ptr z, mpz_srcptr w, double d)
Definition gmpfrxx.h:614
static void eval(mpz_ptr z, double d, mpz_srcptr w)
Definition gmpfrxx.h:621
static void eval(mpq_ptr q, mpq_srcptr r, mpq_srcptr s)
Definition gmpfrxx.h:372
static void eval(mpz_ptr z, double d, mpz_srcptr w)
Definition gmpfrxx.h:364
static void eval(mpz_ptr z, mpz_srcptr w, double d)
Definition gmpfrxx.h:357
static void eval(mpq_ptr q, signed long int l, mpq_srcptr r)
Definition gmpfrxx.h:399
static void eval(mpq_ptr q, double d, mpq_srcptr r)
Definition gmpfrxx.h:415
static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
Definition gmpfrxx.h:437
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:427
static void eval(mpq_ptr q, unsigned long int l, mpq_srcptr r)
Definition gmpfrxx.h:383
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
Definition gmpfrxx.h:346
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:424
static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
Definition gmpfrxx.h:429
static void eval(mpq_ptr q, mpq_srcptr r, signed long int l)
Definition gmpfrxx.h:391
static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
Definition gmpfrxx.h:435
static void eval(mpq_ptr q, mpq_srcptr r, double d)
Definition gmpfrxx.h:407
static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
Definition gmpfrxx.h:353
static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
Definition gmpfrxx.h:375
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
Definition gmpfrxx.h:349
static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
Definition gmpfrxx.h:351
static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
Definition gmpfrxx.h:355
static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
Definition gmpfrxx.h:433
static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
Definition gmpfrxx.h:431
static bool eval(mpz_srcptr z, mpz_srcptr w)
Definition gmpfrxx.h:736
static bool eval(unsigned long int l, mpfr_srcptr f)
Definition gmpfrxx.h:788
static bool eval(mpq_srcptr q, unsigned long int l)
Definition gmpfrxx.h:755
static bool eval(signed long int l, mpq_srcptr q)
Definition gmpfrxx.h:761
static bool eval(double d, mpq_srcptr q)
Definition gmpfrxx.h:773
static bool eval(double d, mpz_srcptr z)
Definition gmpfrxx.h:749
static bool eval(mpfr_srcptr f, unsigned long int l)
Definition gmpfrxx.h:786
static bool eval(mpfr_srcptr f, signed long int l)
Definition gmpfrxx.h:790
static bool eval(mpfr_srcptr f, mpfr_srcptr g)
Definition gmpfrxx.h:784
static bool eval(mpq_srcptr q, mpq_srcptr r)
Definition gmpfrxx.h:752
static bool eval(signed long int l, mpz_srcptr z)
Definition gmpfrxx.h:745
static bool eval(signed long int l, mpfr_srcptr f)
Definition gmpfrxx.h:792
static bool eval(double d, mpfr_srcptr f)
Definition gmpfrxx.h:796
static bool eval(unsigned long int l, mpq_srcptr q)
Definition gmpfrxx.h:757
static bool eval(mpz_srcptr z, signed long int l)
Definition gmpfrxx.h:743
static bool eval(mpq_srcptr q, double d)
Definition gmpfrxx.h:763
static bool eval(mpfr_srcptr f, double d)
Definition gmpfrxx.h:794
static bool eval(mpq_srcptr q, signed long int l)
Definition gmpfrxx.h:759
static bool eval(unsigned long int l, mpz_srcptr z)
Definition gmpfrxx.h:741
static bool eval(mpz_srcptr z, unsigned long int l)
Definition gmpfrxx.h:739
static bool eval(mpz_srcptr z, double d)
Definition gmpfrxx.h:747
static void eval(mpq_ptr q, mpq_srcptr r, double d)
Definition gmpfrxx.h:203
static void eval(mpz_ptr z, mpz_srcptr w, double d)
Definition gmpfrxx.h:165
static void eval(mpq_ptr q, signed long int l, mpq_srcptr r)
Definition gmpfrxx.h:195
static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
Definition gmpfrxx.h:233
static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
Definition gmpfrxx.h:158
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
Definition gmpfrxx.h:144
static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
Definition gmpfrxx.h:229
static void eval(mpq_ptr q, mpq_srcptr r, mpz_srcptr z)
Definition gmpfrxx.h:220
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
Definition gmpfrxx.h:147
static void eval(mpz_ptr z, unsigned long int l, mpz_srcptr w)
Definition gmpfrxx.h:149
static void eval(mpq_ptr q, mpq_srcptr r, signed long int l)
Definition gmpfrxx.h:187
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:227
static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
Definition gmpfrxx.h:183
static void eval(mpq_ptr q, unsigned long int l, mpq_srcptr r)
Definition gmpfrxx.h:185
static void eval(mpz_ptr z, double d, mpz_srcptr w)
Definition gmpfrxx.h:172
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:225
static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
Definition gmpfrxx.h:231
static void eval(mpq_ptr q, double d, mpq_srcptr r)
Definition gmpfrxx.h:211
static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
Definition gmpfrxx.h:235
static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
Definition gmpfrxx.h:237
static void eval(mpq_ptr q, mpq_srcptr r, mpq_srcptr s)
Definition gmpfrxx.h:180
static void eval(mpq_ptr q, mpz_srcptr z, mpq_srcptr r)
Definition gmpfrxx.h:222
static void eval(mpz_ptr z, mpz_srcptr w, signed long int l)
Definition gmpfrxx.h:151
static void eval(mpq_ptr q, mpq_srcptr r, unsigned long int l)
Definition gmpfrxx.h:662
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:664
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l)
Definition gmpfrxx.h:660
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v)
Definition gmpfrxx.h:644
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1129
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1111
static int eval(mpfr_srcptr f, double d)
Definition gmpfrxx.h:1572
static int eval(mpq_srcptr q, signed long int l)
Definition gmpfrxx.h:1537
static int eval(mpfr_srcptr f, unsigned long int l)
Definition gmpfrxx.h:1564
static int eval(unsigned long int l, mpfr_srcptr f)
Definition gmpfrxx.h:1566
static int eval(mpfr_srcptr f, signed long int l)
Definition gmpfrxx.h:1568
static int eval(mpz_srcptr z, unsigned long int l)
Definition gmpfrxx.h:1518
static int eval(signed long int l, mpfr_srcptr f)
Definition gmpfrxx.h:1570
static int eval(mpz_srcptr z, signed long int l)
Definition gmpfrxx.h:1522
static int eval(signed long int l, mpq_srcptr q)
Definition gmpfrxx.h:1539
static int eval(mpfr_srcptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1562
static int eval(mpq_srcptr q, unsigned long int l)
Definition gmpfrxx.h:1533
static int eval(mpz_srcptr z, double d)
Definition gmpfrxx.h:1526
static int eval(mpq_srcptr q, mpq_srcptr r)
Definition gmpfrxx.h:1531
static int eval(mpz_srcptr z, mpz_srcptr w)
Definition gmpfrxx.h:1516
static int eval(unsigned long int l, mpq_srcptr q)
Definition gmpfrxx.h:1535
static int eval(mpq_srcptr q, double d)
Definition gmpfrxx.h:1541
static int eval(double d, mpq_srcptr q)
Definition gmpfrxx.h:1551
static int eval(double d, mpz_srcptr z)
Definition gmpfrxx.h:1528
static int eval(unsigned long int l, mpz_srcptr z)
Definition gmpfrxx.h:1520
static int eval(double d, mpfr_srcptr f)
Definition gmpfrxx.h:1574
static int eval(signed long int l, mpz_srcptr z)
Definition gmpfrxx.h:1524
static int eval(mpfr_srcptr f, mpfr_srcptr g)
Definition gmpfrxx.h:995
static void eval(mpfr_ptr f)
Definition gmpfrxx.h:1440
static void eval(mpfr_ptr f)
Definition gmpfrxx.h:1434
static void eval(mpfr_ptr f)
Definition gmpfrxx.h:1422
static void eval(mpfr_ptr f)
Definition gmpfrxx.h:1428
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1199
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1259
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1229
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1289
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1223
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1283
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:1089
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1331
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1364
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1370
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1193
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1187
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1181
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1325
static void eval(mpfr_ptr f, unsigned long int l)
Definition gmpfrxx.h:1313
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1106
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1497
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1337
static void eval(mpfr_ptr f, mpfr_srcptr g, double d)
Definition gmpfrxx.h:1483
static void eval(mpfr_ptr f, double d, mpfr_srcptr g)
Definition gmpfrxx.h:1488
static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr g)
Definition gmpfrxx.h:1468
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:1458
static void eval(mpfr_ptr f, signed long int l, mpfr_srcptr g)
Definition gmpfrxx.h:1478
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:1463
static void eval(mpfr_ptr f, mpfr_srcptr g, signed long int l)
Definition gmpfrxx.h:1473
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1376
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1382
static void eval(mpfr_ptr f, long h, mpfr_srcptr g)
Definition gmpfrxx.h:1390
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1349
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1343
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1175
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1319
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1169
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1163
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:1446
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:1452
static void eval(mpfr_ptr f, mpfr_srcptr g, long int l)
Definition gmpfrxx.h:1151
static void eval(mpfr_ptr f, mpfr_srcptr g, mpz_srcptr z)
Definition gmpfrxx.h:1153
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:1147
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:1149
static void eval(mpfr_ptr f, unsigned long int l, unsigned long int h)
Definition gmpfrxx.h:1157
static void eval(mpfr_ptr f, unsigned long int l, mpfr_srcptr h)
Definition gmpfrxx.h:1155
static void eval(mpz_ptr z, gmp_randstate_t s, unsigned long int l)
Definition gmpfrxx.h:1666
static void eval(mpz_ptr z, gmp_randstate_t s, mpz_srcptr w)
Definition gmpfrxx.h:1668
static void eval(mpfr_ptr f, gmp_randstate_t s, unsigned long int prec)
Definition gmpfrxx.h:1670
static void eval(mpfr_ptr f, mpfr_srcptr g, mpfr_srcptr h)
Definition gmpfrxx.h:1503
const __gmp_expr< T, U > & ref_type
Definition gmpfrxx.h:1729
const __gmp_expr< T, T > & temp_type
Definition gmpfrxx.h:1804
__gmp_expr< T, T > temp_type
Definition gmpfrxx.h:1798
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1095
static void eval(mpfr_ptr f, mpfr_srcptr g, unsigned long int l)
Definition gmpfrxx.h:1135
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1217
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1277
static int eval(mpq_srcptr q)
Definition gmpfrxx.h:1510
static int eval(mpz_srcptr z)
Definition gmpfrxx.h:1509
static int eval(mpfr_srcptr f)
Definition gmpfrxx.h:1511
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1205
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1265
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1116
static void eval(mpz_ptr z, mpz_srcptr w)
Definition gmpfrxx.h:1122
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1123
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1211
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1271
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, double d)
Definition gmpfrxx.h:1603
static void eval(mpz_ptr z, mpz_srcptr w, signed long int l, mpz_srcptr v)
Definition gmpfrxx.h:1595
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, signed long int l)
Definition gmpfrxx.h:1587
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, unsigned long int l)
Definition gmpfrxx.h:1583
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, mpz_srcptr u)
Definition gmpfrxx.h:1580
static void eval(mpz_ptr z, mpz_srcptr w, double d, mpz_srcptr v)
Definition gmpfrxx.h:1611
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l, mpz_srcptr v)
Definition gmpfrxx.h:1585
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, double d)
Definition gmpfrxx.h:1646
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, mpz_srcptr u)
Definition gmpfrxx.h:1623
static void eval(mpz_ptr z, mpz_srcptr w, double d, mpz_srcptr v)
Definition gmpfrxx.h:1654
static void eval(mpz_ptr z, mpz_srcptr w, unsigned long int l, mpz_srcptr v)
Definition gmpfrxx.h:1628
static void eval(mpz_ptr z, mpz_srcptr w, signed long int l, mpz_srcptr v)
Definition gmpfrxx.h:1638
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, unsigned long int l)
Definition gmpfrxx.h:1626
static void eval(mpz_ptr z, mpz_srcptr w, mpz_srcptr v, signed long int l)
Definition gmpfrxx.h:1630
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1101
static void eval(mpz_ptr z, mpz_srcptr w)
Definition gmpfrxx.h:139
static void eval(mpq_ptr q)
Definition gmpfrxx.h:1074
static void eval(mpz_ptr z)
Definition gmpfrxx.h:1073
static void eval(mpfr_ptr f)
Definition gmpfrxx.h:1076
__gmp_unary_expr(const T &v)
Definition gmpfrxx.h:1815
__gmp_resolve_ref< T >::ref_type val
Definition gmpfrxx.h:1813
static void eval(mpz_ptr z)
Definition gmpfrxx.h:1065
static void eval(mpq_ptr q)
Definition gmpfrxx.h:1066
static void eval(mpfr_ptr f)
Definition gmpfrxx.h:1068
static void eval(mpq_ptr q, mpq_srcptr r)
Definition gmpfrxx.h:132
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:133
static void eval(mpz_ptr z, mpz_srcptr w)
Definition gmpfrxx.h:131
static void eval(mpz_ptr z, mpz_srcptr w)
Definition gmpfrxx.h:123
static void eval(mpq_ptr q, mpq_srcptr r)
Definition gmpfrxx.h:124
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:125
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1396
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1402
static void eval(mpfr_ptr f, long h, mpfr_srcptr g)
Definition gmpfrxx.h:1410
static void eval(mpfr_ptr f, unsigned long int l)
Definition gmpfrxx.h:1358
static void eval(mpfr_ptr f, mpfr_srcptr g)
Definition gmpfrxx.h:1356
size_t V
DynList< int > l1
DynList< int > l2
gsl_rng * r
DynList< int > l