|
Nestedsums library
|
The class transcendental_sum_type_C involves a conjugation. More...
#include <transcendental_C.h>
Public Member Functions | |
| transcendental_sum_type_C (const GiNaC::ex &nn, const GiNaC::ex &i, const GiNaC::ex &l, const GiNaC::ex &v, const GiNaC::ex &ss, const GiNaC::ex &eps, int o, int f) | |
| void | archive (GiNaC::archive_node &node) const override |
| void | read_archive (const GiNaC::archive_node &node, GiNaC::lst &sym_lst) override |
| unsigned | return_type (void) const override |
| void | print (const GiNaC::print_context &c, unsigned level=0) const override |
| unsigned | precedence (void) const override |
| GiNaC::ex | eval () const override |
| GiNaC::ex | subs (const GiNaC::exmap &m, unsigned options=0) const override |
| virtual GiNaC::ex | eval_explicit () const |
| virtual unsigned | get_key (void) const |
| virtual GiNaC::ex | hash_data (void) const |
| virtual GiNaC::ex | subst_data (void) const |
| GiNaC::ex | set_expansion (void) const |
| GiNaC::ex | distribute_over_subsum (void) const |
| GiNaC::ex | distribute_over_letter (void) const |
| GiNaC::ex | shift_plus_one (void) const |
| GiNaC::ex | shift_minus_one (void) const |
Protected Member Functions | |
| GiNaC::ex | eval_ncmul (const GiNaC::exvector &v) const override |
| GiNaC::ex | derivative (const GiNaC::symbol &s) const override |
| unsigned | calchash (void) const override |
Protected Attributes | |
| GiNaC::ex | n |
| GiNaC::ex | index |
| GiNaC::ex | letter |
| GiNaC::ex | lst_of_gammas |
| GiNaC::ex | subsum |
| GiNaC::ex | expansion_parameter |
| int | order |
| int | flag_expand_status |
The class transcendental_sum_type_C involves a conjugation.
The definition is
![\[
\frac{\Gamma(1+d_1\varepsilon)}{\Gamma(1+b_1\varepsilon)}
\frac{\Gamma(1+d_2\varepsilon)}{\Gamma(1+b_2\varepsilon)} ...
\frac{\Gamma(1+d_k\varepsilon)}{\Gamma(1+b_k\varepsilon)}
\]](form_225.png)
![\[
\mbox{} (-1) \sum\limits_{i=1}^n
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c)^m}
\frac{\Gamma(i+a_1+b_1\varepsilon)}{\Gamma(i+c_1+d_1\varepsilon)}
\frac{\Gamma(i+a_2+b_2\varepsilon)}{\Gamma(i+c_2+d_2\varepsilon)} ...
\frac{\Gamma(i+a_k+b_k\varepsilon)}{\Gamma(i+c_k+d_k\varepsilon)}
S(i+o,m_1,...,m_l,x_1,...,x_l)
\]](form_283.png)
Here, 





The upper summation limit should not be infinity.
| ex distribute_over_letter | ( | void | ) | const |
letter is allowed to contain a sum of products (e.g. an expression in expanded form). Each term can contain scalars and basic_letters.
This routine converts the transcendental_sum_type_C to a canonical form, so that afterwards letter only contains a basic_letter.
| ex distribute_over_subsum | ( | void | ) | const |
subsum is allowed to contain a sum of products (e.g. an expression in expanded form). Each term can contain scalars, basic_letters, list_of_tgammas, Zsums or Ssums.
This routine converts the transcendental_sum_type_C to a canonical form, so that afterwards subsum only contains a Ssum.
The algorithm is based on the following steps:
|
override |
Simplifications, which are always performed are:
If flag_expand_status == expand_status::expansion_required, the evaluation routine performs a set of consistency checks:





If one of the tests fails, the object is put into a zombie state.
If flag_expand_status == expand_status::check_for_poles, it assures that the Gamma functions in the numerator do not give rise to poles. The function shift_plus_one() is used.
If flag_expand_status == expand_status::expand_gamma_functions, the Gamma functions are expanded into Euler Zagier sums. This is done by setting the expansion_required flag in the ratio_of_tgamma class.
If flag_expand_status == expand_status::adjust_summation_index, we deal with sums of the form
![\[
\mbox{} - \sum\limits_{i=1}^n
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c)^m} S(i,...)
\]](form_265.png)
with 

If flag_expand_status == expand_status::do_hoelder_convolution, we deal with sums of the form
![\[
\mbox{} - \sum\limits_{i=1}^n
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{i^m} S(i,...)
\]](form_267.png)
The S-sum is first brought to a standard form, which ensures that negative degrees are removed. The function Ssum::remove_negative_degrees() is used for that. We then check if 


