source: git/Singular/dyn_modules/python/Number.h @ fb1675

spielwiese
Last change on this file since fb1675 was fb1675, checked in by Hans Schoenemann <hannes@…>, 7 years ago
use include ".." for singular related .h, p8
  • Property mode set to 100644
File size: 6.4 KB
Line 
1#ifndef NUMBERCPP_HEADER
2#define NUMBERCPP_HEADER
3#include <boost/intrusive_ptr.hpp>
4#include "kernel/mod2.h"
5#include "coeffs/numbers.h"
6#include "kernel/polys.h"
7#include "polys/monomials/ring.h"
8using namespace boost;
9inline void intrusive_ptr_add_ref(ring r)
10{
11    r->ref++;
12    //Print("ref count after add: %d", r->ref);
13}
14inline void intrusive_ptr_release(ring r)
15{
16    if (r->ref<=0) rDelete(r);
17    else
18    {
19      r->ref--;
20    }
21    //Print("ref count after release: %d", r->ref);
22}
23
24enum poly_variant
25{
26  POLY_VARIANT_RING,
27  POLY_VARIANT_MODUL
28};
29template<poly_variant,class,class> class PolyBase;
30class Poly;
31//class TrivialErrorHandler;
32class Vector;
33class Number
34{
35 public:
36  friend Number operator+(const Number& n1, const Number& n2);
37  friend Number operator-(const Number& n1, const Number& n2);
38  friend Number operator/(const Number& n1, const Number& n2);
39  friend Number operator*(const Number& n1, const Number& n2);
40  friend bool operator==(const Number& n1, const Number& n2);
41  friend Number operator+(const Number& n1, int n2);
42  friend Number operator-(const Number& n1, int n2);
43  friend Number operator/(const Number& n1, int n2);
44  friend Number operator*(const Number& n1, int n2);
45  friend bool operator==(const Number& n1, int n2);
46  friend Number operator+(int n1, const Number& n2);
47  friend Number operator-(int n1, const Number& n2);
48  friend Number operator/(int n1, const Number& n2);
49  friend Number operator*(int n1, const Number& n2);
50  friend bool operator==(int n1, const Number& n2);
51  friend class Poly;
52  friend class Vector;
53  //friend class PolyBase<POLY_VARIANT_RING,Poly,TrivialErrorHandler>;
54//   friend class PolyBase <poly_variant variant,
55//   class create_type_input,
56//   class error_handle_traits>;
57   template <poly_variant,class,class> friend class PolyBase;
58  friend class PolyImpl;
59  number as_number() const
60  {
61    return n_Copy(n,r.get()->cf);
62  }
63  Number& operator=(const Number& n2)
64  {
65    //durch Reihenfolge Selbstzuweisungen berücksichtigt
66    number nc=n_Copy(n2.n,n2.r.get()->cf);
67    n_Delete(&n,r.get()->cf);
68    r=n2.r;
69    n=nc;
70    return *this;
71  }
72  Number operator-()
73  {
74    Number t(*this);
75    //t.n=n_Copy(n,r);
76    t.n=n_InpNeg(t.n,r.get()->cf);
77    return t;
78  }
79  Number& operator+=(const Number & n2)
80  {
81    if (r!=n2.r)
82    {
83      WerrorS("not the same ring");
84      return *this;
85    }
86    number nv=n_Add(n,n2.n,r.get()->cf);
87    n_Delete(&n,r.get()->cf);
88    n=nv;
89    return *this;
90  }
91  Number& operator*=(const Number & n2)
92  {
93    if (r!=n2.r)
94    {
95      WerrorS("not the same ring");
96      return *this;
97    }
98    number nv=n_Mult(n,n2.n,r.get()->cf);
99    n_Delete(&n,r.get()->cf);
100    n=nv;
101    return *this;
102  }
103  Number& operator-=(const Number & n2)
104  {
105    if (r!=n2.r)
106    {
107      WerrorS("not the same ring");
108      return *this;
109    }
110    number nv=n_Sub(n,n2.n,r.get()->cf);
111    n_Delete(&n,r.get()->cf);
112    n=nv;
113    return *this;
114  }
115  Number& operator/=(const Number & n2)
116  {
117    if (r!=n2.r)
118    {
119      WerrorS("not the same ring");
120      return *this;
121    }
122    number nv=n_Div(n,n2.n,r.get()->cf);
123    n_Delete(&n,r.get()->cf);
124    n=nv;
125    return *this;
126  }
127  Number& operator=(int n2)
128  {
129    n_Delete(&n,r.get()->cf);
130    n=n_Init(n2,r.get()->cf);
131    return *this;
132  }
133  Number& operator+=(int n2)
134  {
135    number n2n=n_Init(n2,r.get()->cf);
136    number nv=n_Add(n,n2n,r.get()->cf);
137    n_Delete(&n,r.get()->cf);
138    n_Delete(&n2n,r.get()->cf);
139    n=nv;
140    return *this;
141  }
142  Number& operator*=(int n2)
143  {
144    number n2n=n_Init(n2,r.get()->cf);
145    number nv=n_Mult(n,n2n,r.get()->cf);
146    n_Delete(&n,r.get()->cf);
147    n_Delete(&n2n,r.get()->cf);
148    n=nv;
149    return *this;
150  }
151  Number& operator-=(int n2)
152  {
153    number n2n=n_Init(n2,r.get()->cf);
154    number nv=n_Sub(n,n2n,r.get()->cf);
155    n_Delete(&n,r.get()->cf);
156    n_Delete(&n2n,r.get()->cf);
157    n=nv;
158    return *this;
159  }
160  Number& operator/=(int n2)
161  {
162    number n2n=n_Init(n2,r.get()->cf);
163    number nv=n_Div(n,n2n,r.get()->cf);
164    n_Delete(&n,r.get()->cf);
165    n_Delete(&n2n,r.get()->cf);
166    n=nv;
167    return *this;
168  }
169  Number()
170  {
171    r=currRing;
172    if (r.get()!=NULL)
173      n=n_Init(0,r.get()->cf);
174    else
175      n=(number) NULL;
176  }
177  Number(const Number & n)
178  {
179    r=n.r;
180    this->n=n_Copy(n.n,r.get()->cf);
181  }
182  Number(number n, ring r)
183  {
184    this->n=n_Copy(n,r->cf);
185    this->r=r;
186  }
187  Number(int n, ring r)
188  {
189    this->r=r;
190    this->n=n_Init(n,r->cf);
191  }
192  Number(int n, intrusive_ptr<ip_sring> r)
193  {
194    this->r=r;
195    this->n=n_Init(n,r.get()->cf);
196  }
197  explicit Number(int n)
198  {
199    r=currRing;
200    this->n=n_Init(n,r.get()->cf);
201  }
202  void write() const
203  {
204    number towrite=n;
205    n_Write(towrite,r.get()->cf);
206  }
207  ~Number()
208  {
209    if (r!=NULL)
210      n_Delete(&n,r.get()->cf);
211  }
212  ring getRing() const
213  {
214    return r.get();
215  }
216 protected:
217  number n;
218  intrusive_ptr<ip_sring> r;
219};
220
221inline Number operator+(const Number &n1, const Number& n2)
222{
223  Number erg(n1);
224  erg+=n2;
225  return erg;
226}
227inline Number operator*(const Number &n1, const Number& n2)
228{
229  Number erg(n1);
230  erg*=n2;
231  return erg;
232}
233inline Number operator-(const Number &n1, const Number& n2)
234{
235  Number erg(n1);
236  erg-=n2;
237  return erg;
238}
239inline Number operator/(const Number &n1, const Number& n2)
240{
241  Number erg(n1);
242  erg/=n2;
243  return erg;
244}
245inline bool operator==(const Number &n1, const Number& n2)
246{
247  if(n1.r!=n2.r)
248    return false;
249  return n_Equal(n1.n,n2.n,n1.r.get()->cf);
250}
251inline Number operator+(const Number &n1, int n2)
252{
253  Number erg(n1);
254  erg+=Number(n2,n1.r);
255  return erg;
256}
257inline Number operator*(const Number &n1, int n2)
258{
259  Number erg(n1);
260  erg*=Number(n2,n1.r);
261  return erg;
262}
263inline Number operator-(const Number &n1, int n2)
264{
265  Number erg(n1);
266  erg-=Number(n2,n1.r);
267  return erg;
268}
269inline Number operator/(const Number &n1, int n2)
270{
271  Number erg(n1);
272  erg/=Number(n2,n1.r);
273  return erg;
274}
275inline bool operator==(const Number &n1, int n2)
276{
277  return n_Equal(n1.n,Number(n2,n1.r).n,n1.r.get()->cf);
278}
279inline Number operator+(int n1, const Number& n2)
280{
281  Number erg(n2);
282  return erg+=Number(n1,n2.r);
283}
284inline Number operator-(int n1, const Number& n2)
285{
286  Number erg(n1,n2.r);
287  return erg-=n2;
288}
289inline Number operator/(int n1, const Number& n2)
290{
291  Number erg(n1,n2.r);
292  return erg/=n2;
293}
294inline Number operator*(int n1, const Number& n2)
295{
296  Number erg(n2);
297  return erg*=Number(n1,n2.r);
298}
299inline bool operator==(int n1, const Number& n2)
300{
301  return n2==Number(n1,n2.r);
302}
303#endif
Note: See TracBrowser for help on using the repository browser.