80 {
81
82 if (is_a<Add>(*a) && is_a<Add>(*b)) {
83 iaddnum(outArg(coeff),
84 _mulnum(multiply,
85 _mulnum(down_cast<const Add &>(*a).get_coef(),
86 down_cast<const Add &>(*b).get_coef())));
87
88#if defined(HAVE_SYMENGINE_RESERVE)
90 + (down_cast<const Add &>(*a)).get_dict().size()
91 * (down_cast<const Add &>(*b)).get_dict().size());
92#endif
93
94 for (auto &p : (down_cast<const Add &>(*a)).get_dict()) {
95 RCP<const Number> temp = _mulnum(p.second, multiply);
96 for (auto &q : (down_cast<const Add &>(*b)).get_dict()) {
97
98
99 RCP<const Basic> term =
mul(p.first, q.first);
101 iaddnum(outArg(coeff),
102 _mulnum(_mulnum(temp, q.second),
103 rcp_static_cast<const Number>(term)));
104 } else {
105 if (is_a<Mul>(*term)
106 && !(down_cast<const Mul &>(*term)
107 .get_coef()
108 ->is_one())) {
109
110 RCP<const Number> coef2
111 = down_cast<const Mul &>(*term).get_coef();
112
113 map_basic_basic d2
114 = down_cast<const Mul &>(*term).get_dict();
117 d_, _mulnum(_mulnum(temp, q.second), coef2),
118 term);
119 } else {
121 term);
122 }
123 }
124 }
126 d_, _mulnum(down_cast<const Add &>(*b).get_coef(), temp),
127 p.first);
128 }
129
130 RCP<const Number> temp
131 = _mulnum(down_cast<const Add &>(*a).get_coef(), multiply);
132 for (auto &q : (down_cast<const Add &>(*b)).get_dict()) {
134 }
135 return;
136 } else if (is_a<Add>(*a)) {
137 mul_expand_two(b, a);
138 return;
139 } else if (is_a<Add>(*b)) {
140 RCP<const Number> a_coef;
141 RCP<const Basic> a_term;
143 _imulnum(outArg(a_coef), multiply);
144
145#if defined(HAVE_SYMENGINE_RESERVE)
147 + (down_cast<const Add &>(*b)).get_dict().size());
148#endif
149 for (auto &q : (down_cast<const Add &>(*b)).get_dict()) {
150 RCP<const Basic> term =
mul(a_term, q.first);
152 iaddnum(outArg(coeff),
153 _mulnum(_mulnum(q.second, a_coef),
154 rcp_static_cast<const Number>(term)));
155 } else {
156 if (is_a<Mul>(*term)
157 && !(down_cast<const Mul &>(*term)
158 .get_coef()
159 ->is_one())) {
160
161 RCP<const Number> coef2
162 = down_cast<const Mul &>(*term).get_coef();
163
164 map_basic_basic d2
165 = down_cast<const Mul &>(*term).get_dict();
168 d_, _mulnum(_mulnum(q.second, a_coef), coef2),
169 term);
170 } else {
171
173 }
174 }
175 }
176 if (
eq(*a_term, *one)) {
177 iaddnum(outArg(coeff),
178 _mulnum(down_cast<const Add &>(*b).get_coef(), a_coef));
179 } else {
181 d_, _mulnum(down_cast<const Add &>(*b).get_coef(), a_coef),
182 a_term);
183 }
184 return;
185 }
186 _coef_dict_add_term(multiply,
mul(a, b));
187 }
static RCP< const Basic > from_dict(const RCP< const Number > &coef, map_basic_basic &&d)
Create a Mul from a dict.
bool eq(const Basic &a, const Basic &b)
Checks equality for a and b
RCP< const Basic > mul(const RCP< const Basic > &a, const RCP< const Basic > &b)
Multiplication.