00001 #ifndef _synaps_solve_SturmMem_H_
00002 #define _synaps_solve_SturmMem_H_
00003
00004 #include <synaps/init.h>
00005 #include <synaps/usolve/Algebraic.h>
00006 #include <synaps/usolve/solver_base.h>
00007 #include <synaps/usolve/sturm/common.h>
00008
00009 __BEGIN_NAMESPACE_SYNAPS
00010
00011 template < typename NT >
00012 struct SturmMem : public solver_base
00013 {
00014
00015 typedef NumberTraits<NT> NTR;
00016
00017 typedef typename NTR::RT RT;
00018 typedef typename NTR::FT FT;
00019 typedef typename NTR::XT XT;
00020 typedef RR RL;
00021
00022 typedef typename NTR::FIT FIT;
00023 typedef typename NTR::XIT XIT;
00024 typedef typename NTR::XIT RIT;
00025
00026
00027
00028 typedef UPolDse<RT> Poly;
00029 typedef UPolDse<RT> RT_Poly;
00030 typedef UPolDse<FT> FT_Poly;
00031
00032 typedef UPolDse<XT> XT_Poly;
00033 typedef UPolDse<RL> RL_Poly;
00034
00035 typedef ALGEBRAIC::root_of<RT, Poly> RO_t;
00036 typedef ALGEBRAIC::root_of<RT, Poly> solution_type;
00037
00038
00039 typedef SturmMem self_t;
00040
00041
00042 SturmSeq<NT> mem_;
00043 };
00044
00045
00046 template < typename UPOL, typename NT >
00047 Seq
00048 <
00049 typename SturmMem<NT>::RO_t
00050 >
00051 solve( const UPOL& F,
00052 SturmMem<NT>& mth,
00053 const typename SturmMem<NT>::FT& a,
00054 const typename SturmMem<NT>::FT& b
00055 )
00056 {
00057 typedef SturmMem<NT> K;
00058 typedef typename K::RT RT;
00059 typedef typename K::FT FT;
00060 typedef typename K::FIT FIT;
00061 typedef typename K::RO_t RO_t;
00062 typedef typename K::Poly Poly;
00063 typedef typename K::RO_t RO_t;
00064 typedef typename K::Poly poly_t;
00065 typedef typename Poly::coeff_t CF_T;
00066
00067
00068 Seq<RO_t> sol;
00069 poly_t f; let::assign(f,F);
00070
00071 SturmSeq<CF_T> sth;
00072 if(mth.mem_.size()==0)
00073 {
00074 mth.mem_ = SturmSeq<CF_T>(f,diff(f),HABICHT());
00075 sth=mth.mem_;
00076 }
00077 else
00078 sth=mth.mem_;
00079
00080 FIT I(a, b);
00081 sturm_rootof( sth, I, 1, std::back_inserter(sol.rep()), K());
00082
00083
00084 return sol;
00085 }
00086
00087 __END_NAMESPACE_SYNAPS
00088
00089 #endif // _synaps_solve_SturmMem_H_
00090
00091