00001
00002
00003
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