number.h
Go to the documentation of this file.
1 
7 #ifndef SYMENGINE_NUMBER_H
8 #define SYMENGINE_NUMBER_H
9 
10 #include <symengine/basic.h>
11 #include <symengine/assumptions.h>
12 
13 namespace SymEngine
14 {
15 
16 class Evaluate;
17 
18 class SYMENGINE_EXPORT Number : public Basic
19 {
20 public:
22  virtual bool is_zero() const = 0;
24  virtual bool is_one() const = 0;
26  virtual bool is_minus_one() const = 0;
28  virtual bool is_negative() const = 0;
30  virtual bool is_positive() const = 0;
32  virtual bool is_complex() const = 0;
34  virtual RCP<const Basic> conjugate() const;
36  // false if the number is an approximation
37  virtual bool is_exact() const
38  {
39  return true;
40  };
42  inline bool is_exact_zero() const
43  {
44  return is_exact() and is_zero();
45  };
47  virtual Evaluate &get_eval() const
48  {
49  throw NotImplementedError("Not Implemented.");
50  };
51 
53  virtual RCP<const Number> add(const Number &other) const = 0;
55  virtual RCP<const Number> sub(const Number &other) const;
56  virtual RCP<const Number> rsub(const Number &other) const;
58  virtual RCP<const Number> mul(const Number &other) const = 0;
60  virtual RCP<const Number> div(const Number &other) const;
61  virtual RCP<const Number> rdiv(const Number &other) const;
63  virtual RCP<const Number> pow(const Number &other) const = 0;
64  virtual RCP<const Number> rpow(const Number &other) const = 0;
65 
66  vec_basic get_args() const override
67  {
68  return {};
69  }
70 
71  virtual bool is_perfect_power(bool is_expected = false) const
72  {
73  throw NotImplementedError("Not Implemented.");
74  };
75  virtual bool nth_root(const Ptr<RCP<const Number>> &, unsigned long n) const
76  {
77  throw NotImplementedError("Not Implemented.");
78  };
79 };
81 inline RCP<const Number> addnum(const RCP<const Number> &self,
82  const RCP<const Number> &other)
83 {
84  return self->add(*other);
85 }
87 inline RCP<const Number> subnum(const RCP<const Number> &self,
88  const RCP<const Number> &other)
89 {
90  return self->sub(*other);
91 }
93 inline RCP<const Number> mulnum(const RCP<const Number> &self,
94  const RCP<const Number> &other)
95 {
96  return self->mul(*other);
97 }
99 inline RCP<const Number> divnum(const RCP<const Number> &self,
100  const RCP<const Number> &other)
101 {
102  return self->div(*other);
103 }
105 inline RCP<const Number> pownum(const RCP<const Number> &self,
106  const RCP<const Number> &other)
107 {
108  return self->pow(*other);
109 }
110 
111 inline void iaddnum(const Ptr<RCP<const Number>> &self,
112  const RCP<const Number> &other)
113 {
114  *self = addnum(*self, other);
115 }
116 
117 inline void imulnum(const Ptr<RCP<const Number>> &self,
118  const RCP<const Number> &other)
119 {
120  *self = mulnum(*self, other);
121 }
122 
123 inline void idivnum(const Ptr<RCP<const Number>> &self,
124  const RCP<const Number> &other)
125 {
126  *self = divnum(*self, other);
127 }
128 
130 inline bool is_a_Number(const Basic &b)
131 {
132  // `NumberWraper` is the last subclass of Number in TypeID
133  // An enum should be before `SYMENIGNE_NUMBER_WRAPPER` iff it is a
134  // subclass of Number
135  return b.get_type_code() <= SYMENGINE_NUMBER_WRAPPER;
136 }
137 
139 inline bool is_number_and_zero(const Basic &b)
140 {
141  return is_a_Number(b) and down_cast<const Number &>(b).is_zero();
142 }
143 
152 SYMENGINE_EXPORT tribool is_zero(const Basic &b,
153  const Assumptions *assumptions = nullptr);
162 SYMENGINE_EXPORT tribool is_nonzero(const Basic &b,
163  const Assumptions *assumptions = nullptr);
164 SYMENGINE_EXPORT tribool is_positive(const Basic &b,
165  const Assumptions *assumptions = nullptr);
166 
167 SYMENGINE_EXPORT
168 tribool is_nonpositive(const Basic &b,
169  const Assumptions *assumptions = nullptr);
170 SYMENGINE_EXPORT tribool is_negative(const Basic &b,
171  const Assumptions *assumptions = nullptr);
172 
173 SYMENGINE_EXPORT
174 tribool is_nonnegative(const Basic &b,
175  const Assumptions *assumptions = nullptr);
176 SYMENGINE_EXPORT tribool is_integer(const Basic &b,
177  const Assumptions *assumptions = nullptr);
178 SYMENGINE_EXPORT tribool is_real(const Basic &b,
179  const Assumptions *assumptions = nullptr);
180 SYMENGINE_EXPORT tribool is_complex(const Basic &b,
181  const Assumptions *assumptions = nullptr);
182 SYMENGINE_EXPORT tribool is_rational(const Basic &b);
183 SYMENGINE_EXPORT tribool is_irrational(const Basic &b);
184 SYMENGINE_EXPORT tribool is_finite(const Basic &b,
185  const Assumptions *assumptions = nullptr);
186 SYMENGINE_EXPORT tribool is_infinite(const Basic &b,
187  const Assumptions *assumptions = nullptr);
188 SYMENGINE_EXPORT tribool is_even(const Basic &b,
189  const Assumptions *assumptions = nullptr);
190 SYMENGINE_EXPORT tribool is_odd(const Basic &b,
191  const Assumptions *assumptions = nullptr);
192 SYMENGINE_EXPORT tribool is_algebraic(const Basic &b,
193  const Assumptions *assumptions = nullptr);
194 SYMENGINE_EXPORT tribool is_transcendental(const Basic &b,
195  const Assumptions *assumptions
196  = nullptr);
197 
198 class SYMENGINE_EXPORT NumberWrapper : public Number
199 {
200 public:
201  NumberWrapper(){SYMENGINE_ASSIGN_TYPEID()}
202 
203  IMPLEMENT_TYPEID(SYMENGINE_NUMBER_WRAPPER)
204 
205  virtual std::string __str__() const
206  {
207  throw NotImplementedError("Not Implemented.");
208  };
209  virtual RCP<const Number> eval(long bits) const
210  {
211  throw NotImplementedError("Not Implemented.");
212  };
213 };
214 
216 class Evaluate
217 {
218 public:
219  virtual RCP<const Basic> sin(const Basic &) const = 0;
220  virtual RCP<const Basic> cos(const Basic &) const = 0;
221  virtual RCP<const Basic> tan(const Basic &) const = 0;
222  virtual RCP<const Basic> cot(const Basic &) const = 0;
223  virtual RCP<const Basic> sec(const Basic &) const = 0;
224  virtual RCP<const Basic> csc(const Basic &) const = 0;
225  virtual RCP<const Basic> asin(const Basic &) const = 0;
226  virtual RCP<const Basic> acos(const Basic &) const = 0;
227  virtual RCP<const Basic> atan(const Basic &) const = 0;
228  virtual RCP<const Basic> acot(const Basic &) const = 0;
229  virtual RCP<const Basic> asec(const Basic &) const = 0;
230  virtual RCP<const Basic> acsc(const Basic &) const = 0;
231  virtual RCP<const Basic> sinh(const Basic &) const = 0;
232  virtual RCP<const Basic> csch(const Basic &) const = 0;
233  virtual RCP<const Basic> cosh(const Basic &) const = 0;
234  virtual RCP<const Basic> sech(const Basic &) const = 0;
235  virtual RCP<const Basic> tanh(const Basic &) const = 0;
236  virtual RCP<const Basic> coth(const Basic &) const = 0;
237  virtual RCP<const Basic> asinh(const Basic &) const = 0;
238  virtual RCP<const Basic> acsch(const Basic &) const = 0;
239  virtual RCP<const Basic> acosh(const Basic &) const = 0;
240  virtual RCP<const Basic> atanh(const Basic &) const = 0;
241  virtual RCP<const Basic> acoth(const Basic &) const = 0;
242  virtual RCP<const Basic> asech(const Basic &) const = 0;
243  virtual RCP<const Basic> log(const Basic &) const = 0;
244  virtual RCP<const Basic> gamma(const Basic &) const = 0;
245  virtual RCP<const Basic> abs(const Basic &) const = 0;
246  virtual RCP<const Basic> exp(const Basic &) const = 0;
247  virtual RCP<const Basic> floor(const Basic &) const = 0;
248  virtual RCP<const Basic> ceiling(const Basic &) const = 0;
249  virtual RCP<const Basic> truncate(const Basic &) const = 0;
250  virtual RCP<const Basic> erf(const Basic &) const = 0;
251  virtual RCP<const Basic> erfc(const Basic &) const = 0;
252 };
253 
254 } // namespace SymEngine
255 
256 #endif
The base class for SymEngine.
#define IMPLEMENT_TYPEID(SYMENGINE_ID)
Inline members and functions.
Definition: basic.h:344
The lowest unit of symbolic representation.
Definition: basic.h:97
A class that will evaluate functions numerically.
Definition: number.h:217
virtual Evaluate & get_eval() const
Get Evaluate singleton to evaluate numerically.
Definition: number.h:47
virtual RCP< const Number > mul(const Number &other) const =0
Multiplication.
virtual bool is_one() const =0
virtual bool is_complex() const =0
virtual bool is_exact() const
return true if the number is an exact representation
Definition: number.h:37
virtual RCP< const Number > add(const Number &other) const =0
Addition.
virtual RCP< const Number > pow(const Number &other) const =0
Power.
virtual bool is_negative() const =0
bool is_exact_zero() const
Definition: number.h:42
virtual bool is_positive() const =0
virtual bool is_zero() const =0
virtual bool is_minus_one() const =0
vec_basic get_args() const override
Returns the list of arguments.
Definition: number.h:66
Main namespace for SymEngine package.
Definition: add.cpp:19
bool is_a_Number(const Basic &b)
Definition: number.h:130
bool is_number_and_zero(const Basic &b)
Definition: number.h:139
RCP< const Number > mulnum(const RCP< const Number > &self, const RCP< const Number > &other)
Multiply self and other
Definition: number.h:93
RCP< const Number > pownum(const RCP< const Number > &self, const RCP< const Number > &other)
Raise self to power other
Definition: number.h:105
RCP< const Basic > conjugate(const RCP< const Basic > &arg)
Canonicalize Conjugate.
Definition: functions.cpp:149
RCP< const Number > divnum(const RCP< const Number > &self, const RCP< const Number > &other)
Divide self and other
Definition: number.h:99
RCP< const Number > subnum(const RCP< const Number > &self, const RCP< const Number > &other)
Subtract self and other
Definition: number.h:87
RCP< const Basic > sub(const RCP< const Basic > &a, const RCP< const Basic > &b)
Substracts b from a.
Definition: add.cpp:495
SYMENGINE_EXPORT tribool is_nonzero(const Basic &b, const Assumptions *assumptions=nullptr)
Check if a number is non-zero.
RCP< const Basic > div(const RCP< const Basic > &a, const RCP< const Basic > &b)
Division.
Definition: mul.cpp:431
RCP< const Number > addnum(const RCP< const Number > &self, const RCP< const Number > &other)
Add self and other
Definition: number.h:81