algebramix_doc 0.3
/Users/mourrain/Devel/mmx/algebramix/include/algebramix/matrix_modular.hpp
Go to the documentation of this file.
00001 
00002 /******************************************************************************
00003 * MODULE     : matrix_modular.hpp
00004 * DESCRIPTION: modular matrices
00005 * COPYRIGHT  : (C) 2007  Joris van der Hoeven and Gregoire Lecerf
00006 *******************************************************************************
00007 * This software falls under the GNU general public license and comes WITHOUT
00008 * ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details.
00009 * If you don't have this file, write to the Free Software Foundation, Inc.,
00010 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00011 ******************************************************************************/
00012 
00013 #ifndef __MMX__MATRIX_MODULAR__HPP
00014 #define __MMX__MATRIX_MODULAR__HPP
00015 #include <numerix/modular.hpp>
00016 #include <algebramix/matrix_int.hpp>
00017 #include <algebramix/matrix_integer.hpp>
00018 
00019 namespace mmx {
00020 #define TMPL template<typename C, typename V1, typename V2>
00021 #define Modulus modulus<C,V1>
00022 #define Modular modular<Modulus,V2>
00023 
00024 /******************************************************************************
00025 * Variant for modular matrices
00026 ******************************************************************************/
00027 
00028 template<typename V>
00029 struct matrix_modular: public V {
00030   typedef typename V::Vec Vec;
00031   typedef typename V::Naive Naive;
00032   typedef matrix_modular<V> Positive;
00033   typedef matrix_modular<typename V::No_simd> No_simd;
00034   typedef matrix_modular<typename V::No_thread> No_thread;
00035   typedef matrix_modular<typename V::No_scaled> No_scaled;
00036 };
00037 
00038 template<typename F, typename V, typename W>
00039 struct implementation<F,V,matrix_modular<W> >:
00040   public implementation<F,V,W> {};
00041 
00042 TMPL
00043 struct matrix_variant_helper<Modular > {
00044   typedef matrix_naive Naive;
00045   typedef matrix_unrolled<8,Naive> Unrolled;
00046   typedef matrix_simd<8,8,Unrolled> Simd;
00047   typedef matrix_modular<Unrolled> MV;
00048 };
00049 
00050 /******************************************************************************
00051 * Multiplication of generic modular matrices
00052 ******************************************************************************/
00053 
00054 template<typename V, typename MV>
00055 struct implementation<matrix_multiply_base,V,matrix_modular<MV> >:
00056   public implementation<matrix_linear,V>
00057 {
00058   typedef implementation<matrix_multiply,MV> Mat;
00059 
00060 // Fallback
00061 template<typename Op, typename D, typename S1, typename S2>
00062 static inline void
00063 mul (D* d, const S1* s1, const S2* s2,
00064      nat r, nat rr, nat l, nat ll, nat c, nat cc)
00065   {
00066     Mat::template mul<Op> (d, s1, s2, r, rr, l, ll, c, cc);
00067   }
00068 
00069 // Lifting and project is used by default for modulars
00070 template<typename Op, typename C, typename V1, typename V2>
00071 static inline void
00072 mul (Modular* d, const Modular* s1, const Modular* s2,
00073      nat r, nat rr, nat l, nat ll, nat c, nat cc)
00074   {
00075     typedef Lift_type(Modular) D;
00076     typedef typename Matrix_variant(D) W;
00077     typedef implementation<matrix_multiply,W> Mat_D;
00078     nat len_1= aligned_size<D,V> (r * l);
00079     nat len_2= aligned_size<D,V> (l * c);
00080     nat len_d= aligned_size<D,V> (r * c);
00081     nat spc = len_1 + len_2 + len_d;
00082     D* x1= mmx_new<D> (spc);
00083     D* x2= x1 + len_1;
00084     D* xd= x2 + len_2;
00085     Mat_D::template mat_unary_stride<lift_op, D, Modular>
00086       (x1, Mat_D::index (1, 0, r, l)  , Mat_D::index (0, 1, r, l),
00087        s1, Mat  ::index (1, 0, rr, ll), Mat  ::index (0, 1, rr, ll), r, l);
00088     Mat_D::template mat_unary_stride<lift_op, D, Modular>
00089       (x2, Mat_D::index (1, 0, l, c)  , Mat_D::index (0, 1, l, c),
00090        s2, Mat  ::index (1, 0, ll, cc), Mat  ::index (0, 1, ll, cc), l, c);
00091     Mat_D::template mul<Op> (xd, x1, x2, r, r, l, l, c, c);
00092     Mat_D::template mat_unary_stride<project_op>
00093       (d , Mat  ::index (1, 0, rr, cc), Mat  ::index (0, 1, rr, cc),
00094        xd, Mat_D::index (1, 0, r, c)  , Mat_D::index (0, 1, r, c), r, c);
00095     mmx_delete<D> (x1, spc);
00096   }
00097 };
00098 
00099 #undef TMPL
00100 #undef Modulus
00101 #undef Modular
00102 } // namespace mmx
00103 
00104 #endif //__MMX__MATRIX_MODULAR__HPP
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines