00001 00002 #ifndef _SYNAPS_SOLVE_STURMBZ_H_ 00003 #define _SYNAPS_SOLVE_STURMBZ_H_ 00004 00005 00006 #include <synaps/init.h> 00007 #include <synaps/arithm/RealOf.h> 00008 #include <synaps/usolve/solver_base.h> 00009 #include <synaps/usolve.h> 00010 #include <synaps/usolve/sturm/solve_sturm_bezier.h> 00011 #include <synaps/usolve/sturm/common.h> 00012 00013 00014 __BEGIN_NAMESPACE_SYNAPS 00015 00016 template < typename NT > 00017 struct SturmBz : public solver_base 00018 { 00019 00020 typedef NumberTraits<NT> NTR; 00021 00022 typedef typename NTR::RT RT; 00023 typedef typename NTR::FT FT; 00024 typedef typename NTR::XT XT; 00025 typedef RR RL; 00026 00027 typedef typename NTR::FIT FIT; 00028 typedef typename NTR::XIT XIT; 00029 typedef typename NTR::XIT RIT; 00030 // typedef typename NTR::RIT RIT; 00031 00032 00033 typedef UPolDse<RT> Poly; 00034 typedef UPolDse<RT> RT_Poly; 00035 typedef UPolDse<FT> FT_Poly; 00036 00037 typedef UPolDse<XT> FT_Poly; 00038 typedef UPolDse<RL> RL_Poly; 00039 00040 typedef ALGEBRAIC::root_of<RT, Poly> RO_t; 00041 typedef ALGEBRAIC::root_of<RT, Poly> solution_type; 00042 00043 typedef SturmBz self_t; 00044 00045 }; 00046 00047 00048 template < typename NT > 00049 Seq 00050 < 00051 typename SturmBz<NT>::RO_t 00052 > 00053 solve( const typename SturmBz<NT>::Poly& f, 00054 SturmBz<NT> ) 00055 { 00056 typedef SturmBz<NT> K; 00057 typedef typename K::RO_t RO_t; 00058 00059 Seq<RO_t> sol; 00060 ALGEBRAIC::solve_sturm_bezier(f, std::back_inserter(sol.rep()), K()); 00061 00062 std::stable_sort( sol.begin(), sol.end(), ALGEBRAIC::Refine_compare()); 00063 00064 return sol; 00065 } 00066 00067 __END_NAMESPACE_SYNAPS 00068 00069 #endif // _SYNAPS_SOLVE_STURMBZ_H_ 00070 00071
![]() |