00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00021 #ifndef _ARAGELI_hermite_hpp_
00022 #define _ARAGELI_hermite_hpp_
00023
00024 #include <cstddef>
00025
00026 #include "config.hpp"
00027
00028 #include "hermite/storjohann.hpp"
00029 #include "hermite/classic.hpp"
00030 #include "hermite/hafner.hpp"
00031 #include "hermite/domich.hpp"
00032 #include "vector.hpp"
00033 #include "matrix.hpp"
00034
00035 namespace Arageli
00036 {
00037
00038
00039
00041 template <class T>
00042 matrix<T> hermite_old (const matrix<T> &m_);
00043
00044
00046
00050 template
00051 <
00052 typename MA,
00053 typename MH,
00054 typename MU
00055 >
00056 inline void hermite_upper
00057 (
00058 const MA &A,
00059 MH &H,
00060 MU &U
00061 )
00062 {
00063 typedef typename MA::element_type T_A;
00064
00065 vector<std::size_t, false> basis;
00066 T_A det;
00067 hermite_storjohann(A, H, U, basis, det);
00068
00069
00070 ARAGELI_ASSERT_1(H == U*A);
00071 }
00072
00073
00075
00079 template
00080 <
00081 typename MA,
00082 typename MH,
00083 typename MU
00084 >
00085 inline void hermite_lower
00086 (
00087 const MA &A,
00088 MH &H,
00089 MU &U
00090 )
00091 {
00092 typedef typename MA::element_type T_A;
00093
00094 matrix<T_A, false> A2 = A;
00095 A2.transpose();
00096 hermite_upper(A2, H, U);
00097 H.transpose();
00098 U.transpose();
00099
00100 ARAGELI_ASSERT_1(H == A*U);
00101 }
00102
00103
00105 template <typename M>
00106 inline M hermite (const M& A)
00107 {
00108 typedef typename M::element_type T;
00109
00110 vector<std::size_t, false> basis;
00111 matrix<T, false> Q;
00112 matrix<T, true> B;
00113 T det;
00114
00115 hermite_storjohann(A, B, Q, basis, det);
00116
00117 return B;
00118 }
00119
00120
00122 template <typename M>
00123 inline M hermite_transform_matrix (const M& A)
00124 {
00125 typedef typename M::element_type T;
00126
00127 matrix<T, false> B;
00128 matrix<T, true> Q;
00129 vector<std::size_t, false> basis;
00130 T det;
00131
00132 hermite_storjohann(A, B, Q, basis, det);
00133
00134 return Q;
00135 }
00136
00137
00138 }
00139
00140
00141 #ifdef ARAGELI_INCLUDE_CPP_WITH_EXPORT_TEMPLATE
00142 #define ARAGELI_INCLUDE_CPP_WITH_EXPORT_TEMPLATE_hermite
00143 #include "hermite.cpp"
00144 #undef ARAGELI_INCLUDE_CPP_WITH_EXPORT_TEMPLATE_hermite
00145 #endif
00146
00147 #endif // #ifndef _ARAGELI_hermite_hpp_