1 #ifndef SYMENGINE_CANCEL_H
2 #define SYMENGINE_CANCEL_H
3
4 #include <symengine/basic.h>
5 #include <symengine/polys/basic_conversions.h>
6
7 namespace SymEngine
8 {
9 // Declaration of cancel function
10 template <typename Poly>
cancel(const RCP<const Basic> & numer,const RCP<const Basic> & denom,const Ptr<RCP<const Poly>> & result_numer,const Ptr<RCP<const Poly>> & result_denom,const Ptr<RCP<const Poly>> & common)11 inline void cancel(const RCP<const Basic> &numer, const RCP<const Basic> &denom,
12 const Ptr<RCP<const Poly>> &result_numer,
13 const Ptr<RCP<const Poly>> &result_denom,
14 const Ptr<RCP<const Poly>> &common)
15 {
16 // Converting basic to Poly
17 umap_basic_num numer_gens = _find_gens_poly(numer);
18 umap_basic_num denom_gens = _find_gens_poly(denom);
19
20 if (numer_gens.size() != 1 && denom_gens.size() != 1) {
21 // only considering univariate here
22 return;
23 }
24 RCP<const Basic> numer_var = numer_gens.begin()->first;
25 RCP<const Basic> denom_var = denom_gens.begin()->first;
26
27 RCP<const Poly> numer_poly = from_basic<Poly>(numer, numer_var);
28 RCP<const Poly> denom_poly = from_basic<Poly>(denom, denom_var);
29
30 // Finding common factors of numer_poly and denom_poly
31 RCP<const Poly> gcd_poly = gcd_upoly(*numer_poly, *denom_poly);
32
33 // Dividing both by common factors
34 divides_upoly(*gcd_poly, *numer_poly, outArg(*result_numer));
35 divides_upoly(*gcd_poly, *denom_poly, outArg(*result_denom));
36 *common = gcd_poly;
37 }
38 } // namespace SymEngine
39 #endif // SYMENGINE_CANCEL_H
40