2#include <symengine/symengine_exception.h>
7extern RCP<const Basic> i2;
8extern RCP<const Basic> i3;
9extern RCP<const Basic> i5;
10extern RCP<const Basic> im2;
11extern RCP<const Basic> im3;
12extern RCP<const Basic> im5;
14RCP<const Basic>
sqrt(RCP<const Basic> &
arg)
18RCP<const Basic>
cbrt(RCP<const Basic> &
arg)
23extern RCP<const Basic> sq3;
24extern RCP<const Basic> sq2;
25extern RCP<const Basic> sq5;
27extern RCP<const Basic> C0;
28extern RCP<const Basic> C1;
29extern RCP<const Basic> C2;
30extern RCP<const Basic> C3;
31extern RCP<const Basic> C4;
32extern RCP<const Basic> C5;
33extern RCP<const Basic> C6;
35extern RCP<const Basic> mC0;
36extern RCP<const Basic> mC1;
37extern RCP<const Basic> mC2;
38extern RCP<const Basic> mC3;
39extern RCP<const Basic> mC4;
40extern RCP<const Basic> mC5;
41extern RCP<const Basic> mC6;
44static const RCP<const Basic> *sin_table()
46 static const RCP<const Basic>
table[]
47 = {zero, C0, C1, C2, C3, C4, one, C4, C3, C2, C1, C0,
48 zero, mC0, mC1, mC2, mC3, mC4, minus_one, mC4, mC3, mC2, mC1, mC0};
52static const umap_basic_basic &inverse_cst()
71static const umap_basic_basic &inverse_tct()
74 {
div(one, sq3),
mul(i2, i3)},
75 {
div(minus_one, sq3),
mul(im2, i3)},
77 {
mul(minus_one, sq3), im3},
80 {
sub(sq2, one),
pow(i2, i3)},
81 {
sub(one, sq2),
pow(im2, i3)},
87 {minus_one,
mul(minus_one,
pow(i2, i2))},
94 SYMENGINE_ASSIGN_TYPEID()
101 if (
eq(*
arg, *ComplexInf)) {
163 for (
const auto &p : dict) {
165 Mul::dict_add_term_new(outArg(
coef),
new_dict, p.second,
168 Mul::dict_add_term_new(
204 const Ptr<RCP<const Basic>> &x)
209 auto size = s.get_dict().
size();
215 RCP<const Basic>
temp;
217 for (
const auto &p : s.get_dict()) {
218 if (
eq(*p.first, *pi)
224 *x =
add(
mul(p.first, p.second), *x);
231 }
else if (size == 1) {
234 auto p = s.get_dict().
begin();
235 if (
eq(*p->first, *pi)
250 auto p = s.get_dict().
begin();
252 if (s.get_dict().
size() == 1
and eq(*p->first, *pi)
253 and eq(*p->second, *one)
262 }
else if (
eq(*
arg, *pi)) {
266 }
else if (
eq(*
arg, *zero)) {
277bool trig_has_basic_shift(
const RCP<const Basic> &
arg)
281 for (
const auto &p : s.get_dict()) {
283 if (
eq(*p.first, *pi)) {
289 .as_rational_class();
290 return (m < 0)
or (m > 1);
302 auto p = s.get_dict().begin();
303 if (s.get_dict().size() == 1
and eq(*p->first, *pi)
304 and eq(*p->second, *one)) {
310 return (m < 0)
or (m > 1);
316 }
else if (
eq(*
arg, *pi)) {
318 }
else if (
eq(*
arg, *zero)) {
332 RCP<const Number> real_part =
c.real_part();
333 return (real_part->is_negative())
334 or (
eq(*real_part, *zero)
335 and c.imaginary_part()->is_negative());
355bool handle_minus(
const RCP<const Basic> &
arg,
356 const Ptr<RCP<const Basic>> &
rarg)
361 if (s.get_coef()->is_minus_one() && s.get_dict().size() == 1
362 &&
eq(*s.get_dict().begin()->second, *one)) {
371 umap_basic_num
d = s.get_dict();
373 p.second = p.second->mul(*minus_one);
387bool trig_simplify(
const RCP<const Basic> &
arg,
unsigned period,
bool odd,
389 const Ptr<RCP<const Basic>> &
rarg,
int &index,
410 bool b = handle_minus(
r, outArg(
ret_arg));
427#if SYMENGINE_INTEGER_CLASS != SYMENGINE_BOOSTMP
428 mp_fdiv_r(t, get_num(m), get_den(m));
432 mp_fdiv_qr(
quo, t, get_num(m), get_den(m));
433 m -= rational_class(
quo);
440 if (m >= 2
and m < 3) {
443 bool b = handle_minus(
r, outArg(
ret_arg));
458 bool b = handle_minus(
r, outArg(
ret_arg));
481 const Ptr<RCP<const Basic>> &index)
488 *index = (
it->second);
495 SYMENGINE_ASSIGN_TYPEID()
502 if (
eq(*
arg, *ComplexInf)) {
527RCP<const Basic>
sign(
const RCP<const Basic> &
arg)
550 return mul(minus_one, I);
573 SYMENGINE_ASSIGN_TYPEID()
625 return _arg->get_eval().floor(*
_arg);
634 if (
eq(*
arg, *GoldenRatio)) {
651 throw SymEngineException(
652 "Boolean objects not allowed in this context.");
667 SYMENGINE_ASSIGN_TYPEID()
719 return _arg->get_eval().ceiling(*
_arg);
728 if (
eq(*
arg, *GoldenRatio)) {
745 throw SymEngineException(
746 "Boolean objects not allowed in this context.");
761 SYMENGINE_ASSIGN_TYPEID()
813 return _arg->get_eval().truncate(*
_arg);
822 if (
eq(*
arg, *GoldenRatio)) {
839 throw SymEngineException(
840 "Boolean objects not allowed in this context.");
855 SYMENGINE_ASSIGN_TYPEID()
865 if (trig_has_basic_shift(
arg)) {
874RCP<const Basic>
sin(
const RCP<const Basic> &
arg)
923 SYMENGINE_ASSIGN_TYPEID()
933 if (trig_has_basic_shift(
arg)) {
942RCP<const Basic>
cos(
const RCP<const Basic> &
arg)
989 SYMENGINE_ASSIGN_TYPEID()
998 if (trig_has_basic_shift(
arg)) {
1007RCP<const Basic>
tan(
const RCP<const Basic> &
arg)
1009 if (
eq(*
arg, *zero))
1036 div(sin_table()[index], sin_table()[(index + 6) % 24]));
1055 SYMENGINE_ASSIGN_TYPEID()
1064 if (trig_has_basic_shift(
arg)) {
1073RCP<const Basic>
cot(
const RCP<const Basic> &
arg)
1100 div(sin_table()[(index + 6) % 24], sin_table()[index]));
1119 SYMENGINE_ASSIGN_TYPEID()
1129 if (trig_has_basic_shift(
arg)) {
1138RCP<const Basic>
csc(
const RCP<const Basic> &
arg)
1183 SYMENGINE_ASSIGN_TYPEID()
1193 if (trig_has_basic_shift(
arg)) {
1202RCP<const Basic>
sec(
const RCP<const Basic> &
arg)
1248 RCP<const Basic>
i_arg;
1253 return sqrt(
sub(one, pow(
i_arg, i2)));
1259 return sqrt(
sub(one, pow(
i_arg, im2)));
1267 return sqrt(
sub(one, pow(
i_arg, i2)));
1273 return sqrt(
sub(one, pow(
i_arg, im2)));
1312 return sqrt(
add(one, pow(
i_arg, i2)));
1318 return sqrt(
add(one, pow(
i_arg, im2)));
1342 SYMENGINE_ASSIGN_TYPEID()
1350 RCP<const Basic> index;
1362 if (
eq(*
arg, *zero))
1364 else if (
eq(*
arg, *one))
1366 else if (
eq(*
arg, *minus_one))
1367 return mul(minus_one,
div(pi, i2));
1373 RCP<const Basic> index;
1376 return div(pi, index);
1384 SYMENGINE_ASSIGN_TYPEID()
1392 RCP<const Basic> index;
1404 if (
eq(*
arg, *zero))
1406 else if (
eq(*
arg, *one))
1408 else if (
eq(*
arg, *minus_one))
1415 RCP<const Basic> index;
1418 return sub(
div(pi, i2),
div(pi, index));
1426 SYMENGINE_ASSIGN_TYPEID()
1434 RCP<const Basic> index;
1448 else if (
eq(*
arg, *minus_one))
1455 RCP<const Basic> index;
1458 return sub(
div(pi, i2),
div(pi, index));
1466 SYMENGINE_ASSIGN_TYPEID()
1474 RCP<const Basic> index;
1488 else if (
eq(*
arg, *minus_one))
1489 return div(pi, im2);
1495 RCP<const Basic> index;
1498 return div(pi, index);
1506 SYMENGINE_ASSIGN_TYPEID()
1514 RCP<const Basic> index;
1526 if (
eq(*
arg, *zero))
1528 else if (
eq(*
arg, *one))
1529 return div(pi,
mul(i2, i2));
1530 else if (
eq(*
arg, *minus_one))
1531 return mul(minus_one,
div(pi,
mul(i2, i2)));
1537 RCP<const Basic> index;
1540 return div(pi, index);
1548 SYMENGINE_ASSIGN_TYPEID()
1556 RCP<const Basic> index;
1568 if (
eq(*
arg, *zero))
1570 else if (
eq(*
arg, *one))
1571 return div(pi,
mul(i2, i2));
1572 else if (
eq(*
arg, *minus_one))
1579 RCP<const Basic> index;
1582 return sub(
div(pi, i2),
div(pi, index));
1591 SYMENGINE_ASSIGN_TYPEID()
1596 const RCP<const Basic> &
den)
const
1600 RCP<const Basic> index;
1609 const RCP<const Basic> &b)
const
1614RCP<const Basic>
atan2(
const RCP<const Basic> &
num,
const RCP<const Basic> &
den)
1616 if (
eq(*
num, *zero)) {
1621 else if (
den_new->is_positive())
1627 }
else if (
eq(*
den, *zero)) {
1631 return div(pi, im2);
1636 RCP<const Basic> index;
1653 return div(pi, index);
1654 }
else if (
den_new->is_negative()) {
1656 return sub(
div(pi, index), pi);
1658 return add(
div(pi, index), pi);
1661 return div(pi, index);
1664 return div(pi, index);
1737 SYMENGINE_ASSIGN_TYPEID()
1774RCP<const Basic>
log(
const RCP<const Basic> &
arg)
1776 if (
eq(*
arg, *zero))
1786 return _arg->get_eval().log(*
_arg);
1787 }
else if (
_arg->is_negative()) {
1801 if (
_arg->is_re_zero()) {
1802 RCP<const Number>
arg_img =
_arg->imaginary_part();
1806 }
else if (
arg_img->is_zero()) {
1808 }
else if (
arg_img->is_positive()) {
1817RCP<const Basic>
log(
const RCP<const Basic> &
arg,
const RCP<const Basic> &base)
1824 SYMENGINE_ASSIGN_TYPEID()
1830 if (
eq(*
arg, *zero))
1848 if (
eq(*
arg, *zero))
1855 return mul(minus_one,
log(i2));
1860 : MultiArgFunction({
arg}), name_{name} {SYMENGINE_ASSIGN_TYPEID()
1862 is_canonical(get_vec()))}
1867 SYMENGINE_ASSIGN_TYPEID()
1868 SYMENGINE_ASSERT(is_canonical(get_vec()))
1876hash_t FunctionSymbol::__hash__()
const
1878 hash_t seed = SYMENGINE_FUNCTIONSYMBOL;
1879 for (
const auto &a : get_vec())
1880 hash_combine<Basic>(seed, *a);
1881 hash_combine<std::string>(seed, name_);
1885bool FunctionSymbol::__eq__(
const Basic &o)
const
1887 if (is_a<FunctionSymbol>(o)
1888 and name_ == down_cast<const FunctionSymbol &>(o).name_
1889 and unified_eq(get_vec(),
1890 down_cast<const FunctionSymbol &>(o).get_vec()))
1895int FunctionSymbol::compare(
const Basic &o)
const
1897 SYMENGINE_ASSERT(is_a<FunctionSymbol>(o))
1899 if (name_ == s.name_)
1902 return name_ < s.name_ ? -1 : 1;
1905RCP<const Basic> FunctionSymbol::create(
const vec_basic &x)
const
1907 return make_rcp<const FunctionSymbol>(name_, x);
1912 return make_rcp<const FunctionSymbol>(name, arg);
1915RCP<const Basic> function_symbol(
std::string name,
const RCP<const Basic> &arg)
1917 return make_rcp<const FunctionSymbol>(name, arg);
1920FunctionWrapper::FunctionWrapper(
std::string name,
const RCP<const Basic> &arg)
1921 : FunctionSymbol(name, arg){SYMENGINE_ASSIGN_TYPEID()}
1923 FunctionWrapper::FunctionWrapper(
std::string name,
const vec_basic &vec)
1924 : FunctionSymbol(name, vec){SYMENGINE_ASSIGN_TYPEID()}
1928 Derivative::Derivative(
const RCP<const Basic> &arg,
1929 const multiset_basic &x)
1932 SYMENGINE_ASSIGN_TYPEID()
1933 SYMENGINE_ASSERT(is_canonical(
arg, x))
1937 const multiset_basic &x)
const
1940 for (
const auto &a : x)
1951 for (
const auto &a :
f->get_args()) {
1958 }
else if (
neq(*a->diff(s), *zero)) {
1975 auto v =
arg->get_args();
1985 auto v =
arg->get_args();
2002 for (
auto &p :
x_) {
2021 int cmp = arg_->__cmp__(*(s.arg_));
2030 : arg_{
arg}, dict_{dict}
2032 SYMENGINE_ASSIGN_TYPEID()
2033 SYMENGINE_ASSERT(is_canonical(
arg, dict))
2049 for (
const auto &p : dict_) {
2068 int cmp = arg_->__cmp__(*(s.arg_));
2078 for (
const auto &p : dict_) {
2084vec_basic Subs::get_point()
const
2087 for (
const auto &p : dict_) {
2096 for (
const auto &p : dict_) {
2099 for (
const auto &p : dict_) {
2107 SYMENGINE_ASSIGN_TYPEID()
2113 if (
eq(*
arg, *zero))
2129 if (
eq(*
arg, *zero))
2134 return _arg->get_eval().sinh(*
_arg);
2135 }
else if (
_arg->is_negative()) {
2140 bool b = handle_minus(
arg, outArg(
d));
2149 SYMENGINE_ASSIGN_TYPEID()
2155 if (
eq(*
arg, *zero))
2171 if (
eq(*
arg, *zero)) {
2177 return _arg->get_eval().csch(*
_arg);
2178 }
else if (
_arg->is_negative()) {
2183 bool b = handle_minus(
arg, outArg(
d));
2192 SYMENGINE_ASSIGN_TYPEID()
2198 if (
eq(*
arg, *zero))
2214 if (
eq(*
arg, *zero))
2219 return _arg->get_eval().cosh(*
_arg);
2220 }
else if (
_arg->is_negative()) {
2225 handle_minus(
arg, outArg(
d));
2231 SYMENGINE_ASSIGN_TYPEID()
2237 if (
eq(*
arg, *zero))
2253 if (
eq(*
arg, *zero))
2258 return _arg->get_eval().sech(*
_arg);
2259 }
else if (
_arg->is_negative()) {
2264 handle_minus(
arg, outArg(
d));
2270 SYMENGINE_ASSIGN_TYPEID()
2276 if (
eq(*
arg, *zero))
2292 if (
eq(*
arg, *zero))
2297 return _arg->get_eval().tanh(*
_arg);
2298 }
else if (
_arg->is_negative()) {
2304 bool b = handle_minus(
arg, outArg(
d));
2313 SYMENGINE_ASSIGN_TYPEID()
2319 if (
eq(*
arg, *zero))
2335 if (
eq(*
arg, *zero)) {
2341 return _arg->get_eval().coth(*
_arg);
2342 }
else if (
_arg->is_negative()) {
2347 bool b = handle_minus(
arg, outArg(
d));
2356 SYMENGINE_ASSIGN_TYPEID()
2378 if (
eq(*
arg, *zero))
2381 return log(
add(one, sq2));
2382 if (
eq(*
arg, *minus_one))
2383 return log(
sub(sq2, one));
2387 return _arg->get_eval().asinh(*
_arg);
2388 }
else if (
_arg->is_negative()) {
2393 bool b = handle_minus(
arg, outArg(
d));
2402 SYMENGINE_ASSIGN_TYPEID()
2425 return log(
add(one, sq2));
2426 if (
eq(*
arg, *minus_one))
2427 return log(
sub(sq2, one));
2432 return _arg->get_eval().acsch(*
_arg);
2437 bool b = handle_minus(
arg, outArg(
d));
2446 SYMENGINE_ASSIGN_TYPEID()
2474 SYMENGINE_ASSIGN_TYPEID()
2480 if (
eq(*
arg, *zero))
2496 if (
eq(*
arg, *zero))
2501 return _arg->get_eval().atanh(*
_arg);
2502 }
else if (
_arg->is_negative()) {
2507 bool b = handle_minus(
arg, outArg(
d));
2516 SYMENGINE_ASSIGN_TYPEID()
2539 return _arg->get_eval().acoth(*
_arg);
2540 }
else if (
_arg->is_negative()) {
2545 bool b = handle_minus(
arg, outArg(
d));
2554 SYMENGINE_ASSIGN_TYPEID()
2563 if (
eq(*
arg, *zero))
2576 if (
eq(*
arg, *zero))
2581 return _arg->get_eval().asech(*
_arg);
2648 const RCP<const Basic> &
j)
2651 SYMENGINE_ASSIGN_TYPEID()
2656 const RCP<const Basic> &
j)
const
2659 if (
eq(*diff, *zero)) {
2670 const RCP<const Basic> &b)
const
2676 const RCP<const Basic> &
j)
2680 if (
eq(*diff, *zero)) {
2690bool has_dup(
const vec_basic &
arg)
2694 for (
const auto &p :
arg) {
2696 if (
it ==
d.end()) {
2707 SYMENGINE_ASSIGN_TYPEID()
2714 for (
const auto &p :
arg) {
2722 }
else if (has_dup(
arg)) {
2737 RCP<const Basic>
res = one;
2738 for (i = 0; i <
len; i++) {
2739 for (
j = i + 1;
j <
len;
j++) {
2751 for (
const auto &p :
arg) {
2760 return eval_levicivita(
arg,
len);
2761 }
else if (has_dup(
arg)) {
2775 SYMENGINE_ASSIGN_TYPEID()
2780 const RCP<const Basic> &a)
const
2788 if (
s_ < 0 ||
s_ % 2 == 0)
2795 const RCP<const Basic> &b)
const
2800RCP<const Basic>
zeta(
const RCP<const Basic> &s,
const RCP<const Basic> &a)
2804 return sub(
div(one, i2), a);
2810 RCP<const Basic>
zeta;
2812 RCP<const Number>
res = (
s_ % 2 == 0) ? one : minus_one;
2815 }
else if (
s_ % 2 == 0) {
2831RCP<const Basic>
zeta(
const RCP<const Basic> &s)
2833 return zeta(s, one);
2838 SYMENGINE_ASSIGN_TYPEID()
2866 RCP<const Basic>
z =
zeta(s);
2870 return mul(
sub(one, pow(i2,
sub(one, s))),
z);
2891RCP<const Basic>
erf(
const RCP<const Basic> &
arg)
2899 return _arg->get_eval().erf(*
_arg);
2903 bool b = handle_minus(
arg, outArg(
d));
2935 return _arg->get_eval().erfc(*
_arg);
2940 bool b = handle_minus(
arg, outArg(
d));
2949 SYMENGINE_ASSIGN_TYPEID()
2973RCP<const Basic> gamma_positive_int(
const RCP<const Basic> &
arg)
2977 SYMENGINE_ASSERT(arg_->is_positive())
2985 SYMENGINE_ASSERT(get_den(arg_->as_rational_class()) == 2)
2989 *(
integer(get_den(arg_->as_rational_class()))));
2990 if (arg_->is_positive()) {
2994 n = n->addint(*one);
2996 if ((n->as_int() & 1) == 0) {
3003 for (
int i = 3; i < 2 * k->as_int(); i = i + 2) {
3007 if (arg_->is_positive()) {
3018 if (arg_->is_positive()) {
3019 return gamma_positive_int(
arg);
3025 if ((get_den(arg_->as_rational_class())) == 2) {
3026 return gamma_multiple_2(
arg);
3040 SYMENGINE_ASSIGN_TYPEID()
3045 const RCP<const Basic> &x)
const
3055#ifdef HAVE_SYMENGINE_MPFR
3056#if MPFR_VERSION_MAJOR > 3
3065 const RCP<const Basic> &b)
const
3071 const RCP<const Basic> &x)
3076 if (
s_int->is_one()) {
3077 return sub(one,
exp(
mul(minus_one, x)));
3078 }
else if (
s_int->as_integer_class() > 1) {
3089 return mul(sqrt(pi),
3091 }
else if (
s_num->is_positive()) {
3096 mul(pow(x, s),
exp(
mul(minus_one, x)))),
3099#ifdef HAVE_SYMENGINE_MPFR
3100#if MPFR_VERSION_MAJOR > 3
3123 SYMENGINE_ASSIGN_TYPEID()
3128 const RCP<const Basic> &x)
const
3138#ifdef HAVE_SYMENGINE_MPFR
3139#if MPFR_VERSION_MAJOR > 3
3148 const RCP<const Basic> &b)
const
3154 const RCP<const Basic> &x)
3159 if (
s_int->is_one()) {
3160 return exp(
mul(minus_one, x));
3161 }
else if (
s_int->as_integer_class() > 1) {
3173 return mul(sqrt(pi),
3175 }
else if (
s_num->is_positive()) {
3180 mul(pow(x, s),
exp(
mul(minus_one, x)))),
3183#ifdef HAVE_SYMENGINE_MPFR
3184#if MPFR_VERSION_MAJOR > 3
3216RCP<const Basic> LogGamma::rewrite_as_gamma()
const
3243 const RCP<const Basic> &
y)
3245 if (x->__cmp__(*
y) == -1) {
3253 if (x->__cmp__(*
y) == -1) {
3271RCP<const Basic> Beta::rewrite_as_gamma()
const
3278 const RCP<const Basic> &b)
const
3283RCP<const Basic>
beta(
const RCP<const Basic> &x,
const RCP<const Basic> &
y)
3286 if (
eq(*
add(x,
y), *one)) {
3292 if (
x_int->is_positive()) {
3295 if (
y_int->is_positive()) {
3297 mul(gamma_positive_int(x), gamma_positive_int(
y)),
3298 gamma_positive_int(
add(x,
y)));
3304 if (get_den(
y_->as_rational_class()) == 2) {
3305 return div(
mul(gamma_positive_int(x), gamma_multiple_2(
y)),
3306 gamma_multiple_2(
add(x,
y)));
3318 if (
y_int->is_positive()) {
3321 if (get_den(x_->as_rational_class()) == 2) {
3322 return div(
mul(gamma_positive_int(
y), gamma_multiple_2(x)),
3323 gamma_multiple_2(
add(x,
y)));
3337 if (
y_int->is_positive()) {
3338 return div(
mul(gamma_multiple_2(x), gamma_positive_int(
y)),
3339 gamma_multiple_2(
add(x,
y)));
3347 return div(
mul(gamma_multiple_2(x), gamma_multiple_2(
y)),
3348 gamma_positive_int(
add(x,
y)));
3354bool PolyGamma::is_canonical(
const RCP<const Basic> &n,
3355 const RCP<const Basic> &x)
3360 if (
eq(*n, *zero)) {
3366 auto den = get_den(x_->as_rational_class());
3375RCP<const Basic> PolyGamma::rewrite_as_zeta()
const
3378 return rcp_from_this();
3381 if (
not(n->is_positive())) {
3382 return rcp_from_this();
3384 if ((n->as_int() & 1) == 0) {
3392 const RCP<const Basic> &b)
const
3398 const RCP<const Basic> &x_)
3410 }
else if (n % 2 == 1) {
3414 if (
eq(*n_, *zero)) {
3415 if (
eq(*x_, *one)) {
3416 return neg(EulerGamma);
3420 const auto den = get_den(x->as_rational_class());
3421 const auto num = get_num(x->as_rational_class());
3422 const integer_class
r =
num %
den;
3423 RCP<const Basic>
res;
3426 }
else if (
den == 3) {
3434 }
else if (
den == 4) {
3443 rational_class a(0),
f(
r,
den);
3444 for (
unsigned long i = 0; i < (
num -
r) /
den; ++i) {
3453RCP<const Basic> digamma(
const RCP<const Basic> &x)
3458RCP<const Basic> trigamma(
const RCP<const Basic> &x)
3465 SYMENGINE_ASSIGN_TYPEID()
3492RCP<const Basic>
abs(
const RCP<const Basic> &
arg)
3496 if (arg_->is_negative()) {
3503 if (arg_->is_negative()) {
3511 + arg_->imaginary_ * arg_->imaginary_));
3521 handle_minus(
arg, outArg(
d));
3527 SYMENGINE_ASSIGN_TYPEID()
3538 for (
const auto &p :
arg) {
3561 for (
const auto &p :
arg) {
3563 throw SymEngineException(
"Complex can't be passed to max!");
3572 }
else if (
eq(*p, *NegInf)) {
3625 throw SymEngineException(
"Empty vec_basic passed to max!");
3631 SYMENGINE_ASSIGN_TYPEID()
3642 for (
const auto &p :
arg) {
3665 for (
const auto &p :
arg) {
3667 throw SymEngineException(
"Complex can't be passed to min!");
3676 }
else if (
eq(*p, *NegInf)) {
3729 throw SymEngineException(
"Empty vec_basic passed to min!");
3736 SYMENGINE_ASSIGN_TYPEID()
3750RCP<const Basic> unevaluated_expr(
const RCP<const Basic> &
arg)
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
ACos(const RCP< const Basic > &arg)
ACos Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
ACosh(const RCP< const Basic > &arg)
ACosh Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
ACot(const RCP< const Basic > &arg)
ACot Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
ACoth(const RCP< const Basic > &arg)
ACoth Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
ACsc(const RCP< const Basic > &arg)
ACsc Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
RCP< const Basic > create(const RCP< const Basic > &arg) const override
ACsch(const RCP< const Basic > &arg)
ACsch Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
ASec(const RCP< const Basic > &arg)
ASec Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
ASech(const RCP< const Basic > &arg)
ASech Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
ASin(const RCP< const Basic > &arg)
ASin Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
ASinh(const RCP< const Basic > &arg)
ASinh Constructor.
RCP< const Basic > create(const RCP< const Basic > &a, const RCP< const Basic > &b) const override
bool is_canonical(const RCP< const Basic > &num, const RCP< const Basic > &den) const
ATan2(const RCP< const Basic > &num, const RCP< const Basic > &den)
ATan2 Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
ATan(const RCP< const Basic > &arg)
ATan Constructor.
ATanh(const RCP< const Basic > &arg)
ATanh Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
Abs(const RCP< const Basic > &arg)
Abs Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
The base class for representing addition in symbolic expressions.
static RCP< const Basic > from_dict(const RCP< const Number > &coef, umap_basic_num &&d)
Create an appropriate instance from dictionary quickly.
const RCP< const Number > & get_coef() const
The lowest unit of symbolic representation.
static RCP< const Beta > from_two_basic(const RCP< const Basic > &x, const RCP< const Basic > &y)
return Beta with ordered arguments
RCP< const Basic > create(const RCP< const Basic > &a, const RCP< const Basic > &b) const override
bool is_canonical(const RCP< const Basic > &s, const RCP< const Basic > &x)
RCP< const Basic > create(const RCP< const Basic > &arg) const override
Ceiling(const RCP< const Basic > &arg)
Ceiling Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
ComplexBase Class for deriving all complex classes.
Conjugate(const RCP< const Basic > &arg)
Conjugate constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
Cos(const RCP< const Basic > &arg)
Cos Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
Cosh(const RCP< const Basic > &arg)
Cosh Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
Cot(const RCP< const Basic > &arg)
Cot Constructor.
Coth(const RCP< const Basic > &arg)
Coth Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
Csc(const RCP< const Basic > &arg)
Csc Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
Csch(const RCP< const Basic > &arg)
Csch Constructor.
hash_t __hash__() const override
bool __eq__(const Basic &o) const override
Test equality.
multiset_basic x_
The expression to be differentiated.
int compare(const Basic &o) const override
bool is_canonical(const RCP< const Basic > &s) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
Dirichlet_eta(const RCP< const Basic > &s)
Dirichlet_eta Constructor.
RCP< const Basic > rewrite_as_zeta() const
Rewrites in the form of zeta.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
Floor(const RCP< const Basic > &arg)
Floor Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
FunctionSymbol(std::string name, const vec_basic &arg)
FunctionSymbol Constructors.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
Gamma(const RCP< const Basic > &arg)
Gamma Constructor.
bool is_canonical(const RCP< const Basic > &i, const RCP< const Basic > &j) const
RCP< const Basic > create(const RCP< const Basic > &a, const RCP< const Basic > &b) const override
KroneckerDelta(const RCP< const Basic > &i, const RCP< const Basic > &j)
KroneckerDelta Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
LambertW(const RCP< const Basic > &arg)
LambertW Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
bool is_canonical(const vec_basic &arg) const
LeviCivita(const vec_basic &&arg)
LeviCivita Constructor.
RCP< const Basic > create(const vec_basic &arg) const override
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
bool is_canonical(const RCP< const Basic > &arg) const
Log(const RCP< const Basic > &arg)
Log Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
RCP< const Basic > create(const RCP< const Basic > &a, const RCP< const Basic > &b) const override
LowerGamma(const RCP< const Basic > &s, const RCP< const Basic > &x)
LowerGamma Constructor.
bool is_canonical(const RCP< const Basic > &s, const RCP< const Basic > &x) const
bool is_canonical(const vec_basic &arg) const
RCP< const Basic > create(const vec_basic &arg) const override
Max(const vec_basic &&arg)
Max Constructor.
bool is_canonical(const vec_basic &arg) const
Min(const vec_basic &&arg)
Min Constructor.
RCP< const Basic > create(const vec_basic &arg) const override
static RCP< const Basic > from_dict(const RCP< const Number > &coef, map_basic_basic &&d)
Create a Mul from a dict.
RCP< const Basic > get_arg() const
RCP< const Basic > create(const RCP< const Basic > &a, const RCP< const Basic > &b) const override
static RCP< const Number > from_mpq(const rational_class &i)
const rational_class & as_rational_class() const
Convert to rational_class.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
Sec(const RCP< const Basic > &arg)
Sec Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
Sech(const RCP< const Basic > &arg)
Sech Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
Sign(const RCP< const Basic > &arg)
Sign constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
Sin(const RCP< const Basic > &arg)
Sin Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
Sinh(const RCP< const Basic > &arg)
Sinh Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
vec_basic get_args() const override
Returns the list of arguments.
int compare(const Basic &o) const override
hash_t __hash__() const override
bool __eq__(const Basic &o) const override
Test equality.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
bool is_canonical(const RCP< const Basic > &arg) const
Tan(const RCP< const Basic > &arg)
Tan Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
Tanh(const RCP< const Basic > &arg)
Tanh Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
Truncate(const RCP< const Basic > &arg)
Truncate Constructor.
RCP< const Basic > create(const RCP< const Basic > &arg) const override
RCP< const Basic > get_arg2() const
RCP< const Basic > get_arg1() const
RCP< const Basic > create(const RCP< const Basic > &arg) const override
UnevaluatedExpr(const RCP< const Basic > &arg)
UnevaluatedExpr Constructor.
bool is_canonical(const RCP< const Basic > &arg) const
UpperGamma(const RCP< const Basic > &s, const RCP< const Basic > &x)
UpperGamma Constructor.
RCP< const Basic > create(const RCP< const Basic > &a, const RCP< const Basic > &b) const override
bool is_canonical(const RCP< const Basic > &s, const RCP< const Basic > &x) const
Zeta(const RCP< const Basic > &s, const RCP< const Basic > &a)
Zeta Constructor.
RCP< const Basic > create(const RCP< const Basic > &a, const RCP< const Basic > &b) const override
bool is_canonical(const RCP< const Basic > &s, const RCP< const Basic > &a) const
Main namespace for SymEngine package.
bool is_a_Number(const Basic &b)
RCP< const Basic > acos(const RCP< const Basic > &arg)
Canonicalize ACos:
RCP< const Basic > div(const RCP< const Basic > &a, const RCP< const Basic > &b)
Division.
RCP< const Basic > sec(const RCP< const Basic > &arg)
Canonicalize Sec:
RCP< const Basic > polygamma(const RCP< const Basic > &n_, const RCP< const Basic > &x_)
Canonicalize PolyGamma.
RCP< const Basic > beta(const RCP< const Basic > &x, const RCP< const Basic > &y)
Canonicalize Beta:
RCP< const Basic > zeta(const RCP< const Basic > &s, const RCP< const Basic > &a)
Create a new Zeta instance:
RCP< const Basic > max(const vec_basic &arg)
Canonicalize Max:
bool eq(const Basic &a, const Basic &b)
Checks equality for a and b
RCP< const Basic > coth(const RCP< const Basic > &arg)
Canonicalize Coth:
RCP< const Basic > sign(const RCP< const Basic > &arg)
Canonicalize Sign.
RCP< const Basic > atan2(const RCP< const Basic > &num, const RCP< const Basic > &den)
Canonicalize ATan2:
RCP< const Basic > ceiling(const RCP< const Basic > &arg)
Canonicalize Ceiling:
bool get_pi_shift(const RCP< const Basic > &arg, const Ptr< RCP< const Number > > &n, const Ptr< RCP< const Basic > > &x)
RCP< const Basic > abs(const RCP< const Basic > &arg)
Canonicalize Abs:
RCP< const Basic > acsc(const RCP< const Basic > &arg)
Canonicalize ACsc:
RCP< const Number > pownum(const RCP< const Number > &self, const RCP< const Number > &other)
Raise self to power other
RCP< const Integer > quotient_f(const Integer &n, const Integer &d)
void hash_combine(hash_t &seed, const T &v)
RCP< const Basic > sech(const RCP< const Basic > &arg)
Canonicalize Sech: