Nestedsums library
Zsum Class Reference

Zsums form a Hopf algebra. More...

#include <Zsum.h>

Inheritance diagram for Zsum:
Euler_Zagier_sum multiple_polylog multiple_zeta_value harmonic_polylog multiple_zeta_value nielsen_polylog classical_polylog

Public Member Functions

 Zsum (const GiNaC::ex &nc)
 
 Zsum (const GiNaC::ex &nc, const GiNaC::ex &llc)
 
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 convert_to_Ssum_exvector (const GiNaC::exvector &Z0, const GiNaC::exvector &Z1) const
 
virtual GiNaC::ex shuffle_exvector (const GiNaC::exvector &Z0, const GiNaC::exvector &Z1, const GiNaC::exvector &Z2) const
 
virtual GiNaC::ex set_index (const GiNaC::ex &i) const
 
virtual GiNaC::ex shift_plus_one (void) const
 
virtual GiNaC::ex shift_minus_one (void) const
 
virtual GiNaC::ex adjust_upper_limit_downwards (const GiNaC::ex &i) const
 
virtual GiNaC::ex adjust_upper_limit_upwards (const GiNaC::ex &i) const
 
virtual GiNaC::ex adjust_upper_limit_plus_one (void) const
 
virtual GiNaC::ex index_eq_one (void) const
 
virtual GiNaC::ex get_head (int k) const
 
virtual GiNaC::ex get_tail (int k) const
 
virtual GiNaC::ex antipode (void) const
 
virtual GiNaC::ex expand_members (int level=0) const
 
virtual GiNaC::ex eval_explicit () const
 
virtual GiNaC::ex get_first_letter (void) const
 
virtual GiNaC::ex remove_first_letter (void) const
 
virtual GiNaC::ex remove_first_letter (const GiNaC::ex &nc) const
 
virtual GiNaC::ex prepend_letter (const GiNaC::ex &lc) const
 
virtual GiNaC::ex prepend_letter (const GiNaC::ex &nc, const GiNaC::ex &lc) const
 
virtual GiNaC::ex append_letter (const GiNaC::ex &lc) const
 
virtual GiNaC::ex append_letter_list (const GiNaC::ex &lc) const
 
GiNaC::ex get_index (void) const
 
GiNaC::ex get_letter_list (void) const
 
unsigned get_depth (void) const
 
