[f28d81] | 1 | #ifndef NUMBERCPP_HEADER |
---|
| 2 | #define NUMBERCPP_HEADER |
---|
[547474] | 3 | #include <boost/intrusive_ptr.hpp> |
---|
[d78c4c] | 4 | #include "mod2.h" |
---|
| 5 | #include "numbers.h" |
---|
| 6 | #include "febase.h" |
---|
[547474] | 7 | #include "ring.h" |
---|
| 8 | using namespace boost; |
---|
| 9 | inline void intrusive_ptr_add_ref(ring r){ |
---|
| 10 | r->ref++; |
---|
| 11 | //Print("ref count after add: %d", r->ref); |
---|
| 12 | } |
---|
| 13 | inline 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] | 22 | enum poly_variant{ |
---|
[77ed994] | 23 | POLY_VARIANT_RING, |
---|
| 24 | POLY_VARIANT_MODUL |
---|
[ecbe9f7] | 25 | }; |
---|
[8457864] | 26 | template<poly_variant,class,class> class PolyBase; |
---|
[c1e4cd] | 27 | class Poly; |
---|
[8457864] | 28 | //class TrivialErrorHandler; |
---|
[82f499] | 29 | class Vector; |
---|
[d78c4c] | 30 | class 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] | 203 | inline Number operator+(const Number &n1, const Number& n2){ |
---|
[d78c4c] | 204 | Number erg(n1); |
---|
| 205 | erg+=n2; |
---|
| 206 | return erg; |
---|
| 207 | } |
---|
[c300eca] | 208 | inline Number operator*(const Number &n1, const Number& n2){ |
---|
[d78c4c] | 209 | Number erg(n1); |
---|
| 210 | erg*=n2; |
---|
| 211 | return erg; |
---|
| 212 | } |
---|
[c300eca] | 213 | inline Number operator-(const Number &n1, const Number& n2){ |
---|
[d78c4c] | 214 | Number erg(n1); |
---|
| 215 | erg-=n2; |
---|
| 216 | return erg; |
---|
| 217 | } |
---|
[c300eca] | 218 | inline Number operator/(const Number &n1, const Number& n2){ |
---|
[d78c4c] | 219 | Number erg(n1); |
---|
| 220 | erg/=n2; |
---|
| 221 | return erg; |
---|
| 222 | } |
---|
[c300eca] | 223 | inline 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] | 230 | inline Number operator+(const Number &n1, int n2){ |
---|
[d78c4c] | 231 | Number erg(n1); |
---|
| 232 | erg+=Number(n2,n1.r); |
---|
| 233 | return erg; |
---|
| 234 | } |
---|
[c300eca] | 235 | inline Number operator*(const Number &n1, int n2){ |
---|
[d78c4c] | 236 | Number erg(n1); |
---|
| 237 | erg*=Number(n2,n1.r); |
---|
| 238 | return erg; |
---|
| 239 | } |
---|
[c300eca] | 240 | inline Number operator-(const Number &n1, int n2){ |
---|
[d78c4c] | 241 | Number erg(n1); |
---|
| 242 | erg-=Number(n2,n1.r); |
---|
| 243 | return erg; |
---|
| 244 | } |
---|
[c300eca] | 245 | inline Number operator/(const Number &n1, int n2){ |
---|
[d78c4c] | 246 | Number erg(n1); |
---|
| 247 | erg/=Number(n2,n1.r); |
---|
| 248 | return erg; |
---|
| 249 | } |
---|
[c300eca] | 250 | inline bool operator==(const Number &n1, int n2){ |
---|
[d78c4c] | 251 | return n_Equal(n1.n,Number(n2,n1.r).n,n1.r); |
---|
| 252 | } |
---|
[c300eca] | 253 | inline Number operator+(int n1, const Number& n2){ |
---|
[d78c4c] | 254 | Number erg(n2); |
---|
| 255 | return erg+=Number(n1,n2.r); |
---|
| 256 | } |
---|
[c300eca] | 257 | inline Number operator-(int n1, const Number& n2){ |
---|
[d78c4c] | 258 | |
---|
| 259 | Number erg(n1,n2.r); |
---|
| 260 | return erg-=n2; |
---|
| 261 | } |
---|
[c300eca] | 262 | inline Number operator/(int n1, const Number& n2){ |
---|
[d78c4c] | 263 | Number erg(n1,n2.r); |
---|
| 264 | return erg/=n2; |
---|
| 265 | } |
---|
| 266 | |
---|
[c300eca] | 267 | inline Number operator*(int n1, const Number& n2){ |
---|
[d78c4c] | 268 | Number erg(n2); |
---|
| 269 | return erg*=Number(n1,n2.r); |
---|
| 270 | } |
---|
[c300eca] | 271 | inline bool operator==(int n1, const Number& n2){ |
---|
[d78c4c] | 272 | return n2==Number(n1,n2.r); |
---|
| 273 | } |
---|
[f28d81] | 274 | #endif |
---|