realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/polynomial_dual.hpp
Go to the documentation of this file.
00001 #ifndef realroot_ring_dual_hpp
00002 #define realroot_ring_dual_hpp
00003 
00015 //====================================================================
00016 #include <realroot/polynomial.hpp>
00017 #include <realroot/sparse_dual.hpp>
00018 
00019 #define TMPL template<class C, class O> 
00020 #define RING       ring<C,Dual,O>
00021 #define RING_POL   ring<C,Sparse,O>
00022 #define POL        polynomial<C,with<Sparse,O> >
00023 #define DUALPOL    polynomial<C,with<Dual,O> >
00024 //====================================================================
00025 namespace mmx {
00026 
00027   struct Dual {};
00028 
00029   template<class A, class B> struct use;
00030   template<class C, class V> struct polynomial;
00031   template<class C, class V> struct with;
00032  
00033   template<class C, class O> 
00034   struct use<polynomial_of,polynomial<C,with<Dual,O> > >{
00035 
00036     typedef sparse::dual<C,O>           rep_t;
00037 
00038     typedef C                           Scalar;
00039     typedef typename rep_t::Monomial    Monomial;
00040     typedef polynomial<C,with<Dual,O> > Polynomial;
00041     typedef ring<C,Dual,O>              Ring;
00042 
00043   };
00044 
00048   template<class C, class O> 
00049   struct ring<C, Dual, O > {
00050 
00051     typedef RING                        self_t;
00052     typedef sparse::dual<C,O>           rep_t;
00053 
00054     typedef C                           Scalar;
00055     typedef typename rep_t::Monomial    Monomial;
00056     typedef polynomial<C,with<Dual,O> > Polynomial;
00057 
00058     typedef RING                      Ring;
00059     
00060     static variables& vars () { return RING_POL::vars();}
00061 
00062     Polynomial operator[](int i) const {
00063       return Polynomial((C)1,1,i);
00064     }
00065 
00066     int nbvar() const { return  RING_POL::var.nbvar(); }
00067   };
00068   
00069 
00070   template<class C, class O> C sample(const RING&rg) { return (C)0;} 
00071 
00072   
00073   TMPL define_operator_rrr(DUALPOL, POL, DUALPOL, operator*, sparse::mul)
00074   TMPL define_operator_rrr(POL, DUALPOL, POL, operator*, sparse::mul)
00075 
00076   //----------------------------------------------------------------------
00077   template<class P, class Q> struct mul_helper;
00078   template<class C, class O> struct mul_helper<
00079     polynomial< C, with<Sparse,O> >,
00080     polynomial< C, with<Dual,  O> > > {
00081     typedef polynomial< C, with<Dual, O> > TYPE;
00082   };
00083 
00084   template<class C, class O> struct mul_helper<
00085     polynomial< C, with<Dual,  O> >,
00086     polynomial< C, with<Sparse,O> > > {
00087     typedef polynomial< C, with<Sparse,O> > TYPE;
00088   };
00089 }
00090 //====================================================================
00091 #undef TMPL
00092 #undef RING
00093 #undef RING_POL
00094 #undef POL
00095 #undef DUALPOL
00096 #undef Polynomial
00097 //====================================================================
00098 #endif //realroot_polynomial_dual_hpp