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