1 // eval_pqd_series_aux().
7 #include "cl_LF_tran.h"
12 #include "cl_integer.h"
15 void eval_pqd_series_aux (uintL N, cl_pqd_series_term* args, cl_pqd_series_result& Z, cl_boolean rightmost)
22 if (!rightmost) { Z.P = args[0].p; }
25 if (!rightmost) { Z.C = 1; }
30 var cl_I p01 = args[0].p * args[1].p;
31 if (!rightmost) { Z.P = p01; }
32 Z.Q = args[0].q * args[1].q;
33 var cl_I p0q1 = args[0].p * args[1].q + p01;
35 if (!rightmost) { Z.C = args[1].d + args[0].d; }
36 Z.D = args[0].d * args[1].d;
37 Z.V = args[1].d * p0q1 + args[0].d * p01;
41 var cl_I p01 = args[0].p * args[1].p;
42 var cl_I p012 = p01 * args[2].p;
43 if (!rightmost) { Z.P = p012; }
44 Z.Q = args[0].q * args[1].q * args[2].q;
45 var cl_I p0q1 = args[0].p * args[1].q + p01;
46 Z.T = args[2].q * p0q1 + p012;
47 var cl_I d01 = args[0].d * args[1].d;
48 if (!rightmost) { Z.C = (args[1].d + args[0].d) * args[2].d + d01; }
49 Z.D = d01 * args[2].d;
50 Z.V = args[2].d * (args[2].q * (args[1].d * p0q1 + args[0].d * p01) + (args[1].d + args[0].d) * p012) + d01 * p012;
54 var uintL Nm = N/2; // midpoint
56 var cl_pqd_series_result L;
57 eval_pqd_series_aux(Nm,args+0,L,cl_false);
58 // Compute right part.
59 var cl_pqd_series_result R;
60 eval_pqd_series_aux(N-Nm,args+Nm,R,rightmost);
61 // Put together partial results.
62 if (!rightmost) { Z.P = L.P * R.P; }
64 // Z.S = L.S + L.P/L.Q*R.S;
65 var cl_I tmp = L.P * R.T;
66 Z.T = R.Q * L.T + tmp;
67 if (!rightmost) { Z.C = L.C * R.D + L.D * R.C; }
69 // Z.U = L.U + L.C/L.D * L.P/L.Q * R.S + L.P/L.Q * R.U;
70 // Z.V = R.D * R.Q * L.V + R.D * L.C * L.P * R.T + L.D * L.P * R.V;
71 Z.V = R.D * (R.Q * L.V + L.C * tmp) + L.D * L.P * R.V;