Browse Source
Truncated binary splitting for even more memory efficiency:
Truncated binary splitting for even more memory efficiency:
* src/float/transcendental/cl_LF_tran.h: Added new overloads. See below. * src/float/transcendental/cl_LF_ratseries_stream_pq.cc: Removed and moved everything to... * src/float/transcendental/cl_LF_ratseries_pq.cc: ...here. Added an overload for truncated expansion. * src/float/transcendental/cl_LF_ratseries_stream_pqa.cc: Removed and moved everything to... * src/float/transcendental/cl_LF_ratseries_pqa.cc: ...here. Added an overload for truncated expansion. * src/float/transcendental/cl_LF_ratseries_stream_pqb.cc: Removed and moved everything to... * src/float/transcendental/cl_LF_ratseries_pqb.cc: ...here. Added an overload for truncated expansion. * src/float/transcendental/cl_LF_ratseries_stream_pqab.cc: Removed and moved everything to... * src/float/transcendental/cl_LF_ratseries_pqab.cc: ...here. Added an overload for truncated expansion. * src/float/transcendental/cl_LF_ratsumseries_pqcd_aux.cc: Added overloads for streamed and truncated expansion. * src/float/transcendental/cl_LF_ratsumseries_pqcd.cc: Likewise. * src/float/transcendental/cl_LF_ratsumseries_stream_pqd_aux.cc: Removed and moved everything to... * src/float/transcendental/cl_LF_ratsumseries_pqd_aux.cc: ...here. Added an overload for truncated expansion. * src/float/transcendental/cl_LF_ratsumseries_stream_pqd.cc: Removed and moved everything to... * src/float/transcendental/cl_LF_ratsumseries_pqd.cc: ...here. Added an overload for truncated expansion. * src/float/transcendental/cl_LF_pi.cc: Use truncated series. * src/float/transcendental/cl_LF_catalanconst.cc: Likewise. * src/float/transcendental/cl_LF_eulerconst.cc: Likewise. * src/float/transcendental/cl_LF_zeta_int.cc: Likewise. * src/float/transcendental/cl_LF_zeta3.cc: Likewise.master
21 changed files with 1325 additions and 663 deletions
-
37ChangeLog
-
6src/float/transcendental/cl_LF_catalanconst.cc
-
23src/float/transcendental/cl_LF_eulerconst.cc
-
2src/float/transcendental/cl_LF_pi.cc
-
173src/float/transcendental/cl_LF_ratseries_pq.cc
-
173src/float/transcendental/cl_LF_ratseries_pqa.cc
-
190src/float/transcendental/cl_LF_ratseries_pqab.cc
-
191src/float/transcendental/cl_LF_ratseries_pqb.cc
-
102src/float/transcendental/cl_LF_ratseries_stream_pq.cc
-
102src/float/transcendental/cl_LF_ratseries_stream_pqa.cc
-
110src/float/transcendental/cl_LF_ratseries_stream_pqab.cc
-
110src/float/transcendental/cl_LF_ratseries_stream_pqb.cc
-
29src/float/transcendental/cl_LF_ratsumseries_pqcd.cc
-
163src/float/transcendental/cl_LF_ratsumseries_pqcd_aux.cc
-
29src/float/transcendental/cl_LF_ratsumseries_pqd.cc
-
155src/float/transcendental/cl_LF_ratsumseries_pqd_aux.cc
-
31src/float/transcendental/cl_LF_ratsumseries_stream_pqd.cc
-
86src/float/transcendental/cl_LF_ratsumseries_stream_pqd_aux.cc
-
199src/float/transcendental/cl_LF_tran.h
-
2src/float/transcendental/cl_LF_zeta3.cc
-
75src/float/transcendental/cl_LF_zeta_int.cc
@ -1,102 +0,0 @@ |
|||
// eval_rational_series().
|
|||
|
|||
// General includes.
|
|||
#include "cl_sysdep.h"
|
|||
|
|||
// Specification.
|
|||
#include "cl_LF_tran.h"
|
|||
|
|||
|
|||
// Implementation.
|
|||
|
|||
#include "cln/lfloat.h"
|
|||
#include "cln/integer.h"
|
|||
#include "cln/exception.h"
|
|||
#include "cl_LF.h"
|
|||
|
|||
namespace cln { |
|||
|
|||
static void eval_pq_series_aux (uintC N1, uintC N2, |
|||
cl_pq_series_stream& args, |
|||
cl_I* P, cl_I* Q, cl_I* T) |
|||
{ |
|||
switch (N2 - N1) { |
|||
case 0: |
|||
throw runtime_exception(); break; |
|||
case 1: { |
|||
var cl_pq_series_term v0 = args.next(); // [N1]
|
|||
if (P) { *P = v0.p; } |
|||
*Q = v0.q; |
|||
*T = v0.p; |
|||
break; |
|||
} |
|||
case 2: { |
|||
var cl_pq_series_term v0 = args.next(); // [N1]
|
|||
var cl_pq_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
if (P) { *P = p01; } |
|||
*Q = v0.q * v1.q; |
|||
*T = v1.q * v0.p |
|||
+ p01; |
|||
break; |
|||
} |
|||
case 3: { |
|||
var cl_pq_series_term v0 = args.next(); // [N1]
|
|||
var cl_pq_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pq_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
if (P) { *P = p012; } |
|||
var cl_I q12 = v1.q * v2.q; |
|||
*Q = v0.q * q12; |
|||
*T = q12 * v0.p |
|||
+ v2.q * p01 |
|||
+ p012; |
|||
break; |
|||
} |
|||
case 4: { |
|||
var cl_pq_series_term v0 = args.next(); // [N1]
|
|||
var cl_pq_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pq_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_pq_series_term v3 = args.next(); // [N1+3]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
var cl_I p0123 = p012 * v3.p; |
|||
if (P) { *P = p0123; } |
|||
var cl_I q23 = v2.q * v3.q; |
|||
var cl_I q123 = v1.q * q23; |
|||
*Q = v0.q * q123; |
|||
*T = q123 * v0.p |
|||
+ q23 * p01 |
|||
+ v3.q * p012 |
|||
+ p0123; |
|||
break; |
|||
} |
|||
default: { |
|||
var uintC Nm = (N1+N2)/2; // midpoint
|
|||
// Compute left part.
|
|||
var cl_I LP, LQ, LT; |
|||
eval_pq_series_aux(N1,Nm,args,&LP,&LQ,<); |
|||
// Compute right part.
|
|||
var cl_I RP, RQ, RT; |
|||
eval_pq_series_aux(Nm,N2,args,(P?&RP:(cl_I*)0),&RQ,&RT); |
|||
// Put together partial results.
|
|||
if (P) { *P = LP*RP; } |
|||
*Q = LQ*RQ; |
|||
// S = LS + LP/LQ * RS, so T = RQ*LT + LP*RT.
|
|||
*T = RQ*LT + LP*RT; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
const cl_LF eval_rational_series (uintC N, cl_pq_series_stream& args, uintC len) |
|||
{ |
|||
if (N==0) |
|||
return cl_I_to_LF(0,len); |
|||
var cl_I Q, T; |
|||
eval_pq_series_aux(0,N,args,NULL,&Q,&T); |
|||
return cl_I_to_LF(T,len) / cl_I_to_LF(Q,len); |
|||
} |
|||
|
|||
} // namespace cln
|
@ -1,102 +0,0 @@ |
|||
// eval_rational_series().
|
|||
|
|||
// General includes.
|
|||
#include "cl_sysdep.h"
|
|||
|
|||
// Specification.
|
|||
#include "cl_LF_tran.h"
|
|||
|
|||
|
|||
// Implementation.
|
|||
|
|||
#include "cln/lfloat.h"
|
|||
#include "cln/integer.h"
|
|||
#include "cln/exception.h"
|
|||
#include "cl_LF.h"
|
|||
|
|||
namespace cln { |
|||
|
|||
static void eval_pqa_series_aux (uintC N1, uintC N2, |
|||
cl_pqa_series_stream& args, |
|||
cl_I* P, cl_I* Q, cl_I* T) |
|||
{ |
|||
switch (N2 - N1) { |
|||
case 0: |
|||
throw runtime_exception(); break; |
|||
case 1: { |
|||
var cl_pqa_series_term v0 = args.next(); // [N1]
|
|||
if (P) { *P = v0.p; } |
|||
*Q = v0.q; |
|||
*T = v0.a * v0.p; |
|||
break; |
|||
} |
|||
case 2: { |
|||
var cl_pqa_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqa_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
if (P) { *P = p01; } |
|||
*Q = v0.q * v1.q; |
|||
*T = v1.q * v0.a * v0.p |
|||
+ v1.a * p01; |
|||
break; |
|||
} |
|||
case 3: { |
|||
var cl_pqa_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqa_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pqa_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
if (P) { *P = p012; } |
|||
var cl_I q12 = v1.q * v2.q; |
|||
*Q = v0.q * q12; |
|||
*T = q12 * v0.a * v0.p |
|||
+ v2.q * v1.a * p01 |
|||
+ v2.a * p012; |
|||
break; |
|||
} |
|||
case 4: { |
|||
var cl_pqa_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqa_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pqa_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_pqa_series_term v3 = args.next(); // [N1+3]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
var cl_I p0123 = p012 * v3.p; |
|||
if (P) { *P = p0123; } |
|||
var cl_I q23 = v2.q * v3.q; |
|||
var cl_I q123 = v1.q * q23; |
|||
*Q = v0.q * q123; |
|||
*T = q123 * v0.a * v0.p |
|||
+ q23 * v1.a * p01 |
|||
+ v3.q * v2.a * p012 |
|||
+ v3.a * p0123; |
|||
break; |
|||
} |
|||
default: { |
|||
var uintC Nm = (N1+N2)/2; // midpoint
|
|||
// Compute left part.
|
|||
var cl_I LP, LQ, LT; |
|||
eval_pqa_series_aux(N1,Nm,args,&LP,&LQ,<); |
|||
// Compute right part.
|
|||
var cl_I RP, RQ, RT; |
|||
eval_pqa_series_aux(Nm,N2,args,(P?&RP:(cl_I*)0),&RQ,&RT); |
|||
// Put together partial results.
|
|||
if (P) { *P = LP*RP; } |
|||
*Q = LQ*RQ; |
|||
// S = LS + LP/LQ * RS, so T = RQ*LT + LP*RT.
|
|||
*T = RQ*LT + LP*RT; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
const cl_LF eval_rational_series (uintC N, cl_pqa_series_stream& args, uintC len) |
|||
{ |
|||
if (N==0) |
|||
return cl_I_to_LF(0,len); |
|||
var cl_I Q, T; |
|||
eval_pqa_series_aux(0,N,args,NULL,&Q,&T); |
|||
return cl_I_to_LF(T,len) / cl_I_to_LF(Q,len); |
|||
} |
|||
|
|||
} // namespace cln
|
@ -1,110 +0,0 @@ |
|||
// eval_rational_series().
|
|||
|
|||
// General includes.
|
|||
#include "cl_sysdep.h"
|
|||
|
|||
// Specification.
|
|||
#include "cl_LF_tran.h"
|
|||
|
|||
|
|||
// Implementation.
|
|||
|
|||
#include "cln/lfloat.h"
|
|||
#include "cln/integer.h"
|
|||
#include "cln/exception.h"
|
|||
#include "cl_LF.h"
|
|||
|
|||
namespace cln { |
|||
|
|||
static void eval_pqab_series_aux (uintC N1, uintC N2, |
|||
cl_pqab_series_stream& args, |
|||
cl_I* P, cl_I* Q, cl_I* B, cl_I* T) |
|||
{ |
|||
switch (N2 - N1) { |
|||
case 0: |
|||
throw runtime_exception(); break; |
|||
case 1: { |
|||
var cl_pqab_series_term v0 = args.next(); // [N1]
|
|||
if (P) { *P = v0.p; } |
|||
*Q = v0.q; |
|||
*B = v0.b; |
|||
*T = v0.a * v0.p; |
|||
break; |
|||
} |
|||
case 2: { |
|||
var cl_pqab_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqab_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
if (P) { *P = p01; } |
|||
*Q = v0.q * v1.q; |
|||
*B = v0.b * v1.b; |
|||
*T = v1.b * v1.q * v0.a * v0.p |
|||
+ v0.b * v1.a * p01; |
|||
break; |
|||
} |
|||
case 3: { |
|||
var cl_pqab_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqab_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pqab_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
if (P) { *P = p012; } |
|||
var cl_I q12 = v1.q * v2.q; |
|||
*Q = v0.q * q12; |
|||
var cl_I b12 = v1.b * v2.b; |
|||
*B = v0.b * b12; |
|||
*T = b12 * q12 * v0.a * v0.p |
|||
+ v0.b * (v2.b * v2.q * v1.a * p01 |
|||
+ v1.b * v2.a * p012); |
|||
break; |
|||
} |
|||
case 4: { |
|||
var cl_pqab_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqab_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pqab_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_pqab_series_term v3 = args.next(); // [N1+3]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
var cl_I p0123 = p012 * v3.p; |
|||
if (P) { *P = p0123; } |
|||
var cl_I q23 = v2.q * v3.q; |
|||
var cl_I q123 = v1.q * q23; |
|||
*Q = v0.q * q123; |
|||
var cl_I b01 = v0.b * v1.b; |
|||
var cl_I b23 = v2.b * v3.b; |
|||
*B = b01 * b23; |
|||
*T = b23 * (v1.b * q123 * v0.a * v0.p |
|||
+ v0.b * q23 * v1.a * p01) |
|||
+ b01 * (v3.b * v3.q * v2.a * p012 |
|||
+ v2.b * v3.a * p0123); |
|||
break; |
|||
} |
|||
default: { |
|||
var uintC Nm = (N1+N2)/2; // midpoint
|
|||
// Compute left part.
|
|||
var cl_I LP, LQ, LB, LT; |
|||
eval_pqab_series_aux(N1,Nm,args,&LP,&LQ,&LB,<); |
|||
// Compute right part.
|
|||
var cl_I RP, RQ, RB, RT; |
|||
eval_pqab_series_aux(Nm,N2,args,(P?&RP:(cl_I*)0),&RQ,&RB,&RT); |
|||
// Put together partial results.
|
|||
if (P) { *P = LP*RP; } |
|||
*Q = LQ*RQ; |
|||
*B = LB*RB; |
|||
// S = LS + LP/LQ * RS, so T = RB*RQ*LT + LB*LP*RT.
|
|||
*T = RB*RQ*LT + LB*LP*RT; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
const cl_LF eval_rational_series (uintC N, cl_pqab_series_stream& args, uintC len) |
|||
{ |
|||
if (N==0) |
|||
return cl_I_to_LF(0,len); |
|||
var cl_I Q, B, T; |
|||
eval_pqab_series_aux(0,N,args,NULL,&Q,&B,&T); |
|||
return cl_I_to_LF(T,len) / cl_I_to_LF(B*Q,len); |
|||
} |
|||
|
|||
} // namespace cln
|
@ -1,110 +0,0 @@ |
|||
// eval_rational_series().
|
|||
|
|||
// General includes.
|
|||
#include "cl_sysdep.h"
|
|||
|
|||
// Specification.
|
|||
#include "cl_LF_tran.h"
|
|||
|
|||
|
|||
// Implementation.
|
|||
|
|||
#include "cln/lfloat.h"
|
|||
#include "cln/integer.h"
|
|||
#include "cln/exception.h"
|
|||
#include "cl_LF.h"
|
|||
|
|||
namespace cln { |
|||
|
|||
static void eval_pqb_series_aux (uintC N1, uintC N2, |
|||
cl_pqb_series_stream& args, |
|||
cl_I* P, cl_I* Q, cl_I* B, cl_I* T) |
|||
{ |
|||
switch (N2 - N1) { |
|||
case 0: |
|||
throw runtime_exception(); break; |
|||
case 1: { |
|||
var cl_pqb_series_term v0 = args.next(); // [N1]
|
|||
if (P) { *P = v0.p; } |
|||
*Q = v0.q; |
|||
*B = v0.b; |
|||
*T = v0.p; |
|||
break; |
|||
} |
|||
case 2: { |
|||
var cl_pqb_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqb_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
if (P) { *P = p01; } |
|||
*Q = v0.q * v1.q; |
|||
*B = v0.b * v1.b; |
|||
*T = v1.b * v1.q * v0.p |
|||
+ v0.b * p01; |
|||
break; |
|||
} |
|||
case 3: { |
|||
var cl_pqb_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqb_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pqb_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
if (P) { *P = p012; } |
|||
var cl_I q12 = v1.q * v2.q; |
|||
*Q = v0.q * q12; |
|||
var cl_I b12 = v1.b * v2.b; |
|||
*B = v0.b * b12; |
|||
*T = b12 * q12 * v0.p |
|||
+ v0.b * (v2.b * v2.q * p01 |
|||
+ v1.b * p012); |
|||
break; |
|||
} |
|||
case 4: { |
|||
var cl_pqb_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqb_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pqb_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_pqb_series_term v3 = args.next(); // [N1+3]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
var cl_I p0123 = p012 * v3.p; |
|||
if (P) { *P = p0123; } |
|||
var cl_I q23 = v2.q * v3.q; |
|||
var cl_I q123 = v1.q * q23; |
|||
*Q = v0.q * q123; |
|||
var cl_I b01 = v0.b * v1.b; |
|||
var cl_I b23 = v2.b * v3.b; |
|||
*B = b01 * b23; |
|||
*T = b23 * (v1.b * q123 * v0.p |
|||
+ v0.b * q23 * p01) |
|||
+ b01 * (v3.b * v3.q * p012 |
|||
+ v2.b * p0123); |
|||
break; |
|||
} |
|||
default: { |
|||
var uintC Nm = (N1+N2)/2; // midpoint
|
|||
// Compute left part.
|
|||
var cl_I LP, LQ, LB, LT; |
|||
eval_pqb_series_aux(N1,Nm,args,&LP,&LQ,&LB,<); |
|||
// Compute right part.
|
|||
var cl_I RP, RQ, RB, RT; |
|||
eval_pqb_series_aux(Nm,N2,args,(P?&RP:(cl_I*)0),&RQ,&RB,&RT); |
|||
// Put together partial results.
|
|||
if (P) { *P = LP*RP; } |
|||
*Q = LQ*RQ; |
|||
*B = LB*RB; |
|||
// S = LS + LP/LQ * RS, so T = RB*RQ*LT + LB*LP*RT.
|
|||
*T = RB*RQ*LT + LB*LP*RT; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
const cl_LF eval_rational_series (uintC N, cl_pqb_series_stream& args, uintC len) |
|||
{ |
|||
if (N==0) |
|||
return cl_I_to_LF(0,len); |
|||
var cl_I Q, B, T; |
|||
eval_pqb_series_aux(0,N,args,NULL,&Q,&B,&T); |
|||
return cl_I_to_LF(T,len) / cl_I_to_LF(B*Q,len); |
|||
} |
|||
|
|||
} // namespace cln
|
@ -1,31 +0,0 @@ |
|||
// eval_pqd_series().
|
|||
|
|||
// General includes.
|
|||
#include "cl_sysdep.h"
|
|||
|
|||
// Specification.
|
|||
#include "cl_LF_tran.h"
|
|||
|
|||
|
|||
// Implementation.
|
|||
|
|||
#include "cln/lfloat.h"
|
|||
#include "cln/integer.h"
|
|||
#include "cl_LF.h"
|
|||
|
|||
namespace cln { |
|||
|
|||
const cl_LF eval_pqd_series (uintC N, cl_pqd_series_stream& args, uintC len) |
|||
{ |
|||
if (N==0) |
|||
return cl_I_to_LF(0,len); |
|||
var cl_pqd_series_result sums; |
|||
eval_pqd_series_aux(N,args,sums); |
|||
// Instead of computing fsum = T/Q and gsum = V/(D*Q)
|
|||
// and then dividing them, to compute gsum/fsum, we save two
|
|||
// divisions by computing V/(D*T).
|
|||
return |
|||
cl_I_to_LF(sums.V,len) / The(cl_LF)(sums.D * cl_I_to_LF(sums.T,len)); |
|||
} |
|||
|
|||
} // namespace cln
|
@ -1,86 +0,0 @@ |
|||
// eval_pqd_series_aux().
|
|||
|
|||
// General includes.
|
|||
#include "cl_sysdep.h"
|
|||
|
|||
// Specification.
|
|||
#include "cl_LF_tran.h"
|
|||
|
|||
|
|||
// Implementation.
|
|||
|
|||
#include "cln/integer.h"
|
|||
#include "cln/exception.h"
|
|||
|
|||
namespace cln { |
|||
|
|||
void eval_pqd_series_aux (uintC N, cl_pqd_series_stream& args, cl_pqd_series_result& Z, bool rightmost) |
|||
{ |
|||
// N = N2-N1
|
|||
switch (N) { |
|||
case 0: |
|||
throw runtime_exception(); break; |
|||
case 1: { |
|||
var cl_pqd_series_term v0 = args.next(); // [N1]
|
|||
if (!rightmost) { Z.P = v0.p; } |
|||
Z.Q = v0.q; |
|||
Z.T = v0.p; |
|||
if (!rightmost) { Z.C = 1; } |
|||
Z.D = v0.d; |
|||
Z.V = v0.p; |
|||
break; |
|||
} |
|||
case 2: { |
|||
var cl_pqd_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqd_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
if (!rightmost) { Z.P = p01; } |
|||
Z.Q = v0.q * v1.q; |
|||
var cl_I p0q1 = v0.p * v1.q + p01; |
|||
Z.T = p0q1; |
|||
if (!rightmost) { Z.C = v1.d + v0.d; } |
|||
Z.D = v0.d * v1.d; |
|||
Z.V = v1.d * p0q1 + v0.d * p01; |
|||
break; |
|||
} |
|||
case 3: { |
|||
var cl_pqd_series_term v0 = args.next(); // [N1]
|
|||
var cl_pqd_series_term v1 = args.next(); // [N1+1]
|
|||
var cl_pqd_series_term v2 = args.next(); // [N1+2]
|
|||
var cl_I p01 = v0.p * v1.p; |
|||
var cl_I p012 = p01 * v2.p; |
|||
if (!rightmost) { Z.P = p012; } |
|||
Z.Q = v0.q * v1.q * v2.q; |
|||
var cl_I p0q1 = v0.p * v1.q + p01; |
|||
Z.T = v2.q * p0q1 + p012; |
|||
var cl_I d01 = v0.d * v1.d; |
|||
if (!rightmost) { Z.C = (v1.d + v0.d) * v2.d + d01; } |
|||
Z.D = d01 * v2.d; |
|||
Z.V = v2.d * (v2.q * (v1.d * p0q1 + v0.d * p01) + (v1.d + v0.d) * p012) + d01 * p012; |
|||
break; |
|||
} |
|||
default: { |
|||
var uintC Nm = N/2; // midpoint
|
|||
// Compute left part.
|
|||
var cl_pqd_series_result L; |
|||
eval_pqd_series_aux(Nm,args,L,false); |
|||
// Compute right part.
|
|||
var cl_pqd_series_result R; |
|||
eval_pqd_series_aux(N-Nm,args,R,rightmost); |
|||
// Put together partial results.
|
|||
if (!rightmost) { Z.P = L.P * R.P; } |
|||
Z.Q = L.Q * R.Q; |
|||
// Z.S = L.S + L.P/L.Q*R.S;
|
|||
var cl_I tmp = L.P * R.T; |
|||
Z.T = R.Q * L.T + tmp; |
|||
if (!rightmost) { Z.C = L.C * R.D + L.D * R.C; } |
|||
Z.D = L.D * R.D; |
|||
// Z.U = L.U + L.C/L.D * L.P/L.Q * R.S + L.P/L.Q * R.U;
|
|||
// Z.V = R.D * R.Q * L.V + R.D * L.C * L.P * R.T + L.D * L.P * R.V;
|
|||
Z.V = R.D * (R.Q * L.V + L.C * tmp) + L.D * L.P * R.V; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
|
|||
} // namespace cln
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue