synaps/mpol/subs.h

00001 /*********************************************************************
00002 *      This file is part of the source code of SYNAPS kernel.        *
00003 *      Author(s): B. Mourrain, GALAAD, INRIA                         *
00004 **********************************************************************/
00005 #ifndef synaps_mpol_subs_h_
00006 #define synaps_mpol_subs_h_
00007 //--------------------------------------------------------------------
00008 #include <synaps/mpol/MPol.h>
00009 #include <synaps/mpol/binomial.h>
00010 #include <synaps/mpol/MPOLDST.m>
00011 //--------------------------------------------------------------------
00012 __BEGIN_NAMESPACE_SYNAPS
00013 //--------------------------------------------------------------------
00015 template <class X, class C, class O, class R>
00016 MPol<C,O,R> subs(int i, const X & p, const MPol<C,O,R>& q)
00017 {
00018   return MPOLDST::subs(i,p,q); 
00019 }
00020 //--------------------------------------------------------------------
00022 template <class X, class C, class O, class R>
00023 MPol<C,O,R> subs(char* v, const X & p, const MPol<C,O,R>& q, Variables& vars = Variables::default_ )
00024 {
00025   typedef typename MPol<C,O,R>::monom_t monom_t;
00026   int i = vars[v];
00027   return MPOLDST::subs(i,p,q); 
00028 }
00029 //----------------------------------------------------------------------
00030 template <class C, class O, class R> inline
00031 void swap(MPol<C,O,R> & P, MPol<C,O,R> & Q)
00032 {
00033   swap(P.rep(),Q.rep());
00034 }
00035 //----------------------------------------------------------------------
00042 template<class C,class O,class R> inline
00043 MPol<C,O,R> Rotate(const MPol<C,O,R> &  P,C t)
00044 {
00045   typedef typename MPol<C,O,R>::const_iterator  const_iterator;
00046   typedef typename MPol<C,O,R>::coeff_t coeff_t;
00047   MPol<C,O,R> P4=0;
00048 
00049   coeff_t cos_teta = (1-pow<coeff_t>(t,2))/(1+pow<coeff_t>(t,2));
00050   coeff_t sin_teta = 2*t/(1+pow<coeff_t>(t,2));
00051 
00052   for(const_iterator i = P.begin(); i != P.end(); ++i)
00053     {
00054       int puiss1=(*i)[0];
00055       int puiss2=(*i)[1];
00056 
00057       coeff_t coeff = i->coeff();
00058       MPol<C,O,R> P1=0,P2=0;
00059 
00060       for(int j=0;j<=puiss1;j++)
00061         {
00062           int puiss_j = puiss1-j;
00063           coeff_t coeffB=binomial<coeff_t>(puiss1,j);
00064           MPol<C,O,R> pi1 = Monom<coeff_t,dynamicexp<unsigned> >(coeffB,0,j);
00065           MPol<C,O,R> pi2 = Monom<coeff_t,dynamicexp<unsigned> >(1,1,puiss_j);
00066           coeff_t k=pow<coeff_t>(cos_teta,j);
00067           pi1*=k;
00068           k=pow<coeff_t>(-sin_teta,puiss_j);
00069           pi2*=k;
00070           if ( Degree(pi1*pi2) > 0)
00071             P1 += (pi1*pi2);
00072         }
00073 
00074 
00075       for(int j=0;j<=puiss2;j++)
00076         {
00077           int puiss_j = puiss2-j;
00078           coeff_t coeffB=binomial<coeff_t>(puiss2,j);
00079           MPol<C,O,R> pi1 = Monom<coeff_t,dynamicexp<unsigned> >(coeffB,0,j);
00080           MPol<C,O,R> pi2 = Monom<coeff_t,dynamicexp<unsigned> >(1,1,puiss_j);
00081           coeff_t k=pow<coeff_t>(sin_teta,j);
00082           pi1*=k;
00083           k=pow<coeff_t>(cos_teta,puiss_j);
00084           pi2*=k;
00085           if ( Degree(pi1*pi2) > 0)
00086             P2 += (pi1*pi2);
00087         }
00088 
00089       MPol<C,O,R> P3("0;");
00090       if (coeff != 0)
00091         P3+=coeff;
00092       if (puiss1)
00093         P3*=P1;
00094       if (puiss2)
00095         P3*=P2;
00096 
00097       if (P3 != MPol<C,O,R>("0;"))
00098         P4 += P3;
00099     }
00100   return P4;
00101 }
00102 //--------------------------------------------------------------------
00103 __END_NAMESPACE_SYNAPS
00104 //--------------------------------------------------------------------
00105 #endif // synaps_mpol_subs_h_
00106 

SYNAPS DOCUMENTATION
logo