hermite.hpp

Go to the documentation of this file.
00001 /*****************************************************************************
00002     
00003     hermite.hpp -- the Hermite form of a matrix.
00004 
00005     This file is a part of the Arageli library.
00006 
00007     Created:    2005/10/18    23:48
00008 
00009     Copyright (C) Andrey Somsikov, 2005--2006
00010     Copyright (C) Anna Bestaeva, 2006
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 // WARNING! Explicit matrix type.
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     //classic_hermite(A, H, U, basis, det);
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     //classic_hermite(A, B, Q, basis, det);
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     // classic_hermite(A, B, Q, basis, det);
00134     return Q;
00135 }
00136 
00137 
00138 } // namesapce Arageli
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_

Generated on Thu Aug 31 17:38:06 2006 for Arageli by  doxygen 1.4.7