00001 #ifndef realroot_ring_sparse_hpp
00002 #define realroot_ring_sparse_hpp
00003
00020
00021 #include <realroot/sparse_monomials.hpp>
00022 #include <realroot/Seq.hpp>
00023 #include <realroot/polynomial.hpp>
00024 #include <realroot/ring.hpp>
00025
00026 #define TMPL template<class C, class O>
00027 #define RING ring<C, Sparse, O >
00028
00029 namespace mmx {
00030
00031 template<class A, class B> struct use;
00032 template<class C, class V> struct polynomial;
00033 template<class C, class V> struct with;
00034
00035 struct Sparse {};
00036
00037 template<> struct default_variant_of<Sparse> {
00038 typedef DegRevLex Variant;
00039 } ;
00040
00041 template<class C, class O>
00042 struct use<polynomial_of, polynomial<C, with<Sparse,O> > > {
00043
00044 typedef sparse::monomial_seq<C,O> rep_t;
00045 typedef typename rep_t::Monomial Monomial;
00046 typedef C Scalar;
00047 typedef RING var_t;
00048 typedef RING Ring;
00049 typedef polynomial<C, with<Sparse,O> > Polynomial;
00050
00051 };
00052
00053
00055 template<class C, class O >
00056 struct ring<C, Sparse, O > {
00057
00059 typedef sparse::monomial_seq<C,O> rep_t;
00060 typedef typename rep_t::Monomial Monomial;
00061 typedef C Scalar;
00062 typedef RING var_t;
00063 typedef RING self_t;
00064 typedef polynomial<C, with<Sparse,O> > Polynomial;
00065
00066 ring(){}
00067 ring(const self_t& r){}
00068 ring(const char* s) {var = variables(s); }
00069
00070 Polynomial operator[](int i) const {
00071 return Polynomial((C)1,1,i);
00072 }
00073
00074 static int nbvar() { return var.nbvar(); }
00075
00076 static variables var;
00077 static variables& vars () { return var;}
00078
00079 };
00080
00081 TMPL variables RING::var;
00082 TMPL C sample (const RING& R) { return (C)0; }
00083
00084 }
00085
00086 #undef TMPL
00087 #undef PRING
00088 #undef RING
00089 #undef RING
00090 #undef Polynomial
00091 #endif //realroot_ring_sparse_hpp