-// cl_zeta3().
+// zeta3().
// General includes.
-#include "cl_sysdep.h"
+#include "base/cl_sysdep.h"
// Specification.
-#include "cl_F_tran.h"
+#include "float/transcendental/cl_F_tran.h"
// Implementation.
-#include "cl_lfloat.h"
-#include "cl_LF_tran.h"
-#include "cl_LF.h"
-#include "cl_integer.h"
-#include "cl_alloca.h"
+#include "cln/lfloat.h"
+#include "float/transcendental/cl_LF_tran.h"
+#include "float/lfloat/cl_LF.h"
+#include "cln/integer.h"
+#include "base/cl_alloca.h"
-const cl_LF cl_zeta3 (uintC len)
+namespace cln {
+
+const cl_LF zeta3 (uintC len)
{
+ struct rational_series_stream : cl_pqa_series_stream {
+ uintC n;
+ static cl_pqa_series_term computenext (cl_pqa_series_stream& thisss)
+ {
+ var rational_series_stream& thiss = (rational_series_stream&)thisss;
+ var uintC n = thiss.n;
+ var cl_pqa_series_term result;
+ if (n==0) {
+ result.p = 1;
+ } else {
+ result.p = -expt_pos(n,5);
+ }
+ result.q = expt_pos(2*n+1,5)<<5;
+ result.a = 205*square((cl_I)n) + 250*(cl_I)n + 77;
+ thiss.n = n+1;
+ return result;
+ }
+ rational_series_stream ()
+ : cl_pqa_series_stream (rational_series_stream::computenext),
+ n (0) {}
+ } series;
// Method:
- // /infinity \
+ // /infinity \
// | ----- (n + 1) 2 |
// 1 | \ (-1) (205 n - 160 n + 32)|
// - | ) ---------------------------------|
// \ n = 1 /
//
// The formula used to compute Zeta(3) has reference in the paper
- // "Acceleration of Hypergeometric Series via the WZ method" by
- // T. Amdeberhan and Doron Zeilberger, to appear in the Electronic
- // Journal of Combinatorics [Wilf Festschrift Volume].
+ // "Hypergeometric Series Acceleration via the WZ method" by
+ // T. Amdeberhan and Doron Zeilberger,
+ // Electronic J. Combin. 4 (1997), R3.
//
// Computation of the sum:
// Evaluate a sum(0 <= n < N, a(n)/b(n) * (p(0)...p(n))/(q(0)...q(n)))
// with appropriate N, and
// a(n) = 205*n^2+250*n+77, b(n) = 1,
// p(0) = 1, p(n) = -n^5 for n>0, q(n) = 32*(2n+1)^5.
- var uintC actuallen = len+2; // 2 Schutz-Digits
- var uintL N = ceiling(actuallen*intDsize,10);
+ var uintC actuallen = len+2; // 2 guard digits
+ var uintC N = ceiling(actuallen*intDsize,10);
// 1024^-N <= 2^(-intDsize*actuallen).
- CL_ALLOCA_STACK;
- var cl_I* av = (cl_I*) cl_alloca(N*sizeof(cl_I));
- var cl_I* pv = (cl_I*) cl_alloca(N*sizeof(cl_I));
- var cl_I* qv = (cl_I*) cl_alloca(N*sizeof(cl_I));
- var uintL n;
- for (n = 0; n < N; n++) {
- init1(cl_I, av[n]) (205*square((cl_I)n) + 250*(cl_I)n + 77);
- if (n==0)
- init1(cl_I, pv[n]) (1);
- else
- init1(cl_I, pv[n]) (-expt_pos(n,5));
- init1(cl_I, qv[n]) (expt_pos(2*n+1,5)<<5);
- }
- var cl_pqa_series series;
- series.av = av;
- series.pv = pv; series.qv = qv; series.qsv = NULL;
- var cl_LF sum = eval_rational_series(N,series,actuallen);
- for (n = 0; n < N; n++) {
- av[n].~cl_I();
- pv[n].~cl_I();
- qv[n].~cl_I();
- }
+ var cl_LF sum = eval_rational_series<false>(N,series,actuallen,actuallen);
return scale_float(shorten(sum,len),-1);
}
// Bit complexity (N := len): O(log(N)^2*M(N)).
// 50000 3723
// asymp. FAST N^2 FAST FAST
// (FAST means O(log(N)^2*M(N)))
+
+} // namespace cln