source: git/kernel/Number.h @ 35b1d7

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