}
+static ex lgamma_conjugate(const ex & x)
+{
+ // conjugate(lgamma(x))==lgamma(conjugate(x)) unless on the branch cut
+ // which runs along the negative real axis.
+ if (x.info(info_flags::positive)) {
+ return lgamma(x);
+ }
+ if (is_exactly_a<numeric>(x) &&
+ !x.imag_part().is_zero()) {
+ return lgamma(x.conjugate());
+ }
+ return conjugate_function(lgamma(x)).hold();
+}
+
+
REGISTER_FUNCTION(lgamma, eval_func(lgamma_eval).
evalf_func(lgamma_evalf).
derivative_func(lgamma_deriv).
series_func(lgamma_series).
+ conjugate_func(lgamma_conjugate).
latex_name("\\log \\Gamma"));
}
+static ex tgamma_conjugate(const ex & x)
+{
+ // conjugate(tgamma(x))==tgamma(conjugate(x))
+ return tgamma(x.conjugate());
+}
+
+
REGISTER_FUNCTION(tgamma, eval_func(tgamma_eval).
evalf_func(tgamma_evalf).
derivative_func(tgamma_deriv).
series_func(tgamma_series).
+ conjugate_func(tgamma_conjugate).
latex_name("\\Gamma"));
derivative_func(beta_deriv).
series_func(beta_series).
latex_name("\\mathrm{B}").
- set_symmetry(sy_symm(0, 1)));
+ set_symmetry(sy_symm(0, 1)));
//////////
return exp(GiNaC::real_part(x))*sin(GiNaC::imag_part(x));
}
+static ex exp_conjugate(const ex & x)
+{
+ // conjugate(exp(x))==exp(conjugate(x))
+ return exp(x.conjugate());
+}
+
REGISTER_FUNCTION(exp, eval_func(exp_eval).
evalf_func(exp_evalf).
derivative_func(exp_deriv).
real_part_func(exp_real_part).
imag_part_func(exp_imag_part).
+ conjugate_func(exp_conjugate).
latex_name("\\exp"));
//////////
return atan2(GiNaC::imag_part(x), GiNaC::real_part(x));
}
+static ex log_conjugate(const ex & x)
+{
+ // conjugate(log(x))==log(conjugate(x)) unless on the branch cut which
+ // runs along the negative real axis.
+ if (x.info(info_flags::positive)) {
+ return log(x);
+ }
+ if (is_exactly_a<numeric>(x) &&
+ !x.imag_part().is_zero()) {
+ return log(x.conjugate());
+ }
+ return conjugate_function(log(x)).hold();
+}
+
REGISTER_FUNCTION(log, eval_func(log_eval).
evalf_func(log_evalf).
derivative_func(log_deriv).
series_func(log_series).
real_part_func(log_real_part).
imag_part_func(log_imag_part).
+ conjugate_func(log_conjugate).
latex_name("\\ln"));
//////////
return sinh(GiNaC::imag_part(x))*cos(GiNaC::real_part(x));
}
+static ex sin_conjugate(const ex & x)
+{
+ // conjugate(sin(x))==sin(conjugate(x))
+ return sin(x.conjugate());
+}
+
REGISTER_FUNCTION(sin, eval_func(sin_eval).
evalf_func(sin_evalf).
derivative_func(sin_deriv).
real_part_func(sin_real_part).
imag_part_func(sin_imag_part).
+ conjugate_func(sin_conjugate).
latex_name("\\sin"));
//////////
return -sinh(GiNaC::imag_part(x))*sin(GiNaC::real_part(x));
}
+static ex cos_conjugate(const ex & x)
+{
+ // conjugate(cos(x))==cos(conjugate(x))
+ return cos(x.conjugate());
+}
+
REGISTER_FUNCTION(cos, eval_func(cos_eval).
evalf_func(cos_evalf).
derivative_func(cos_deriv).
real_part_func(cos_real_part).
imag_part_func(cos_imag_part).
+ conjugate_func(cos_conjugate).
latex_name("\\cos"));
//////////
return (sin(x)/cos(x)).series(rel, order, options);
}
+static ex tan_conjugate(const ex & x)
+{
+ // conjugate(tan(x))==tan(conjugate(x))
+ return tan(x.conjugate());
+}
+
REGISTER_FUNCTION(tan, eval_func(tan_eval).
evalf_func(tan_evalf).
derivative_func(tan_deriv).
series_func(tan_series).
real_part_func(tan_real_part).
imag_part_func(tan_imag_part).
+ conjugate_func(tan_conjugate).
latex_name("\\tan"));
//////////
return power(1-power(x,_ex2),_ex_1_2);
}
+static ex asin_conjugate(const ex & x)
+{
+ // conjugate(asin(x))==asin(conjugate(x)) unless on the branch cuts which
+ // run along the real axis outside the interval [-1, +1].
+ if (is_exactly_a<numeric>(x) &&
+ (!x.imag_part().is_zero() || (x > *_num_1_p && x < *_num1_p))) {
+ return asin(x.conjugate());
+ }
+ return conjugate_function(asin(x)).hold();
+}
+
REGISTER_FUNCTION(asin, eval_func(asin_eval).
evalf_func(asin_evalf).
derivative_func(asin_deriv).
+ conjugate_func(asin_conjugate).
latex_name("\\arcsin"));
//////////
return -power(1-power(x,_ex2),_ex_1_2);
}
+static ex acos_conjugate(const ex & x)
+{
+ // conjugate(acos(x))==acos(conjugate(x)) unless on the branch cuts which
+ // run along the real axis outside the interval [-1, +1].
+ if (is_exactly_a<numeric>(x) &&
+ (!x.imag_part().is_zero() || (x > *_num_1_p && x < *_num1_p))) {
+ return acos(x.conjugate());
+ }
+ return conjugate_function(acos(x)).hold();
+}
+
REGISTER_FUNCTION(acos, eval_func(acos_eval).
evalf_func(acos_evalf).
derivative_func(acos_deriv).
+ conjugate_func(acos_conjugate).
latex_name("\\arccos"));
//////////
throw do_taylor();
}
+static ex atan_conjugate(const ex & x)
+{
+ // conjugate(atan(x))==atan(conjugate(x)) unless on the branch cuts which
+ // run along the imaginary axis outside the interval [-I, +I].
+ if (x.info(info_flags::real))
+ return atan(x);
+ if (is_exactly_a<numeric>(x)) {
+ const numeric x_re = ex_to<numeric>(x.real_part());
+ const numeric x_im = ex_to<numeric>(x.imag_part());
+ if (!x_re.is_zero() ||
+ (x_im > *_num_1_p && x_im < *_num1_p))
+ return atan(x.conjugate());
+ }
+ return conjugate_function(atan(x)).hold();
+}
+
REGISTER_FUNCTION(atan, eval_func(atan_eval).
evalf_func(atan_evalf).
derivative_func(atan_deriv).
series_func(atan_series).
+ conjugate_func(atan_conjugate).
latex_name("\\arctan"));
//////////
return power(_ex1+power(x,_ex2),_ex_1_2);
}
+static ex asinh_conjugate(const ex & x)
+{
+ // conjugate(asinh(x))==asinh(conjugate(x)) unless on the branch cuts which
+ // run along the imaginary axis outside the interval [-I, +I].
+ if (x.info(info_flags::real))
+ return asinh(x);
+ if (is_exactly_a<numeric>(x)) {
+ const numeric x_re = ex_to<numeric>(x.real_part());
+ const numeric x_im = ex_to<numeric>(x.imag_part());
+ if (!x_re.is_zero() ||
+ (x_im > *_num_1_p && x_im < *_num1_p))
+ return asinh(x.conjugate());
+ }
+ return conjugate_function(asinh(x)).hold();
+}
+
REGISTER_FUNCTION(asinh, eval_func(asinh_eval).
evalf_func(asinh_evalf).
- derivative_func(asinh_deriv));
+ derivative_func(asinh_deriv).
+ conjugate_func(asinh_conjugate));
//////////
// inverse hyperbolic cosine (trigonometric function)
return power(x+_ex_1,_ex_1_2)*power(x+_ex1,_ex_1_2);
}
+static ex acosh_conjugate(const ex & x)
+{
+ // conjugate(acosh(x))==acosh(conjugate(x)) unless on the branch cut
+ // which runs along the real axis from +1 to -inf.
+ if (is_exactly_a<numeric>(x) &&
+ (!x.imag_part().is_zero() || x > *_num1_p)) {
+ return acosh(x.conjugate());
+ }
+ return conjugate_function(acosh(x)).hold();
+}
+
REGISTER_FUNCTION(acosh, eval_func(acosh_eval).
evalf_func(acosh_evalf).
- derivative_func(acosh_deriv));
+ derivative_func(acosh_deriv).
+ conjugate_func(acosh_conjugate));
//////////
// inverse hyperbolic tangent (trigonometric function)
throw do_taylor();
}
+static ex atanh_conjugate(const ex & x)
+{
+ // conjugate(atanh(x))==atanh(conjugate(x)) unless on the branch cuts which
+ // run along the real axis outside the interval [-1, +1].
+ if (is_exactly_a<numeric>(x) &&
+ (!x.imag_part().is_zero() || (x > *_num_1_p && x < *_num1_p))) {
+ return atanh(x.conjugate());
+ }
+ return conjugate_function(atanh(x)).hold();
+}
+
REGISTER_FUNCTION(atanh, eval_func(atanh_eval).
evalf_func(atanh_evalf).
derivative_func(atanh_deriv).
- series_func(atanh_series));
+ series_func(atanh_series).
+ conjugate_func(atanh_conjugate));
} // namespace GiNaC