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