static ex abs_power(const ex & arg, const ex & exp) { if ((is_a<numeric>(exp) && ex_to<numeric>(exp).is_even()) || exp.info(info_flags::even)) { if (arg.info(info_flags::real) || arg.is_equal(arg.conjugate())) return pow(arg, exp); else return pow(arg, exp/2) * pow(arg.conjugate(), exp/2); } else return power(abs(arg), exp).hold(); }
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(); }
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(); }
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(); }
static ex Li2_conjugate(const ex & x) { // conjugate(Li2(x))==Li2(conjugate(x)) unless on the branch cuts which // run along the positive real axis beginning at 1. if (x.info(info_flags::negative)) { return Li2(x).hold(); } if (is_exactly_a<numeric>(x) && (!x.imag_part().is_zero() || x < *_num1_p)) { return Li2(x.conjugate()); } return conjugate_function(Li2(x)).hold(); }
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(); }
static ex tan_conjugate(const ex & x) { // conjugate(tan(x))==tan(conjugate(x)) return tan(x.conjugate()); }
static ex cos_conjugate(const ex & x) { // conjugate(cos(x))==cos(conjugate(x)) return cos(x.conjugate()); }
static ex sin_conjugate(const ex & x) { // conjugate(sin(x))==sin(conjugate(x)) return sin(x.conjugate()); }
static ex exp_conjugate(const ex & x) { // conjugate(exp(x))==exp(conjugate(x)) return exp(x.conjugate()); }
static ex abs_expl_derivative(const ex & arg, const symbol & s) { ex diff_arg = arg.diff(s); return (diff_arg*arg.conjugate()+arg*diff_arg.conjugate())/2/abs(arg); }