source: git/kernel/old.Number.h @ fbc7cb

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