Happy New Year!
[ginac.git] / ginac / power.h
1 /** @file power.h
2  *
3  *  Interface to GiNaC's symbolic exponentiation (basis^exponent). */
4
5 /*
6  *  GiNaC Copyright (C) 1999-2019 Johannes Gutenberg University Mainz, Germany
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21  */
22
23 #ifndef GINAC_POWER_H
24 #define GINAC_POWER_H
25
26 #include "basic.h"
27 #include "ex.h"
28 #include "archive.h"
29
30 namespace GiNaC {
31
32 class numeric;
33 class add;
34 class mul;
35
36 /** This class holds a two-component object, a basis and and exponent
37  *  representing exponentiation. */
38 class power : public basic
39 {
40         GINAC_DECLARE_REGISTERED_CLASS(power, basic)
41         
42         friend class mul;
43         
44 // member functions
45         
46         // other constructors
47 public:
48         power(const ex & lh, const ex & rh) :  basis(lh), exponent(rh) {}
49         template<typename T> power(const ex & lh, const T & rh) :  basis(lh), exponent(rh) {}
50         
51         // functions overriding virtual functions from base classes
52 public:
53         unsigned precedence() const override {return 60;}
54         bool info(unsigned inf) const override;
55         size_t nops() const override;
56         ex op(size_t i) const override;
57         ex map(map_function & f) const override;
58         bool is_polynomial(const ex & var) const override;
59         int degree(const ex & s) const override;
60         int ldegree(const ex & s) const override;
61         ex coeff(const ex & s, int n = 1) const override;
62         ex eval() const override;
63         ex evalf() const override;
64         ex evalm() const override;
65         ex series(const relational & s, int order, unsigned options = 0) const override;
66         ex subs(const exmap & m, unsigned options = 0) const override;
67         bool has(const ex & other, unsigned options = 0) const override;
68         ex normal(exmap & repl, exmap & rev_lookup) const override;
69         ex to_rational(exmap & repl) const override;
70         ex to_polynomial(exmap & repl) const override;
71         ex conjugate() const override;
72         ex real_part() const override;
73         ex imag_part() const override;
74         /** Save (a.k.a. serialize) object into archive. */
75         void archive(archive_node& n) const override;
76         /** Read (a.k.a. deserialize) object from archive. */
77         void read_archive(const archive_node& n, lst& syms) override;
78 protected:
79         ex derivative(const symbol & s) const override;
80         ex eval_ncmul(const exvector & v) const override;
81         unsigned return_type() const override;
82         return_type_t return_type_tinfo() const override;
83         ex expand(unsigned options = 0) const override;
84         
85         // new virtual functions which can be overridden by derived classes
86         // none
87         
88         // non-virtual functions in this class
89 protected:
90         void print_power(const print_context & c, const char *powersymbol, const char *openbrace, const char *closebrace, unsigned level) const;
91         void do_print_dflt(const print_dflt & c, unsigned level) const;
92         void do_print_latex(const print_latex & c, unsigned level) const;
93         void do_print_csrc(const print_csrc & c, unsigned level) const;
94         void do_print_python(const print_python & c, unsigned level) const;
95         void do_print_python_repr(const print_python_repr & c, unsigned level) const;
96         void do_print_csrc_cl_N(const print_csrc_cl_N & c, unsigned level) const;
97
98         static ex expand_add(const add & a, long n, unsigned options);
99         static ex expand_add_2(const add & a, unsigned options);
100         static ex expand_mul(const mul & m, const numeric & n, unsigned options, bool from_expand = false);
101         
102 // member variables
103         
104 protected:
105         ex basis;
106         ex exponent;
107 };
108 GINAC_DECLARE_UNARCHIVER(power); 
109
110 // wrapper functions
111
112 /** Symbolic exponentiation.  Returns a power-object as a new expression.
113  *
114  *  @param b the basis expression
115  *  @param e the exponent expression */
116 inline ex pow(const ex & b, const ex & e)
117 {
118         return dynallocate<power>(b, e);
119 }
120 template<typename T1, typename T2>
121 inline ex pow(const T1 & b, const T2 & e)
122 {
123         return dynallocate<power>(ex(b), ex(e));
124 }
125
126 /** Square root expression.  Returns a power-object with exponent 1/2. */
127 inline ex sqrt(const ex & a)
128 {
129         extern const ex _ex1_2;
130         return power(a,_ex1_2);
131 }
132
133 } // namespace GiNaC
134
135 #endif // ndef GINAC_POWER_H