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