![\[
S(i;m_1,...,m_k;x_1,...,x_k)
\]](form_269.png)
![\[
= S(N;m_1,...,m_k;x_1,...,x_k)
\]](form_270.png)
![\[
\mbox{} - S(N;m_2,...,m_k;x_2,...,x_k) \cdot
\left( \sum\limits_{i_1=i+1}^N
\frac{x_1^{i_1}}{i_1^{m_1}} \right)
\]](form_271.png)
![\[
+ S(N;m_3,...,m_k;x_3,...,x_k) \cdot
\left( \sum\limits_{i_1=i+1}^N \sum\limits_{i_2=i_1+1}^N
\frac{x_1^{i_1}}{i_1^{m_1}} \frac{x_2^{i_2}}{i_2^{m_2}} \right)
\]](form_272.png)
![\[
\mbox{} - ... + (-1)^k \cdot \left(\sum\limits_{i_1=i+1}^N \sum\limits_{i_2=i_1+1}^N
... \sum\limits_{i_k=i_{k-1}+1}^N
\frac{x_1^{i_1}}{i_1^{m_1}}
\frac{x_2^{i_2}}{i_2^{m_2}} ...
\frac{x_k^{i_k}}{i_k^{m_k}} \right)
\]](form_273.png)
Each term is a product of a Ssum at infinity and a sum of type "Csum". The Ssum at infinity is converted to a Zsum at infinity and expressed in terms of multiple polylogarithms. The evaluation of the Csum is done in its proper evaluation routine.
|
virtual |
Explicit evaluation
|
overrideprotected |
No automatic simplifications
|
virtual |
The hash key is calculated from the hash_data.
|
virtual |
The summation index is a redundant variable and does not influence the hash_data.
| ex set_expansion | ( | void | ) | const |
Sets the flag flag_expand_status to expand_status::expansion_required. The object is then automatically expanded up to the order specified in the member variable order.
| ex shift_minus_one | ( | void | ) | const |
This routine assumes sums of the form
![\[
\mbox{} - \sum\limits_{i=1}^n
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c)^m} S(i,...)
\]](form_277.png)
and performs the substitution index -> index + 1.
If 
![\[
\mbox{} - \sum\limits_{i=1}^n
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c)^m} S(i,...)
\]](form_277.png)
![\[
=
\sum\limits_{j=0}^{-m}
\left( \begin{array}{c} -m \\ j \\ \end{array} \right)
c^{-m-j}
\mbox{} (-1) \sum\limits_{i=1}^n
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{i^{-j}} S(i,...)
\]](form_278.png)
If the depth of the subsum is zero, we have
![\[
\mbox{} - \sum\limits_{i=1}^n
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c)^m} S(i)
\]](form_279.png)
![\[
=
\mbox{} - \frac{1}{x} \frac{1}{n+1} Z(n-1)
(-1) \sum\limits_{i=1}^{n+1}
\left( \begin{array}{c} n+1 \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c-1)^m} i S(i)
+ \frac{1}{c^m} Z(n-1)
\]](form_280.png)
If the depth of the subsum is not equal to zero, we have
![\[
\mbox{} - \sum\limits_{i=1}^n
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c)^m} S(i,...)
\]](form_277.png)
![\[
=
\mbox{} - \frac{1}{x} \frac{1}{n+1} Z(n-1)
(-1) \sum\limits_{i=1}^{n+1}
\left( \begin{array}{c} n+1 \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c-1)^m} i S(i,...)
\]](form_281.png)
![\[
+ \frac{1}{x} \frac{1}{n+1} Z(n-1)
(-1) \sum\limits_{i=1}^{n+1}
\left( \begin{array}{c} n+1 \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c-1)^m} \frac{x_1^i}{i^{m_1-1}} S(i;m_2,...)
\]](form_282.png)
This routine is called from eval/adjust_summation_index only for 
| ex shift_plus_one | ( | void | ) | const |
This routine performs the substitution index -> index - 1. The formula used is
![\[
\mbox{} - \sum\limits_{i=1}^{n}
\left( \begin{array}{c} n \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c)^m}
\frac{\Gamma(i+a_1+b_1\varepsilon)}{\Gamma(i+c_1+d_1\varepsilon)} ...
S(i+o,m_1,...,m_l,x_1,...,x_l)
\]](form_274.png)
![\[
= (-x) n (-1)
\sum\limits_{i=1}^{n-1}
\left( \begin{array}{c} n-1 \\ i \\ \end{array} \right)
\left( -1 \right)^i
\frac{x^i}{(i+c+1)^m}
\frac{\Gamma(i+a_1+1+b_1\varepsilon)}{\Gamma(i+c_1+1+d_1\varepsilon)} ...
\frac{1}{i+1}
S(i+o+1,m_1,...,m_l,x_1,...,x_l)
\]](form_275.png)
![\[
+ n \frac{x}{(c+1)^m}
\frac{\Gamma(a_1+1+b_1\varepsilon)}{\Gamma(c_1+1+d_1\varepsilon)} ...
S(o+1,m_1,...,m_l,x_1,...,x_l)
Z(n-1)
\]](form_276.png)
|
virtual |
No substitutions necessary.