From 78246b8d25f84d0e01ae8c16ea4b01178ab13a1c Mon Sep 17 00:00:00 2001 From: Jens Vollinga Date: Fri, 19 Sep 2003 17:27:12 +0000 Subject: [PATCH] series expansion behaviour fixed. harmonic/multiple polylogs now check for convergence. --- ginac/inifcns_nstdsums.cpp | 42 +++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/ginac/inifcns_nstdsums.cpp b/ginac/inifcns_nstdsums.cpp index 879bb639..f0cd6ab9 100644 --- a/ginac/inifcns_nstdsums.cpp +++ b/ginac/inifcns_nstdsums.cpp @@ -53,6 +53,7 @@ #include "numeric.h" #include "operators.h" #include "relational.h" +#include "pseries.h" namespace GiNaC { @@ -484,7 +485,7 @@ static ex Li_evalf(const ex& x1, const ex& x2) return Li(x1,x2).hold(); if (!is_a(x2.op(i))) return Li(x1,x2).hold(); - if (x2 >= 1) + if (x2.op(i) >= 1) return Li(x1,x2).hold(); } @@ -514,7 +515,14 @@ static ex Li_evalf(const ex& x1, const ex& x2) return Li(x1,x2).hold(); } -REGISTER_FUNCTION(Li, eval_func(Li_eval).evalf_func(Li_evalf).do_not_evalf_params()); +static ex Li_series(const ex& x1, const ex& x2, const relational& rel, int order, unsigned options) +{ + epvector seq; + seq.push_back(expair(Li(x1,x2), 0)); + return pseries(rel,seq); +} + +REGISTER_FUNCTION(Li, eval_func(Li_eval).evalf_func(Li_evalf).do_not_evalf_params().series_func(Li_series)); // Nielsen's generalized polylogarithm @@ -539,7 +547,14 @@ static ex S_evalf(const ex& x1, const ex& x2, const ex& x3) return S(x1,x2,x3).hold(); } -REGISTER_FUNCTION(S, eval_func(S_eval).evalf_func(S_evalf).do_not_evalf_params()); +static ex S_series(const ex& x1, const ex& x2, const ex& x3, const relational& rel, int order, unsigned options) +{ + epvector seq; + seq.push_back(expair(S(x1,x2,x3), 0)); + return pseries(rel,seq); +} + +REGISTER_FUNCTION(S, eval_func(S_eval).evalf_func(S_evalf).do_not_evalf_params().series_func(S_series)); // Harmonic polylogarithm @@ -556,6 +571,9 @@ static ex H_evalf(const ex& x1, const ex& x2) if (!is_a(x1.op(i))) return H(x1,x2).hold(); } + if (x2 >= 1) { + return H(x1,x2).hold(); + } cln::cl_N m_1 = ex_to(x1.op(x1.nops()-1)).to_cl_N(); cln::cl_N x_1 = ex_to(x2).to_cl_N(); @@ -581,7 +599,14 @@ static ex H_evalf(const ex& x1, const ex& x2) return H(x1,x2).hold(); } -REGISTER_FUNCTION(H, eval_func(H_eval).evalf_func(H_evalf).do_not_evalf_params()); +static ex H_series(const ex& x1, const ex& x2, const relational& rel, int order, unsigned options) +{ + epvector seq; + seq.push_back(expair(H(x1,x2), 0)); + return pseries(rel,seq); +} + +REGISTER_FUNCTION(H, eval_func(H_eval).evalf_func(H_evalf).do_not_evalf_params().series_func(H_series)); // Multiple zeta value @@ -624,7 +649,14 @@ static ex mZeta_evalf(const ex& x1) return mZeta(x1).hold(); } -REGISTER_FUNCTION(mZeta, eval_func(mZeta_eval).evalf_func(mZeta_evalf).do_not_evalf_params()); +static ex mZeta_series(const ex& x1, const relational& rel, int order, unsigned options) +{ + epvector seq; + seq.push_back(expair(mZeta(x1), 0)); + return pseries(rel,seq); +} + +REGISTER_FUNCTION(mZeta, eval_func(mZeta_eval).evalf_func(mZeta_evalf).do_not_evalf_params().series_func(mZeta_series)); } // namespace GiNaC -- 2.50.0