00001
00002 #ifndef vnl_bignum_h_
00003 #define vnl_bignum_h_
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 #include <vcl_iostream.h>
00068 #include <vcl_string.h>
00069
00070 class vnl_bignum;
00071
00072
00073
00074 int magnitude_cmp(const vnl_bignum&, const vnl_bignum&);
00075 void add(const vnl_bignum&, const vnl_bignum&, vnl_bignum&);
00076 void subtract(const vnl_bignum&, const vnl_bignum&, vnl_bignum&);
00077 void multiply_aux(const vnl_bignum&, unsigned short d, vnl_bignum&, unsigned short i);
00078 unsigned short normalize(const vnl_bignum&, const vnl_bignum&, vnl_bignum&, vnl_bignum&);
00079 void divide_aux(const vnl_bignum&, unsigned short, vnl_bignum&, unsigned short&);
00080 unsigned short estimate_q_hat(const vnl_bignum&, const vnl_bignum&, unsigned short);
00081 unsigned short multiply_subtract(vnl_bignum&, const vnl_bignum&, unsigned short, unsigned short);
00082 void divide(const vnl_bignum&, const vnl_bignum&, vnl_bignum&, vnl_bignum&);
00083 vnl_bignum left_shift(const vnl_bignum& b1, int l);
00084 vnl_bignum right_shift(const vnl_bignum& b1, int l);
00085 void decrement (vnl_bignum& bnum);
00086 void increment (vnl_bignum& bnum);
00087
00088
00089
00090 vcl_ostream& operator<<(vcl_ostream& s, vnl_bignum const& r);
00091
00092
00093
00094 vcl_istream& operator>>(vcl_istream& s, vnl_bignum& r);
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138 class vnl_bignum
00139 {
00140 unsigned short count;
00141 int sign;
00142 unsigned short* data;
00143 public:
00144 vnl_bignum();
00145 vnl_bignum(long);
00146 vnl_bignum(unsigned long);
00147 vnl_bignum(int);
00148 vnl_bignum(unsigned int);
00149 vnl_bignum(float);
00150 vnl_bignum(double);
00151 vnl_bignum(long double);
00152 vnl_bignum(vnl_bignum const&);
00153 vnl_bignum(const char*);
00154 ~vnl_bignum();
00155
00156 operator short() const;
00157 operator int() const;
00158 operator long() const;
00159 operator float() const;
00160 operator double() const;
00161 operator long double() const;
00162 inline operator short() { return ((const vnl_bignum*)this)->operator short(); }
00163 inline operator int() { return ((const vnl_bignum*)this)->operator int(); }
00164 inline operator long() { return ((const vnl_bignum*)this)->operator long(); }
00165 inline operator float() { return ((const vnl_bignum*)this)->operator float(); }
00166 inline operator double() { return ((const vnl_bignum*)this)->operator double(); }
00167 inline operator long double() { return ((const vnl_bignum*)this)->operator long double(); }
00168
00169 vnl_bignum operator-() const;
00170 inline vnl_bignum operator+() const { return *this; }
00171
00172 vnl_bignum& operator=(const vnl_bignum&);
00173
00174 vnl_bignum operator<<(int l) const;
00175 vnl_bignum operator>>(int l) const;
00176 vnl_bignum operator+(vnl_bignum const& r) const;
00177 inline vnl_bignum& operator+=(vnl_bignum const& r) { return *this = operator+(r); }
00178 inline vnl_bignum& operator-=(vnl_bignum const& r) { return *this = operator+(-r); }
00179 vnl_bignum& operator*=(vnl_bignum const& r);
00180 vnl_bignum& operator/=(vnl_bignum const& r);
00181 vnl_bignum& operator%=(vnl_bignum const& r);
00182 inline vnl_bignum& operator<<=(int l) { return *this = *this << l; }
00183 inline vnl_bignum& operator>>=(int l) { return *this = *this >> l; }
00184
00185
00186 vnl_bignum& operator++();
00187
00188 vnl_bignum& operator--();
00189
00190 inline vnl_bignum operator++(int) { vnl_bignum b=(*this); operator++(); return b; }
00191
00192 inline vnl_bignum operator--(int) { vnl_bignum b=(*this); operator--(); return b; }
00193
00194 bool operator==(vnl_bignum const&) const;
00195 bool operator< (vnl_bignum const&) const;
00196 inline bool operator!=(vnl_bignum const& r) const { return !operator==(r); }
00197 inline bool operator> (vnl_bignum const& r) const { return r<(*this); }
00198 inline bool operator<=(vnl_bignum const& r) const { return !operator>(r); }
00199 inline bool operator>=(vnl_bignum const& r) const { return !operator<(r); }
00200 inline bool operator==(long r) const { return operator==(vnl_bignum(r)); }
00201 inline bool operator!=(long r) const { return !operator==(vnl_bignum(r)); }
00202 inline bool operator< (long r) const { return operator<(vnl_bignum(r)); }
00203 inline bool operator> (long r) const { return vnl_bignum(r) < (*this); }
00204 inline bool operator<=(long r) const { return !operator>(vnl_bignum(r)); }
00205 inline bool operator>=(long r) const { return !operator<(vnl_bignum(r)); }
00206 inline bool operator==(int r) const { return operator==(long(r)); }
00207 inline bool operator!=(int r) const { return !operator==(long(r)); }
00208 inline bool operator< (int r) const { return operator<(long(r)); }
00209 inline bool operator> (int r) const { return vnl_bignum(long(r)) < (*this); }
00210 inline bool operator<=(int r) const { return !operator>(long(r)); }
00211 inline bool operator>=(int r) const { return !operator<(long(r)); }
00212 inline bool operator==(double r) const { return r == this->operator double(); }
00213 inline bool operator!=(double r) const { return r != this->operator double(); }
00214 inline bool operator< (double r) const { return r > this->operator double(); }
00215 inline bool operator> (double r) const { return r < this->operator double(); }
00216 inline bool operator<=(double r) const { return r >= this->operator double(); }
00217 inline bool operator>=(double r) const { return r <= this->operator double(); }
00218 inline bool operator==(long double r) const { return r == this->operator long double(); }
00219 inline bool operator!=(long double r) const { return r != this->operator long double(); }
00220 inline bool operator< (long double r) const { return r > this->operator long double(); }
00221 inline bool operator> (long double r) const { return r < this->operator long double(); }
00222 inline bool operator<=(long double r) const { return r >= this->operator long double(); }
00223 inline bool operator>=(long double r) const { return r <= this->operator long double(); }
00224
00225 inline vnl_bignum abs() const { return operator<(0L) ? operator-() : *this; }
00226
00227
00228 inline bool is_infinity() const { return count==1 && data[0]==0; }
00229 inline bool is_plus_infinity() const { return is_infinity() && sign==1; }
00230 inline bool is_minus_infinity() const { return is_infinity() && sign==-1; }
00231
00232 void dump(vcl_ostream& = vcl_cout) const;
00233
00234 friend int magnitude_cmp(const vnl_bignum&, const vnl_bignum&);
00235 friend void add(const vnl_bignum&, const vnl_bignum&, vnl_bignum&);
00236 friend void subtract(const vnl_bignum&, const vnl_bignum&, vnl_bignum&);
00237 friend void increment (vnl_bignum& bnum);
00238 friend void decrement (vnl_bignum& bnum);
00239 friend void multiply_aux(const vnl_bignum&, unsigned short, vnl_bignum&, unsigned short);
00240 friend unsigned short normalize(const vnl_bignum&, const vnl_bignum&, vnl_bignum&, vnl_bignum&);
00241 friend void divide_aux(const vnl_bignum&, unsigned short, vnl_bignum&, unsigned short&);
00242 friend unsigned short estimate_q_hat(const vnl_bignum&, const vnl_bignum&, unsigned short);
00243 friend unsigned short multiply_subtract(vnl_bignum&, const vnl_bignum&, unsigned short, unsigned short);
00244 friend void divide(const vnl_bignum&, const vnl_bignum&, vnl_bignum&, vnl_bignum&);
00245 friend vnl_bignum left_shift(const vnl_bignum& b1, int l);
00246 friend vnl_bignum right_shift(const vnl_bignum& b1, int l);
00247 friend vcl_ostream& operator<< (vcl_ostream&, const vnl_bignum&);
00248 friend vcl_istream& operator>> (vcl_istream&, vnl_bignum&);
00249 friend vcl_string& vnl_bignum_to_string (vcl_string& s, const vnl_bignum& b);
00250 friend vnl_bignum& vnl_bignum_from_string (vnl_bignum& b, const vcl_string& s);
00251
00252 private:
00253 void xtoBigNum(const char *s);
00254 int dtoBigNum(const char *s);
00255 void otoBigNum(const char *s);
00256 void exptoBigNum(const char *s);
00257
00258 void resize(short);
00259 vnl_bignum& trim();
00260 };
00261
00262
00263
00264
00265 vcl_string& vnl_bignum_to_string (vcl_string& s, const vnl_bignum& b);
00266
00267
00268
00269 vnl_bignum& vnl_bignum_from_string (vnl_bignum& b, const vcl_string& s);
00270
00271
00272
00273 inline vnl_bignum operator+(vnl_bignum const& r1, long r2) { return r1+vnl_bignum(r2); }
00274 inline vnl_bignum operator+(vnl_bignum const& r1, int r2) { return r1+long(r2); }
00275 inline vnl_bignum operator+(vnl_bignum const& r1, double r2) { return r1+vnl_bignum(r2); }
00276 inline vnl_bignum operator+(vnl_bignum const& r1, long double r2) { return r1+vnl_bignum(r2); }
00277 inline vnl_bignum operator+(long r2, vnl_bignum const& r1) { return r1 + r2; }
00278 inline vnl_bignum operator+(int r2, vnl_bignum const& r1) { return r1 + r2; }
00279 inline vnl_bignum operator+(double r2, vnl_bignum const& r1) { return r1 + r2; }
00280 inline vnl_bignum operator+(long double r2, vnl_bignum const& r1) { return r1 + r2; }
00281
00282
00283
00284 inline vnl_bignum operator-(vnl_bignum const& r1, vnl_bignum const& r2) { return r1 + (-r2); }
00285 inline vnl_bignum operator-(vnl_bignum const& r1, long r2) { return r1 + (-r2); }
00286 inline vnl_bignum operator-(vnl_bignum const& r1, int r2) { return r1 + (-r2); }
00287 inline vnl_bignum operator-(vnl_bignum const& r1, double r2) { return r1 + (-r2); }
00288 inline vnl_bignum operator-(vnl_bignum const& r1, long double r2) { return r1 + (-r2); }
00289 inline vnl_bignum operator-(long r2, vnl_bignum const& r1) { return -(r1 + (-r2)); }
00290 inline vnl_bignum operator-(int r2, vnl_bignum const& r1) { return -(r1 + (-r2)); }
00291 inline vnl_bignum operator-(double r2, vnl_bignum const& r1) { return -(r1 + (-r2)); }
00292 inline vnl_bignum operator-(long double r2, vnl_bignum const& r1) { return -(r1 + (-r2)); }
00293
00294
00295
00296 inline vnl_bignum operator*(vnl_bignum const& r1, vnl_bignum const& r2)
00297 {
00298 vnl_bignum result(r1); return result *= r2;
00299 }
00300
00301 inline vnl_bignum operator*(vnl_bignum const& r1, long r2)
00302 {
00303 vnl_bignum result(r1); return result *= vnl_bignum(r2);
00304 }
00305
00306 inline vnl_bignum operator*(vnl_bignum const& r1, int r2)
00307 {
00308 vnl_bignum result(r1); return result *= (long)r2;
00309 }
00310
00311 inline vnl_bignum operator*(vnl_bignum const& r1, double r2)
00312 {
00313 vnl_bignum result(r1); return result *= (vnl_bignum)r2;
00314 }
00315
00316 inline vnl_bignum operator*(vnl_bignum const& r1, long double r2)
00317 {
00318 vnl_bignum result(r1); return result *= (vnl_bignum)r2;
00319 }
00320
00321 inline vnl_bignum operator*(long r2, vnl_bignum const& r1)
00322 {
00323 vnl_bignum result(r1); return result *= r2;
00324 }
00325
00326 inline vnl_bignum operator*(int r2, vnl_bignum const& r1)
00327 {
00328 vnl_bignum result(r1); return result *= (long)r2;
00329 }
00330
00331 inline vnl_bignum operator*(double r2, vnl_bignum const& r1)
00332 {
00333 vnl_bignum result(r1); return result *= (vnl_bignum)r2;
00334 }
00335
00336 inline vnl_bignum operator*(long double r2, vnl_bignum const& r1)
00337 {
00338 vnl_bignum result(r1); return result *= (vnl_bignum)r2;
00339 }
00340
00341
00342
00343 inline vnl_bignum operator/(vnl_bignum const& r1, vnl_bignum const& r2)
00344 {
00345 vnl_bignum result(r1); return result /= r2;
00346 }
00347
00348 inline vnl_bignum operator/(vnl_bignum const& r1, long r2)
00349 {
00350 vnl_bignum result(r1); return result /= r2;
00351 }
00352
00353 inline vnl_bignum operator/(vnl_bignum const& r1, int r2)
00354 {
00355 vnl_bignum result(r1); return result /= (long)r2;
00356 }
00357
00358 inline vnl_bignum operator/(vnl_bignum const& r1, double r2)
00359 {
00360 vnl_bignum result(r1); return result /= (vnl_bignum)r2;
00361 }
00362
00363 inline vnl_bignum operator/(vnl_bignum const& r1, long double r2)
00364 {
00365 vnl_bignum result(r1); return result /= (vnl_bignum)r2;
00366 }
00367
00368 inline vnl_bignum operator/(long r1, vnl_bignum const& r2)
00369 {
00370 vnl_bignum result(r1); return result /= r2;
00371 }
00372
00373 inline vnl_bignum operator/(int r1, vnl_bignum const& r2)
00374 {
00375 vnl_bignum result((long)r1); return result /= r2;
00376 }
00377
00378 inline vnl_bignum operator/(double r1, vnl_bignum const& r2)
00379 {
00380 vnl_bignum result(r1); return result /= r2;
00381 }
00382
00383 inline vnl_bignum operator/(long double r1, vnl_bignum const& r2)
00384 {
00385 vnl_bignum result(r1); return result /= r2;
00386 }
00387
00388
00389
00390 inline vnl_bignum operator%(vnl_bignum const& r1, vnl_bignum const& r2)
00391 {
00392 vnl_bignum result(r1); return result %= r2;
00393 }
00394
00395 inline vnl_bignum operator%(vnl_bignum const& r1, long r2)
00396 {
00397 vnl_bignum result(r1); return result %= vnl_bignum(r2);
00398 }
00399
00400 inline vnl_bignum operator%(vnl_bignum const& r1, int r2)
00401 {
00402 vnl_bignum result(r1); return result %= vnl_bignum((long)r2);
00403 }
00404
00405 inline vnl_bignum operator%(long r1, vnl_bignum const& r2)
00406 {
00407 vnl_bignum result(r1); return result %= r2;
00408 }
00409
00410 inline vnl_bignum operator%(int r1, vnl_bignum const& r2)
00411 {
00412 vnl_bignum result((long)r1); return result %= r2;
00413 }
00414
00415
00416
00417 inline bool operator==(long r1, vnl_bignum const& r2) { return r2==r1; }
00418 inline bool operator!=(long r1, vnl_bignum const& r2) { return r2!=r1; }
00419 inline bool operator< (long r1, vnl_bignum const& r2) { return r2> r1; }
00420 inline bool operator> (long r1, vnl_bignum const& r2) { return r2< r1; }
00421 inline bool operator<=(long r1, vnl_bignum const& r2) { return r2>=r1; }
00422 inline bool operator>=(long r1, vnl_bignum const& r2) { return r2<=r1; }
00423
00424 inline vnl_bignum vnl_math_abs(vnl_bignum const& x) { return x.abs(); }
00425 inline vnl_bignum vnl_math_squared_magnitude(vnl_bignum const& x) { return x*x; }
00426 inline vnl_bignum vnl_math_sqr(vnl_bignum const& x) { return x*x; }
00427 inline bool vnl_math_isnan(vnl_bignum const& ) { return false; }
00428 inline bool vnl_math_isfinite(vnl_bignum const& x) { return ! x.is_infinity(); }
00429
00430 #endif // vnl_bignum_h_