00001
00002
00003
00004
00005
00006
00007
00008 #ifndef synaps_arithm_CC_H
00009 #define synaps_arithm_CC_H
00010
00011 #include <assert.h>
00012 #include <synaps/init.h>
00013 #include <synaps/arithm/Scl.h>
00014 #include <mpsolve/mpc.h>
00015 #include <iostream>
00016
00017 __BEGIN_NAMESPACE_SYNAPS
00018
00019 typedef __mpc_struct MPC;
00020
00021 typedef Scl<MPC> CC;
00022
00023 template<> inline
00024 void CC::init() {mpc_init(&rep());}
00025
00026 template<> inline
00027 Scl<MPC>::Scl(void)
00028 {
00029 mpc_init(&rep());
00030 }
00031
00032 template<> inline
00033 Scl<MPC>::Scl(const Scl<MPC>& b)
00034 {
00035 mpc_init_set(&rep(), &b.rep());
00036 }
00037
00038 template<> inline
00039 Scl<MPC>::Scl(const MPC & b)
00040 {
00041 mpc_init_set(&rep(), &b);
00042 }
00043
00044 template<> inline
00045 Scl<MPC>::Scl(double d)
00046 {
00047 mpc_init_set_d(&rep(), d, 0);
00048 }
00049
00050 template<> inline
00051 Scl<MPC>::Scl(signed long int sl)
00052 {
00053 mpc_init_set_si(&rep(), sl, 0);
00054 }
00055
00056 template<> inline
00057 Scl<MPC>::Scl(unsigned long int ul)
00058 {
00059 mpc_init_set_ui(&rep(), ul, 0);
00060 }
00061
00062 template<> inline
00063 Scl<MPC>::Scl(int si)
00064 {
00065 mpc_init_set_si(&rep(), (long) si,0);
00066 }
00067
00068 template<> inline
00069 Scl<MPC>::Scl(const char *string,unsigned int base)
00070 {
00071 if (mpc_init_set_str(&rep(), string,"0", base))
00072 std::cerr << "Scl<MPC>::Scl<MPC>: The string " << string
00073 << " is not a valid number in base " << base << std::endl;
00074 }
00075
00076
00077
00078 template<> inline
00079 Scl<MPC>& Scl<MPC>::operator = (const Scl<MPC>& rhs)
00080 {
00081 if (this != &rhs)
00082 mpc_set(&rep(), &rhs.rep()); return *this;
00083 }
00084
00085 template<> inline
00086 Scl<MPC>& Scl<MPC>::operator += (const Scl<MPC>& rhs)
00087 {
00088 mpc_add(&rep(), &rep(), &rhs.rep()); return *this;
00089 }
00090
00091 template<> inline
00092 Scl<MPC>& Scl<MPC>::operator -= (const Scl<MPC>& rhs)
00093 {
00094 mpc_sub(&rep(), &rep(), &rhs.rep()); return *this;
00095 }
00096
00097 template<> inline
00098 Scl<MPC>& Scl<MPC>::operator *= (const Scl<MPC>& rhs)
00099 {
00100 mpc_mul(&rep(), &rep(), &rhs.rep()); return *this;
00101 }
00102
00103 template<> inline
00104 Scl<MPC>& Scl<MPC>::operator /= (const Scl<MPC>& rhs)
00105 {
00106 mpc_div(&rep(), &rep(), &rhs.rep()); return *this;
00107 }
00108
00109
00110
00111 template<> inline
00112 Scl<MPC>& Scl<MPC>::operator = (unsigned long ul)
00113 {
00114 mpc_set_ui(&rep(), ul,0); return *this;
00115 }
00116
00117 template<> inline Scl<MPC>&
00118 Scl<MPC>::operator += (unsigned long ul)
00119 {
00120 mpc_add_ui(&rep(), &rep(), ul,0);return *this;
00121 }
00122
00123 template<> inline Scl<MPC>&
00124 Scl<MPC>::operator -= (unsigned long ul)
00125 {
00126 mpc_sub_ui(&rep(), &rep(), ul,0);return *this;
00127 }
00128
00129 template<> inline Scl<MPC>&
00130 Scl<MPC>::operator *= (int ul)
00131 {
00132 if (ul >= 0)
00133 mpc_mul_ui(&rep(), &rep(), (unsigned long) ul);
00134 else {
00135 mpc_mul_ui(&rep(), &rep(), (unsigned long) (-ul));
00136 mpc_neg(&rep(), &rep());
00137 }
00138 return *this;
00139 }
00140
00141 template<> inline Scl<MPC>&
00142 Scl<MPC>::operator *= (unsigned long ul)
00143 {
00144 mpc_mul_ui(&rep(), &rep(), ul);return *this;
00145 }
00146
00147 template<> inline Scl<MPC>&
00148 Scl<MPC>::operator /= (unsigned long ul)
00149 {
00150 mpc_div_ui(&rep(), &rep(), ul);return *this;
00151 }
00152
00153
00154 template<> inline Scl<MPC>&
00155 Scl<MPC>::operator = (long sl)
00156 {
00157 mpc_set_si(&rep(), sl,0);return *this;
00158 }
00159
00160 template<> inline Scl<MPC>&
00161 Scl<MPC>::operator += (long sl)
00162 {
00163 if (sl >= 0)
00164 mpc_add_ui(&rep(), &rep(), (unsigned long) sl,0);
00165 else
00166 mpc_sub_ui(&rep(), &rep(), ((unsigned long) -sl),0);
00167 return *this;
00168 }
00169
00170 template<> inline Scl<MPC>&
00171 Scl<MPC>::operator -= (long sl)
00172 {
00173 if (sl >= 0)
00174 mpc_sub_ui(&rep(), &rep(), (unsigned long) sl,0);
00175 else
00176 mpc_add_ui(&rep(), &rep(), (unsigned long) sl,0);
00177 return *this;
00178 }
00179
00180 template<> inline Scl<MPC>&
00181 Scl<MPC>::operator *= (long sl)
00182 {
00183 if (sl >= 0)
00184 mpc_mul_ui(&rep(), &rep(), (unsigned long)sl);
00185 else
00186 {
00187 mpc_mul_ui(&rep(), &rep(), ((unsigned long) -sl));
00188 mpc_neg(&rep(), &rep());
00189 }
00190 return *this;
00191 }
00192
00193 template<> inline Scl<MPC>&
00194 Scl<MPC>::operator /= (long sl)
00195 {
00196 if (sl >= 0)
00197 mpc_div_ui(&rep(), &rep(), (unsigned long) sl);
00198 else
00199 {
00200 mpc_div_ui(&rep(), &rep(), ((unsigned long) -sl));
00201 mpc_neg(&rep(), &rep());
00202 }
00203 return *this;
00204 }
00205
00206
00207 template<> inline Scl<MPC>& Scl<MPC>::operator = (int si)
00208 {
00209 mpc_init_set_si(&rep(), (long) si,0); return *this;
00210 }
00211
00212 template<> inline Scl<MPC>&
00213 Scl<MPC>::operator += (int i)
00214 {
00215 *this+= long(i);
00216 return *this;
00217 }
00218
00219 template<> inline
00220 Scl<MPC>& Scl<MPC>::pow (unsigned long exp)
00221 {
00222
00223 Scl<MPC> r(*this);
00224 for (unsigned long i = 2; i <= exp; i++) mpc_mul(&rep(),&rep(),&r.rep());
00225
00226
00227 return *this;
00228 }
00229
00230 inline Scl<MPC> operator * (double d, const Scl<MPC>& b)
00231 {
00232
00233
00234 Scl<MPC> r(d);
00235 mpc_mul(&r.rep(),&r.rep(),&b.rep());
00236 return Scl<MPC>(r);
00237 }
00238
00239 template<> inline bool
00240 Scl<MPC>::operator == (const Scl<MPC>& x) const
00241 {
00242 return mpc_eq(&rep(), &x.rep(), 0);
00243 }
00244
00245 template<> inline bool
00246 Scl<MPC>::operator != (int si) const
00247 {
00248 if(si==0)
00249 return mpc_eq_zero(& this->rep());
00250 else if(si==1)
00251 return mpc_eq_one(& this->rep());
00252 else
00253 {
00254 Scl<MPC> tmp(si);
00255 return mpc_eq(&rep(), &tmp.rep(), 0);
00256 }
00257 }
00258
00259 inline Scl<MPC>
00260 Norm(const Scl<MPC>& x)
00261 {
00262 if(x>0)
00263 return Scl<MPC>(x);
00264 else
00265 return Scl<MPC>(-x);
00266 }
00267
00268
00269
00270
00271
00272 inline void add(MPC& r, const MPC& a, const MPC& b) {mpc_add(&r,&a,&b);}
00273 inline void sub(MPC& r, const MPC& a, const MPC& b) {mpc_sub(&r,&a,&b);}
00274 inline void mul(MPC& r, const MPC& a, const MPC& b) {mpc_mul(&r,&a,&b);}
00275 inline void div(MPC& r, const MPC& a, const MPC& b) {mpc_div(&r,&a,&b);}
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309 inline std::ostream& operator << (std::ostream& os, const Scl<MPC>& b)
00310 {
00311 mpc_out_str(stdout, 10, mpc_get_prec(&b.rep()), &b.rep());
00312 return os;
00313 }
00314
00315 inline std::istream& operator >> (std::istream& is, Scl<MPC>& x)
00316 {
00317 std::string a,b; is >> a>> b;
00318 mpc_init_set_str(&x.rep(),a.c_str(),b.c_str(),10);
00319 return is;
00320 }
00321
00322 template<class T>
00323 CC Complex(const T& a, const T& b)
00324 {
00325 RR r,i;
00326 let::assign(r,a);
00327 let::assign(i,b);
00328 CC z;
00329 mpc_set_f(&z.rep(),r.get_mpf_t(),i.get_mpf_t());
00330 return z;
00331 }
00332
00333 inline RR real(const CC& z)
00334 {
00335 return RR(z.rep().r);
00336 }
00337
00338 inline RR img(const CC& z)
00339 {
00340 return RR(z.rep().i);
00341 }
00342
00343 __END_NAMESPACE_SYNAPS
00344 #endif //synaps_arithm_CC_H