1 #include <symengine/series_visitor.h>
6 URatPSeriesPiranha::URatPSeriesPiranha(pp_t p,
const std::string varname,
8 : SeriesBase(
std::
move(p), varname, degree){SYMENGINE_ASSIGN_TYPEID()} RCP<
9 const URatPSeriesPiranha> URatPSeriesPiranha::
10 series(
const RCP<const Basic> &t,
const std::string &x,
13 SeriesVisitor<pp_t, piranha::rational, URatPSeriesPiranha> visitor(pp_t(x),
15 return visitor.series(t);
18 hash_t URatPSeriesPiranha::__hash__()
const
20 hash_t seed = SYMENGINE_URATPSERIESPIRANHA;
27 int URatPSeriesPiranha::compare(
const Basic &o)
const
29 SYMENGINE_ASSERT(is_a<URatPSeriesPiranha>(o))
30 const URatPSeriesPiranha &s = down_cast<const URatPSeriesPiranha &>(o);
32 return (var_ < s.var_) ? -1 : 1;
33 if (degree_ != s.degree_)
34 return (degree_ < s.degree_) ? -1 : 1;
37 return (p_.hash() < s.p_.hash()) ? -1 : 1;
61 return convert(x.as_rational_class());
66 throw NotImplementedError(
"Not Implemented");
69 RCP<const Basic> URatPSeriesPiranha::as_basic()
const
71 RCP<const Symbol> x =
symbol(var_);
72 RCP<const Number> zcoef =
integer(0);
74 for (
const auto &it : p_) {
76 rational_class cl_rat(it.first.get_mpq_view());
78 RCP<const Number> co_basic = Rational::from_mpq(
std::move(cl_rat));
82 if (it.second.degree() == 0)
84 Add::coef_dict_add_term(outArg(co_basic), dict_, one, term);
87 return Add::from_dict(zcoef,
std::move(dict_));
90 umap_int_basic URatPSeriesPiranha::as_dict()
const
93 for (
const auto &it : p_) {
95 rational_class cl_rat(it.first.get_mpq_view());
96 RCP<const Basic> basic = Rational::from_mpq(
std::move(cl_rat));
97 map[it.second.degree()] = basic;
103 RCP<const Basic> URatPSeriesPiranha::get_coeff(
int i)
const
105 rational_class cl_rat(p_.find_cf({i}).get_mpq_view());
106 return Rational::from_mpq(
std::move(cl_rat));
109 pp_t URatPSeriesPiranha::mul(
const pp_t &s,
const pp_t &r,
unsigned prec)
111 pp_t::set_auto_truncate_degree(prec - 1);
113 pp_t::unset_auto_truncate_degree();
117 pp_t URatPSeriesPiranha::pow(
const pp_t &s,
int n,
unsigned prec)
119 pp_t::set_auto_truncate_degree(prec - 1);
120 pp_t::clear_pow_cache();
122 pp_t::unset_auto_truncate_degree();
126 unsigned URatPSeriesPiranha::ldegree(
const pp_t &s)
134 return s.find_cf({deg});
139 rational_class cl_rat(c.get_mpq_view());
141 if (get_den(cl_rat) == 1) {
143 rational_class cl_root;
144 res = mp_root(get_num(cl_root), get_num(cl_rat), n);
146 throw SymEngineException(
"constant term is not an nth power");
147 return convert(cl_root);
149 RCP<const Rational> cterm = make_rcp<const Rational>(
std::move(cl_rat));
150 RCP<const Number> cout;
151 res = cterm->nth_root(outArg(cout), n);
153 throw SymEngineException(
"constant term is not an nth power");
154 return convert(down_cast<const Rational &>(*cout).as_rational_class());
158 pp_t URatPSeriesPiranha::diff(
const pp_t &s,
const pp_t &var)
160 return s.partial(var.get_symbol_set()[0].get_name());
163 pp_t URatPSeriesPiranha::integrate(
const pp_t &s,
const pp_t &var)
165 return s.integrate(var.get_symbol_set()[0].get_name());
168 pp_t URatPSeriesPiranha::subs(
const pp_t &s,
const pp_t &var,
const pp_t &r,
171 pp_t::set_auto_truncate_degree(prec - 1);
172 pp_t ret = s.subs(var.get_symbol_set()[0].get_name(), r);
173 pp_t::unset_auto_truncate_degree();
177 UPSeriesPiranha::UPSeriesPiranha(p_expr p,
const std::string varname,
178 const unsigned degree)
179 : SeriesBase(
std::
move(p), varname, degree){SYMENGINE_ASSIGN_TYPEID()}
181 RCP<const UPSeriesPiranha> UPSeriesPiranha::series(
182 const RCP<const Basic> &t,
const std::string &x,
unsigned int prec)
184 SeriesVisitor<p_expr, Expression, UPSeriesPiranha> visitor(p_expr(x), x,
186 return visitor.series(t);
189 hash_t UPSeriesPiranha::__hash__()
const
191 hash_t seed = SYMENGINE_URATPSERIESPIRANHA;
198 int UPSeriesPiranha::compare(
const Basic &o)
const
200 SYMENGINE_ASSERT(is_a<UPSeriesPiranha>(o))
201 const UPSeriesPiranha &s = down_cast<const UPSeriesPiranha &>(o);
203 return (var_ < s.var_) ? -1 : 1;
204 if (degree_ != s.degree_)
205 return (degree_ < s.degree_) ? -1 : 1;
208 return (p_.hash() < s.p_.hash()) ? -1 : 1;
216 Expression UPSeriesPiranha::convert(
const Basic &x)
218 return Expression(x.rcp_from_this());
221 RCP<const Basic> UPSeriesPiranha::as_basic()
const
223 RCP<const Symbol> x =
symbol(var_);
224 umap_basic_num dict_;
225 for (
const auto &it : p_) {
228 it.first.get_basic(),
230 RCP<const Number> coef;
232 Add::coef_dict_add_term(outArg(coef), dict_, one, term);
235 return Add::from_dict(one,
std::move(dict_));
238 umap_int_basic UPSeriesPiranha::as_dict()
const
241 for (
const auto &it : p_) {
243 map[it.second.degree()] = it.first.get_basic();
249 RCP<const Basic> UPSeriesPiranha::get_coeff(
int i)
const
251 return p_.find_cf({i}).get_basic();
254 p_expr UPSeriesPiranha::mul(
const p_expr &s,
const p_expr &r,
unsigned prec)
256 p_expr::set_auto_truncate_degree(prec - 1);
258 p_expr::unset_auto_truncate_degree();
262 p_expr UPSeriesPiranha::pow(
const p_expr &s,
int n,
unsigned prec)
264 p_expr::set_auto_truncate_degree(prec - 1);
265 p_expr::clear_pow_cache();
266 p_expr ret = s.pow(n);
267 p_expr::unset_auto_truncate_degree();
271 unsigned UPSeriesPiranha::ldegree(
const p_expr &s)
276 Expression UPSeriesPiranha::find_cf(
const p_expr &s,
const p_expr &var,
279 return s.find_cf({deg});
282 Expression UPSeriesPiranha::root(Expression &c,
unsigned n)
284 return SymEngine::pow(c, 1 / Expression(n));
287 p_expr UPSeriesPiranha::diff(
const p_expr &s,
const p_expr &var)
289 return s.partial(var.get_symbol_set()[0].get_name());
292 p_expr UPSeriesPiranha::integrate(
const p_expr &s,
const p_expr &var)
294 return s.integrate(var.get_symbol_set()[0].get_name());
297 p_expr UPSeriesPiranha::subs(
const p_expr &s,
const p_expr &var,
298 const p_expr &r,
unsigned prec)
300 p_expr::set_auto_truncate_degree(prec - 1);
301 p_expr ret = s.subs(var.get_symbol_set()[0].get_name(), r);
302 p_expr::unset_auto_truncate_degree();
306 Expression UPSeriesPiranha::sin(
const Expression &c)
311 Expression UPSeriesPiranha::cos(
const Expression &c)
316 Expression UPSeriesPiranha::tan(
const Expression &c)
321 Expression UPSeriesPiranha::asin(
const Expression &c)
326 Expression UPSeriesPiranha::acos(
const Expression &c)
331 Expression UPSeriesPiranha::atan(
const Expression &c)
336 Expression UPSeriesPiranha::sinh(
const Expression &c)
341 Expression UPSeriesPiranha::cosh(
const Expression &c)
346 Expression UPSeriesPiranha::tanh(
const Expression &c)
351 Expression UPSeriesPiranha::asinh(
const Expression &c)
356 Expression UPSeriesPiranha::atanh(
const Expression &c)
361 Expression UPSeriesPiranha::exp(
const Expression &c)
366 Expression UPSeriesPiranha::log(
const Expression &c)
Main namespace for SymEngine package.
RCP< const Basic > acos(const RCP< const Basic > &arg)
Canonicalize ACos:
std::enable_if< std::is_integral< T >::value, RCP< const Integer > >::type integer(T i)
RCP< const Symbol > symbol(const std::string &name)
inline version to return Symbol
void hash_combine(hash_t &seed, const T &v)
RCP< const Basic > exp(const RCP< const Basic > &x)
Returns the natural exponential function E**x = pow(E, x)
RCP< const Basic > asin(const RCP< const Basic > &arg)
Canonicalize ASin:
RCP< const Basic > tan(const RCP< const Basic > &arg)
Canonicalize Tan:
RCP< const Basic > cosh(const RCP< const Basic > &arg)
Canonicalize Cosh:
RCP< const Basic > atan(const RCP< const Basic > &arg)
Canonicalize ATan:
RCP< const Basic > asinh(const RCP< const Basic > &arg)
Canonicalize ASinh:
RCP< const Basic > tanh(const RCP< const Basic > &arg)
Canonicalize Tanh:
RCP< const Basic > mul(const RCP< const Basic > &a, const RCP< const Basic > &b)
Multiplication.
RCP< const Basic > atanh(const RCP< const Basic > &arg)
Canonicalize ATanh:
RCP< const Basic > cos(const RCP< const Basic > &arg)
Canonicalize Cos:
RCP< const Basic > log(const RCP< const Basic > &arg)
Returns the Natural Logarithm from argument arg
RCP< const Number > rational(long n, long d)
convenience creator from two longs
RCP< const Basic > sinh(const RCP< const Basic > &arg)
Canonicalize Sinh:
RCP< const Basic > sin(const RCP< const Basic > &arg)
Canonicalize Sin: