81 {
82 RCP<const Number> coef = one;
83 map_basic_basic d;
84 for (const auto &p : x.get_dict()) {
85 RCP<const Basic> factor_old;
86 if (
eq(*p.second, *one)) {
87 factor_old = p.first;
88 } else {
89 factor_old = make_rcp<Pow>(p.first, p.second);
90 }
91 RCP<const Basic>
factor = apply(factor_old);
92 if (
factor == factor_old) {
93
94 Mul::dict_add_term_new(outArg(coef), d, p.second, p.first);
96 imulnum(outArg(coef), rcp_static_cast<const Number>(
factor));
97 }
else if (is_a<Mul>(*
factor)) {
98 RCP<const Mul> tmp = rcp_static_cast<const Mul>(
factor);
99 imulnum(outArg(coef), tmp->get_coef());
100 for (const auto &q : tmp->get_dict()) {
101 Mul::dict_add_term_new(outArg(coef), d, q.second, q.first);
102 }
103 } else {
104 RCP<const Basic>
exp, t;
106 Mul::dict_add_term_new(outArg(coef), d,
exp, t);
107 }
108 }
109
110
111 RCP<const Basic>
factor = apply(x.get_coef());
113 imulnum(outArg(coef), rcp_static_cast<const Number>(
factor));
114 }
else if (is_a<Mul>(*
factor)) {
115 RCP<const Mul> tmp = rcp_static_cast<const Mul>(
factor);
116 imulnum(outArg(coef), tmp->get_coef());
117 for (const auto &q : tmp->get_dict()) {
118 Mul::dict_add_term_new(outArg(coef), d, q.second, q.first);
119 }
120 } else {
121 RCP<const Basic>
exp, t;
123 Mul::dict_add_term_new(outArg(coef), d,
exp, t);
124 }
126 }
static void as_base_exp(const RCP< const Basic > &self, const Ptr< RCP< const Basic > > &exp, const Ptr< RCP< const Basic > > &base)
Convert to a base and exponent form.
static RCP< const Basic > from_dict(const RCP< const Number > &coef, map_basic_basic &&d)
Create a Mul from a dict.
bool is_a_Number(const Basic &b)
bool eq(const Basic &a, const Basic &b)
Checks equality for a and b
RCP< const Basic > exp(const RCP< const Basic > &x)
Returns the natural exponential function E**x = pow(E, x)
int factor(const Ptr< RCP< const Integer > > &f, const Integer &n, double B1)