synaps/usolve/Util.h

00001 
00002 #ifndef SYNAPS_ARITHM_ALGEBRAIC_UTIL_H
00003 #define SYNAPS_ARITHM_ALGEBRAIC_UTIL_H
00004 
00005 
00006 #include <ext/algorithm>
00007 
00008 #include <synaps/init.h>
00009 #include <synaps/arithm/Abs.h>
00010 
00011 
00012 __ALGEBRAIC_BEGIN_NAMESPACE
00013 
00014 
00015 template < typename POLY >  inline
00016 void
00017 make_lcoeff_positive(POLY& p)
00018 {
00019         typedef typename POLY::value_type    RT;
00020         if (UPOLDAR::lcoeff(p) < RT(0))
00021           std::transform(p.begin(), p.end(), p.begin(), std::negate<RT>());
00022         return;
00023 }
00024 
00025 
00026 template < typename POLY >
00027 struct Construct_poly_func {
00028 
00029   typedef typename POLY::value_type   RT;
00030 
00031   POLY operator()(const RT& a0, const RT& a1)
00032   {
00033         POLY f(2, AsSize());
00034         f[0] = a0;
00035         f[1] = a1;
00036         return f;
00037   }
00038 
00039   POLY operator()(const RT& a0, const RT& a1, const RT& a2)
00040   {
00041         POLY f(3, AsSize());
00042         f[0] = a0;
00043         f[1] = a1;
00044         f[2] = a2;
00045         return f;
00046   }
00047 
00048   POLY operator()(const RT& a0, const RT& a1, const RT& a2, const RT& a3)
00049   {
00050         POLY f(4, AsSize());
00051         f[0] = a0;
00052         f[1] = a1;
00053         f[2] = a2;
00054         f[3] = a3;
00055         return f;
00056   }
00057 
00058   POLY operator()(const RT& a0, const RT& a1, const RT& a2, const RT& a3, const RT& a4)
00059   {
00060         POLY f(5, AsSize());
00061         f[0] = a0;
00062         f[1] = a1;
00063         f[2] = a2;
00064         f[3] = a3;
00065         f[4] = a4;
00066         return f;
00067   }
00068 };
00069 
00070 
00071 template < typename POLY > inline
00072 void construct_poly( const typename POLY::value_type& a0,
00073                          const typename POLY::value_type& a1,
00074                                          POLY& f)
00075 { f = Construct_poly_func<POLY>()(a0, a1); }
00076 
00077 
00078 
00079 template < typename POLY > inline
00080 void construct_poly( const typename POLY::value_type& a0,
00081                          const typename POLY::value_type& a1,
00082                          const typename POLY::value_type& a2,
00083                                          POLY& f)
00084 { f = Construct_poly_func<POLY>()(a0, a1, a2); }
00085 
00086 
00087 template < typename POLY > inline
00088 void construct_poly( const typename POLY::value_type& a0,
00089                          const typename POLY::value_type& a1,
00090                          const typename POLY::value_type& a2,
00091                          const typename POLY::value_type& a3,
00092                                          POLY& f)
00093 { f = Construct_poly_func<POLY>()(a0, a1, a2, a3); }
00094 
00095 
00096 template < typename POLY > inline
00097 void construct_poly( const typename POLY::value_type& a0,
00098                          const typename POLY::value_type& a1,
00099                          const typename POLY::value_type& a2,
00100                          const typename POLY::value_type& a3,
00101                          const typename POLY::value_type& a4,
00102                                          POLY& f)
00103 { f = Construct_poly_func<POLY>()(a0, a1, a2, a3, a4); }
00104 
00105 
00106 
00107 __ALGEBRAIC_END_NAMESPACE
00108 
00109 #endif // SYNAPS_ARITHM_ALGEBRAIC_UTIL_H
00110 

SYNAPS DOCUMENTATION
logo