61 {
62 if (is_a<const Integer>(*x.get_exp())) {
63 int i = numeric_cast<int>(
64 down_cast<const Integer &>(*x.get_exp()).as_int());
65 if (i > 0) {
66 dict
67 = pow_upoly(*P::from_container(gen, _basic_to_upoly<D, P>(
68 x.get_base(), gen)),
69 i)
70 ->get_poly();
71 return;
72 }
73 }
74
75 RCP<const Basic> genbase = gen, genpow = one, coef = one, tmp;
76 if (is_a<const Pow>(*gen)) {
77 genbase = down_cast<const Pow &>(*gen).get_base();
78 genpow = down_cast<const Pow &>(*gen).get_exp();
79 }
80
81 if (
eq(*genbase, *x.get_base())) {
82
83 set_basic expos;
84
85 if (is_a<const Add>(*x.get_exp())) {
86 RCP<const Add> addx = rcp_static_cast<const Add>(x.get_exp());
87 for (auto const &it : addx->get_dict())
88 expos.insert(
mul(it.first, it.second));
89 if (not addx->get_coef()->is_zero())
90 expos.insert(addx->get_coef());
91 } else {
92 expos.insert(x.get_exp());
93 }
94
95 int powr = 0;
96 for (auto const &it : expos) {
97 tmp =
div(it, genpow);
98 if (is_a<const Integer>(*tmp)) {
99 RCP<const Integer> i = rcp_static_cast<const Integer>(tmp);
100 if (i->is_positive()) {
101 powr = static_cast<int>(i->as_int());
102 continue;
103 }
104 }
105 coef =
mul(coef,
pow(genbase, it));
106 }
107 dict_set(powr, *coef);
108 } else {
109 this->bvisit((const Basic &)x);
110 }
111 }
RCP< const Basic > mul(const RCP< const Basic > &a, const RCP< const Basic > &b)
Multiplication.