source: git/kernel/old.Number.h @ 210e07

spielwiese
Last change on this file since 210e07 was 210e07, checked in by Oleksandr Motsak <motsak@…>, 13 years ago
ADD: testing headers with "make test.o" FIX: cleaning up headers in kernel: TODO: kutil.h?! FIX: febase.h -> old.febase.h (remove later on) ADD: dummy headers instead of some splited or moved: febase.h, modulop.h (for later fixing) FIX: renamed various obsolette files into "old.*"
  • Property mode set to 100644
File size: 6.1 KB
RevLine 
[f28d81]1#ifndef NUMBERCPP_HEADER
2#define NUMBERCPP_HEADER
[547474]3#include <boost/intrusive_ptr.hpp>
[599326]4#include <kernel/mod2.h>
[210e07]5#include <coeffs/numbers.h>
[599326]6#include <kernel/febase.h>
[210e07]7#include <polys/monomials/ring.h>
[547474]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}
[d78c4c]21
[ecbe9f7]22enum poly_variant{
[77ed994]23  POLY_VARIANT_RING,
24  POLY_VARIANT_MODUL
[ecbe9f7]25};
[8457864]26template<poly_variant,class,class> class PolyBase;
[c1e4cd]27class Poly;
[8457864]28//class TrivialErrorHandler;
[82f499]29class Vector;
[d78c4c]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);
[c1e4cd]48  friend class Poly;
[82f499]49  friend class Vector;
[8457864]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;
[f28d81]55  friend class PolyImpl;
[c53bf60]56  number as_number() const{
[547474]57    return n_Copy(n,r.get());
[c53bf60]58  }
[d78c4c]59  Number& operator=(const Number& n2){
60    //durch Reihenfolge Selbstzuweisungen berücksichtigt
[547474]61    number nc=n_Copy(n2.n,n2.r.get());
62    n_Delete(&n,r.get());
[d78c4c]63    r=n2.r;
64    n=nc;
65    return *this;
66  }
67  Number operator-(){
68    Number t(*this);
[92b8e1]69    //t.n=n_Copy(n,r);
[547474]70    t.n=n_Neg(t.n,r.get());
[d78c4c]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    }
[547474]78    number nv=n_Add(n,n2.n,r.get());
79    n_Delete(&n,r.get());
[d78c4c]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    }
[547474]88    number nv=n_Mult(n,n2.n,r.get());
89    n_Delete(&n,r.get());
[d78c4c]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    }
[547474]98    number nv=n_Sub(n,n2.n,r.get());
99    n_Delete(&n,r.get());
[d78c4c]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    }
[547474]108    number nv=n_Div(n,n2.n,r.get());
109    n_Delete(&n,r.get());
[d78c4c]110    n=nv;
111    return *this;
112  }
113
114  Number& operator=(int n2){
[547474]115    n_Delete(&n,r.get());
116    n=n_Init(n2,r.get());
[d78c4c]117    return *this;
118  }
119 
120  Number& operator+=(int n2){
[547474]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());
[d78c4c]125    n=nv;
126    return *this;
127  }
128  Number& operator*=(int n2){
[547474]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());
[d78c4c]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);
[547474]140    n_Delete(&n,r.get());
141    n_Delete(&n2n,r.get());
[d78c4c]142    n=nv;
143    return *this;
144  }
145  Number& operator/=(int n2){ 
[547474]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());
[d78c4c]150    n=nv;
151    return *this;
152  }
153
154
155
156  Number(){
157    r=currRing;
[547474]158    if (r.get()!=NULL)
159      n=n_Init(0,r.get());
[a171c0]160    else
161      n=(number) NULL;
[d78c4c]162  }
163  Number(const Number & n){
164    r=n.r;
[547474]165    this->n=n_Copy(n.n,r.get());
[d78c4c]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){
[547474]172
173    this->r=r;
[d78c4c]174    this->n=n_Init(n,r);
[547474]175  }
176  Number(int n, intrusive_ptr<ip_sring> r){
[d78c4c]177    this->r=r;
[547474]178    this->n=n_Init(n,r.get());
179
[d78c4c]180  }
181  explicit Number(int n){
182    r=currRing;
[547474]183    this->n=n_Init(n,r.get());
[d78c4c]184  }
[ef413f]185  void write() const{
186    number towrite=n;
[547474]187    n_Write(towrite,r.get());
[d78c4c]188  }
[547474]189 
190  ~Number(){
[a171c0]191    if (r!=NULL)
[547474]192      n_Delete(&n,r.get());
[d78c4c]193  }
[70ca29]194 ring getRing() const{
195    return r.get();
196 }
[d78c4c]197 protected:
198  number n;
[547474]199  intrusive_ptr<ip_sring> r;
[d78c4c]200
201};
202
[c300eca]203inline Number operator+(const Number &n1, const Number& n2){
[d78c4c]204  Number erg(n1);
205  erg+=n2;
206  return erg;
207}
[c300eca]208inline Number operator*(const Number &n1, const Number& n2){
[d78c4c]209  Number erg(n1);
210  erg*=n2;
211  return erg;
212}
[c300eca]213inline Number operator-(const Number &n1, const Number& n2){
[d78c4c]214  Number erg(n1);
215  erg-=n2;
216  return erg;
217}
[c300eca]218inline Number operator/(const Number &n1, const Number& n2){
[d78c4c]219  Number erg(n1);
220  erg/=n2;
221  return erg;
222}
[c300eca]223inline bool operator==(const Number &n1, const Number& n2){
[d78c4c]224  if(n1.r!=n2.r)
225    return false;
226  return n_Equal(n1.n,n2.n,n1.r);
227}
228
229
[c300eca]230inline Number operator+(const Number &n1, int n2){
[d78c4c]231  Number erg(n1);
232  erg+=Number(n2,n1.r);
233  return erg;
234}
[c300eca]235inline Number operator*(const Number &n1, int n2){
[d78c4c]236  Number erg(n1);
237  erg*=Number(n2,n1.r);
238  return erg;
239}
[c300eca]240inline Number operator-(const Number &n1, int n2){
[d78c4c]241  Number erg(n1);
242  erg-=Number(n2,n1.r);
243  return erg;
244}
[c300eca]245inline Number operator/(const Number &n1, int n2){
[d78c4c]246  Number erg(n1);
247  erg/=Number(n2,n1.r);
248  return erg;
249}
[c300eca]250inline bool operator==(const Number &n1, int n2){
[d78c4c]251  return n_Equal(n1.n,Number(n2,n1.r).n,n1.r);
252}
[c300eca]253inline Number operator+(int n1, const Number& n2){
[d78c4c]254  Number erg(n2);
255  return erg+=Number(n1,n2.r);
256}
[c300eca]257inline Number operator-(int n1, const Number& n2){
[d78c4c]258
259  Number erg(n1,n2.r);
260  return erg-=n2;
261}
[c300eca]262inline Number operator/(int n1, const Number& n2){
[d78c4c]263  Number erg(n1,n2.r);
264  return erg/=n2;
265}
266
[c300eca]267inline Number operator*(int n1, const Number& n2){
[d78c4c]268  Number erg(n2);
269  return erg*=Number(n1,n2.r);
270}
[c300eca]271inline bool operator==(int n1, const Number& n2){
[d78c4c]272  return n2==Number(n1,n2.r);
273}
[f28d81]274#endif
Note: See TracBrowser for help on using the repository browser.