Nestedsums library
Zsum.h
Go to the documentation of this file.
1
8/*
9 * Copyright (C) 2001-2017 Stefan Weinzierl
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 */
25
26#ifndef __NESTEDSUMS_ZSUM_H__
27#define __NESTEDSUMS_ZSUM_H__
28
29#include "ginac/ginac.h"
30
31namespace nestedsums {
32
34
53 class Zsum : public GiNaC::basic
54 {
55
56 GINAC_DECLARE_REGISTERED_CLASS(Zsum, GiNaC::basic)
57
58 // ctors
59 public:
60 explicit Zsum(const GiNaC::ex & nc);
61 Zsum(const GiNaC::ex & nc, const GiNaC::ex & llc);
62
63 // functions overriding virtual functions from bases classes
64 public:
65 void archive(GiNaC::archive_node &node) const override;
66 void read_archive(const GiNaC::archive_node &node, GiNaC::lst &sym_lst) override;
67
68 unsigned return_type(void) const override { return GiNaC::return_types::noncommutative; }
69
70 void print(const GiNaC::print_context & c, unsigned level = 0) const override;
71 unsigned precedence(void) const override {return 60;}
72 GiNaC::ex eval() const override;
73 GiNaC::ex subs(const GiNaC::exmap & m, unsigned options = 0) const override;
74
75 protected:
76 GiNaC::ex eval_ncmul(const GiNaC::exvector & v) const override;
77 GiNaC::ex derivative(const GiNaC::symbol & s) const override;
78 unsigned calchash(void) const override;
79
80 // new virtual functions which can be overridden by derived classes
81 public :
82 virtual GiNaC::ex convert_to_Ssum_exvector(const GiNaC::exvector & Z0, const GiNaC::exvector & Z1) const;
83 virtual GiNaC::ex shuffle_exvector(const GiNaC::exvector & Z0, const GiNaC::exvector & Z1, const GiNaC::exvector & Z2) const;
84
85 virtual GiNaC::ex set_index(const GiNaC::ex & i) const;
86 virtual GiNaC::ex shift_plus_one(void) const;
87 virtual GiNaC::ex shift_minus_one(void) const;
88 virtual GiNaC::ex adjust_upper_limit_downwards(const GiNaC::ex & i) const;
89 virtual GiNaC::ex adjust_upper_limit_upwards(const GiNaC::ex & i) const;
90 virtual GiNaC::ex adjust_upper_limit_plus_one(void) const;
91 virtual GiNaC::ex index_eq_one(void) const;
92
93 virtual GiNaC::ex get_head(int k) const;
94 virtual GiNaC::ex get_tail(int k) const;
95
96 virtual GiNaC::ex antipode(void) const;
97
98 virtual GiNaC::ex expand_members(int level = 0) const;
99 virtual GiNaC::ex eval_explicit() const;
100
101 virtual GiNaC::ex get_first_letter(void) const;
102 virtual GiNaC::ex remove_first_letter(void) const;
103 virtual GiNaC::ex remove_first_letter(const GiNaC::ex & nc) const;
104 virtual GiNaC::ex prepend_letter(const GiNaC::ex & lc) const;
105 virtual GiNaC::ex prepend_letter(const GiNaC::ex & nc, const GiNaC::ex & lc) const;
106 virtual GiNaC::ex append_letter(const GiNaC::ex & lc) const;
107 virtual GiNaC::ex append_letter_list(const GiNaC::ex & lc) const;
108
109 protected:
110 virtual GiNaC::ex cast_to_Ssum(void) const;
111
112 virtual GiNaC::ex multiply_letter_with_last_letter(const GiNaC::ex & lc) const;
113 virtual GiNaC::ex multiply_letter_with_first_letter(const GiNaC::ex & lc) const;
114 virtual GiNaC::ex concat_two_sums(const GiNaC::ex & Z1, const GiNaC::ex & Z2) const;
115
116 // non-virtual functions
117 public :
118 GiNaC::ex get_index(void) const;
119 GiNaC::ex get_letter_list(void) const;
120 unsigned get_depth(void) const;
121 GiNaC::ex get_weight(void) const;
122
123 protected:
124
125
126 // friends :
127 friend GiNaC::ex shuffle_Zsum(const GiNaC::ex & Z1, const GiNaC::ex & Z2);
128 friend GiNaC::ex convert_Zsum_to_Ssum(const GiNaC::ex & Z1);
129 friend GiNaC::ex remove_trivial_Zsum(const GiNaC::ex & expr);
130
131 // member variables :
132
133 protected:
134
135 GiNaC::ex n;
136 GiNaC::ex letter_list;
137 };
138
139GINAC_DECLARE_UNARCHIVER(Zsum);
140
141 // inline functions
142
148inline GiNaC::ex Zsum::get_index(void) const
149 {
150 return n;
151 }
152
158inline GiNaC::ex Zsum::get_letter_list(void) const
159 {
160 return letter_list;
161 }
162
168inline unsigned Zsum::get_depth(void) const
169 {
170 return letter_list.nops();
171 }
172
178inline GiNaC::ex create_Zsum(const GiNaC::ex & nc, const GiNaC::ex & llc)
179 {
180 return (new Zsum(nc,llc))->setflag(GiNaC::status_flags::dynallocated);
181 }
182
183 GiNaC::ex shuffle_Zsum(const GiNaC::ex & Z1, const GiNaC::ex & Z2);
184
185 GiNaC::ex convert_Zsum_to_Ssum(const GiNaC::ex & Z1);
186
187 GiNaC::ex create_Zsum_from_exvector(const GiNaC::ex & nc, const GiNaC::exvector & v);
188
189 GiNaC::ex Zsum_to_Ssum(const GiNaC::ex & expr);
190
191 GiNaC::ex shift_upper_limit_plus_one_for_Zsum(const GiNaC::ex & expr);
192
193 GiNaC::ex remove_negative_degrees_from_Zsum(const GiNaC::ex & expr);
194
195 GiNaC::ex remove_trivial_Zsum(const GiNaC::ex & expr);
196
197} // namespace nestedsums
198
199#endif // ndef __NESTEDSUMS_ZSUM_H__
Zsums form a Hopf algebra.
Definition Zsum.h:54
unsigned get_depth(void) const
Definition Zsum.h:168
virtual GiNaC::ex get_first_letter(void) const
Definition Zsum.cc:402
GiNaC::ex get_weight(void) const
Definition Zsum.cc:914
virtual GiNaC::ex get_tail(int k) const
Definition Zsum.cc:748
GiNaC::ex eval_ncmul(const GiNaC::exvector &v) const override
Definition Zsum.cc:209
GiNaC::ex get_letter_list(void) const
Definition Zsum.h:158
virtual GiNaC::ex cast_to_Ssum(void) const
Definition Zsum.cc:562
virtual GiNaC::ex remove_first_letter(void) const
Definition Zsum.cc:415
virtual GiNaC::ex append_letter_list(const GiNaC::ex &lc) const
Definition Zsum.cc:535
virtual GiNaC::ex eval_explicit() const
Definition Zsum.cc:879
virtual GiNaC::ex index_eq_one(void) const
Definition Zsum.cc:712
virtual GiNaC::ex concat_two_sums(const GiNaC::ex &Z1, const GiNaC::ex &Z2) const
Definition Zsum.cc:849
virtual GiNaC::ex multiply_letter_with_first_letter(const GiNaC::ex &lc) const
Definition Zsum.cc:824
virtual GiNaC::ex shuffle_exvector(const GiNaC::exvector &Z0, const GiNaC::exvector &Z1, const GiNaC::exvector &Z2) const
Definition Zsum.cc:352
virtual GiNaC::ex convert_to_Ssum_exvector(const GiNaC::exvector &Z0, const GiNaC::exvector &Z1) const
Definition Zsum.cc:296
virtual GiNaC::ex adjust_upper_limit_plus_one(void) const
Definition Zsum.cc:683
virtual GiNaC::ex append_letter(const GiNaC::ex &lc) const
Definition Zsum.cc:511
GiNaC::ex eval() const override
Definition Zsum.cc:176
GiNaC::ex get_index(void) const
Definition Zsum.h:148
virtual GiNaC::ex shift_plus_one(void) const
Definition Zsum.cc:582
virtual GiNaC::ex shift_minus_one(void) const
Definition Zsum.cc:592
virtual GiNaC::ex antipode(void) const
Definition Zsum.cc:773
virtual GiNaC::ex set_index(const GiNaC::ex &i) const
Definition Zsum.cc:572
virtual GiNaC::ex get_head(int k) const
Definition Zsum.cc:724
virtual GiNaC::ex adjust_upper_limit_upwards(const GiNaC::ex &i) const
Definition Zsum.cc:654
virtual GiNaC::ex adjust_upper_limit_downwards(const GiNaC::ex &i) const
Definition Zsum.cc:614
virtual GiNaC::ex multiply_letter_with_last_letter(const GiNaC::ex &lc) const
Definition Zsum.cc:797
Definition basic_letter.cc:35
ex remove_negative_degrees_from_Zsum(const ex &expr)
Definition Zsum.cc:1098
ex convert_Zsum_to_Ssum(const ex &Z1)
Definition Zsum.cc:978
ex shuffle_Zsum(const ex &Z1, const ex &Z2)
Definition Zsum.cc:939
ex Zsum_to_Ssum(const ex &expr)
Definition Zsum.cc:1026
ex remove_trivial_Zsum(const ex &expr)
Definition Zsum.cc:1144
GiNaC::ex create_Zsum(const GiNaC::ex &nc, const GiNaC::ex &llc)
Definition Zsum.h:178
ex create_Zsum_from_exvector(const ex &nc, const exvector &v)
Definition Zsum.cc:1009
ex shift_upper_limit_plus_one_for_Zsum(const ex &expr)
Definition Zsum.cc:1062