50 {
51
52 RCP<const Basic> curr_num = zero;
53 RCP<const Basic> curr_den = one;
54 RCP<const Basic> arg_num, arg_den, den_mul, divx;
55 RCP<const Basic> divx_num, divx_den;
56
57 for (const auto &arg : x.get_args()) {
58
59 as_numer_denom(arg, outArg(arg_num), outArg(arg_den));
60
61 divx =
div(arg_den, curr_den);
62 as_numer_denom(divx, outArg(divx_num), outArg(divx_den));
63 if (
eq(*divx_den, *one)) {
64
65 curr_den = arg_den;
66 curr_num =
add(
mul(curr_num, divx), arg_num);
67 continue;
68 }
69
70 divx =
div(curr_den, arg_den);
71 as_numer_denom(divx, outArg(divx_num), outArg(divx_den));
72
73
74 curr_den =
mul(curr_den, divx_den);
75 curr_num =
add(
mul(curr_num, divx_den),
mul(arg_num, divx_num));
76 }
77
78 *numer_ = curr_num;
79 *denom_ = curr_den;
80 }
RCP< const Basic > div(const RCP< const Basic > &a, const RCP< const Basic > &b)
Division.
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.
RCP< const Basic > add(const RCP< const Basic > &a, const RCP< const Basic > &b)
Adds two objects (safely).