algebramix_doc 0.3
/Users/mourrain/Devel/mmx/algebramix/include/algebramix/polynomial_carry_naive.hpp
Go to the documentation of this file.
00001 
00002 /******************************************************************************
00003 * MODULE     : polynomial_carry_naive.hpp
00004 * DESCRIPTION: naive arithmetic for expansions in base p
00005 * COPYRIGHT  : (C) 2009  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__POLYNOMIAL_CARRY_NAIVE__HPP
00014 #define __MMX__POLYNOMIAL_CARRY_NAIVE__HPP
00015 #include <algebramix/polynomial_naive.hpp>
00016 
00017 namespace mmx {
00018 #define TMPL  template <typename C>
00019 #define TMPLK template <typename C, typename K>
00020 #define TMPLX template <typename C, typename X>
00021 #define TMPLP template <typename Polynomial>
00022 #define Vector vector<C>
00023 template <typename C, typename V> struct polynomial;
00024 
00025 /******************************************************************************
00026 * Naive variant for polynomials
00027 ******************************************************************************/
00028 
00029 template<typename V>
00030 struct polynomial_carry_naive: public V {
00031   typedef typename V::Vec Vec;
00032   typedef typename V::Naive Naive;
00033   typedef polynomial_carry_naive<typename V::Positive> Positive;
00034   typedef polynomial_carry_naive<typename V::No_simd> No_simd;
00035   typedef polynomial_carry_naive<typename V::No_thread> No_thread;
00036   typedef polynomial_carry_naive<typename V::No_scaled> No_scaled;
00037 };
00038 
00039 template<typename F, typename V, typename W>
00040 struct implementation<F,V,polynomial_carry_naive<W> >:
00041     public implementation<F,V,W> {};
00042 
00043 template<typename C>
00044 struct polynomial_carry_variant_helper {
00045   typedef polynomial_carry_naive<polynomial_naive> PV;
00046 };
00047 
00048 #define Polynomial_carry_variant(C) polynomial_carry_variant_helper<C>::PV
00049 
00050 /******************************************************************************
00051 * Variable name storage, default base is written 'p'
00052 ******************************************************************************/
00053 
00054 template<typename V,typename W>
00055 struct implementation<polynomial_defaults,V,polynomial_carry_naive<W> > {
00056   template<typename P>
00057   class global_variables {
00058     static inline generic& dyn_name () {
00059       static generic name = "p";
00060       return name; }
00061   public:
00062     static inline void set_variable_name (const generic& x) {
00063       dyn_name () = x; }
00064     static inline generic get_variable_name () {
00065       return dyn_name (); }
00066   };
00067 
00068 }; // implementation<polynomial_defaults,V,polynomial_carry_naive<W> >
00069 
00070 /******************************************************************************
00071 * Vectorial operations
00072 ******************************************************************************/
00073 
00074 template<typename V,typename W>
00075 struct implementation<polynomial_vectorial,V,polynomial_carry_naive<W> >:
00076   public implementation<polynomial_defaults,V>
00077 {
00078   typedef implementation<vector_linear,V> Vec;
00079 
00080 TMPLX static inline void set (C* dest, const X& c, nat n) {
00081   Vec::set (dest, c, n); }
00082 TMPL static inline void clear (C* dest, nat n) {
00083   Vec::clear (dest, n); }
00084 TMPL static inline void copy (C* dest, const C* s, nat n) {
00085   Vec::copy (dest, s, n); }
00086 TMPLX static inline void cast (C* dest, const X* s, nat n) {
00087   Vec::cast (dest, s, n); }
00088 TMPL static inline void reverse (C* dest, const C* s, nat n) {
00089   Vec::vec_reverse (dest, s, n); }
00090 
00091 TMPL static inline void add (C* dest, const C* s1, const C* s2, nat n) {
00092   ERROR ("not implemented"); }
00093 TMPL static inline void add (C* dest, const C* s, nat n) {
00094   ERROR ("not implemented"); }
00095 TMPL static inline void sub (C* dest, const C* s1, const C* s2, nat n) {
00096   ERROR ("not implemented"); }
00097 TMPL static inline void sub (C* dest, const C* s, nat n) {
00098   ERROR ("not implemented"); }
00099 TMPL static inline void mul_add (C* dest, const C* s1, const C* s2, nat n) {
00100   ERROR ("not implemented"); }
00101 
00102 TMPLX static inline void mul_add (C* dest, const C* s, const X& c, nat n) {
00103   ERROR ("not implemented"); }
00104 TMPLX static inline void mul_add (C* dest, const X& c, const C* s, nat n) {
00105   ERROR ("not implemented"); }
00106 TMPL static inline void mul_sc (C* dest, const C* s, const C& c, nat n) {
00107   ERROR ("not implemented"); }
00108 TMPL static inline void mul_sc (C* dest, const C& c, nat n) {
00109   ERROR ("not implemented"); }
00110 TMPL static inline void div_sc (C* dest, const C* s, const C& c, nat n) {
00111   ERROR ("not implemented"); }
00112 TMPL static inline void div_sc (C* dest, const C& c, nat n) {
00113   ERROR ("not implemented"); }
00114 TMPL static inline void quo_sc (C* dest, const C* s, const C& c, nat n) {
00115   ERROR ("not implemented"); }
00116 TMPL static inline void quo_sc (C* dest, const C& c, nat n) {
00117   ERROR ("not implemented"); }
00118 TMPL static inline void rem_sc (C* dest, const C* s, const C& c, nat n) {
00119   ERROR ("not implemented"); }
00120 TMPL static inline void rem_sc (C* dest, const C& c, nat n) {
00121   ERROR ("not implemented"); }
00122 TMPL static inline bool equal (const C* s1, const C* s2, nat n) {
00123   ERROR ("not implemented"); }
00124 TMPL static inline bool equal (const C* s, const C& c, nat n) {
00125   ERROR ("not implemented"); }
00126 TMPL static inline bool exact_eq (const C* s1, const C* s2, nat n) {
00127   ERROR ("not implemented"); }
00128 TMPL static inline bool exact_eq (const C* s, const C& c, nat n) {
00129   ERROR ("not implemented"); }
00130 TMPL static inline void trim (const C* s, nat& n) {
00131   ERROR ("not implemented"); }
00132 
00133 }; // implementation<polynomial_vectorial,V,polynomial_carry_naive<W> >
00134 
00135 /******************************************************************************
00136 * Multiplication
00137 ******************************************************************************/
00138 
00139 template<typename V,typename W>
00140 struct implementation<polynomial_multiply,V,polynomial_carry_naive<W> >:
00141   public implementation<polynomial_linear,V>
00142 {
00143   typedef implementation<polynomial_linear,V> Pol;
00144   typedef implementation<vector_linear,V> Vec;
00145 
00146 TMPLK static void
00147 mul (C* dest, const C* s1, const K* s2, nat n1, nat n2) {
00148   ERROR ("not implemented"); }
00149 
00150 TMPL static void
00151 square (C* dest, const C* s, nat n) {
00152   ERROR ("not implemented"); }
00153 
00154 TMPL static void
00155 tmul (C* dest, const C* s1, const C* s2, nat n1, nat n2) {
00156   ERROR ("not implemented"); }
00157 
00158 }; // implementation<polynomial_multiply,V,polynomial_carry_naive>
00159 
00160 /******************************************************************************
00161 * Division
00162 ******************************************************************************/
00163 
00164 template<typename V, typename W>
00165 struct implementation<polynomial_divide,V,polynomial_carry_naive<W> >:
00166   public implementation<polynomial_multiply,V>
00167 {
00168   typedef implementation<polynomial_multiply,V> Pol;
00169   typedef implementation<vector_linear,V> Vec;
00170 
00171 TMPL static void
00172 quo_rem (C* dest, C* s1, const C* s2, nat n1, nat n2) {
00173   ERROR ("not implemented"); }
00174 
00175 TMPL static void
00176 tquo_rem (C* dest, const C* s1, const C* s2, nat n1, nat n2) {
00177   ERROR ("not implemented"); }
00178 
00179 TMPL static void
00180 pquo_rem (C* dest, C* s1, const C* s2, nat n1, nat n2) {
00181   ERROR ("not implemented"); }
00182 
00183 }; // implementation<polynomial_divide,V,polynomial_carry_naive>
00184 
00185 /******************************************************************************
00186 * Euclidean sequence
00187 ******************************************************************************/
00188 
00189 template<typename V,typename W>
00190 struct implementation<polynomial_euclidean,V,polynomial_carry_naive<W> >:
00191   public implementation<polynomial_divide,V>
00192 {
00193   typedef implementation<polynomial_divide,V> Pol;
00194   typedef implementation<vector_linear,V> Vec;
00195 
00196 TMPL static void
00197 euclidean_sequence (const C* s1, const C* s2, nat n1, nat n2,
00198                     C* d1, C* d2, nat& m1 , nat& m2,
00199                     C* u1, C* u2, nat& nu1, nat& nu2,
00200                     C* v1, C* v2, nat& nv1, nat& nv2,
00201                     nat* n, C* rho, C* q, C** r, C** co1, C** co2, nat k= 0) {
00202   ERROR ("not implemented"); }
00203   
00204 TMPL static void
00205 gcd (C* g, nat& n, const C* s1, const C* s2, nat n1, nat n2,
00206      C* u1, C* u2, nat& nu1, nat& nu2) {
00207   ERROR ("not implemented"); }
00208 
00209 TMPL static void
00210 pade (C* r, C* t, const C* s, nat m, nat n, nat k) {
00211   ERROR ("not implemented"); }
00212 
00213 }; // implementation<polynomial_euclidean,V,polynomial_carry_naive>
00214 
00215 /******************************************************************************
00216 * Gcd computations
00217 ******************************************************************************/
00218 
00219 template<typename V,typename W>
00220 struct implementation<polynomial_gcd,V,polynomial_carry_naive<W> >:
00221   public implementation<polynomial_divide,V>
00222 {
00223   typedef implementation<polynomial_euclidean,V> Pol;
00224   typedef implementation<vector_linear,V> Vec;
00225 
00226 TMPLP static Polynomial
00227 gcd (const Polynomial& P1, const Polynomial& P2,
00228      Polynomial& U1, Polynomial& U2) {
00229   ERROR ("not implemented"); }
00230 
00231 TMPLP static Polynomial
00232 gcd (const Polynomial& P1, const Polynomial& P2) {
00233   ERROR ("not implemented"); }
00234 
00235 TMPLP static inline Polynomial
00236 lcm (const Polynomial& P1, const Polynomial& P2) {
00237   ERROR ("not implemented"); }
00238 
00239 TMPLP static Polynomial
00240 invert_mod (const Polynomial& P, const Polynomial& Q) {
00241   ERROR ("not implemented"); }
00242 
00243 TMPLP static void
00244 pade (const Polynomial& P, nat n, nat k,
00245       Polynomial& Num, Polynomial &Den) {
00246   ERROR ("not implemented"); }
00247 
00248 }; // implementation<polynomial_gcd,V,polynomial_carry_naive>
00249 
00250 #undef TMPL
00251 #undef TMPLK
00252 #undef TMPLX
00253 #undef TMPLP
00254 #undef Vector
00255 } // namespace mmx
00256 #endif //__MMX__POLYNOMIAL_CARRY_NAIVE__HPP
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines