]> www.ginac.de Git - cln.git/blob - src/float/transcendental/cl_LF_ratsumseries_pqcd_aux.cc
b42ed0854c9b948730746d47a2caaa59ce20847a
[cln.git] / src / float / transcendental / cl_LF_ratsumseries_pqcd_aux.cc
1 // eval_pqcd_series_aux().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_LF_tran.h"
8
9
10 // Implementation.
11
12 #include "cl_integer.h"
13 #include "cl_abort.h"
14
15 void eval_pqcd_series_aux (uintL N, cl_pqcd_series_term* args, cl_pqcd_series_result& Z, cl_boolean rightmost)
16 {
17         // N = N2-N1
18         switch (N) {
19         case 0:
20                 cl_abort(); break;
21         case 1:
22                 if (!rightmost) { Z.P = args[0].p; }
23                 Z.Q = args[0].q;
24                 Z.T = args[0].p;
25                 if (!rightmost) { Z.C = args[0].c; }
26                 Z.D = args[0].d;
27                 Z.V = args[0].c * args[0].p;
28                 break;
29         case 2: {
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;
34                 Z.T = p0q1;
35                 var cl_I c0d1 = args[0].c * args[1].d;
36                 var cl_I c1d0 = args[1].c * args[0].d;
37                 if (!rightmost) { Z.C = c0d1 + c1d0; }
38                 Z.D = args[0].d * args[1].d;
39                 Z.V = c0d1 * p0q1 + c1d0 * p01;
40                 break;
41                 }
42         case 3: {
43                 var cl_I p01 = args[0].p * args[1].p;
44                 var cl_I p012 = p01 * args[2].p;
45                 if (!rightmost) { Z.P = p012; }
46                 Z.Q = args[0].q * args[1].q * args[2].q;
47                 var cl_I p0q1 = args[0].p * args[1].q + p01;
48                 Z.T = args[2].q * p0q1 + p012;
49                 var cl_I c0d1 = args[0].c * args[1].d;
50                 var cl_I c1d0 = args[1].c * args[0].d;
51                 var cl_I d01 = args[0].d * args[1].d;
52                 if (!rightmost) { Z.C = (c0d1 + c1d0) * args[2].d + args[2].c * d01; }
53                 Z.D = d01 * args[2].d;
54                 Z.V = args[2].d * (args[2].q * (c0d1 * p0q1 + c1d0 * p01) + (c0d1 + c1d0) * p012) + args[2].c * d01 * p012;
55                 break;
56                 }
57         default: {
58                 var uintL Nm = N/2; // midpoint
59                 // Compute left part.
60                 var cl_pqcd_series_result L;
61                 eval_pqcd_series_aux(Nm,args+0,L,cl_false);
62                 // Compute right part.
63                 var cl_pqcd_series_result R;
64                 eval_pqcd_series_aux(N-Nm,args+Nm,R,rightmost);
65                 // Put together partial results.
66                 if (!rightmost) { Z.P = L.P * R.P; }
67                 Z.Q = L.Q * R.Q;
68                 // Z.S = L.S + L.P/L.Q*R.S;
69                 var cl_I tmp = L.P * R.T;
70                 Z.T = R.Q * L.T + tmp;
71                 if (!rightmost) { Z.C = L.C * R.D + L.D * R.C; }
72                 Z.D = L.D * R.D;
73                 // Z.U = L.U + L.C/L.D * L.P/L.Q * R.S + L.P/L.Q * R.U;
74                 // Z.V = R.D * R.Q * L.V + R.D * L.C * L.P * R.T + L.D * L.P * R.V;
75                 Z.V = R.D * (R.Q * L.V + L.C * tmp) + L.D * L.P * R.V;
76                 break;
77                 }
78         }
79 }