00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MMX__QUOTIENT_SERIES__HPP
00014 #define __MMX__QUOTIENT_SERIES__HPP
00015 #include <algebramix/series.hpp>
00016
00017 namespace mmx {
00018 #define TMPL_DEF template<typename Series, typename Monomial>
00019 #define TMPL template<typename Series, typename Monomial>
00020 #define C typename scalar_type_helper<Series>::val
00021 #define Stair list<Monomial >
00022 #define Variable typename Series::variable_type
00023 #define Quotient_series quotient_series<Series,Monomial>
00024 #define Quotient_series_rep quotient_series_rep<Series,Monomial>
00025 #define Set table<bool,Variable >
00026 TMPL class quotient_series_rep;
00027 TMPL class quotient_series;
00028
00029
00030
00031
00032
00033 TMPL_DEF
00034 class quotient_series_rep REP_STRUCT {
00035 public:
00036 Series f;
00037 Monomial m;
00038 inline quotient_series_rep ():
00039 f (0), m (1) {}
00040 inline quotient_series_rep (const Series& f2):
00041 f (f2), m (1) {}
00042 inline quotient_series_rep (const Series& f2, const Monomial& m2):
00043 f (f2), m (m2) {}
00044 inline quotient_series_rep (const Monomial& m2):
00045 f (1), m (m2) {}
00046 inline ~quotient_series_rep () {}
00047 };
00048
00049 TMPL_DEF
00050 class quotient_series {
00051 INDIRECT_PROTO_2 (quotient_series, quotient_series_rep, Series, Monomial)
00052 public:
00053 inline quotient_series ():
00054 rep (new Quotient_series_rep ()) {}
00055 template<typename T> inline quotient_series (const T& c):
00056 rep (new Quotient_series_rep (Series (c))) {}
00057 inline quotient_series (const Monomial& m):
00058 rep (new Quotient_series_rep (m)) {}
00059 inline quotient_series (const Series& f, const Monomial& m):
00060 rep (new Quotient_series_rep (f, m)) {}
00061 inline C operator [] (const Monomial& m) const {
00062 return rep->f [m / rep->m]; }
00063
00064 static inline generic get_variable_name () {
00065 return Series::get_variable_name (); }
00066 static inline void set_variable_name (const generic& x) {
00067 Series::set_variable_name (x); }
00068
00069 static inline nat get_output_order () {
00070 return Series::get_output_order (); }
00071 static inline void set_output_order (const nat& x) {
00072 Series::set_output_order (x); }
00073
00074 static inline nat get_cancel_order () {
00075 return Series::get_cancel_order (); }
00076 static inline void set_cancel_order (const nat& x) {
00077 Series::set_cancel_order (x); }
00078
00079 static inline bool get_formula_output () {
00080 return Series::get_formula_output (); }
00081 static inline void set_formula_output (const bool& x) {
00082 Series::set_formula_output (x); }
00083 };
00084 INDIRECT_IMPL_2 (quotient_series, quotient_series_rep,
00085 typename Series, Series, typename Monomial, Monomial)
00086
00087 STYPE_TO_TYPE(TMPL,scalar_type,Quotient_series);
00088
00089 TMPL inline nat hash (const Quotient_series& f) {
00090
00091 (void) f; return 0; }
00092 TMPL inline bool
00093 operator == (const Quotient_series& f, const Quotient_series& g) {
00094 Monomial m= gcd (f->m, g->m);
00095 return f->f * (g->m / m) == g->f * (f->m / m); }
00096 TMPL inline bool
00097 operator != (const Quotient_series& f, const Quotient_series& g) {
00098 return !(f == g); }
00099 TMPL inline nat exact_hash (const Quotient_series& f) {
00100 return exact_hash (f->f) ^ exact_hash (f->m); }
00101 TMPL inline bool
00102 exact_eq (const Quotient_series& f, const Quotient_series& g) {
00103 return exact_eq (f->f, g->f) && exact_eq (f->m, g->m); }
00104 TMPL inline bool
00105 exact_neq (const Quotient_series& f, const Quotient_series& g) {
00106 return !exact_eq (f, g); }
00107
00108 TMPL inline syntactic flatten (const Quotient_series& f) {
00109 return flatten (f->f) * flatten (f->m); }
00110
00111
00112
00113
00114
00115 TMPL inline Set variables (const Quotient_series& f) {
00116 return variables (f->f) | variables (f->m); }
00117 TMPL inline int val (const Quotient_series& f, const Variable& v) {
00118 return val (f->f, v) * f->m[v]; }
00119 TMPL inline Monomial monomial_val (const Quotient_series f) {
00120 return monomial_val (f->f) * f->m; }
00121
00122 TMPL Quotient_series project (const Quotient_series& f, const Stair& l) {
00123 return Quotient_series (project (f->f, stair_mul (1/f->m, l)), f->m); }
00124 TMPL Quotient_series head (const Quotient_series& f, const Stair& l) {
00125 return Quotient_series (head (f->f, stair_mul (1/f->m, l)), f->m); }
00126 TMPL Quotient_series tail (const Quotient_series& f, const Stair& l) {
00127 return Quotient_series (tail (f->f, stair_mul (1/f->m, l)), f->m); }
00128 TMPL Stair dominant_monomials (const Quotient_series& f) {
00129 return stair_mul (f->m, dominant_monomials (f->f)); }
00130 TMPL inline Quotient_series
00131 normalize (const Quotient_series& f, const Monomial& dom_m) {
00132 return Quotient_series (lshiftz (f->f, f->m / dom_m), dom_m); }
00133
00134
00135
00136
00137
00138 TMPL Quotient_series
00139 operator + (const Quotient_series& f, const Quotient_series& g) {
00140 if (f->m == g->m) return Quotient_series (f->f + g->f, f->m);
00141 else {
00142 Monomial m= gcd (f->m, g->m);
00143 return Quotient_series (f->f * (f->m / m) + g->f * (g->m / m), m);
00144 }
00145 }
00146
00147 TMPL Quotient_series
00148 operator + (const Quotient_series& f, const C& c) {
00149 return Quotient_series (f->f + Quotient_series (c));
00150 }
00151
00152 TMPL Quotient_series
00153 operator + (const C& c, const Quotient_series& f) {
00154 return Quotient_series (Quotient_series (c) + f->f);
00155 }
00156
00157 TMPL Quotient_series
00158 operator - (const Quotient_series& f) {
00159 return Quotient_series (-f->f, f->m);
00160 }
00161
00162 TMPL Quotient_series
00163 operator - (const Quotient_series& f, const Quotient_series& g) {
00164 if (f->m == g->m) return Quotient_series (f->f - g->f, f->m);
00165 else {
00166 Monomial m= gcd (f->m, g->m);
00167 return Quotient_series (f->f * (f->m / m) - g->f * (g->m / m), m);
00168 }
00169 }
00170
00171 TMPL Quotient_series
00172 operator - (const Quotient_series& f, const C& c) {
00173 return Quotient_series (f->f - Quotient_series (c));
00174 }
00175
00176 TMPL Quotient_series
00177 operator - (const C& c, const Quotient_series& f) {
00178 return Quotient_series (Quotient_series (c) - f->f);
00179 }
00180
00181 TMPL Quotient_series
00182 operator * (const Monomial& m, const Quotient_series& f) {
00183 return Quotient_series (f->f, m * f->m);
00184 }
00185
00186 TMPL Quotient_series
00187 operator * (const Quotient_series& f, const Monomial& m) {
00188 return Quotient_series (f->f, f->m * m);
00189 }
00190
00191 TMPL Quotient_series
00192 operator * (const C& c, const Quotient_series& f) {
00193 return Quotient_series (c * f->f, f->m);
00194 }
00195
00196 TMPL Quotient_series
00197 operator * (const Quotient_series& f, const C& c) {
00198 return Quotient_series (c * f->f, f->m);
00199 }
00200
00201 TMPL Quotient_series
00202 operator * (const Quotient_series& f, const Quotient_series& g) {
00203 return Quotient_series (f->f * g->f, f->m * g->m);
00204 }
00205
00206 TMPL Quotient_series
00207 operator / (const Quotient_series& f, const Monomial& m) {
00208 return Quotient_series (f->f, f->m / m);
00209 }
00210
00211 TMPL Quotient_series
00212 operator / (const Monomial& m, const Quotient_series& f) {
00213 Monomial v= monomial_val (f);
00214 if (v != Monomial (1)) return (m/v) / (f/v);
00215 return Quotient_series (C(1) / f->f, m / f->m);
00216 }
00217
00218 TMPL Quotient_series
00219 operator / (const Quotient_series& f, const C& c) {
00220 return Quotient_series (f->f / c, f->m);
00221 }
00222
00223 TMPL Quotient_series
00224 operator / (const C& c, const Quotient_series& f) {
00225 Monomial v= monomial_val (f);
00226 if (v != Monomial (1)) return (c / (f/v)) / v;
00227 return Quotient_series (c / f->f, Monomial (1) / f->m);
00228 }
00229
00230 TMPL Quotient_series
00231 operator / (const Quotient_series& f, const Quotient_series& g) {
00232 Monomial v= monomial_val (g);
00233 if (v != Monomial (1)) return (f/v) / (g/v);
00234 return Quotient_series (f->f / g->f, f->m);
00235 }
00236
00237 ARITH_SCALAR_INT_SUGAR(TMPL,Quotient_series);
00238
00239 #undef TMPL_DEF
00240 #undef TMPL
00241 #undef C
00242 #undef Stair
00243 #undef Variable
00244 #undef Quotient_series
00245 #undef Quotient_series_rep
00246 #undef Set
00247 }
00248 #endif // __MMX__QUOTIENT_SERIES__HPP