Nestedsums library
transcendental_sum_type_C Class Reference

The class transcendental_sum_type_C involves a conjugation. More...

#include <transcendental_C.h>

Inheritance diagram for transcendental_sum_type_C:

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
 

Detailed Description

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)}
 \]

\[
    \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)
 \]

Here, $c$, $o$ and all $a_j$ and $c_j$ are integers. In addition $c$ is non-negative or $c \ge o $.

The upper summation limit should not be infinity.

Member Function Documentation

◆ distribute_over_letter()

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.

◆ distribute_over_subsum()

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:

  • If an object is of type basic_letter and the difference of its index with the index member is an integer, it is combined with the letter member. Otherwise it is taken out of the sum.
  • If an object is of type list_of_tgamma and the difference of its index with the index member is an integer, it is combined with the lst_of_gammas member. Otherwise it is taken out of the sum.
  • If an object is of type Ssum and the difference of its index with the index member is an integer, it is stays inside the subsum. Otherwise it is taken out of the sum.
  • If an object is of type Zsum and the difference of its index with the index member is an integer, it is converted to an Ssum and stays inside the subsum. Otherwise it is taken out of the sum.

◆ eval()

ex eval ( ) const
override

Simplifications, which are always performed are:

  • If subsum is equal to 1, the subsum is replaced with S(i).
  • If subsum is not of type Ssum, the routine distribute_over_subsum is called.
  • If the difference of the upper summation index of the Ssum with the index member is not an integer, the Ssum is taken out of the sum. The subsum is replaced with S(i).
  • If letter is not of type basic_letter, the routine distribute_over_letter is called.
  • If the difference of the index of the basic_letter with the index member is not zero, the index in basic_letter is adjusted.
  • If the difference of the index of lst_of_gammas with the index member is not zero, the index in lst_of_gammas is adjusted.

If flag_expand_status == expand_status::expansion_required, the evaluation routine performs a set of consistency checks:

  • It adjusts the upper summation limit in subsum to index. If $ o > 0 $ the function Ssum::adjust_upper_limit_downwards(index) is used. If $ o < 0 $ the function shift_plus_one() is called.
  • It checks, that letter does not give rise to poles (e.g. that the offset $c$ is a non-negative integer or a negative integer larger or equal to $c \ge o $).
  • It checks, that the $a_j$ in the Gamma functions are integers.

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,...)
\]

with $c \ge 0$. Here eval adjusts the offset. In the case $c > 0$ the function shift_minus_one() is called. The function shift_minus_one() does not change the upper summation limit of the subsum (this avoids an infinite recursion).

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,...)
\]

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 $m$ is negative. In that case the function shift_plus_one() is called. We then can assume that $m$ is non-negative and that the subsum does not contain negative degrees. $S(i,...)$ is then rewritten as

\[
   S(i;m_1,...,m_k;x_1,...,x_k) 
\]

\[
   = S(N;m_1,...,m_k;x_1,...,x_k) 
\]

\[
    \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)
\]

\[
    + 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) 
\]

\[
    \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)
\]

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.

◆ eval_explicit()

ex eval_explicit ( ) const
virtual

Explicit evaluation

◆ eval_ncmul()

ex eval_ncmul ( const GiNaC::exvector & v) const
overrideprotected

No automatic simplifications

◆ get_key()

unsigned get_key ( void ) const
virtual

The hash key is calculated from the hash_data.

◆ hash_data()

ex hash_data ( void ) const
virtual

The summation index is a redundant variable and does not influence the hash_data.

◆ set_expansion()

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.

◆ shift_minus_one()

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,...)
\]

and performs the substitution index -> index + 1.

If $m \le 0 $ we use the binomial formula

\[
    \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,...)
\]

\[
   =
    \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,...)
\]

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)
\]

\[
    =
      \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)
\]

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,...)
\]

\[
    =
      \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}{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,...)
\]

This routine is called from eval/adjust_summation_index only for $c>0$.

◆ shift_plus_one()

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)
 \]

\[
   = (-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)
 \]

\[
  + 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) 
 \]

◆ subst_data()

ex subst_data ( void ) const
virtual

No substitutions necessary.


The documentation for this class was generated from the following files: