GiNaC 1.8.10
numeric.cpp
Go to the documentation of this file.
1
9/*
10 * GiNaC Copyright (C) 1999-2026 Johannes Gutenberg University Mainz, Germany
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program. If not, see <https://www.gnu.org/licenses/>.
24 */
25
26#include "numeric.h"
27#include "ex.h"
28#include "operators.h"
29#include "archive.h"
30#include "utils.h"
31
32#include <limits>
33#include <sstream>
34#include <stdexcept>
35#include <string>
36#include <vector>
37
38// CLN should pollute the global namespace as little as possible. Hence, we
39// include most of it here and include only the part needed for properly
40// declaring cln::cl_number in numeric.h. This can only be safely done in
41// namespaced versions of CLN, i.e. version > 1.1.0. Also, we only need a
42// subset of CLN, so we don't include the complete <cln/cln.h> but only the
43// essential stuff:
44#include <cln/output.h>
45#include <cln/integer_io.h>
46#include <cln/integer_ring.h>
47#include <cln/rational_io.h>
48#include <cln/rational_ring.h>
49#include <cln/lfloat_class.h>
50#include <cln/lfloat_io.h>
51#include <cln/real_io.h>
52#include <cln/real_ring.h>
53#include <cln/complex_io.h>
54#include <cln/complex_ring.h>
55#include <cln/numtheory.h>
56
57namespace GiNaC {
58
61 print_func<print_latex>(&numeric::do_print_latex).
62 print_func<print_csrc>(&numeric::do_print_csrc).
63 print_func<print_csrc_cl_N>(&numeric::do_print_csrc_cl_N).
64 print_func<print_tree>(&numeric::do_print_tree).
65 print_func<print_python_repr>(&numeric::do_print_python_repr))
66
67
68// default constructor
70
73{
74 value = cln::cl_I(0);
76}
77
79// other constructors
81
82// public
83
85{
86 // Not the whole int-range is available if we don't cast to long
87 // first. This is due to the behavior of the cl_I-ctor, which
88 // emphasizes efficiency. However, if the integer is small enough
89 // we save space and dereferences by using an immediate type.
90 // (C.f. <cln/object.h>)
91 // The #if clause prevents compiler warnings on 64bit machines where the
92 // comparision is always true.
93#if cl_value_len >= 32
94 value = cln::cl_I(i);
95#else
96 if (i < (1L << (cl_value_len-1)) && i >= -(1L << (cl_value_len-1)))
97 value = cln::cl_I(i);
98 else
99 value = cln::cl_I(static_cast<long>(i));
100#endif
102}
103
104
105numeric::numeric(unsigned int i)
106{
107 // Not the whole uint-range is available if we don't cast to ulong
108 // first. This is due to the behavior of the cl_I-ctor, which
109 // emphasizes efficiency. However, if the integer is small enough
110 // we save space and dereferences by using an immediate type.
111 // (C.f. <cln/object.h>)
112 // The #if clause prevents compiler warnings on 64bit machines where the
113 // comparision is always true.
114#if cl_value_len >= 32
115 value = cln::cl_I(i);
116#else
117 if (i < (1UL << (cl_value_len-1)))
118 value = cln::cl_I(i);
119 else
120 value = cln::cl_I(static_cast<unsigned long>(i));
121#endif
123}
124
125
131
132
133numeric::numeric(unsigned long i)
134{
135 value = cln::cl_I(i);
137}
138
140{
141 value = cln::cl_I(i);
143}
144
145numeric::numeric(unsigned long long i)
146{
147 value = cln::cl_I(i);
149}
150
155{
156 if (!denom)
157 throw std::overflow_error("division by zero");
158 value = cln::cl_I(numer) / cln::cl_I(denom);
160}
161
162
164{
165 // We really want to explicitly use the type cl_LF instead of the
166 // more general cl_F, since that would give us a cl_DF only which
167 // will not be promoted to cl_LF if overflow occurs:
168 value = cln::cl_float(d, cln::default_float_format);
170}
171
172
175numeric::numeric(const char *s)
176{
177 cln::cl_N ctorval = 0;
178 // parse complex numbers (functional but not completely safe, unfortunately
179 // std::string does not understand regexpese):
180 // ss should represent a simple sum like 2+5*I
181 std::string ss = s;
182 std::string::size_type delim;
183
184 // make this implementation safe by adding explicit sign
185 if (ss.at(0) != '+' && ss.at(0) != '-' && ss.at(0) != '#')
186 ss = '+' + ss;
187
188 // We use 'E' as exponent marker in the output, but some people insist on
189 // writing 'e' at input, so let's substitute them right at the beginning:
190 while ((delim = ss.find("e"))!=std::string::npos)
191 ss.replace(delim,1,"E");
192
193 // main parser loop:
194 do {
195 // chop ss into terms from left to right
196 std::string term;
197 bool imaginary = false;
198 delim = ss.find_first_of(std::string("+-"),1);
199 // Do we have an exponent marker like "31.415E-1"? If so, hop on!
200 if (delim!=std::string::npos && ss.at(delim-1)=='E')
201 delim = ss.find_first_of(std::string("+-"),delim+1);
202 term = ss.substr(0,delim);
203 if (delim!=std::string::npos)
204 ss = ss.substr(delim);
205 // is the term imaginary?
206 if (term.find("I")!=std::string::npos) {
207 // erase 'I':
208 term.erase(term.find("I"),1);
209 // erase '*':
210 if (term.find("*")!=std::string::npos)
211 term.erase(term.find("*"),1);
212 // correct for trivial +/-I without explicit factor on I:
213 if (term.size()==1)
214 term += '1';
215 imaginary = true;
216 }
217 if (term.find('.')!=std::string::npos || term.find('E')!=std::string::npos) {
218 // CLN's short type cl_SF is not very useful within the GiNaC
219 // framework where we are mainly interested in the arbitrary
220 // precision type cl_LF. Hence we go straight to the construction
221 // of generic floats. In order to create them we have to convert
222 // our own floating point notation used for output and construction
223 // from char * to CLN's generic notation:
224 // 3.14 --> 3.14e0_<Digits>
225 // 31.4E-1 --> 31.4e-1_<Digits>
226 // and s on.
227 // No exponent marker? Let's add a trivial one.
228 if (term.find("E")==std::string::npos)
229 term += "E0";
230 // E to lower case
231 term = term.replace(term.find("E"),1,"e");
232 // append _<Digits> to term
233 term += "_" + std::to_string((unsigned)Digits);
234 // construct float using cln::cl_F(const char *) ctor.
235 if (imaginary)
236 ctorval = ctorval + cln::complex(cln::cl_I(0),cln::cl_F(term.c_str()));
237 else
238 ctorval = ctorval + cln::cl_F(term.c_str());
239 } else {
240 // this is not a floating point number...
241 if (imaginary)
242 ctorval = ctorval + cln::complex(cln::cl_I(0),cln::cl_R(term.c_str()));
243 else
244 ctorval = ctorval + cln::cl_R(term.c_str());
245 }
246 } while (delim != std::string::npos);
247 value = ctorval;
249}
250
251
254numeric::numeric(const cln::cl_N &z)
255{
256 value = z;
258}
259
260
262// archiving
264
268static const cln::cl_F make_real_float(const cln::cl_idecoded_float& dec)
269{
270 cln::cl_F x = cln::cl_float(dec.mantissa, cln::default_float_format);
271 x = cln::scale_float(x, dec.exponent);
272 cln::cl_F sign = cln::cl_float(dec.sign, cln::default_float_format);
273 x = cln::float_sign(sign, x);
274 return x;
275}
276
280static const cln::cl_F read_real_float(std::istream& s)
281{
282 cln::cl_idecoded_float dec;
283 s >> dec.sign >> dec.mantissa >> dec.exponent;
284 const cln::cl_F x = make_real_float(dec);
285 return x;
286}
287
289{
290 inherited::read_archive(n, sym_lst);
291 value = 0;
292
293 // Read number as string
294 std::string str;
295 if (n.find_string("number", str)) {
296 std::istringstream s(str);
297 cln::cl_R re, im;
298 char c;
299 s.get(c);
300 switch (c) {
301 case 'R':
302 // real FP (floating point) number
303 re = read_real_float(s);
304 value = re;
305 break;
306 case 'C':
307 // both real and imaginary part are FP numbers
308 re = read_real_float(s);
309 im = read_real_float(s);
310 value = cln::complex(re, im);
311 break;
312 case 'H':
313 // real part is a rational number,
314 // imaginary part is a FP number
315 s >> re;
316 im = read_real_float(s);
317 value = cln::complex(re, im);
318 break;
319 case 'J':
320 // real part is a FP number,
321 // imaginary part is a rational number
322 re = read_real_float(s);
323 s >> im;
324 value = cln::complex(re, im);
325 break;
326 default:
327 // both real and imaginary parts are rational
328 s.putback(c);
329 s >> value;
330 break;
331 }
332 }
334}
336
337static void write_real_float(std::ostream& s, const cln::cl_R& n)
338{
339 const cln::cl_idecoded_float dec = cln::integer_decode_float(cln::the<cln::cl_F>(n));
340 s << dec.sign << ' ' << dec.mantissa << ' ' << dec.exponent;
341}
342
344{
345 inherited::archive(n);
346
347 // Write number as string
348
349 const cln::cl_R re = cln::realpart(value);
350 const cln::cl_R im = cln::imagpart(value);
351 const bool re_rationalp = cln::instanceof(re, cln::cl_RA_ring);
352 const bool im_rationalp = cln::instanceof(im, cln::cl_RA_ring);
353
354 // Non-rational numbers are written in an integer-decoded format
355 // to preserve the precision
356 std::ostringstream s;
357 if (re_rationalp && im_rationalp)
358 s << value;
359 else if (zerop(im)) {
360 // real FP (floating point) number
361 s << 'R';
362 write_real_float(s, re);
363 } else if (re_rationalp) {
364 s << 'H'; // just any unique character
365 // real part is a rational number,
366 // imaginary part is a FP number
367 s << re << ' ';
368 write_real_float(s, im);
369 } else if (im_rationalp) {
370 s << 'J';
371 // real part is a FP number,
372 // imaginary part is a rational number
373 write_real_float(s, re);
374 s << ' ' << im;
375 } else {
376 // both real and imaginary parts are floating point
377 s << 'C';
378 write_real_float(s, re);
379 s << ' ';
380 write_real_float(s, im);
381 }
382 n.add_string("number", s.str());
383}
384
386// functions overriding virtual functions from base classes
388
396static void print_real_number(const print_context & c, const cln::cl_R & x)
397{
398 cln::cl_print_flags ourflags;
399 if (cln::instanceof(x, cln::cl_RA_ring)) {
400 // case 1: integer or rational
401 if (cln::instanceof(x, cln::cl_I_ring) ||
402 !is_a<print_latex>(c)) {
403 cln::print_real(c.s, ourflags, x);
404 } else { // rational output in LaTeX context
405 if (x < 0)
406 c.s << "-";
407 c.s << "\\frac{";
408 cln::print_real(c.s, ourflags, cln::abs(cln::numerator(cln::the<cln::cl_RA>(x))));
409 c.s << "}{";
410 cln::print_real(c.s, ourflags, cln::denominator(cln::the<cln::cl_RA>(x)));
411 c.s << '}';
412 }
413 } else {
414 // case 2: float
415 // make CLN believe this number has default_float_format, so it prints
416 // 'E' as exponent marker instead of 'L':
417 ourflags.default_float_format = cln::float_format(cln::the<cln::cl_F>(x));
418 cln::print_real(c.s, ourflags, x);
419 }
420}
421
425static void print_integer_csrc(const print_context & c, const cln::cl_I & x)
426{
427 // Print small numbers in compact float format, but larger numbers in
428 // scientific format
429 const int max_cln_int = 536870911; // 2^29-1
430 if (x >= cln::cl_I(-max_cln_int) && x <= cln::cl_I(max_cln_int))
431 c.s << cln::cl_I_to_int(x) << ".0";
432 else
433 c.s << cln::double_approx(x);
434}
435
439static void print_real_csrc(const print_context & c, const cln::cl_R & x)
440{
441 if (cln::instanceof(x, cln::cl_I_ring)) {
442
443 // Integer number
444 print_integer_csrc(c, cln::the<cln::cl_I>(x));
445
446 } else if (cln::instanceof(x, cln::cl_RA_ring)) {
447
448 // Rational number
449 const cln::cl_I numer = cln::numerator(cln::the<cln::cl_RA>(x));
450 const cln::cl_I denom = cln::denominator(cln::the<cln::cl_RA>(x));
451 if (cln::plusp(x)) {
452 c.s << "(";
454 } else {
455 c.s << "-(";
457 }
458 c.s << "/";
460 c.s << ")";
461
462 } else {
463
464 // Anything else
465 c.s << cln::double_approx(x);
466 }
467}
468
469template<typename T1, typename T2>
470static inline bool coerce(T1& dst, const T2& arg);
471
477template<>
478inline bool coerce<int, cln::cl_I>(int& dst, const cln::cl_I& arg)
479{
480 static const cln::cl_I cl_max_int =
481 (cln::cl_I)(long)(std::numeric_limits<int>::max());
482 static const cln::cl_I cl_min_int =
483 (cln::cl_I)(long)(std::numeric_limits<int>::min());
484 if ((arg >= cl_min_int) && (arg <= cl_max_int)) {
485 dst = cl_I_to_int(arg);
486 return true;
487 }
488 return false;
489}
490
491template<>
492inline bool coerce<unsigned int, cln::cl_I>(unsigned int& dst, const cln::cl_I& arg)
493{
494 static const cln::cl_I cl_max_uint =
495 (cln::cl_I)(unsigned long)(std::numeric_limits<unsigned int>::max());
496 if ((! minusp(arg)) && (arg <= cl_max_uint)) {
497 dst = cl_I_to_uint(arg);
498 return true;
499 }
500 return false;
501}
502
506static void print_real_cl_N(const print_context & c, const cln::cl_R & x)
507{
508 if (cln::instanceof(x, cln::cl_I_ring)) {
509
510 int dst;
511 // fixnum
512 if (coerce(dst, cln::the<cln::cl_I>(x))) {
513 // can be converted to native int
514 if (dst < 0)
515 c.s << '(' << dst << ')';
516 else
517 c.s << dst;
518 } else {
519 // bignum
520 c.s << "cln::cl_I(\"";
522 c.s << "\")";
523 }
524 } else if (cln::instanceof(x, cln::cl_RA_ring)) {
525
526 // Rational number
527 cln::cl_print_flags ourflags;
528 c.s << "cln::cl_RA(\"";
529 cln::print_rational(c.s, ourflags, cln::the<cln::cl_RA>(x));
530 c.s << "\")";
531
532 } else {
533
534 // Anything else
535 c.s << "cln::cl_F(\"";
536 print_real_number(c, cln::cl_float(1.0, cln::default_float_format) * x);
537 c.s << "_" << Digits << "\")";
538 }
539}
540
541void numeric::print_numeric(const print_context & c, const char *par_open, const char *par_close, const char *imag_sym, const char *mul_sym, unsigned level) const
542{
543 const cln::cl_R r = cln::realpart(value);
544 const cln::cl_R i = cln::imagpart(value);
545
546 if (cln::zerop(i)) {
547
548 // case 1, real: x or -x
549 if ((precedence() <= level) && (!this->is_nonneg_integer())) {
550 c.s << par_open;
552 c.s << par_close;
553 } else {
555 }
556
557 } else {
558 if (cln::zerop(r)) {
559
560 // case 2, imaginary: y*I or -y*I
561 if (i == 1)
562 c.s << imag_sym;
563 else {
564 if (precedence()<=level)
565 c.s << par_open;
566 if (i == -1)
567 c.s << "-" << imag_sym;
568 else {
570 c.s << mul_sym << imag_sym;
571 }
572 if (precedence()<=level)
573 c.s << par_close;
574 }
575
576 } else {
577
578 // case 3, complex: x+y*I or x-y*I or -x+y*I or -x-y*I
579 if (precedence() <= level)
580 c.s << par_open;
582 if (i < 0) {
583 if (i == -1) {
584 c.s << "-" << imag_sym;
585 } else {
587 c.s << mul_sym << imag_sym;
588 }
589 } else {
590 if (i == 1) {
591 c.s << "+" << imag_sym;
592 } else {
593 c.s << "+";
595 c.s << mul_sym << imag_sym;
596 }
597 }
598 if (precedence() <= level)
599 c.s << par_close;
600 }
601 }
602}
603
604void numeric::do_print(const print_context & c, unsigned level) const
605{
606 print_numeric(c, "(", ")", "I", "*", level);
607}
608
609void numeric::do_print_latex(const print_latex & c, unsigned level) const
610{
611 print_numeric(c, "{(", ")}", "i", " ", level);
612}
613
614void numeric::do_print_csrc(const print_csrc & c, unsigned level) const
615{
616 std::ios::fmtflags oldflags = c.s.flags();
617 c.s.setf(std::ios::scientific);
618 int oldprec = c.s.precision();
619
620 // Set precision
621 if (is_a<print_csrc_double>(c))
622 c.s.precision(std::numeric_limits<double>::digits10 + 1);
623 else
624 c.s.precision(std::numeric_limits<float>::digits10 + 1);
625
626 if (this->is_real()) {
627
628 // Real number
629 print_real_csrc(c, cln::the<cln::cl_R>(value));
630
631 } else {
632
633 // Complex number
634 c.s << "std::complex<";
635 if (is_a<print_csrc_double>(c))
636 c.s << "double>(";
637 else
638 c.s << "float>(";
639
640 print_real_csrc(c, cln::realpart(value));
641 c.s << ",";
642 print_real_csrc(c, cln::imagpart(value));
643 c.s << ")";
644 }
645
646 c.s.flags(oldflags);
647 c.s.precision(oldprec);
648}
649
650void numeric::do_print_csrc_cl_N(const print_csrc_cl_N & c, unsigned level) const
651{
652 if (this->is_real()) {
653
654 // Real number
655 print_real_cl_N(c, cln::the<cln::cl_R>(value));
656
657 } else {
658
659 // Complex number
660 c.s << "cln::complex(";
661 print_real_cl_N(c, cln::realpart(value));
662 c.s << ",";
663 print_real_cl_N(c, cln::imagpart(value));
664 c.s << ")";
665 }
666}
667
668void numeric::do_print_tree(const print_tree & c, unsigned level) const
669{
670 c.s << std::string(level, ' ') << value
671 << " (" << class_name() << ")" << " @" << this
672 << std::hex << ", hash=0x" << hashvalue << ", flags=0x" << flags << std::dec
673 << std::endl;
674}
675
676void numeric::do_print_python_repr(const print_python_repr & c, unsigned level) const
677{
678 c.s << class_name() << "('";
679 print_numeric(c, "(", ")", "I", "*", level);
680 c.s << "')";
681}
682
683bool numeric::info(unsigned inf) const
684{
685 switch (inf) {
690 return true;
691 case info_flags::real:
692 return is_real();
695 return is_rational();
698 return is_crational();
701 return is_integer();
704 return is_cinteger();
706 return is_positive();
708 return is_negative();
710 return is_zero() || is_positive();
712 return is_pos_integer();
714 return is_integer() && is_negative();
716 return is_nonneg_integer();
717 case info_flags::even:
718 return is_even();
719 case info_flags::odd:
720 return is_odd();
722 return is_prime();
723 }
724 return false;
725}
726
727bool numeric::is_polynomial(const ex & var) const
728{
729 return true;
730}
731
732int numeric::degree(const ex & s) const
733{
734 return 0;
735}
736
737int numeric::ldegree(const ex & s) const
738{
739 return 0;
740}
741
742ex numeric::coeff(const ex & s, int n) const
743{
744 return n==0 ? *this : _ex0;
745}
746
753bool numeric::has(const ex &other, unsigned options) const
754{
755 if (!is_exactly_a<numeric>(other))
756 return false;
757 const numeric &o = ex_to<numeric>(other);
758 if (this->is_equal(o) || this->is_equal(-o))
759 return true;
760 if (o.imag().is_zero()) { // e.g. scan for 3 in -3*I
761 if (!this->real().is_equal(*_num0_p))
762 if (this->real().is_equal(o) || this->real().is_equal(-o))
763 return true;
764 if (!this->imag().is_equal(*_num0_p))
765 if (this->imag().is_equal(o) || this->imag().is_equal(-o))
766 return true;
767 return false;
768 }
769 else {
770 if (o.is_equal(I)) // e.g scan for I in 42*I
771 return !this->is_real();
772 if (o.real().is_zero()) // e.g. scan for 2*I in 2*I+1
773 if (!this->imag().is_equal(*_num0_p))
774 if (this->imag().is_equal(o*I) || this->imag().is_equal(-o*I))
775 return true;
776 }
777 return false;
778}
779
780
783{
784 return this->hold();
785}
786
787
795{
796 return numeric(cln::cl_float(1.0, cln::default_float_format) * value);
797}
798
800{
801 if (is_real()) {
802 return *this;
803 }
804 return numeric(cln::conjugate(this->value));
805}
806
808{
809 return numeric(cln::realpart(value));
810}
811
813{
814 return numeric(cln::imagpart(value));
815}
816
817// protected
818
819int numeric::compare_same_type(const basic &other) const
820{
821 GINAC_ASSERT(is_exactly_a<numeric>(other));
822 const numeric &o = static_cast<const numeric &>(other);
823
824 return this->compare(o);
825}
826
827
828bool numeric::is_equal_same_type(const basic &other) const
829{
830 GINAC_ASSERT(is_exactly_a<numeric>(other));
831 const numeric &o = static_cast<const numeric &>(other);
832
833 return this->is_equal(o);
834}
835
836
837unsigned numeric::calchash() const
838{
839 // Base computation of hashvalue on CLN's hashcode. Note: That depends
840 // only on the number's value, not its type or precision (i.e. a true
841 // equivalence relation on numbers). As a consequence, 3 and 3.0 share
842 // the same hashvalue. That shouldn't really matter, though.
844 hashvalue = golden_ratio_hash(cln::equal_hashcode(value));
845 return hashvalue;
846}
847
848
850// new virtual functions which can be overridden by derived classes
852
853// none
854
856// non-virtual functions in this class
858
859// public
860
863const numeric numeric::add(const numeric &other) const
864{
865 return numeric(value + other.value);
866}
867
868
871const numeric numeric::sub(const numeric &other) const
872{
873 return numeric(value - other.value);
874}
875
876
879const numeric numeric::mul(const numeric &other) const
880{
881 return numeric(value * other.value);
882}
883
884
889const numeric numeric::div(const numeric &other) const
890{
891 if (cln::zerop(other.value))
892 throw std::overflow_error("numeric::div(): division by zero");
893 return numeric(value / other.value);
894}
895
896
899const numeric numeric::power(const numeric &other) const
900{
901 // Shortcut for efficiency and numeric stability (as in 1.0 exponent):
902 // trap the neutral exponent.
903 if (&other==_num1_p || cln::equal(other.value,_num1_p->value))
904 return *this;
905
906 if (cln::zerop(value)) {
907 if (cln::zerop(other.value))
908 throw std::domain_error("numeric::eval(): pow(0,0) is undefined");
909 else if (cln::zerop(cln::realpart(other.value)))
910 throw std::domain_error("numeric::eval(): pow(0,I) is undefined");
911 else if (cln::minusp(cln::realpart(other.value)))
912 throw std::overflow_error("numeric::eval(): division by zero");
913 else
914 return *_num0_p;
915 }
916 return numeric(cln::expt(value, other.value));
917}
918
919
920
924const numeric &numeric::add_dyn(const numeric &other) const
925{
926 // Efficiency shortcut: trap the neutral element by pointer. This hack
927 // is supposed to keep the number of distinct numeric objects low.
928 if (this==_num0_p)
929 return other;
930 else if (&other==_num0_p)
931 return *this;
932
933 return dynallocate<numeric>(value + other.value);
934}
935
936
941const numeric &numeric::sub_dyn(const numeric &other) const
942{
943 // Efficiency shortcut: trap the neutral exponent (first by pointer). This
944 // hack is supposed to keep the number of distinct numeric objects low.
945 if (&other==_num0_p || cln::zerop(other.value))
946 return *this;
947
948 return dynallocate<numeric>(value - other.value);
949}
950
951
956const numeric &numeric::mul_dyn(const numeric &other) const
957{
958 // Efficiency shortcut: trap the neutral element by pointer. This hack
959 // is supposed to keep the number of distinct numeric objects low.
960 if (this==_num1_p)
961 return other;
962 else if (&other==_num1_p)
963 return *this;
964
965 return dynallocate<numeric>(value * other.value);
966}
967
968
975const numeric &numeric::div_dyn(const numeric &other) const
976{
977 // Efficiency shortcut: trap the neutral element by pointer. This hack
978 // is supposed to keep the number of distinct numeric objects low.
979 if (&other==_num1_p)
980 return *this;
981 if (cln::zerop(cln::the<cln::cl_N>(other.value)))
982 throw std::overflow_error("division by zero");
983
984 return dynallocate<numeric>(value / other.value);
985}
986
987
992const numeric &numeric::power_dyn(const numeric &other) const
993{
994 // Efficiency shortcut: trap the neutral exponent (first try by pointer, then
995 // try harder, since calls to cln::expt() below may return amazing results for
996 // floating point exponent 1.0).
997 if (&other==_num1_p || cln::equal(other.value, _num1_p->value))
998 return *this;
999
1000 if (cln::zerop(value)) {
1001 if (cln::zerop(other.value))
1002 throw std::domain_error("numeric::eval(): pow(0,0) is undefined");
1003 else if (cln::zerop(cln::realpart(other.value)))
1004 throw std::domain_error("numeric::eval(): pow(0,I) is undefined");
1005 else if (cln::minusp(cln::realpart(other.value)))
1006 throw std::overflow_error("numeric::eval(): division by zero");
1007 else
1008 return *_num0_p;
1009 }
1010
1011 return dynallocate<numeric>(cln::expt(value, other.value));
1012}
1013
1014
1016{
1017 return operator=(numeric(i));
1018}
1019
1020
1021const numeric &numeric::operator=(unsigned int i)
1022{
1023 return operator=(numeric(i));
1024}
1025
1026
1028{
1029 return operator=(numeric(i));
1030}
1031
1032
1033const numeric &numeric::operator=(unsigned long i)
1034{
1035 return operator=(numeric(i));
1036}
1037
1038
1040{
1041 return operator=(numeric(d));
1042}
1043
1044
1045const numeric &numeric::operator=(const char * s)
1046{
1047 return operator=(numeric(s));
1048}
1049
1050
1053{
1054 if (cln::zerop(value))
1055 throw std::overflow_error("numeric::inverse(): division by zero");
1056 return numeric(cln::recip(value));
1057}
1058
1064{ cln::cl_R r = cln::realpart(value);
1065 if(cln::zerop(r))
1066 return numeric(1,2);
1067 if(cln::plusp(r))
1068 return 1;
1069 return 0;
1070}
1071
1077int numeric::csgn() const
1078{
1079 if (cln::zerop(value))
1080 return 0;
1081 cln::cl_R r = cln::realpart(value);
1082 if (!cln::zerop(r)) {
1083 if (cln::plusp(r))
1084 return 1;
1085 else
1086 return -1;
1087 } else {
1088 if (cln::plusp(cln::imagpart(value)))
1089 return 1;
1090 else
1091 return -1;
1092 }
1093}
1094
1095
1103int numeric::compare(const numeric &other) const
1104{
1105 // Comparing two real numbers?
1106 if (cln::instanceof(value, cln::cl_R_ring) &&
1107 cln::instanceof(other.value, cln::cl_R_ring))
1108 // Yes, so just cln::compare them
1109 return cln::compare(cln::the<cln::cl_R>(value), cln::the<cln::cl_R>(other.value));
1110 else {
1111 // No, first cln::compare real parts...
1112 cl_signean real_cmp = cln::compare(cln::realpart(value), cln::realpart(other.value));
1113 if (real_cmp)
1114 return real_cmp;
1115 // ...and then the imaginary parts.
1116 return cln::compare(cln::imagpart(value), cln::imagpart(other.value));
1117 }
1118}
1119
1120
1121bool numeric::is_equal(const numeric &other) const
1122{
1123 return cln::equal(value, other.value);
1124}
1125
1126
1129{
1130 return cln::zerop(value);
1131}
1132
1133
1136{
1137 if (cln::instanceof(value, cln::cl_R_ring)) // real?
1138 return cln::plusp(cln::the<cln::cl_R>(value));
1139 return false;
1140}
1141
1142
1145{
1146 if (cln::instanceof(value, cln::cl_R_ring)) // real?
1147 return cln::minusp(cln::the<cln::cl_R>(value));
1148 return false;
1149}
1150
1151
1154{
1155 return cln::instanceof(value, cln::cl_I_ring);
1156}
1157
1158
1161{
1162 return (cln::instanceof(value, cln::cl_I_ring) && cln::plusp(cln::the<cln::cl_I>(value)));
1163}
1164
1165
1168{
1169 return (cln::instanceof(value, cln::cl_I_ring) && !cln::minusp(cln::the<cln::cl_I>(value)));
1170}
1171
1172
1175{
1176 return (cln::instanceof(value, cln::cl_I_ring) && cln::evenp(cln::the<cln::cl_I>(value)));
1177}
1178
1179
1182{
1183 return (cln::instanceof(value, cln::cl_I_ring) && cln::oddp(cln::the<cln::cl_I>(value)));
1184}
1185
1186
1191{
1192 return (cln::instanceof(value, cln::cl_I_ring) // integer?
1193 && cln::plusp(cln::the<cln::cl_I>(value)) // positive?
1194 && cln::isprobprime(cln::the<cln::cl_I>(value)));
1195}
1196
1197
1201{
1202 return cln::instanceof(value, cln::cl_RA_ring);
1203}
1204
1205
1208{
1209 return cln::instanceof(value, cln::cl_R_ring);
1210}
1211
1212
1213bool numeric::operator==(const numeric &other) const
1214{
1215 return cln::equal(value, other.value);
1216}
1217
1218
1219bool numeric::operator!=(const numeric &other) const
1220{
1221 return !cln::equal(value, other.value);
1222}
1223
1224
1228{
1229 if (cln::instanceof(value, cln::cl_I_ring))
1230 return true;
1231 else if (!this->is_real()) { // complex case, handle n+m*I
1232 if (cln::instanceof(cln::realpart(value), cln::cl_I_ring) &&
1233 cln::instanceof(cln::imagpart(value), cln::cl_I_ring))
1234 return true;
1235 }
1236 return false;
1237}
1238
1239
1243{
1244 if (cln::instanceof(value, cln::cl_RA_ring))
1245 return true;
1246 else if (!this->is_real()) { // complex case, handle Q(i):
1247 if (cln::instanceof(cln::realpart(value), cln::cl_RA_ring) &&
1248 cln::instanceof(cln::imagpart(value), cln::cl_RA_ring))
1249 return true;
1250 }
1251 return false;
1252}
1253
1254
1258bool numeric::operator<(const numeric &other) const
1259{
1260 if (this->is_real() && other.is_real())
1261 return (cln::the<cln::cl_R>(value) < cln::the<cln::cl_R>(other.value));
1262 throw std::invalid_argument("numeric::operator<(): complex inequality");
1263}
1264
1265
1269bool numeric::operator<=(const numeric &other) const
1270{
1271 if (this->is_real() && other.is_real())
1272 return (cln::the<cln::cl_R>(value) <= cln::the<cln::cl_R>(other.value));
1273 throw std::invalid_argument("numeric::operator<=(): complex inequality");
1274}
1275
1276
1280bool numeric::operator>(const numeric &other) const
1281{
1282 if (this->is_real() && other.is_real())
1283 return (cln::the<cln::cl_R>(value) > cln::the<cln::cl_R>(other.value));
1284 throw std::invalid_argument("numeric::operator>(): complex inequality");
1285}
1286
1287
1291bool numeric::operator>=(const numeric &other) const
1292{
1293 if (this->is_real() && other.is_real())
1294 return (cln::the<cln::cl_R>(value) >= cln::the<cln::cl_R>(other.value));
1295 throw std::invalid_argument("numeric::operator>=(): complex inequality");
1296}
1297
1298
1303{
1304 GINAC_ASSERT(this->is_integer());
1305 return cln::cl_I_to_int(cln::the<cln::cl_I>(value));
1306}
1307
1308
1313{
1314 GINAC_ASSERT(this->is_integer());
1315 return cln::cl_I_to_long(cln::the<cln::cl_I>(value));
1316}
1317
1318
1322{
1323 GINAC_ASSERT(this->is_real());
1324 return cln::double_approx(cln::realpart(value));
1325}
1326
1327
1331cln::cl_N numeric::to_cl_N() const
1332{
1333 return value;
1334}
1335
1336
1339{
1340 return numeric(cln::realpart(value));
1341}
1342
1343
1346{
1347 return numeric(cln::imagpart(value));
1348}
1349
1350
1356{
1357 if (cln::instanceof(value, cln::cl_I_ring))
1358 return numeric(*this); // integer case
1359
1360 else if (cln::instanceof(value, cln::cl_RA_ring))
1361 return numeric(cln::numerator(cln::the<cln::cl_RA>(value)));
1362
1363 else if (!this->is_real()) { // complex case, handle Q(i):
1364 const cln::cl_RA r = cln::the<cln::cl_RA>(cln::realpart(value));
1365 const cln::cl_RA i = cln::the<cln::cl_RA>(cln::imagpart(value));
1366 if (cln::instanceof(r, cln::cl_I_ring) && cln::instanceof(i, cln::cl_I_ring))
1367 return numeric(*this);
1368 if (cln::instanceof(r, cln::cl_I_ring) && cln::instanceof(i, cln::cl_RA_ring))
1369 return numeric(cln::complex(r*cln::denominator(i), cln::numerator(i)));
1370 if (cln::instanceof(r, cln::cl_RA_ring) && cln::instanceof(i, cln::cl_I_ring))
1371 return numeric(cln::complex(cln::numerator(r), i*cln::denominator(r)));
1372 if (cln::instanceof(r, cln::cl_RA_ring) && cln::instanceof(i, cln::cl_RA_ring)) {
1373 const cln::cl_I s = cln::lcm(cln::denominator(r), cln::denominator(i));
1374 return numeric(cln::complex(cln::numerator(r)*(cln::exquo(s,cln::denominator(r))),
1375 cln::numerator(i)*(cln::exquo(s,cln::denominator(i)))));
1376 }
1377 }
1378 // at least one float encountered
1379 return numeric(*this);
1380}
1381
1382
1387{
1388 if (cln::instanceof(value, cln::cl_I_ring))
1389 return *_num1_p; // integer case
1390
1391 if (cln::instanceof(value, cln::cl_RA_ring))
1392 return numeric(cln::denominator(cln::the<cln::cl_RA>(value)));
1393
1394 if (!this->is_real()) { // complex case, handle Q(i):
1395 const cln::cl_RA r = cln::the<cln::cl_RA>(cln::realpart(value));
1396 const cln::cl_RA i = cln::the<cln::cl_RA>(cln::imagpart(value));
1397 if (cln::instanceof(r, cln::cl_I_ring) && cln::instanceof(i, cln::cl_I_ring))
1398 return *_num1_p;
1399 if (cln::instanceof(r, cln::cl_I_ring) && cln::instanceof(i, cln::cl_RA_ring))
1400 return numeric(cln::denominator(i));
1401 if (cln::instanceof(r, cln::cl_RA_ring) && cln::instanceof(i, cln::cl_I_ring))
1402 return numeric(cln::denominator(r));
1403 if (cln::instanceof(r, cln::cl_RA_ring) && cln::instanceof(i, cln::cl_RA_ring))
1404 return numeric(cln::lcm(cln::denominator(r), cln::denominator(i)));
1405 }
1406 // at least one float encountered
1407 return *_num1_p;
1408}
1409
1410
1418{
1419 if (cln::instanceof(value, cln::cl_I_ring))
1420 return cln::integer_length(cln::the<cln::cl_I>(value));
1421 else
1422 return 0;
1423}
1424
1426// global constants
1428
1432const numeric I = numeric(cln::complex(cln::cl_I(0),cln::cl_I(1)));
1433
1434
1438const numeric exp(const numeric &x)
1439{
1440 return numeric(cln::exp(x.to_cl_N()));
1441}
1442
1443
1449const numeric log(const numeric &x)
1450{
1451 if (x.is_zero())
1452 throw pole_error("log(): logarithmic pole",0);
1453 return numeric(cln::log(x.to_cl_N()));
1454}
1455
1456
1460const numeric sin(const numeric &x)
1461{
1462 return numeric(cln::sin(x.to_cl_N()));
1463}
1464
1465
1469const numeric cos(const numeric &x)
1470{
1471 return numeric(cln::cos(x.to_cl_N()));
1472}
1473
1474
1478const numeric tan(const numeric &x)
1479{
1480 return numeric(cln::tan(x.to_cl_N()));
1481}
1482
1483
1487const numeric asin(const numeric &x)
1488{
1489 return numeric(cln::asin(x.to_cl_N()));
1490}
1491
1492
1496const numeric acos(const numeric &x)
1497{
1498 return numeric(cln::acos(x.to_cl_N()));
1499}
1500
1501
1507const numeric atan(const numeric &x)
1508{
1509 if (!x.is_real() &&
1510 x.real().is_zero() &&
1511 abs(x.imag()).is_equal(*_num1_p))
1512 throw pole_error("atan(): logarithmic pole",0);
1513 return numeric(cln::atan(x.to_cl_N()));
1514}
1515
1516
1524const numeric atan(const numeric &y, const numeric &x)
1525{
1526 if (x.is_zero() && y.is_zero())
1527 return *_num0_p;
1528 if (x.is_real() && y.is_real())
1529 return numeric(cln::atan(cln::the<cln::cl_R>(x.to_cl_N()),
1530 cln::the<cln::cl_R>(y.to_cl_N())));
1531
1532 // Compute -I*log((x+I*y)/sqrt(x^2+y^2))
1533 // == -I*log((x+I*y)/sqrt((x+I*y)*(x-I*y)))
1534 // Do not "simplify" this to -I/2*log((x+I*y)/(x-I*y))) or likewise.
1535 // The branch cuts are easily messed up.
1536 const cln::cl_N aux_p = x.to_cl_N()+cln::complex(0,1)*y.to_cl_N();
1537 if (cln::zerop(aux_p)) {
1538 // x+I*y==0 => y/x==I, so this is a pole (we have x!=0).
1539 throw pole_error("atan(): logarithmic pole",0);
1540 }
1541 const cln::cl_N aux_m = x.to_cl_N()-cln::complex(0,1)*y.to_cl_N();
1542 if (cln::zerop(aux_m)) {
1543 // x-I*y==0 => y/x==-I, so this is a pole (we have x!=0).
1544 throw pole_error("atan(): logarithmic pole",0);
1545 }
1546 return numeric(cln::complex(0,-1)*cln::log(aux_p/cln::sqrt(aux_p*aux_m)));
1547}
1548
1549
1553const numeric sinh(const numeric &x)
1554{
1555 return numeric(cln::sinh(x.to_cl_N()));
1556}
1557
1558
1562const numeric cosh(const numeric &x)
1563{
1564 return numeric(cln::cosh(x.to_cl_N()));
1565}
1566
1567
1571const numeric tanh(const numeric &x)
1572{
1573 return numeric(cln::tanh(x.to_cl_N()));
1574}
1575
1576
1580const numeric asinh(const numeric &x)
1581{
1582 return numeric(cln::asinh(x.to_cl_N()));
1583}
1584
1585
1589const numeric acosh(const numeric &x)
1590{
1591 return numeric(cln::acosh(x.to_cl_N()));
1592}
1593
1594
1598const numeric atanh(const numeric &x)
1599{
1600 return numeric(cln::atanh(x.to_cl_N()));
1601}
1602
1603
1604/*static cln::cl_N Li2_series(const ::cl_N &x,
1605 const ::float_format_t &prec)
1606{
1607 // Note: argument must be in the unit circle
1608 // This is very inefficient unless we have fast floating point Bernoulli
1609 // numbers implemented!
1610 cln::cl_N c1 = -cln::log(1-x);
1611 cln::cl_N c2 = c1;
1612 // hard-wire the first two Bernoulli numbers
1613 cln::cl_N acc = c1 - cln::square(c1)/4;
1614 cln::cl_N aug;
1615 cln::cl_F pisq = cln::square(cln::cl_pi(prec)); // pi^2
1616 cln::cl_F piac = cln::cl_float(1, prec); // accumulator: pi^(2*i)
1617 unsigned i = 1;
1618 c1 = cln::square(c1);
1619 do {
1620 c2 = c1 * c2;
1621 piac = piac * pisq;
1622 aug = c2 * (*(bernoulli(numeric(2*i)).clnptr())) / cln::factorial(2*i+1);
1623 // aug = c2 * cln::cl_I(i%2 ? 1 : -1) / cln::cl_I(2*i+1) * cln::cl_zeta(2*i, prec) / piac / (cln::cl_I(1)<<(2*i-1));
1624 acc = acc + aug;
1625 ++i;
1626 } while (acc != acc+aug);
1627 return acc;
1628}*/
1629
1632static cln::cl_N Li2_series(const cln::cl_N &x,
1633 const cln::float_format_t &prec)
1634{
1635 // Note: argument must be in the unit circle
1636 cln::cl_N aug, acc;
1637 cln::cl_N num = cln::complex(cln::cl_float(1, prec), 0);
1638 cln::cl_I den = 0;
1639 unsigned i = 1;
1640 do {
1641 num = num * x;
1642 den = den + i; // 1, 4, 9, 16, ...
1643 i += 2;
1644 aug = num / den;
1645 acc = acc + aug;
1646 } while (acc != acc+aug);
1647 return acc;
1648}
1649
1651static cln::cl_N Li2_projection(const cln::cl_N &x,
1652 const cln::float_format_t &prec)
1653{
1654 const cln::cl_R re = cln::realpart(x);
1655 const cln::cl_R im = cln::imagpart(x);
1656 if (re > cln::cl_F(".5"))
1657 // zeta(2) - Li2(1-x) - log(x)*log(1-x)
1658 return(cln::zeta(2)
1659 - Li2_series(1-x, prec)
1660 - cln::log(x)*cln::log(1-x));
1661 if ((re <= 0 && cln::abs(im) > cln::cl_F(".75")) || (re < cln::cl_F("-.5")))
1662 // -log(1-x)^2 / 2 - Li2(x/(x-1))
1663 return(- cln::square(cln::log(1-x))/2
1664 - Li2_series(x/(x-1), prec));
1665 if (re > 0 && cln::abs(im) > cln::cl_LF(".75"))
1666 // Li2(x^2)/2 - Li2(-x)
1667 return(Li2_projection(cln::square(x), prec)/2
1668 - Li2_projection(-x, prec));
1669 return Li2_series(x, prec);
1670}
1671
1672
1678const cln::cl_N Li2_(const cln::cl_N& value)
1679{
1680 if (zerop(value))
1681 return 0;
1682
1683 // what is the desired float format?
1684 // first guess: default format
1685 cln::float_format_t prec = cln::default_float_format;
1686 // second guess: the argument's format
1687 if (!instanceof(realpart(value), cln::cl_RA_ring))
1688 prec = cln::float_format(cln::the<cln::cl_F>(cln::realpart(value)));
1689 else if (!instanceof(imagpart(value), cln::cl_RA_ring))
1690 prec = cln::float_format(cln::the<cln::cl_F>(cln::imagpart(value)));
1691
1692 if (value==1) // may cause trouble with log(1-x)
1693 return cln::zeta(2, prec);
1694
1695 if (cln::abs(value) > 1)
1696 // -log(-x)^2 / 2 - zeta(2) - Li2(1/x)
1697 return(- cln::square(cln::log(-value))/2
1698 - cln::zeta(2, prec)
1699 - Li2_projection(cln::recip(value), prec));
1700 else
1701 return Li2_projection(value, prec);
1702}
1703
1704const numeric Li2(const numeric &x)
1705{
1706 const cln::cl_N x_ = x.to_cl_N();
1707 if (zerop(x_))
1708 return *_num0_p;
1709 const cln::cl_N result = Li2_(x_);
1710 return numeric(result);
1711}
1712
1713
1716const numeric zeta(const numeric &x)
1717{
1718 // A dirty hack to allow for things like zeta(3.0), since CLN currently
1719 // only knows about integer arguments and zeta(3).evalf() automatically
1720 // cascades down to zeta(3.0).evalf(). The trick is to rely on 3.0-3
1721 // being an exact zero for CLN, which can be tested and then we can just
1722 // pass the number casted to an int:
1723 if (x.is_real()) {
1724 const int aux = (int)(cln::double_approx(cln::the<cln::cl_R>(x.to_cl_N())));
1725 if (cln::zerop(x.to_cl_N()-aux))
1726 return numeric(cln::zeta(aux));
1727 }
1728 throw dunno();
1729}
1730
1732{
1733 public:
1735 bool sufficiently_accurate(int digits);
1736 int get_order() const { return current_vector->size(); }
1737 cln::cl_N calc_lanczos_A(const cln::cl_N &) const;
1738 private:
1739 // coeffs[0] is used in case Digits <= 20.
1740 // coeffs[1] is used in case Digits <= 50.
1741 // coeffs[2] is used in case Digits <= 100.
1742 // coeffs[3] is used in case Digits <= 200.
1743 static std::vector<cln::cl_N> *coeffs;
1744 // Pointer to the vector that is currently in use.
1745 std::vector<cln::cl_N> *current_vector;
1746};
1747
1748std::vector<cln::cl_N>* lanczos_coeffs::coeffs = nullptr;
1749
1751{ if (digits<=20) {
1752 current_vector = &(coeffs[0]);
1753 return true;
1754 }
1755 if (digits<=50) {
1756 current_vector = &(coeffs[1]);
1757 return true;
1758 }
1759 if (digits<=100) {
1760 current_vector = &(coeffs[2]);
1761 return true;
1762 }
1763 if (digits<=200) {
1764 current_vector = &(coeffs[3]);
1765 return true;
1766 }
1767 return false;
1768}
1769
1770cln::cl_N lanczos_coeffs::calc_lanczos_A(const cln::cl_N &x) const
1771{
1772 cln::cl_N A = (*current_vector)[0];
1773 int size = current_vector->size();
1774 for (int i=1; i<size; ++i)
1775 A = A + (*current_vector)[i]/(x+cln::cl_I(-1+i));
1776 return A;
1777}
1778
1779// The values in this function have been calculated using the program
1780// lanczos.cpp in the directory doc/examples. If you want to add more
1781// digits, be sure to read the comments in that file.
1783{ if (coeffs)
1784 return;
1785 /* Use four different arrays for different accuracies. */
1786 coeffs = new std::vector<cln::cl_N>[4];
1787 std::vector<cln::cl_N> coeffs_12(12);
1788 /* twelve coefficients follow. */
1789 coeffs_12[0] = "1.000000000000000002194974863102775496587";
1790 coeffs_12[1] = "133550.502942477423232096703994753698903";
1791 coeffs_12[2] = "-492930.93529936026920053070245469905582";
1792 coeffs_12[3] = "741287.473697611642492293025524275986598";
1793 coeffs_12[4] = "-585097.37760399665198416642641725036094";
1794 coeffs_12[5] = "260425.270330385275465083772352301818652";
1795 coeffs_12[6] = "-65413.3533961142651069690504470463782994";
1796 coeffs_12[7] = "8801.45963508441793636152568413199291892";
1797 coeffs_12[8] = "-564.805024129362118607692062642312799553";
1798 coeffs_12[9] = "13.80379833961490898061357227729422691903";
1799 coeffs_12[10] = "-0.0807817619724537563116612761921260762075";
1800 coeffs_12[11] = "3.47974801622326717770813986587340515986E-5";
1801 coeffs[0].swap(coeffs_12);
1802 std::vector<cln::cl_N> coeffs_30(30);
1803 /* thirty coefficients follow. */
1804 coeffs_30[0] = "1.0000000000000000000000000000000000000000000000445658922238202528026977308762";
1805 coeffs_30[1] = "1.40445649204966682962030786915579421135474600150789821268713805046080310901683E13";
1806 coeffs_30[2] = "-1.4473384178280338809560100504713144673757322488310852336205875273000116908753E14";
1807 coeffs_30[3] = "6.9392104219998816400402602197781299548036066538116472480223222192156630720206E14";
1808 coeffs_30[4] = "-2.05552680548452350127164925238339710431333013110755662640014074226849466382297E15";
1809 coeffs_30[5] = "4.21346047774975891986783355395961145235696863271597017695734168781011785582523E15";
1810 coeffs_30[6] = "-6.3439111294220458481092019992445750626799029041090235945435769621790257585491E15";
1811 coeffs_30[7] = "7.2684029986336427327225410026373012514882246322145965580608264703248155838791E15";
1812 coeffs_30[8] = "-6.4784969409198000751978874152931803231807770528527455966624850088042561231024E15";
1813 coeffs_30[9] = "4.5545745239457403086706103662737668418631761744785802123770605916210445083544E15";
1814 coeffs_30[10] = "-2.54592491966737919409139938046543941491145224466411852277136834553178078105403E15";
1815 coeffs_30[11] = "1.1356718195163150156198936885250451780214219874255251444701005988134747787666E15";
1816 coeffs_30[12] = "-4.04275236298036712070700727222520609783336229393218886420197964965371362011123E14";
1817 coeffs_30[13] = "1.14472757259832757229433124273590647229089622322597383276758880048004748372644E14";
1818 coeffs_30[14] = "-2.56166271828342920179612184110684658183432315551120625854181503468327037516717E13";
1819 coeffs_30[15] = "4.4861708254018935131376878973710146069395814469656232761173409397653101421558E12";
1820 coeffs_30[16] = "-6.0657495816705687896607821799338217335976369800808791959096705890743701166037E11";
1821 coeffs_30[17] = "6.21975328147406581536747878587069711930541459818297675578654403265380823122363E10";
1822 coeffs_30[18] = "-4.7255003764027411113501086372508071116675161078057298991208060427341079636661E9";
1823 coeffs_30[19] = "2.5814613908651936680441351265410235295992556406609945442133129515256889464315E8";
1824 coeffs_30[20] = "-9752115.5047412418881417732027953903591189993329461844657371497174389592441887";
1825 coeffs_30[21] = "242056.60372411758318197954509546521913927205056839365620249547101194072057318";
1826 coeffs_30[22] = "-3686.17673045938850138289555088011327333352145765167200561022138925168680049115";
1827 coeffs_30[23] = "31.3494924501834034405048975310989414795238339283146314931357877820190435258517";
1828 coeffs_30[24] = "-0.130254774344853676030752542814176943723937677940441021884132211221409382350105";
1829 coeffs_30[25] = "2.16625679868432886771581352257834967866602495378408740265571976698475288337338E-4";
1830 coeffs_30[26] = "-1.05077239977528252603869373455592388508233760416601143477182890107978206726294E-7";
1831 coeffs_30[27] = "8.5728436055212340846907439451102962820713733082683634385104363203776378266115E-12";
1832 coeffs_30[28] = "-3.9175430218003196379961975369936752665267219444417121562332986822123821080906E-17";
1833 coeffs_30[29] = "1.06841715008998384033789050831892757796251622802680860264598247667384268519263E-24";
1834 coeffs[1].swap(coeffs_30);
1835 std::vector<cln::cl_N> coeffs_60(60);
1836 /* sixty coefficients follow. */
1837 coeffs_60[0] = "1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000007301368866363013444179014835363181183419450549774";
1838 coeffs_60[1] = "2.13152397525281235754468356918725048606852617746577461250754322057711822075135461598274984226013367948201688447853106595646692682568953E26";
1839 coeffs_60[2] = "-4.548529924829267669336610112411669181387790087825260737133755173032543313325682598833009521765336124891170163525664509845740222794717604E27";
1840 coeffs_60[3] = "4.6879437426294973235875133160595324795437824160731608900005486977197800919261614723948577079551305728583507312310069280623018775850412E28";
1841 coeffs_60[4] = "-3.10861265267020467624457768823845414206135580030123228715133927538323570190367768297139526311161786169387040978744732051184844409191231E29";
1842 coeffs_60[5] = "1.490599577483981276717037178787147902256911799467742317379590487947009001487476793680630580522955117318124168494382267800788736334308E30";
1843 coeffs_60[6] = "-5.50755504045738806940255910881807353185463857314393682608295373644157298562106198431098170107741597645409216199785852260920496247655646E30";
1844 coeffs_60[7] = "1.631668518639067070100242032960081591016027803392225476881353619523143028349554534276268195490790113905102273979193269720381236708853746E31";
1845 coeffs_60[8] = "-3.9823057865511431381368541930378720290638930941334849821428293955264049587073723565727061718251925950255036781219414607001763225298119E31";
1846 coeffs_60[9] = "8.16425963140638737297557821827674142140347732117757126331775708561852858085860735359056658172512163756926693444882201094206795155146202E31";
1847 coeffs_60[10] = "-1.426548236351667330492229413193359354309705120770113917370333660827270957172393778178051742077714657388432785747112574456061555034588373E32";
1848 coeffs_60[11] = "2.14821861694536170414714365485614715949416083667308573285807894910742621740039595483105992136915471547998283891842897000924199509164799E32";
1849 coeffs_60[12] = "-2.81233281290021706519566203146379395136352592819625378308636458418501787286411189089807465993150834399778687427813779950602826375635436E32";
1850 coeffs_60[13] = "3.222783358826786224404373038021509245352188734386849874296356404770508945395436142634892645963851510893216093037595555902121365717716154E32";
1851 coeffs_60[14] = "-3.250409075716999887328836263791911196138647661969351655925350981785153422033954649154242209471752219326556302767677017396179477496948985E32";
1852 coeffs_60[15] = "2.897783210826628399578158893643627107049805015801395657097255344786041806868455726759715576609013221857885740543509045196763816109465777E32";
1853 coeffs_60[16] = "-2.29136919195969647663887561122314618826917230275433296293059354280077561407373070937197721317435316121212106870152659174216557412788874E32";
1854 coeffs_60[17] = "1.611288006928200619663496306945576194382628760891807800193737346171844871295031418730500946186238469256168610033434708290528870722514911E32";
1855 coeffs_60[18] = "-1.009632466053186015034182792930705530447465885425278324598880797572411588461783484686932989855033967294215840157892487264656571258327313E32";
1856 coeffs_60[19] = "5.64520651042784179741815642438421132518008517154942873706221206276337451930555926854271086501686252334516011905237101877044320182980053E31";
1857 coeffs_60[20] = "-2.81912877441595327683492797147781153304080114512116755424671954256427789550109614317215500473322621746416096887803928883800132453510579E31";
1858 coeffs_60[21] = "1.257934257434294354026338893625531254891110662111965279263894740714811495074726866375858553579650295684850594211744093582249745250079168E31";
1859 coeffs_60[22] = "-5.01544407232599962845688086323662774702854661522104499328570796808858930542190600193190967249971520736397504227594619670310759235566195E30";
1860 coeffs_60[23] = "1.786035425040937365122699272239542501767986628253845452136132211710520249195280548478081559036323184490150479070929923213045153333111476E30";
1861 coeffs_60[24] = "-5.67605430104368150038863866362066081946938075036837029856903803768657069745962581310398542442108872722631658677177822712376500859930109E29";
1862 coeffs_60[25] = "1.607878222558573982505999018371559631909289246981490321219650132406126936263403946310818841465409950661433241956831540547593847161412447E29";
1863 coeffs_60[26] = "-4.05332042374309456146169816144083508836132423024788116321074411679252452773181941601763924562378611113519038766273534176937279867894066E28";
1864 coeffs_60[27] = "9.07493596543985672039002802030098143847503854224661484396413496012780904911929710460264147600378604646912175235271954302119768907744722E27";
1865 coeffs_60[28] = "-1.800074018924350353143489874038038169034914082090587278672411654146678304871125651069902339241049552886098125667720181441150399048551683E27";
1866 coeffs_60[29] = "3.154250688078046681602499411296013099183808016176992164829953752437167774310360166977972581670851790753785195101324694758021403186162394E26";
1867 coeffs_60[30] = "-4.86629244083379932983782216256143990390210226006560452979433243294026128577640975980482675864760717747936401374948595060083674140963469E25";
1868 coeffs_60[31] = "6.58428611248406176613133080039790689602908099995907522692286902207707012485115422092589779128693214784991500936878932461139361901566087E24";
1869 coeffs_60[32] = "-7.77846893445970039116628280774361378296946997639645747353868461156972352366479641995295874152354776734003001337605345817120316052066992E23";
1870 coeffs_60[33] = "7.98268735994772082084918485121285571015813651374688487489679943603727447378945977989630573952891101472578977333720105112837324185659362E22";
1871 coeffs_60[34] = "-7.07562692971089746095546542541499489835693326760069291570193808615779224025348460132750549389189539682228913778397783434269420284483726E21";
1872 coeffs_60[35] = "5.381346729881846847476909845563262674288431852755093265786345982700437823098162630059919716651136095720390719236493773958116646152386075E20";
1873 coeffs_60[36] = "-3.4856856542678356876484367392130359114150104987588151214926676834365219571876912071608359944324610844909103855562977795837329347647911E19";
1874 coeffs_60[37] = "1.90665542883474657677037950113781854248329048412482665873254624417996252139138481002200079466749149325431679310476862249520001277129217E18";
1875 coeffs_60[38] = "-8.72254994006151131395107200045641306281165826830744222866994799005490857259177347821280095689079457417603257537321939951004603693393316E16";
1876 coeffs_60[39] = "3.30066663941625244322555483012774856710545517350986120571194216206848716066355962922968824538055042855044917677713272771363157100391997E15";
1877 coeffs_60[40] = "-1.020092089391030771746960980075254826475625668908623135552682999358854102567810002206013823466362488147261886160954607897574298699485318E14";
1878 coeffs_60[41] = "2.537518136375035057088980117582986067754938584307761188810498418760131416720976321039509027979006220650166651208980823946300429957067604E12";
1879 coeffs_60[42] = "-4.99523339577986301543863423322168947825482352498610406809585164155176248614834684219539096936869521198401912030883142734471627752449382E10";
1880 coeffs_60[43] = "7.62961024898383965152735310352890448678585029645218309944823403624458716639413808284778269959424212699922000610764015063766429510499158E8";
1881 coeffs_60[44] = "-8834336.1370238009649936481782352367054397712953420330251745022286767420934395739052638862442455545176778475848478708230456099596423988";
1882 coeffs_60[45] = "75445.9196169409678879362111492280315111800786619928588067631801224813888137547544321383450353324917130013984795690223150786036557545929";
1883 coeffs_60[46] = "-459.8458738886001056822131294892698769439281099450630714273592488999986769567563218319365007529495798105783705491469742412340762305916056";
1884 coeffs_60[47] = "1.922366163948404706136462977961544621491268971185908661903800938507393909575693892375103171073678191394626251633433930639174604982075991";
1885 coeffs_60[48] = "-0.00524987734300376305383172698735851896799115189212445098242699916121836353753886238290792298378658233479210271064792489583846726184351881";
1886 coeffs_60[49] = "8.81521840386771771843311455937479573971716020932982441671173279504850522350287085310420429874536637110755391716691475171030099411021337E-6";
1887 coeffs_60[50] = "-8.42883518072336499031504944519862331274440110738275125460829656821173301216150526266773841539372995424665091651911614576906895281293397E-9";
1888 coeffs_60[51] = "4.1559932977982056953309753711587342647729282359841592558743510304569204546713517319749817560490538963802716194154620384631597656968764E-12";
1889 coeffs_60[52] = "-9.26494376646923216540342478135986593801117330292329759013854851055518195892306285985326338987592590319793280515888731024676428929933443E-16";
1890 coeffs_60[53] = "7.80165274836868312019654872701978288745672229459298320116385383568401529728308916875595120085091565550085090877341856355815270191309086E-20";
1891 coeffs_60[54] = "-1.922049272463411538721456378153955404697617250978865956250065913541261535132290272529565880980548519758359440057376306817458561627984943E-24";
1892 coeffs_60[55] = "9.46189821976955264154519811789356895736753858729897267240554901027053652869864043679401817030067356960879571432881603836052222728024736E-30";
1893 coeffs_60[56] = "-5.06814507370603015985813829025522226614719112357562650414521252967497371724973383019436312018485582224796590023220166954083973156538672E-36";
1894 coeffs_60[57] = "1.022249951013180267209479446016461291488484443236553319305574600271584296178678167457933405768832443689762998392188667506451117069946568E-43";
1895 coeffs_60[58] = "-1.158776990252157075591666544736990249102708476419363164106801472497162421792350234416969073422311477683246469337273059290064112071625785E-47";
1896 coeffs_60[59] = "4.27222387142756413870104074160770434521893587460314314301300261552300727494374933435001642531897059406263033431558827297492879960920275E-49";
1897 coeffs[2].swap(coeffs_60);
1898 std::vector<cln::cl_N> coeffs_120(120);
1899 /* 120 coefficients follow. */
1900 coeffs_120[0] = "1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060166025676976656004344991957470171590616719251813003320122316373430327091055571";
1901 coeffs_120[1] = "3.4497260317073952007403696383770947678893302981614719279265682622766639811173298171511730607823612517530376844024218507032522459279662180470113961839690189982241536061314319614353993672315096520499373373015802582693649149063603309572777186560148513524E52";
1902 coeffs_120[2] = "-1.4975581565000729527538170857594663742319328925831469933998274880997450758924704742659571258591716460336677591345828722528085692201176737000527729600671680178988361119859420301844184208079614468449296788394212801103162564922199859549237082372776667464E54";
1903 coeffs_120[3] = "3.1957762163065481328529158845807843312720427291703934903666695190945338610786360201875291048323381336567812569171891600400186742244091402566230953251621720778096033490814848238417212345597975915378369497445590090951446115848410773972658485451963575288E55";
1904 coeffs_120[4] = "-4.4689623509319752841609439083871154399631153121231062689347162975834499076693093642474289117173045421812089871506249999929076992135798925381959196225961791389783472385803138226317976820364502651110639008585046458007356178875618627927171581950486124233E56";
1905 coeffs_120[5] = "4.606068718424276543329442566011849623375399823565351941825685310847310447457609082356012685588953435307896055516214072529445026693975872604267789672469025113562486157850515006504573881812473997762948360804814769118883992998548055557441646946685125118E57";
1906 coeffs_120[6] = "-3.7314461146854666499272326592212099391213696621869706562566612605818861385928266960370453310708465394226398321257508947092784006446784523328681347046673172481746936234783770854350210504707173921547794426833735429199925024679815789545465854297845328325E58";
1907 coeffs_120[7] = "2.474425401670711256989398808079221298913654027234786607507813220440957186918973475366048940039541074278444160674001228864321389049663140487504402096319272526201782217412803784224929141788255724630940381342478088455751340159338461174261577243566175687E59";
1908 coeffs_120[8] = "-1.3811875718622847750042362590249762290599823842851465148429257970104907280458901604054390293828410620002370526629527048636126473391278330353375163563724888073254512227198849135923692811222561965740181944727170495185714496890490479692693474125883791901E60";
1909 coeffs_120[9] = "6.623089858532754482582703479109160446021743439335073883710993620625687271109284320721410901325182604938578905712329203551531862389936804947105415805829404869727743706364603519433193421234231031076682156125442577335383798263985569601899041876776866622E60";
1910 coeffs_120[10] = "-2.7709515004299938864490083840820063124223529009388282231525445615826433364331567602934962481829061542793349831611106716261513624279121506887680318284535361848032886450351898892264386237450622827397559067350672965967202437971930333676917000390477963866E61";
1911 coeffs_120[11] = "1.02386112293172223921263435003659366453292875147351461165091656394534393086780717052422266565203902889367201592668259202439166666819852985689989767402099479793087277263747942659943270101657408462079787397068550734516045511611701546009078868077038808757E62";
1912 coeffs_120[12] = "-3.3740197731917655541744976218513993073761175468772389726802124778433432226803314067431898210976006853342921093194297198044021414900546886804610561082663076825192459864843102368108908666053756409152492134638014803233805912009476407113691438596300794146E62";
1913 coeffs_120[13] = "9.996217786487670355655374796561399578704294298563457268841140703036898520360123177193155340144551120260016445533739357030180277693840431766824113840895797510199955331557143980793267795747200088810293047731873192410526786931879590684673414288653913515E62";
1914 coeffs_120[14] = "-2.6804750990199908441443350402311488850281543531194918304012545530803283220192092419107511475988099394746800512008906823331244710178292896561401750166818497729239682879419868799442954945496319510685448344062610897698253544876306888341881254056091234759E63";
1915 coeffs_120[15] = "6.5422964482833531603879610057815197301035372862466791995455246163778529556707384145891730234453157337303612060344197138180893720879196243783337539071284141345021864817147590781643393947019750353147151780290464319306645652085743359080495090595200531486E63";
1916 coeffs_120[16] = "-1.4604487304348366496825146715570516556564950771546738885215899741781982964860978993963272314092830563320794184042847908967120542212316261920409301852237223308467032419706968676861616456179895880956772385510853673982424825597152850339588189159102980666E64";
1917 coeffs_120[17] = "2.9942297466313630831467808691292548682230644559492580161942357031681185068971393754352871129412787966878287389513657398203481589163498279625760316093736277896138061249076616695157422053188087353540756151586375196486093987258640269607104978950906670704E64";
1918 coeffs_120[18] = "-5.658399283776588293772725313973093187743120982052603944865098913586526167668102733207163739469977271584007101869254711458133873627143366757941713180350370056955237604551850024423889291598422917971467957836705917204903687959901869098540153925178692732E64";
1919 coeffs_120[19] = "9.887368951584101622633538892976576123080629424367489037686110916264512731398396560326756128205833849608930564615629875435100785011872254223744155330328477703592008501954532369042429700051416733748454350165515933757314793533786385104271308839525639768E64";
1920 coeffs_120[20] = "-1.6019504550228766725078575508839635707919311420327486864048705642201106895239857903763208049376932672160478820626774934879424498715258948985194011690204294886396827446040036506699933786721588971678753877371518212675519147446728054067639530675249526082E65";
1921 coeffs_120[21] = "2.4124568469636899540706437405441629738413207418758399778576327598069435452295650039157974716832514441625728576753250737726840109004878753294786785674578138926529507088264657400701828947949531197915861820274684954206665488761473274445827472596875582911E65";
1922 coeffs_120[22] = "-3.3841653726400000079488483558717068873181168418395106876260246491163166726612427450773591871178866824643300679819366574162583413250423974373322308130319007820863363304629451933781204964221002853140392226489420463827400812929748772154909106349410663293E65";
1923 coeffs_120[23] = "4.4305670380812288478773282114598811227924298131011853412998479811262358077680067168455361591598296346480072528806092976336961470360354620203822421524751468329936930212919915114854135818230382164555078957880154875221176513434392525189922941290050575762E65";
1924 coeffs_120[24] = "-5.4228176962574428947233160003094662570284359565811627941401342797491445636152854865132166939274138115146035207618348708829039395974942115203986578386666664945394109693178927438991059414217518334491360514633536224841961444935232548483014691997071543828E65";
1925 coeffs_120[25] = "6.214554789078092267222051275213928685756510105900211846145778269883351640710249139978059486185007208670776100912863866582278800642692097830681092656540813877576256048148229340562594504915197956922387464825593941922429396202734006609196778697870436014E65";
1926 coeffs_120[26] = "-6.6773485088895517986512141063848395783979405189075416643094283756118912554557672721632998501682483143868731647507940026369035991063923616298815637819145806214374157182512600196214559297579802178103007615921637577873304407436850546650711237281572008424E65";
1927 coeffs_120[27] = "6.734925330317694704469314845373778479111077864464012553672292377883525864326847400954413754291163739900219432201437895152976917857427306427115230048061308424221525123820493252697918698598513232640014129066982507718245232516657455821629338155744427538E65";
1928 coeffs_120[28] = "-6.383582878496429871173501676061533991181960023885889537277705274319508246322757005217436814481703326467002683699047193244918123789600842413060331898515872574523803039779899326755393070345055586059441271293717500426377884349137309244757708993087958455E65";
1929 coeffs_120[29] = "5.6913529405959275511022780614007027176288843526260372650173869440228336395668389555081751187360483397341349300975285817498083216487282169140596290796279875175764991375447348355187090404486257481827615256024271536396461908482904537799521891879785332367E65";
1930 coeffs_120[30] = "-4.776996734587211249165031248400648409423153869394988746115380756083311986805300361459383722536698540926452976310737678416019979202990255666249869917768885659350216400547190883549730059461513588008706974008085270389354525600694962352952715682056375518E65";
1931 coeffs_120[31] = "3.7775367524287124255443145064623569295746034916892464094281613465046063954544055573214473155479196552309207209647540614474216985097792266203411723082566949978062697757983354600199199984244302856099811940389910544756210676400851240882142140969864764468E65";
1932 coeffs_120[32] = "-2.8161966171919236962021901287860232075259781334554793534017516884995332700369401674058517414969240048359891934178343992080557338603528540157030635217682829894098359736903943078409166055640608627322968554856315650475005062493399450913753277478547118352E65";
1933 coeffs_120[33] = "1.9804651678733327456903212258413521470612733719543558365536494344764973229749132899499862883369665827727506916597326744330471802598610837032598656197205238983585794266213317465548361566327435762497208877015986690267754534342053368396181078097467171858E65";
1934 coeffs_120[34] = "-1.3144275813663231527166312401997093907605894997476799416306355417933431514642211250592825223377757973148122542735038736133300194844844655961425683877005418926364412294006123974642296395931311307760050290069031276972832755406161248577410950671224318855E65";
1935 coeffs_120[35] = "8.2367260670024829522614096155108151082106397954565823313893008773930966293786646885943761866773022391428854862805955553810619924412431932999726399857050871862122529700098570542876369425991842818202826823540112018849926644955200888291063471724203391548E64";
1936 coeffs_120[36] = "-4.8749964750377069822933994525197085013480654713783888755556109773660249389776804499013517227967180500633060271953473316017147397601291325922904139209860429881054757911243087427393920494271315804033914011087815785282473032714919188637172020633929566123E64";
1937 coeffs_120[37] = "2.7259664773094932979328467102942769029907299417406744864696200699394594868759231280169149208728483197299648608091313447896342349454038879581019820193316159535211365363553004387852005780736869678460092714636910972426808304270369152189989142121207224142E64";
1938 coeffs_120[38] = "-1.440426226855027726783521340050349148103881707415523724377763633849488875095817796257895327883428230885349760692732068174527147156893314818583058727424251827006457849321094911262818557954829248070170426870959233263267490276774734065709978749400927185E64";
1939 coeffs_120[39] = "7.193790858249547212173205531149034887209275529426061411129294234841122474820371873361100215884757249851960370114629943083807936135915003201800204713978377250292881453568756354858194614039311248345228434431020394729104593125888325843724239404594830488E63";
1940 coeffs_120[40] = "-3.3960029336234301755324970935705944032408435186630159101426062821929524761770439420961993430248258136340087498829339209014794230274407979103789924433683527009234592433480445831820377517333956042612961562022604325181492952329031432513768020816986814393E63";
1941 coeffs_120[41] = "1.5154618904112106565112797443687014834429200069480460967081898435635890576815349145926430052596468033907024005478559584915319911380449387176530845634833237204659108290330613043367085829373476690728522550189678729181372902816898536141595215616716630939E63";
1942 coeffs_120[42] = "-6.3927647843464050458917092484911245813170740434503951669888756878206365814594631676413018245438405308353724023007754523096143775098898268650326908751515418318201372985246418468844138298345777180517875695389655616000832495210812684049030674085212697428E62";
1943 coeffs_120[43] = "2.5490394366379355452002449693074954071810215414182359403355645652443600688717811337587901850157210686351097591461582890354662732336749618027675479531031836144519267481752770036252137747675754903974915999567019837855523058289177148692481402871253211324E62";
1944 coeffs_120[44] = "-9.606466879185328464666445215840505657671157752044466089989040292763536710311599947887918708456526669882072519263973105599580140713596301388561639705589314111762600854460059589939760935803484446888352368360433606245369171819922425771642408570388554052E61";
1945 coeffs_120[45] = "3.4212392804723358445152430359637323789304939688937873921904941412927756295848104328630952153624979489607759834359194243032109828811134607612715016533909375981353098879969472700079242226099049323998286020341979178782935852542355220403299144612362244738E61";
1946 coeffs_120[46] = "-1.15119134701605919461057899755821946453925102458815313053351247263978303346790555715641513756644038607667203392289423834966320935498856390723555744530789850290369071103208529608463210398231590077340268751005311531529356083188150256469829678612245577446E61";
1947 coeffs_120[47] = "3.6588622583411432033523084711047679684233731128914152509273818448610176621874654252431411048902598388935105893946323641003087000410095802098177375492833543391040706755511234323104846636415419597151008153829618275459606044459923718022154035121167198784E60";
1948 coeffs_120[48] = "-1.0981148514467449476248066871827754422009180048705085132882492434176164929454140182025449006310206725429473330511884213470600326782740663313311256352613244044500057688932314549669435095761340307817735687643806167483576999980691227831561891265615422486E60";
1949 coeffs_120[49] = "3.110998209448997739767747906196101611409160829345058138064861244336130082424927251851805875584197897229644157110035272012393338413235208343342708685139492629786435072305986349067452739209758702078026647999828517440754895711519542954337931090643534216E59";
1950 coeffs_120[50] = "-8.3162485922574890007748232799240657004521608654422032389269811102140449056333167761296051794842882201869698963586030628312914066893199727852512779320175952962772072653493447297721128265231294406156925752496310087025926300388984242024436858845487466277E58";
1951 coeffs_120[51] = "2.0966904516945699848169820408710416999765756367767199815424586610234585829069218729220161654233351574517459523275756901094737085187558904179251813051891939079067686519817858153690134828671544815635956527611986498479411756457222935682849773436423295467E58";
1952 coeffs_120[52] = "-4.983121305881207125553776640558094509942884568949257704810973508397697839859902664482541160531856121365759763455699578413261749913567077796586919935391984240753355552646184306812426079133011894826183873855851966310877619118554510972675999316631346679E57";
1953 coeffs_120[53] = "1.1158023601951707374356047495258406415892974604387009613173591921419195864040428221070481312383179580486787822935456571355463718115785982888531393271665510645725283439572279946304699780331972095822869500426555507626639723865965516308476400920600382357E57";
1954 coeffs_120[54] = "-2.3524850615012075127499506758220926725372558166170912192116695445007095502575329450463479860779122789467638956004572617263549199692255055063165454868102165975951768676031140009643202074220557325155838768661030361538572755082660730808847591840060467064E56";
1955 coeffs_120[55] = "4.6669318431895615057208826641721251136909284138581355667925884903657855204100373961676117747969449100495897986226609480142908763981931305129946569690612924941456739524153327260627627771254850382983581593260532259539447965597396206625726656509884058042E55";
1956 coeffs_120[56] = "-8.7053773217442419007560462613131691749734845382618514999712446313788486289774350240165530159591402631439776213579542026449818009956904779042347595401565525081115611496250192338958392965746523979241969677734430475813057146574920495171984815351708574336E54";
1957 coeffs_120[57] = "1.5256552489620511464542280446639568546874380361953025589702692266626310669215652044048704882910412155084167930513006634430352568411276836880182348033924636960897794333644980768878022821035659978039286230061734024129667272393315169114199838321062607299E54";
1958 coeffs_120[58] = "-2.5099934505534008439782195609383796207770494575364994376922414269548303512602084430128307108303305643530918354709126474742035537827601791192999467996479881350277448357927640707861695639576629921988481117017137420422963638277868648516492581097660522547E53";
1959 coeffs_120[59] = "3.872963359882179682964169603201046384616694634651871844057456079738892419308420856725974686574980381399016464501318163662938118593626674643538005780375691959391996340141057698193381380484420715733863044826589570328349973407598034428591146829028071358E52";
1960 coeffs_120[60] = "-5.59947633823301408044455223877913062308847941596689956112764416031828413291312481723036534632655608672535030921469531903033364444816678754679807809159478411100820014592865068932440734964265842594875758737421026093110624848762070026616564150314951394E51";
1961 coeffs_120[61] = "7.57762861280525531438216991274899157834431478755285945898172885086150762425529113816148806028462888396660067975773261101497666568988246606837690320098870044112671149076084444095163491848634465373822951831018725769263871497616640732007420499659069842E50";
1962 coeffs_120[62] = "-9.587786106526273406187878833167940811862067040706459726637556599860244751467528905534431960251166924163661188573831350928972391892492380823531476387272791432306808700507685765850397294118719242350333451452137838374120658600691461454898577711260078952E49";
1963 coeffs_120[63] = "1.13288726401696728230264357306938076698155303500407071418573081766541065136778223998897791839613776442037036668986628122296219518360439574147622758002647495909592177914657175019781723803408732148262293125845657503039410078589916085532057725749397276232E49";
1964 coeffs_120[64] = "-1.24849787223197441956280303618704887038709792250544105638342097080498907831514597860418910331910245753340059089147824955071899315894649696314820492532126554883819507650973976145456660786429117569053901704116877128391672511345177517877672824534972448216E48";
1965 coeffs_120[65] = "1.2815463720972693091316233381473056495608681859925407504190742949467232967966271661733907550222983737930524555721493736920130260377888287772008209963158064973076933575966719577456540496444474944074979736374259087350416613616719928507635667369740203319E47";
1966 coeffs_120[66] = "-1.2234887340201843394744986892310393596065877342193196880417674427168862926389642850813687099959036354499094230765541977493433449153438766822382486040215211159359175689369230076522107734270943423777076523650345103234411047700646432924770659676420158487E46";
1967 coeffs_120[67] = "1.0847187881607033339631651118075716564835185723270640503055198532318419482330026641941088359447807553514405522074008969583213861070993661224871455023365601323302778638456843760403418046238489404394483720438784739822580385277055304353975028280477740796E45";
1968 coeffs_120[68] = "-8.9160881476675795743767277986448579964735858351472748620623279571408606135698760493224031735408212513500922230670883171668702983221921543376953865813604783695111225412173880768170509738290662806468458720236121755965944855709552219268353813402612336565E43";
1969 coeffs_120[69] = "6.782864920104031936272293608616215844503387641476821968620772153274069873138756405621471099960069602613619793775294358177761533027360002770186566164041138064221354961783144649476276625776241973967317262115970868665380343599565811072109785000646703404E42";
1970 coeffs_120[70] = "-4.7667808452660756441368384708874451089976319738852731080495062883240643961463680300964077232336439626019128672679703771884184482488932861160134911816225569323838390204451496983578077563176966732010513231048738892639707790407292070646798259086924770995E41";
1971 coeffs_120[71] = "3.0885057140860079424719232591765602418793465632939298397987628606701994268384966881159469651774584648643122830739130127593326652998108850492039117928976417052691273804304806596509726701594300563830431015215234640024338277573401498998072908815285293868E40";
1972 coeffs_120[72] = "-1.8410405906573614531857309495652487774337134256805076777639383854080936219680656594060736479739035202182601529001321266214227848431889644620036213870966329509961114940541333851155401637197303308322414678191211465563854205816313387785764908216851396633E39";
1973 coeffs_120[73] = "1.0073694433024942271325653907485159683302928496826793112696958500366488338508211620934892875328717073528902110227362794694820010124321343709182901273795782541866547318841893692957109947576483162095037812781379193423759617638948859880051822460818418552E38";
1974 coeffs_120[74] = "-5.0475051506252944853315611134428802424958512917967945464108691542854207821486654807141339210375899950551724141366521361887864357385178212628348794663127149312605456165451981719848656127310229221238908657530297751682848475855876378576874607521597136906E36";
1975 coeffs_120[75] = "2.3099766115359817610656986443137072041797751710805647712896098246833051023271876304983288225638204962631413469467959017768113430777226924099787875749611560913177631681394153889301715579572842026181746028117354815826836594637709952294015960031772162547E35";
1976 coeffs_120[76] = "-9.629053850440590569772960665435833408449876392175761493622541259322053209458881628458334353756739601360772251654643632187697620334088992038575944303101187678397564511853344433267011583960451100374611538881978045643233876974513962362084978095067025623E33";
1977 coeffs_120[77] = "3.6452126546120530579393646694066971671091434168707822859890104373691687449831950255953317231572802167174179528347370588567969602221261721708890001616085516755796796282628169745443137768549800602834096924025507345446292715781107949529692160434800323E32";
1978 coeffs_120[78] = "-1.2492564030201607643388368733220662634846470405464496879151879822123866671204541555507638492613046717628358162773937737774832271305618491107140304474323049182605167775847584622690299098207979849043605983558768056117581593008210986863088433891075743152E31";
1979 coeffs_120[79] = "3.8627447638297686357472526935538070834588578920414538227245516723308987020816841052950727259618753144711425856434270832495754300189881199851254605718213699755258867641301730599979474865704144160112269948588154919128986989885090481959424806312935273075E29";
1980 coeffs_120[80] = "-1.0736758703963497284148841547397192249226725101007524773889805877171959717011395181953504058502607435217886087332761920207901621377557079619638699346496468750455986591040017334237734940082333954589067611955107878899677189289648293223359861027746438121E28";
1981 coeffs_120[81] = "2.6722714785740082059347577649909834926335247252399259683264830680945466475595847553753509546415283809619181144796536494882020159787371993099998263815645014317923922311421330376008111312767167437401741178863083976628261471599264811824656877164988491393E26";
1982 coeffs_120[82] = "-5.9304047185329750657632568788530498935629656326502947505210292278638825286675833282579834326765999907183142489791905921257123760969245535649745876992946512033156167841406724363867902645010435996961270021857807247440211477908060243655541266857227638988E24";
1983 coeffs_120[83] = "1.16817022089143274700208191285335154155497013626172270535715899131321522799010543339535307798264602677955894930046454353008462671803498794203612585729705145312299224155123919877760274781582850868001155383467754608529345730226972329454404720862870618607E23";
1984 coeffs_120[84] = "-2.03239515657536501213472165328009690017090356606547792466197690386716728380893226886179282271040418637806139515373566132123131620086873213475424131345589653019635327048678766191769576650893957440830876852296666120473866301097954633389040518870395767125E21";
1985 coeffs_120[85] = "3.1065334503269182605978912331263087603258864771943471481540265718169544724355602987297631515907391374943512439350265433478241465606056187134785807375293801936399644663199667496663518171930757047012102683120173353568660795955174938680248863153863947508E19";
1986 coeffs_120[86] = "-4.1476244154347831048636005592317388215032295704489937704602030038303705695463546496640638505584602502764898113504560236629804442607426019604639559875021291459916615723777004493344143132459204229291886967479716413925814352313734234340863490128872380307E17";
1987 coeffs_120[87] = "4.8067293487250079673131214670887682215073707729621636364424152483295071605326220176372385638491275365750175037404843071051780212494354459897540110089573898336327006157766256896984455454193271731091632286742192439925748114360605084629432813597189767538E15";
1988 coeffs_120[88] = "-4.8023544548381246628003457039588616467438691159189277447469028024236284353593054364114519649309416187375157096932150251663679454372678125518452171003992957433311257042292636706448339781439297178835786059318810522834929923770539615271536113963729385909E13";
1989 coeffs_120[89] = "4.1055087514683476865343055835875083237542317413651906253058979029083965525058905726360233143503628224856307545474786181299719957472120906835233967660557875100202077212004953379299507351564181758434304881046845705855303854083493519588411179065109026834E11";
1990 coeffs_120[90] = "-2.9787503393847675871205038539267895335240592213878943742323972872214441728681744433089698206110260166068266926018988659692353298939109421567999207730700359726920482465669373553804927535369930188390246988033893916611435406224816632683980860607732310186E9";
1991 coeffs_120[91] = "1.8178328110729629877907010659834277046059726898311908447099830056830012488194646687474150289147446390570639168063598563291822008033517936194534129929881015025633519502485415000390171249019651579295905194415531994026553693578406432674734610095421683863E7";
1992 coeffs_120[92] = "-92391.136314434380495997449781381513978328604842061708454699991154771188446049720445502194923435235472458378926242100033122111143321209059959788378033220861638093951546784186137626553022963832352496255851690092415165826965388502958309163995296640164754";
1993 coeffs_120[93] = "386.82763074890451546182061419449593717951707520472938425276820204065379182568600735469831672149785863654956632602671563997131280046154927653332261114114005498875447205079045401364007035880825957300757663780618819785476980699579657587509130753204519233";
1994 coeffs_120[94] = "-1.3181204292571874302358432444324779303744749959754136019600954846045028319805074783759764870805734807693739252625657350494147444011046941331047057337345953605042408524072436811726898109072388160378243068564382623631658424851676817690976343859083960324";
1995 coeffs_120[95] = "0.003606538673252695455085947121496196507159591230095595764694813152630524319596509155920374890595867709349176662036024214476302717902368680224618116411588086562230407996267622244422187853090635901906175373997993725355114393033631058067900506212434600015";
1996 coeffs_120[96] = "-7.805244503909439374422205381130511738566245024242591464192744568789876715121004646510755612128565674260161510215430132815223049297785205382643947556846567064565241387424696940674258789227398935846571768027456535982674711768030751512030174841314425949E-6";
1997 coeffs_120[97] = "1.31373705470989377112938364152965446631228819123896570245455699237549295870321627234421140232628798373711221392827979836922621437205363811871692678679625916100572037589291239046725228767017131155814257944742981208252138821140381478767814046301821211856E-8";
1998 coeffs_120[98] = "-1.6872873094408224472617181717534409090015431593544429529131126514352910895332010213914243717484771690790552077128803350550170014347729272790464826195676369023970955260051387240496705602732313607409271794413329062030561818907163134089683283286623809325E-11";
1999 coeffs_120[99] = "1.6183083251905685095057354853863188515437903228178486856957070037813756492593759658405336450433607296873747595037080703825755020175480385843762609522889527239577435110258291566585028919336090916225831079571865425410181260759913688103716786795647286451E-14";
2000 coeffs_120[100] = "-1.13097359411474028225398794102354853670936316496817819635688647804142428962171772690717075128208102537660772310780986623575005236651312181907812813813504742701120603881086064664411899253566047514905519888629604717647221817372977488600336785871295304013E-17";
2001 coeffs_120[101] = "5.599216369109121957949255319730053610385733330502739423509794477602247233276045188197007198417289907263120960704056657544648432653622931077692740961599655386871075693202473992087883485704436336279135221721374640982826144708808646466699352755417123702E-21";
2002 coeffs_120[102] = "-1.9009180102993021108185348502624676395148544369474718879637745630712451378711342634099259114111847962752555305470572286326367888004493816251811794947276966269738750207359305252041104539066278002044545942171476984766923991983055271262414217352967659228E-24";
2003 coeffs_120[103] = "4.261262509940940316499754264112111685174274727656165126333137554124192224955656564229887938745508952447664695831728428607673797269945824475565104978593072684829487175697371245288754204324544164474840153141042852153497051337607734150135978754952561336E-28";
2004 coeffs_120[104] = "-6.033854291373449912236926137860325602686312455380825767485673949251953414778800668020214699151728472172651816317924130614791108454134597377848088327850505473503152696524861086193124979489104732214189466703901268332265826882296309653009237279831825243E-32";
2005 coeffs_120[105] = "5.1208402745272379096703574714836785944518835939702823617280147111145234914591060871138496110227453241036619229980622243972303295470574470937679143516006222494480144845809123492603651773613707216680534850900104861326332900592715684757980394834998321888E-36";
2006 coeffs_120[106] = "-2.4463535717946588550832618025289907099586319384566637643650142186828541109926588999585266911960640972919441499109750654299062004147686492034166034659422424525984094382368955916181276646903453872999065929058429821759475215620044891133652431220664754175E-40";
2007 coeffs_120[107] = "6.0973480699773886324239008989591793773608942051497498591908583910660358857815864266160341286217871697703362816166340947142517661604423899536979689047275448159991318658879804351288744125363072102852651926942302209139318098544348348564409845011546432615E-45";
2008 coeffs_120[108] = "-7.2234185761285078775026471720270426097727212523472472797635230392183067756271499246654638332288950167477129840028892565652782123508855602380279653475510712205780583313834027906297063690370430285856541927759405826980856379432703473274890527421175151858E-50";
2009 coeffs_120[109] = "3.6217112680215791206171182969894344487335819731880124290544082848140757826983885738735436324684863867140575000400288923606439193119990961489053513339202655922248092157737577138929144240507796562250602457839068582279379672722261563501188150876583184441E-55";
2010 coeffs_120[110] = "-6.6329300032795486066608594142675837603786558782159646987663521197523704085781830169369726460621246948945196657495305819768951424025780824076252490918306538895670861455244641773606980519824591785816943621538721352987553804824051051144609050417497894495E-61";
2011 coeffs_120[111] = "3.6664720904335295532012711597888717227860988776477301054518326674835421172405060906940404374163713097964932859351917152390238690399278248344863365606468942320103392909602843987855082225592776850615943708151738327210634139824601616072015258461809772448E-67";
2012 coeffs_120[112] = "-4.7466013179695826928232672846686064011594588664906398407027593213652099998530859940288723349213099851532139911079905393494419637612780994270110734378146177806681489226896952731800026849872070824592339117757940119304241732812925979963178130104280115315E-74";
2013 coeffs_120[113] = "1.0163707785221910939390789816391472677729665860532352695801597334766068288835382195560328979864550624486740471947632369344045378626680607890520366137741785540226552923584183986350590955499329375427326072319268396685478606934920507703868118038891818762E-81";
2014 coeffs_120[114] = "-3.4814151260242800905467399051937942442621710748397374123807284826536707678408888416026868585492229216524609739211131993326633970334388991812593549702868877534701822990946125111761892723042376117665640296993581745994557803052315791392349639065203872505E-90";
2015 coeffs_120[115] = "1.18525924288117432386770939895670573772658621857195305986011196724304231598127227408839423385042572374412446842112646168302015480830234100570192462192015131968307084609177540911503689228342834030959242458698413980031135644018348590823980902427540799814E-91";
2016 coeffs_120[116] = "-8.5714961216566153236700116412888006837408819915951896129362859520462766617634320531162919426026429378433105901035364956643086394331335747930198070611009941831387116980941022864465946989065467218665543814574849964435089931072761832853235509961870476035E-93";
2017 coeffs_120[117] = "4.5681983751743456413033268196376305093509590040595182930261094908859252761697530924655649930852283295534503341542929581967081012867692190108698698006237799801339418962091877730207560007839789937153876806052229193448161273005984514504886230869730232561E-94";
2018 coeffs_120[118] = "-1.5943139155457706045530478744891549581317663177038648406493256399589001327414318955746453934207742828511041930090849236963271943244329753764497401819704943705370596846318480510254313447057477914171472190541408193443142906466279172123681623644325254209E-95";
2019 coeffs_120[119] = "2.7319125666863032595604997603472305262880292377469053594326527505796348018540179196191192420176181194669607935656210005192217186286873953583571180312679155204061051208771126804209623533044988888808754656646355388901404252058383561064953226611421609762E-97";
2020 coeffs[3].swap(coeffs_120);
2021}
2022
2023static cln::float_format_t guess_precision(const cln::cl_N& x)
2024{
2025 cln::float_format_t prec = cln::default_float_format;
2026 if (!instanceof(realpart(x), cln::cl_RA_ring))
2027 prec = cln::float_format(cln::the<cln::cl_F>(realpart(x)));
2028 if (!instanceof(imagpart(x), cln::cl_RA_ring))
2029 prec = cln::float_format(cln::the<cln::cl_F>(imagpart(x)));
2030 return prec;
2031}
2032
2038const cln::cl_N lgamma(const cln::cl_N &x)
2039{
2040 cln::float_format_t prec = guess_precision(x);
2041 lanczos_coeffs lc;
2042 if (lc.sufficiently_accurate(prec)) {
2043 cln::cl_N pi_val = cln::pi(prec);
2044 if (realpart(x) < 0.5)
2045 return cln::log(pi_val) - cln::log(sin(pi_val*x))
2046 - lgamma(1 - x);
2047 cln::cl_N A = lc.calc_lanczos_A(x);
2048 cln::cl_N temp = x + lc.get_order() - cln::cl_N(1)/2;
2049 cln::cl_N result = log(cln::cl_I(2)*pi_val)/2
2050 + (x-cln::cl_N(1)/2)*log(temp)
2051 - temp
2052 + log(A);
2053 return result;
2054 }
2055 else
2056 throw dunno();
2057}
2058
2060{
2061 const cln::cl_N x_ = x.to_cl_N();
2062 const cln::cl_N result = lgamma(x_);
2063 return numeric(result);
2064}
2065
2066const cln::cl_N tgamma(const cln::cl_N &x)
2067{
2068 cln::float_format_t prec = guess_precision(x);
2069 lanczos_coeffs lc;
2070 if (lc.sufficiently_accurate(prec)) {
2071 cln::cl_N pi_val = cln::pi(prec);
2072 if (realpart(x) < 0.5)
2073 return pi_val/(cln::sin(pi_val*x))/tgamma(1 - x);
2074 cln::cl_N A = lc.calc_lanczos_A(x);
2075 cln::cl_N temp = x + lc.get_order() - cln::cl_N(1)/2;
2076 cln::cl_N result = sqrt(cln::cl_I(2)*pi_val)
2077 * expt(temp, x - cln::cl_N(1)/2)
2078 * exp(-temp) * A;
2079 return result;
2080 }
2081 else
2082 throw dunno();
2083}
2084
2086{
2087 const cln::cl_N x_ = x.to_cl_N();
2088 const cln::cl_N result = tgamma(x_);
2089 return numeric(result);
2090}
2091
2094const numeric psi(const numeric &x)
2095{
2096 throw dunno();
2097}
2098
2099
2102const numeric psi(const numeric &n, const numeric &x)
2103{
2104 throw dunno();
2105}
2106
2107
2113{
2114 if (!n.is_nonneg_integer())
2115 throw std::range_error("numeric::factorial(): argument must be integer >= 0");
2116 return numeric(cln::factorial(n.to_int()));
2117}
2118
2119
2127{
2128 if (n.is_equal(*_num_1_p))
2129 return *_num1_p;
2130
2131 if (!n.is_nonneg_integer())
2132 throw std::range_error("numeric::doublefactorial(): argument must be integer >= -1");
2133
2134 return numeric(cln::doublefactorial(n.to_int()));
2135}
2136
2137
2144const numeric binomial(const numeric &n, const numeric &k)
2145{
2146 if (n.is_integer() && k.is_integer()) {
2147 if (n.is_nonneg_integer()) {
2148 if (k.compare(n)!=1 && k.compare(*_num0_p)!=-1)
2149 return numeric(cln::binomial(n.to_int(),k.to_int()));
2150 else
2151 return *_num0_p;
2152 } else {
2153 if (k.is_nonneg_integer())
2154 return _num_1_p->power(k)*binomial(k-n-(*_num1_p), k);
2155 else
2156 return _num_1_p->power(n-k)*binomial(-k-(*_num1_p), n-k);
2157 }
2158 }
2159
2160 // should really be gamma(n+1)/gamma(k+1)/gamma(n-k+1) or a suitable limit
2161 throw std::range_error("numeric::binomial(): don't know how to evaluate that.");
2162}
2163
2164
2170const numeric bernoulli(const numeric &nn)
2171{
2172 if (!nn.is_integer() || nn.is_negative())
2173 throw std::range_error("numeric::bernoulli(): argument must be integer >= 0");
2174
2175 // Method:
2176 //
2177 // The Bernoulli numbers are rational numbers that may be computed using
2178 // the relation
2179 //
2180 // B_n = - 1/(n+1) * sum_{k=0}^{n-1}(binomial(n+1,k)*B_k)
2181 //
2182 // with B(0) = 1. Since the n'th Bernoulli number depends on all the
2183 // previous ones, the computation is necessarily very expensive. There are
2184 // several other ways of computing them, a particularly good one being
2185 // cl_I s = 1;
2186 // cl_I c = n+1;
2187 // cl_RA Bern = 0;
2188 // for (unsigned i=0; i<n; i++) {
2189 // c = exquo(c*(i-n),(i+2));
2190 // Bern = Bern + c*s/(i+2);
2191 // s = s + expt_pos(cl_I(i+2),n);
2192 // }
2193 // return Bern;
2194 //
2195 // But if somebody works with the n'th Bernoulli number she is likely to
2196 // also need all previous Bernoulli numbers. So we need a complete remember
2197 // table and above divide and conquer algorithm is not suited to build one
2198 // up. The formula below accomplishes this. It is a modification of the
2199 // defining formula above but the computation of the binomial coefficients
2200 // is carried along in an inline fashion. It also honors the fact that
2201 // B_n is zero when n is odd and greater than 1.
2202 //
2203 // (There is an interesting relation with the tangent polynomials described
2204 // in `Concrete Mathematics', which leads to a program a little faster as
2205 // our implementation below, but it requires storing one such polynomial in
2206 // addition to the remember table. This doubles the memory footprint so
2207 // we don't use it.)
2208
2209 const unsigned n = nn.to_int();
2210
2211 // the special cases not covered by the algorithm below
2212 if (n & 1)
2213 return (n==1) ? (*_num_1_2_p) : (*_num0_p);
2214 if (!n)
2215 return *_num1_p;
2216
2217 // store nonvanishing Bernoulli numbers here
2218 static std::vector< cln::cl_RA > results;
2219 static unsigned next_r = 0;
2220
2221 // algorithm not applicable to B(2), so just store it
2222 if (!next_r) {
2223 results.push_back(cln::recip(cln::cl_RA(6)));
2224 next_r = 4;
2225 }
2226 if (n<next_r)
2227 return numeric(results[n/2-1]);
2228
2229 results.reserve(n/2);
2230 for (unsigned p=next_r; p<=n; p+=2) {
2231 cln::cl_I c = 1; // seed for binomial coefficients
2232 cln::cl_RA b = cln::cl_RA(p-1)/-2;
2233 // The CLN manual says: "The conversion from `unsigned int' works only
2234 // if the argument is < 2^29" (This is for 32 Bit machines. More
2235 // generally, cl_value_len is the limiting exponent of 2. We must make
2236 // sure that no intermediates are created which exceed this value. The
2237 // largest intermediate is (p+3-2*k)*(p/2-k+1) <= (p^2+p)/2.
2238 if (p < (1UL<<cl_value_len/2)) {
2239 for (unsigned k=1; k<=p/2-1; ++k) {
2240 c = cln::exquo(c * ((p+3-2*k) * (p/2-k+1)), (2*k-1)*k);
2241 b = b + c*results[k-1];
2242 }
2243 } else {
2244 for (unsigned k=1; k<=p/2-1; ++k) {
2245 c = cln::exquo((c * (p+3-2*k)) * (p/2-k+1), cln::cl_I(2*k-1)*k);
2246 b = b + c*results[k-1];
2247 }
2248 }
2249 results.push_back(-b/(p+1));
2250 }
2251 next_r = n+2;
2252 return numeric(results[n/2-1]);
2253}
2254
2255
2263{
2264 if (!n.is_integer())
2265 throw std::range_error("numeric::fibonacci(): argument must be integer");
2266 // Method:
2267 //
2268 // The following addition formula holds:
2269 //
2270 // F(n+m) = F(m-1)*F(n) + F(m)*F(n+1) for m >= 1, n >= 0.
2271 //
2272 // (Proof: For fixed m, the LHS and the RHS satisfy the same recurrence
2273 // w.r.t. n, and the initial values (n=0, n=1) agree. Hence all values
2274 // agree.)
2275 // Replace m by m+1:
2276 // F(n+m+1) = F(m)*F(n) + F(m+1)*F(n+1) for m >= 0, n >= 0
2277 // Now put in m = n, to get
2278 // F(2n) = (F(n+1)-F(n))*F(n) + F(n)*F(n+1) = F(n)*(2*F(n+1) - F(n))
2279 // F(2n+1) = F(n)^2 + F(n+1)^2
2280 // hence
2281 // F(2n+2) = F(n+1)*(2*F(n) + F(n+1))
2282 if (n.is_zero())
2283 return *_num0_p;
2284 if (n.is_negative()) {
2285 if (n.is_even()) {
2286 return -fibonacci(-n);
2287 }
2288 else {
2289 return fibonacci(-n);
2290 }
2291 }
2292
2293 cln::cl_I u(0);
2294 cln::cl_I v(1);
2295 cln::cl_I m = cln::the<cln::cl_I>(n.to_cl_N()) >> 1L; // floor(n/2);
2296 for (uintL bit=cln::integer_length(m); bit>0; --bit) {
2297 // Since a squaring is cheaper than a multiplication, better use
2298 // three squarings instead of one multiplication and two squarings.
2299 cln::cl_I u2 = cln::square(u);
2300 cln::cl_I v2 = cln::square(v);
2301 if (cln::logbitp(bit-1, m)) {
2302 v = cln::square(u + v) - u2;
2303 u = u2 + v2;
2304 } else {
2305 u = v2 - cln::square(v - u);
2306 v = u2 + v2;
2307 }
2308 }
2309 if (n.is_even())
2310 // Here we don't use the squaring formula because one multiplication
2311 // is cheaper than two squarings.
2312 return numeric(u * ((v << 1) - u));
2313 else
2314 return numeric(cln::square(u) + cln::square(v));
2315}
2316
2317
2319const numeric abs(const numeric& x)
2320{
2321 return numeric(cln::abs(x.to_cl_N()));
2322}
2323
2324
2332const numeric mod(const numeric &a, const numeric &b)
2333{
2334 if (a.is_integer() && b.is_integer())
2335 return numeric(cln::mod(cln::the<cln::cl_I>(a.to_cl_N()),
2336 cln::the<cln::cl_I>(b.to_cl_N())));
2337 else
2338 return *_num0_p;
2339}
2340
2341
2345const numeric smod(const numeric &a_, const numeric &b_)
2346{
2347 if (a_.is_integer() && b_.is_integer()) {
2348 const cln::cl_I a = cln::the<cln::cl_I>(a_.to_cl_N());
2349 const cln::cl_I b = cln::the<cln::cl_I>(b_.to_cl_N());
2350 const cln::cl_I b2 = b >> 1;
2351 const cln::cl_I m = cln::mod(a, b);
2352 const cln::cl_I m_b = m - b;
2353 const cln::cl_I ret = m > b2 ? m_b : m;
2354 return numeric(ret);
2355 } else
2356 return *_num0_p;
2357}
2358
2359
2367const numeric irem(const numeric &a, const numeric &b)
2368{
2369 if (b.is_zero())
2370 throw std::overflow_error("numeric::irem(): division by zero");
2371 if (a.is_integer() && b.is_integer())
2372 return numeric(cln::rem(cln::the<cln::cl_I>(a.to_cl_N()),
2373 cln::the<cln::cl_I>(b.to_cl_N())));
2374 else
2375 return *_num0_p;
2376}
2377
2378
2387const numeric irem(const numeric &a, const numeric &b, numeric &q)
2388{
2389 if (b.is_zero())
2390 throw std::overflow_error("numeric::irem(): division by zero");
2391 if (a.is_integer() && b.is_integer()) {
2392 const cln::cl_I_div_t rem_quo = cln::truncate2(cln::the<cln::cl_I>(a.to_cl_N()),
2393 cln::the<cln::cl_I>(b.to_cl_N()));
2394 q = numeric(rem_quo.quotient);
2395 return numeric(rem_quo.remainder);
2396 } else {
2397 q = *_num0_p;
2398 return *_num0_p;
2399 }
2400}
2401
2402
2408const numeric iquo(const numeric &a, const numeric &b)
2409{
2410 if (b.is_zero())
2411 throw std::overflow_error("numeric::iquo(): division by zero");
2412 if (a.is_integer() && b.is_integer())
2413 return numeric(cln::truncate1(cln::the<cln::cl_I>(a.to_cl_N()),
2414 cln::the<cln::cl_I>(b.to_cl_N())));
2415 else
2416 return *_num0_p;
2417}
2418
2419
2427const numeric iquo(const numeric &a, const numeric &b, numeric &r)
2428{
2429 if (b.is_zero())
2430 throw std::overflow_error("numeric::iquo(): division by zero");
2431 if (a.is_integer() && b.is_integer()) {
2432 const cln::cl_I_div_t rem_quo = cln::truncate2(cln::the<cln::cl_I>(a.to_cl_N()),
2433 cln::the<cln::cl_I>(b.to_cl_N()));
2434 r = numeric(rem_quo.remainder);
2435 return numeric(rem_quo.quotient);
2436 } else {
2437 r = *_num0_p;
2438 return *_num0_p;
2439 }
2440}
2441
2442
2447const numeric gcd(const numeric &a, const numeric &b)
2448{
2449 if (a.is_integer() && b.is_integer())
2450 return numeric(cln::gcd(cln::the<cln::cl_I>(a.to_cl_N()),
2451 cln::the<cln::cl_I>(b.to_cl_N())));
2452 else
2453 return *_num1_p;
2454}
2455
2456
2461const numeric lcm(const numeric &a, const numeric &b)
2462{
2463 if (a.is_integer() && b.is_integer())
2464 return numeric(cln::lcm(cln::the<cln::cl_I>(a.to_cl_N()),
2465 cln::the<cln::cl_I>(b.to_cl_N())));
2466 else
2467 return a.mul(b);
2468}
2469
2470
2479const numeric sqrt(const numeric &x)
2480{
2481 return numeric(cln::sqrt(x.to_cl_N()));
2482}
2483
2484
2486const numeric isqrt(const numeric &x)
2487{
2488 if (x.is_integer()) {
2489 cln::cl_I root;
2490 cln::isqrt(cln::the<cln::cl_I>(x.to_cl_N()), &root);
2491 return numeric(root);
2492 } else
2493 return *_num0_p;
2494}
2495
2496
2499{
2500 return numeric(cln::pi(cln::default_float_format));
2501}
2502
2503
2506{
2507 return numeric(cln::eulerconst(cln::default_float_format));
2508}
2509
2510
2513{
2514 return numeric(cln::catalanconst(cln::default_float_format));
2515}
2516
2517
2520 : digits(17)
2521{
2522 // It initializes to 17 digits, because in CLN float_format(17) turns out
2523 // to be 61 (<64) while float_format(18)=65. The reason is we want to
2524 // have a cl_LF instead of cl_SF, cl_FF or cl_DF.
2525 if (too_late)
2526 throw(std::runtime_error("I told you not to do instantiate me!"));
2527 too_late = true;
2528 cln::default_float_format = cln::float_format(17);
2529
2530 // add callbacks for built-in functions
2531 // like ... add_callback(Li_lookuptable);
2532}
2533
2534
2537{
2538 long digitsdiff = prec - digits;
2539 digits = prec;
2540 cln::default_float_format = cln::float_format(prec);
2541
2542 // call registered callbacks
2543 for (auto it : callbacklist) {
2544 (it)(digitsdiff);
2545 }
2546
2547 return *this;
2548}
2549
2550
2552_numeric_digits::operator long()
2553{
2554 // BTW, this is approx. unsigned(cln::default_float_format*0.301)-1
2555 return (long)digits;
2556}
2557
2558
2560void _numeric_digits::print(std::ostream &os) const
2561{
2562 os << digits;
2563}
2564
2565
2568{
2569 callbacklist.push_back(callback);
2570}
2571
2572
2573std::ostream& operator<<(std::ostream &os, const _numeric_digits &e)
2574{
2575 e.print(os);
2576 return os;
2577}
2578
2580// static member variables
2582
2583// private
2584
2585bool _numeric_digits::too_late = false;
2586
2587
2591
2592} // namespace GiNaC
Archiving of GiNaC expressions.
#define GINAC_ASSERT(X)
Assertion macro for checking invariances.
Definition assertion.h:32
This class is used to instantiate a global singleton object Digits which behaves just like Maple's Di...
Definition numeric.h:51
_numeric_digits & operator=(long prec)
Assign a native long to global Digits object.
Definition numeric.cpp:2536
_numeric_digits()
_numeric_digits default ctor, checking for singleton invariance.
Definition numeric.cpp:2519
std::vector< digits_changed_callback > callbacklist
Definition numeric.h:64
void print(std::ostream &os) const
Append global Digits object to ostream.
Definition numeric.cpp:2560
static bool too_late
Already one object present.
Definition numeric.h:62
void add_callback(digits_changed_callback callback)
Add a new callback function.
Definition numeric.cpp:2567
long digits
Number of decimal digits.
Definition numeric.h:61
This class stores all properties needed to record/retrieve the state of one object of class basic (or...
Definition archive.h:48
This class is the ABC (abstract base class) of GiNaC's class hierarchy.
Definition basic.h:104
const basic & setflag(unsigned f) const
Set some status_flags.
Definition basic.h:287
unsigned hashvalue
hash value
Definition basic.h:302
unsigned flags
of type status_flags
Definition basic.h:301
const basic & hold() const
Stop further evaluation.
Definition basic.cpp:886
virtual int compare_same_type(const basic &other) const
Returns order relation between two objects of same type.
Definition basic.cpp:718
Wrapper template for making GiNaC classes out of STL containers.
Definition container.h:72
Exception class thrown by functions to signal unimplemented functionality so the expression may just ...
Definition utils.h:36
Lightweight wrapper for GiNaC's symbolic objects.
Definition ex.h:72
bool is_zero() const
Definition ex.h:213
bool sufficiently_accurate(int digits)
Definition numeric.cpp:1750
int get_order() const
Definition numeric.cpp:1736
cln::cl_N calc_lanczos_A(const cln::cl_N &) const
Definition numeric.cpp:1770
std::vector< cln::cl_N > * current_vector
Definition numeric.cpp:1745
static std::vector< cln::cl_N > * coeffs
Definition numeric.cpp:1743
This class is a wrapper around CLN-numbers within the GiNaC class hierarchy.
Definition numeric.h:81
void do_print(const print_context &c, unsigned level) const
Definition numeric.cpp:604
bool is_pos_integer() const
True if object is an exact integer greater than zero.
Definition numeric.cpp:1160
const numeric & operator=(int i)
Definition numeric.cpp:1015
void read_archive(const archive_node &n, lst &syms) override
Read (a.k.a.
Definition numeric.cpp:288
const numeric & sub_dyn(const numeric &other) const
Numerical subtraction method.
Definition numeric.cpp:941
unsigned calchash() const override
Compute the hash value of an object and if it makes sense to store it in the objects status_flags,...
Definition numeric.cpp:837
bool is_equal_same_type(const basic &other) const override
Returns true if two objects of same type are equal.
Definition numeric.cpp:828
const numeric sub(const numeric &other) const
Numerical subtraction method.
Definition numeric.cpp:871
const numeric & mul_dyn(const numeric &other) const
Numerical multiplication method.
Definition numeric.cpp:956
void do_print_csrc(const print_csrc &c, unsigned level) const
Definition numeric.cpp:614
bool is_cinteger() const
True if object is element of the domain of integers extended by I, i.e.
Definition numeric.cpp:1227
unsigned precedence() const override
Return relative operator precedence (for parenthezing output).
Definition numeric.h:100
numeric(int i)
Definition numeric.cpp:84
bool is_polynomial(const ex &var) const override
Check whether this is a polynomial in the given variables.
Definition numeric.cpp:727
numeric step() const
Return the step function of a numeric.
Definition numeric.cpp:1063
bool is_crational() const
True if object is an exact rational number, may even be complex (denominator may be unity).
Definition numeric.cpp:1242
ex imag_part() const override
Definition numeric.cpp:812
bool is_rational() const
True if object is an exact rational number, may even be complex (denominator may be unity).
Definition numeric.cpp:1200
bool operator>(const numeric &other) const
Numerical comparison: greater.
Definition numeric.cpp:1280
void archive(archive_node &n) const override
Save (a.k.a.
Definition numeric.cpp:343
bool info(unsigned inf) const override
Information about the object.
Definition numeric.cpp:683
ex real_part() const override
Definition numeric.cpp:807
int ldegree(const ex &s) const override
Return degree of lowest power in object s.
Definition numeric.cpp:737
const numeric real() const
Real part of a number.
Definition numeric.cpp:1338
ex eval() const override
Evaluation of numbers doesn't do anything at all.
Definition numeric.cpp:782
bool is_prime() const
Probabilistic primality test.
Definition numeric.cpp:1190
bool has(const ex &other, unsigned options=0) const override
Disassemble real part and imaginary part to scan for the occurrence of a single number.
Definition numeric.cpp:753
long to_long() const
Converts numeric types to machine's long.
Definition numeric.cpp:1312
void do_print_latex(const print_latex &c, unsigned level) const
Definition numeric.cpp:609
void do_print_tree(const print_tree &c, unsigned level) const
Definition numeric.cpp:668
ex coeff(const ex &s, int n=1) const override
Return coefficient of degree n in object s.
Definition numeric.cpp:742
const numeric & power_dyn(const numeric &other) const
Numerical exponentiation.
Definition numeric.cpp:992
void do_print_python_repr(const print_python_repr &c, unsigned level) const
Definition numeric.cpp:676
int compare(const numeric &other) const
This method establishes a canonical order on all numbers.
Definition numeric.cpp:1103
bool is_nonneg_integer() const
True if object is an exact integer greater or equal zero.
Definition numeric.cpp:1167
bool is_positive() const
True if object is not complex and greater than zero.
Definition numeric.cpp:1135
ex conjugate() const override
Definition numeric.cpp:799
bool is_real() const
True if object is a real integer, rational or float (but not complex).
Definition numeric.cpp:1207
const numeric numer() const
Numerator.
Definition numeric.cpp:1355
cln::cl_N value
Definition numeric.h:199
bool is_integer() const
True if object is a non-complex integer.
Definition numeric.cpp:1153
const numeric power(const numeric &other) const
Numerical exponentiation.
Definition numeric.cpp:899
ex evalf() const override
Cast numeric into a floating-point object.
Definition numeric.cpp:794
const numeric denom() const
Denominator.
Definition numeric.cpp:1386
bool is_negative() const
True if object is not complex and less than zero.
Definition numeric.cpp:1144
bool is_odd() const
True if object is an exact odd integer.
Definition numeric.cpp:1181
cln::cl_N to_cl_N() const
Returns a new CLN object of type cl_N, representing the value of *this.
Definition numeric.cpp:1331
const numeric imag() const
Imaginary part of a number.
Definition numeric.cpp:1345
const numeric mul(const numeric &other) const
Numerical multiplication method.
Definition numeric.cpp:879
bool is_even() const
True if object is an exact even integer.
Definition numeric.cpp:1174
const numeric & add_dyn(const numeric &other) const
Numerical addition method.
Definition numeric.cpp:924
int degree(const ex &s) const override
Return degree of highest power in object s.
Definition numeric.cpp:732
bool operator<=(const numeric &other) const
Numerical comparison: less or equal.
Definition numeric.cpp:1269
int csgn() const
Return the complex half-plane (left or right) in which the number lies.
Definition numeric.cpp:1077
bool operator==(const numeric &other) const
Definition numeric.cpp:1213
bool is_equal(const numeric &other) const
Definition numeric.cpp:1121
const numeric & div_dyn(const numeric &other) const
Numerical division method.
Definition numeric.cpp:975
bool operator>=(const numeric &other) const
Numerical comparison: greater or equal.
Definition numeric.cpp:1291
bool operator!=(const numeric &other) const
Definition numeric.cpp:1219
int to_int() const
Converts numeric types to machine's int.
Definition numeric.cpp:1302
int int_length() const
Size in binary notation.
Definition numeric.cpp:1417
void print_numeric(const print_context &c, const char *par_open, const char *par_close, const char *imag_sym, const char *mul_sym, unsigned level) const
Definition numeric.cpp:541
void do_print_csrc_cl_N(const print_csrc_cl_N &c, unsigned level) const
Definition numeric.cpp:650
double to_double() const
Converts numeric types to machine's double.
Definition numeric.cpp:1321
const numeric inverse() const
Inverse of a number.
Definition numeric.cpp:1052
bool operator<(const numeric &other) const
Numerical comparison: less.
Definition numeric.cpp:1258
const numeric add(const numeric &other) const
Numerical addition method.
Definition numeric.cpp:863
bool is_zero() const
True if object is zero.
Definition numeric.cpp:1128
const numeric div(const numeric &other) const
Numerical division method.
Definition numeric.cpp:889
Exception class thrown when a singularity is encountered.
Definition numeric.h:69
Base class for print_contexts.
Definition print.h:101
std::ostream & s
stream to output to
Definition print.h:107
Context for C source output using CLN numbers.
Definition print.h:180
Base context for C source output.
Definition print.h:156
Context for latex-parsable output.
Definition print.h:121
Context for python-parsable output.
Definition print.h:137
Context for tree-like output for debugging.
Definition print.h:145
@ expanded
.expand(0) has already done its job (other expand() options ignore this flag)
Definition flags.h:203
@ evaluated
.eval() has already done its job
Definition flags.h:202
@ hash_calculated
.calchash() has already done its job
Definition flags.h:204
Interface to GiNaC's light-weight expression handles.
static const bool value
Definition factor.cpp:198
unsigned options
Definition factor.cpp:2473
vector< int > k
Definition factor.cpp:1434
size_t n
Definition factor.cpp:1431
size_t c
Definition factor.cpp:756
ex x
Definition factor.cpp:1609
size_t r
Definition factor.cpp:756
mvec m
Definition factor.cpp:757
Definition add.cpp:35
const numeric I
Imaginary unit.
Definition numeric.cpp:1432
const numeric atan(const numeric &x)
Numeric arcustangent.
Definition numeric.cpp:1507
const numeric * _num_1_p
Definition utils.cpp:350
std::ostream & operator<<(std::ostream &os, const archive_node &n)
Write archive_node to binary data stream.
Definition archive.cpp:198
ex denom(const ex &thisex)
Definition ex.h:763
unsigned golden_ratio_hash(uintptr_t n)
Truncated multiplication with golden ratio, for computing hash values.
Definition utils.h:67
const numeric bernoulli(const numeric &nn)
Bernoulli number.
Definition numeric.cpp:2170
const numeric cosh(const numeric &x)
Numeric hyperbolic cosine (trigonometric function).
Definition numeric.cpp:1562
const numeric mod(const numeric &a, const numeric &b)
Modulus (in positive representation).
Definition numeric.cpp:2332
const numeric abs(const numeric &x)
Absolute value.
Definition numeric.cpp:2319
ex EulerEvalf()
Floating point evaluation of Euler's constant gamma.
Definition numeric.cpp:2505
static void print_real_csrc(const print_context &c, const cln::cl_R &x)
Helper function to print real number in C++ source format.
Definition numeric.cpp:439
const numeric asin(const numeric &x)
Numeric inverse sine (trigonometric function).
Definition numeric.cpp:1487
function zeta(const T1 &p1)
Definition inifcns.h:110
ex PiEvalf()
Floating point evaluation of Archimedes' constant Pi.
Definition numeric.cpp:2498
const numeric fibonacci(const numeric &n)
Fibonacci number.
Definition numeric.cpp:2262
const numeric doublefactorial(const numeric &n)
The double factorial combinatorial function.
Definition numeric.cpp:2126
const numeric tanh(const numeric &x)
Numeric hyperbolic tangent (trigonometric function).
Definition numeric.cpp:1571
const numeric Li2(const numeric &x)
Definition numeric.cpp:1704
const numeric acos(const numeric &x)
Numeric inverse cosine (trigonometric function).
Definition numeric.cpp:1496
ex gcd(const ex &a, const ex &b, ex *ca, ex *cb, bool check_args, unsigned options)
Compute GCD (Greatest Common Divisor) of multivariate polynomials a(X) and b(X) in Z[X].
Definition normal.cpp:1432
bool coerce< int, cln::cl_I >(int &dst, const cln::cl_I &arg)
Check if CLN integer can be converted into int.
Definition numeric.cpp:478
function psi(const T1 &p1)
Definition inifcns.h:164
const numeric sqrt(const numeric &x)
Numeric square root.
Definition numeric.cpp:2479
const numeric irem(const numeric &a, const numeric &b)
Numeric integer remainder.
Definition numeric.cpp:2367
const cln::cl_N tgamma(const cln::cl_N &x)
Definition numeric.cpp:2066
const numeric sinh(const numeric &x)
Numeric hyperbolic sine (trigonometric function).
Definition numeric.cpp:1553
void(* digits_changed_callback)(long)
Function pointer to implement callbacks in the case 'Digits' gets changed.
Definition numeric.h:39
static const cln::cl_F make_real_float(const cln::cl_idecoded_float &dec)
Construct a floating point number from sign, mantissa, and exponent.
Definition numeric.cpp:268
const numeric binomial(const numeric &n, const numeric &k)
The Binomial coefficients.
Definition numeric.cpp:2144
const numeric exp(const numeric &x)
Exponential function.
Definition numeric.cpp:1438
static cln::cl_N Li2_projection(const cln::cl_N &x, const cln::float_format_t &prec)
Folds Li2's argument inside a small rectangle to enhance convergence.
Definition numeric.cpp:1651
const numeric factorial(const numeric &n)
Factorial combinatorial function.
Definition numeric.cpp:2112
const numeric acosh(const numeric &x)
Numeric inverse hyperbolic cosine (trigonometric function).
Definition numeric.cpp:1589
const numeric cos(const numeric &x)
Numeric cosine (trigonometric function).
Definition numeric.cpp:1469
const numeric smod(const numeric &a_, const numeric &b_)
Modulus (in symmetric representation).
Definition numeric.cpp:2345
const numeric atanh(const numeric &x)
Numeric inverse hyperbolic tangent (trigonometric function).
Definition numeric.cpp:1598
print_func< print_context >(&varidx::do_print). print_func< print_latex >(&varidx
Definition idx.cpp:43
const cln::cl_N Li2_(const cln::cl_N &value)
Numeric evaluation of Dilogarithm.
Definition numeric.cpp:1678
ex lcm(const ex &a, const ex &b, bool check_args)
Compute LCM (Least Common Multiple) of multivariate polynomials in Z[X].
Definition normal.cpp:1774
const numeric iquo(const numeric &a, const numeric &b)
Numeric integer quotient.
Definition numeric.cpp:2408
const numeric isqrt(const numeric &x)
Integer numeric square root.
Definition numeric.cpp:2486
const numeric log(const numeric &x)
Natural logarithm.
Definition numeric.cpp:1449
static void print_integer_csrc(const print_context &c, const cln::cl_I &x)
Helper function to print integer number in C++ source format.
Definition numeric.cpp:425
_numeric_digits Digits
Accuracy in decimal digits.
Definition numeric.cpp:2590
const numeric sin(const numeric &x)
Numeric sine (trigonometric function).
Definition numeric.cpp:1460
static void print_real_number(const print_context &c, const cln::cl_R &x)
Helper function to print a real number in a nicer way than is CLN's default.
Definition numeric.cpp:396
static void print_real_cl_N(const print_context &c, const cln::cl_R &x)
Helper function to print real number in C++ source format using cl_N types.
Definition numeric.cpp:506
const numeric * _num1_p
Definition utils.cpp:383
static void write_real_float(std::ostream &s, const cln::cl_R &n)
Definition numeric.cpp:337
ex numer(const ex &thisex)
Definition ex.h:760
ex CatalanEvalf()
Floating point evaluation of Catalan's constant.
Definition numeric.cpp:2512
static cln::float_format_t guess_precision(const cln::cl_N &x)
Definition numeric.cpp:2023
const numeric asinh(const numeric &x)
Numeric inverse hyperbolic sine (trigonometric function).
Definition numeric.cpp:1580
const numeric tan(const numeric &x)
Numeric tangent (trigonometric function).
Definition numeric.cpp:1478
GINAC_IMPLEMENT_REGISTERED_CLASS_OPT_T(lst, basic, print_func< print_context >(&lst::do_print). print_func< print_tree >(&lst::do_print_tree)) template<> bool lst GINAC_BIND_UNARCHIVER(lst)
Specialization of container::info() for lst.
Definition lst.cpp:41
static const cln::cl_F read_real_float(std::istream &s)
Read serialized floating point number.
Definition numeric.cpp:280
static bool coerce(T1 &dst, const T2 &arg)
const cln::cl_N lgamma(const cln::cl_N &x)
The Gamma function.
Definition numeric.cpp:2038
bool coerce< unsigned int, cln::cl_I >(unsigned int &dst, const cln::cl_I &arg)
Definition numeric.cpp:492
const ex _ex0
Definition utils.cpp:368
static ex Li2_series(const ex &x, const relational &rel, int order, unsigned options)
Definition inifcns.cpp:717
const numeric * _num0_p
Definition utils.cpp:366
Makes the interface to the underlying bignum package available.
Interface to GiNaC's overloaded operators.
#define GINAC_IMPLEMENT_REGISTERED_CLASS_OPT(classname, supername, options)
Macro for inclusion in the implementation of each registered class.
Definition registrar.h:183
Interface to several small and furry utilities needed within GiNaC but not of any interest to the use...

This page is part of the GiNaC developer's reference. It was generated automatically by doxygen. For an introduction, see the tutorial.