GiNaC::ex get_weight (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
 
virtual GiNaC::ex cast_to_Ssum (void) const
 
virtual GiNaC::ex multiply_letter_with_last_letter (const GiNaC::ex &lc) const
 
virtual GiNaC::ex multiply_letter_with_first_letter (const GiNaC::ex &lc) const
 
virtual GiNaC::ex concat_two_sums (const GiNaC::ex &Z1, const GiNaC::ex &Z2) const
 

Protected Attributes

GiNaC::ex n
 
GiNaC::ex letter_list
 

Friends

GiNaC::ex shuffle_Zsum (const GiNaC::ex &Z1, const GiNaC::ex &Z2)
 
GiNaC::ex convert_Zsum_to_Ssum (const GiNaC::ex &Z1)
 
GiNaC::ex remove_trivial_Zsum (const GiNaC::ex &expr)
 

Detailed Description

Zsums form a Hopf algebra.

A Zsum is recursively defined by

\[
    Z(n;m_1,...,m_k;x_1,...,x_k) = \sum\limits_{i=1}^n \frac{x_1^i}{i^{m_1}} Z(i-1;m_2,...,m_k;x_2,...,x_k)
 \]

with

\[
    Z(n) = 1
 \]

for $ n \ge 0 $ and

\[
    Z(n) = 0
 \]

for $ n < 0 $

All letters should have their index set to _default_index.

Member Function Documentation

◆ adjust_upper_limit_downwards()

ex adjust_upper_limit_downwards ( const GiNaC::ex & i) const
virtual

Adjusts the upper summation limit $n$ down to $i$, e.g.

\[
    Z(n;m_1,...;x_1,...) = Z(i;m_1,...;x_1,...) 
     + \sum\limits_{j=1}^{n-i} x_1^j \frac{x_1^i}{(i+j)^{m_1}} Z(i-1+j;m_2,...;x_2,...)
\]

with $n > i $.

For the empty sum we have

\[
    Z(n) = Z(i)
\]

This routine assumes $ i \ge 0 $.

Reimplemented in Euler_Zagier_sum.

◆ adjust_upper_limit_plus_one()

ex adjust_upper_limit_plus_one ( void ) const
virtual

Adjusts the upper summation limit $n$ to $n+1$, e.g.

\[
    Z(n;m_1,...;x_1,...) = Z(n+1;m_1,...;x_1,...) 
     \mbox{} - \frac{x_1^{n+1}}{(n+1)^{m_1}} Z(n;m_2,...;x_2,...).
\]

Reimplemented in Euler_Zagier_sum.

◆ adjust_upper_limit_upwards()

ex adjust_upper_limit_upwards ( const GiNaC::ex & i) const
virtual

Adjusts the upper summation limit $n$ up to $i$, e.g.

\[
    Z(n;m_1,...;x_1,...) = Z(i;m_1,...;x_1,...) 
     \mbox{} - \sum\limits_{j=0}^{i-n-1} x_1^{-j} \frac{x_1^i}{(i-j)^{m_1}} Z(i-j-1;m_2,...;x_2,...)
\]

with $n < i $.

For the empty sum we have

\[
    Z(n) = Z(i)
\]

This routine assumes $ n \ge 0 $.

This routine might give rise to poles for some values of $i$ and should be used with care.

Reimplemented in Euler_Zagier_sum.

◆ antipode()

ex antipode ( void ) const
virtual

Calculates the antipode.

Only for Zsums.

◆ append_letter()

ex append_letter ( const GiNaC::ex & lc) const
virtual

Appends the letter lc to the letter_list.

◆ append_letter_list()

ex append_letter_list ( const GiNaC::ex & lc) const
virtual

Appends the list lc to the letter_list.

◆ cast_to_Ssum()

ex cast_to_Ssum ( void ) const
protectedvirtual

Creates a Ssum with the same upper summation index and the same letter_list.

This is a crude cast, something like reinterpret_cast.

◆ concat_two_sums()

ex concat_two_sums ( const GiNaC::ex & Z1,
const GiNaC::ex & Z2 ) const
protectedvirtual

Takes Z1 as head and Z2 as tail and forms a new sum as the concatenation of the two.

◆ convert_to_Ssum_exvector()

ex convert_to_Ssum_exvector ( const GiNaC::exvector & Z0,
const GiNaC::exvector & Z1 ) const
virtual

Method to convert a Zsum to a Ssum.

An efficient version for the conversion to Ssums, based on exvector (e.g. std::vector<GiNaC::ex> ). Z0 contains the result. Z1 is reversed order, so that we can use pop_back.

The basic formula is

\[
   Z(n;m_1,...;x_1,...) = \sum\limits_{i=1}^n \frac{x_1^i}{i^{m_1}} Z(i;m_2,...;x_2,...)
    \mbox{} - Z(n;m_1+m_2,...;x_1 x_2, ...)
\]

Reimplemented in Euler_Zagier_sum.

◆ eval()

ex eval ( ) const
override

The simplifications are done in the following order:

  • If the upper summation limit is equal to infinity, we have a multiple polylog.
  • If all $x_j$'s are equal to 1, we have a Euler-Zagier sum.
  • If the upper summation index is an integer, perform the sum explicitly.

◆ eval_explicit()

ex eval_explicit ( ) const
virtual

Explicit evaluation

◆ eval_ncmul()

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

A product of Zsums is simplified, if the last two have the same upper summation index. The function shuffle_Zsum is called for the multiplication.

A product is also simplified if the difference between the two upper summation indices is an integer. The factor with the "larger" upper summation index is converted to the "smaller" index with the help of the function Zsum::adjust_upper_limit_downwards. Note that the algorithm returns a product, where both factors have the "smaller" index.

◆ get_depth()

unsigned get_depth ( void ) const
inline

Returns the depth.

◆ get_first_letter()

ex get_first_letter ( void ) const
virtual

Returns the first letter from the letter_list.

◆ get_head()

ex get_head ( int k) const
virtual

Returns from the Z-sum $ Z(n;m_1,...,m_l;x_1,...,x_l) $ the head $ Z(n;m_1,...,m_{k-1};x_1,...,x_{k-1}) $.

◆ get_index()

GiNaC::ex get_index ( void ) const
inline

Returns the upper summation limit.

◆ get_letter_list()

GiNaC::ex get_letter_list ( void ) const
inline

Returns the letter_list.

◆ get_tail()

ex get_tail ( int k) const
virtual

Returns from the Z-sum $ Z(n;m_1,...,m_l;x_1,...,x_l) $ the tail $ Z(n;m_k,...,m_l;x_k,...,x_l) $.

◆ get_weight()

ex get_weight ( void ) const

Returns the weight.

◆ index_eq_one()

ex index_eq_one ( void ) const
virtual

Returns

\[
    Z(1;m_1,...,m_k;x_1,...,x_k) = 0
\]

for $k>1$. For $k=1$ it returns

\[
   x_1
\]

and for $k=0$ we have

\[
   1
\]

◆ multiply_letter_with_first_letter()

ex multiply_letter_with_first_letter ( const GiNaC::ex & lc) const
protectedvirtual

Returns a Zsum, where the letter lc is multiplied with the first letter in the letter list of the original Zsum.

If the sum is empty, e.g. $Z(n)$, the result is $\frac{x^n}{n^m} Z(n)$.

◆ multiply_letter_with_last_letter()

ex multiply_letter_with_last_letter ( const GiNaC::ex & lc) const
protectedvirtual

Returns a Zsum, where the letter lc is multiplied with the last letter in the letter list of the original Zsum.

If the sum is empty, e.g. $Z(n)$, the result is $\frac{x^n}{n^m} Z(n)$.

◆ remove_first_letter()

ex remove_first_letter ( void ) const
virtual

Returns a Zsum with the first letter removed from the letter_list.

Reimplemented in Euler_Zagier_sum.

◆ set_index()

ex set_index ( const GiNaC::ex & i) const
virtual

Sets the upper summation index to $i$

Reimplemented in Euler_Zagier_sum.

◆ shift_minus_one()

ex shift_minus_one ( void ) const
virtual

Returns $Z(n-1,m_1,...,x_1,...)$

Reimplemented in Euler_Zagier_sum.

◆ shift_plus_one()

ex shift_plus_one ( void ) const
virtual

Returns $Z(n+1,m_1,...,x_1,...)$

Reimplemented in Euler_Zagier_sum.

◆ shuffle_exvector()

ex shuffle_exvector ( const GiNaC::exvector & Z0,
const GiNaC::exvector & Z1,
const GiNaC::exvector & Z2 ) const
virtual

Method to multiply two Zsums.

An efficient version for the multiplication of Zsums, based on exvector (e.g. std::vector<GiNaC::ex> ). Z0 contains the result. Z1 and Z2 are in reversed order, so that we can use pop_back.

The basic formula is

\[
   Z(n;m_1,...;x_1,...) Z(n;m_1',...;x_1',...) 
     = \sum\limits_{i=1}^n \frac{x_1^i}{i^{m_1}} Z(i-1;m_2,...;x_2,...) Z(i-1;m_1',...;x_1',...)
\]

\[
     \mbox{} + \sum\limits_{i=1}^n \frac{{x_1'}^i}{i^{m_1'}} Z(i-1;m_1,...;x_1,...) Z(i-1;m_2',...;x_2',...)
     \mbox{} + \sum\limits_{i=1}^n \frac{(x_1 {x_1'})^i}{i^{m_1+m_1'}} Z(i-1;m_2,...;x_2,...) Z(i-1;m_2',...;x_2',...)
\]

Reimplemented in Euler_Zagier_sum.


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