realroot_doc 0.1.1
/Users/mourrain/Devel/mmx/realroot/include/realroot/tensor_monomials_fcts.hpp
Go to the documentation of this file.
00001 #ifndef realroot_MPOLDSE_MONOMIAL_C
00002 #define realroot_MPOLDSE_MONOMIAL_C
00003 
00004 #include <realroot/monomial.hpp>
00005 #include <realroot/tensor_monomials.hpp>
00006 #include <realroot/tensor_convert.hpp>
00007 #include <iostream>
00008 namespace mmx { 
00009 
00010 #ifndef MMX_WITH_PLUS_SIGN
00011 #define MMX_WITH_PLUS_SIGN
00012   template<class X> inline bool with_plus_sign(const X& x) {return x>0;}
00013 
00014 template<class C> inline bool with_plus_sign(const tensor::monomials<C>& x) {
00015   return true;
00016 }
00017 
00018 #endif  //MMX_WITH_PLUS_SIGN
00019 
00020 namespace  tensor 
00021 {
00022   template < class C > inline
00023   monomials < C >::monomials () {
00024     //   int szs = 1; new (this) monomials (1, &szs); data[0] = (C)0; 
00025     int *szs = new int, *vrs= new int;
00026     szs[0] = 1;
00027     vrs[0] = 0;
00028     env = eenv(1, szs, vrs);
00029     data = vector_type (env.sz(),(C)0);
00030     data[0] = (C)0; 
00031   }
00032   template < class C > inline
00033   monomials < C >::monomials (const eenv & e)//:env (e), data (e.sz ()) {}
00034   {
00035     env = e;
00036     data = vector_type (e.sz());
00037   };
00038   template < class C > inline
00039   monomials < C >::monomials (const eenv & e, const C & c)//:env(e),data (e.sz (), c) {};
00040   {
00041     env = e;
00042     data = vector_type (e.sz(),c);
00043   };
00044   template < class C > inline
00045   monomials < C >::monomials (int v, int d)
00046   {
00047     int *szs = new int, *vrs= new int;
00048     szs[0] = d+1;
00049     vrs[0] = v;
00050     env = eenv(1, szs, vrs);
00051     data = vector_type (env.sz(),(C)0);
00052     data[env.sz()-1]= 1;
00053   }
00054 
00055   template < class C > inline
00056   monomials < C >::monomials (const C& c, int d, unsigned v)
00057   {
00058     assert(d>=0);
00059     int *szs = new int, *vrs= new int;
00060     szs[0] = d+1;
00061     vrs[0] = v;
00062     env = eenv(1, szs, vrs);
00063     data = vector_type (env.sz(),(C)0);
00064     data[env.sz()-1]= c;
00065   }
00066 
00067   template < class C > inline
00068   monomials < C >::monomials (int nvr, const int *szs, const int *vrs) //:env (nvr, szs, vrs),data (env.sz(),(C)0)
00069   {
00070     env = eenv(nvr, szs, vrs);
00071     data = vector_type (env.sz(),(C)0);
00072   };
00073   template < class C > inline
00074   monomials < C >::monomials (const C & x)
00075   { int szs = 1; new (this) monomials (1, &szs); data[0] = x; }
00076 
00077   template < class C > 
00078   void realloc (monomials < C > &mpl, const eenv & nenv)
00079   {
00080     if (!eenv::equal (mpl.env, nenv ))
00081       {
00082         monomials< C > tmp (nenv);
00083         mpl.swap (tmp);
00084       };
00085   };
00086 
00087   template < class C >  inline
00088   void clear ( monomials < C >& monoms ) { std::fill(monoms.begin(),monoms.end(),C(0)); };
00089   template < class C >  inline
00090   void clear ( monomials < C > &mpl, const eenv & nenv)
00091   {
00092     if (mpl.env != nenv) {
00093       monomials < C > tmp (nenv, C (0));
00094       mpl.swap (tmp);
00095     } else 
00096       clear(mpl);
00097   };
00098 
00099   template < class C > 
00100   bool varindex (int &lv, const monomials<C>& mpl, int gv) 
00101   {
00102     return mpl.env.hasvar (lv, gv);
00103   }
00104 
00105   template < class C > bool monomials < C >::operator== (const monomials & mpl) const
00106   {
00107     if (!eenv::equal (env, mpl.env))
00108       return false;
00109     unsigned *oadd = new unsigned[esz ()];
00110     eenv::oaddress (env, oadd, mpl.env, 0, 0);
00111     for (int i = 0; i < esz (); i++)
00112       if (data[i] != mpl[oadd[i]])
00113         {
00114           delete[]oadd;
00115           return false;
00116         };
00117     delete[]oadd;
00118     return true;
00119   };
00120 
00121   template < class C >
00122   std::ostream & operator<< (std::ostream & o, const monomials < C > &mpl)
00123   {
00124     o << "monomials  object:\n";
00125     o << "\t(addresses) o: " << &mpl << " e: " << mpl.env.data <<  "d: " << mpl.
00126       begin () << std::endl;
00127     o << "\t(eenv)" << mpl.env << std::endl;
00128     o << "\t(data)";
00129     array::print (o, mpl.data);
00130     o << std::endl;
00131     o << ":object monomials\n";
00132     return o;
00133   };
00134   template < class Result, class Coeff, class Parameters > inline 
00135   void eval (Result & result, const monomials < Coeff > & monoms , const Parameters & parameters )
00136   { 
00137     //    if (monoms.nbvar()==1)
00138     vct::horner(result, monoms.begin (), monoms.size(), parameters, 1); 
00139     // levalm( result, monoms.begin (), monoms.env, parameters ); 
00140   };
00141   template < class Result, class Coeff, class Parameters > inline 
00142   void eval (Result & result, const monomials < Coeff > & monoms , const Parameters & parameters , unsigned n)
00143   { 
00144       //assert(parameters.size()<n);
00145     levalm( result, monoms.begin (), monoms.env, parameters ); 
00146   };
00147    
00148   template < class Result, class Coeff, class Parameters > inline 
00149   void heval (Result & result, const monomials < Coeff > & monoms , const Parameters & parameters)
00150   { 
00151     hevalm( result, monoms.begin (), monoms.env, parameters ); 
00152   };
00153   
00154   template < class Result, class Coeff, class Parameters > inline 
00155   void subs0 (Result *result, const monomials < Coeff > & monoms , const Parameters & parameters )
00156   { 
00157     subs0m( result, monoms.begin (), monoms.env, parameters ); 
00158   };
00159 
00160   template < class C > 
00161   void extend (monomials < C > &mpl, const eenv & nenv)
00162   {
00163     if ( mpl.env != nenv )
00164       {
00165         unsigned *oadd = new unsigned[mpl.esz ()];
00166         eenv::oaddress (nenv, oadd, mpl.env, 0, 0);
00167         monomials < C > tmp (nenv);
00168         vct::icopy (tmp.begin (), oadd, mpl.esz (), mpl.begin ());
00169         delete[]oadd;
00170         mpl.swap (tmp);
00171       };
00172   };
00173 
00174   // addition optimisable ...(mais pas maintenant)
00175   template < class X, class Y >
00176   void waddm (monomials < X > &mpla, const monomials < Y > &mplb)
00177   {
00178     assert (eenv::subset (mplb.env, mpla.env));
00179     unsigned *oadd = new unsigned[mplb.esz ()];
00180     eenv::oaddress (mpla.env, oadd, mplb.env, 0, 0);
00181     vct::ipadd (mpla.begin (), oadd, mplb.esz (), mplb.begin ());
00182     delete[]oadd;
00183   };
00184 
00185   template < class X, class C > inline void 
00186   add (monomials < X > &r, const monomials < X > &a, const C& c ) {
00187     add(r=a,c);
00188   }
00189 
00190   template < class C > inline void 
00191   add (monomials < C > &a, const C & x) {
00192     a[0] += x;
00193   }
00194 
00195   template < class C > void
00196   add (monomials < C > &r, const C & c, const monomials < C > &a) {
00197     add(r,a,c);
00198   }
00199 
00200   template < class C > inline
00201   void add (monomials < C > &r, const monomials < C > &a)
00202   {
00203     extend (r, eenv::common (r.env, a.env));
00204     waddm (r, a);
00205   }
00206 
00207   template < class C > inline
00208   void add (monomials < C > &r, const monomials < C > &a, const monomials < C > &b)
00209   {
00210     if ( &r == &a  ) {  add(r,b);  return;  };
00211     if ( &r  == &b ) {  add(r,a); return; };
00212     realloc(r,eenv::common(a.env,b.env));
00213     unsigned *oadd = new unsigned[std::max(a.esz (),b.esz())];
00214     eenv::oaddress (r.env, oadd,a.env, 0, 0);
00215     vct::icopy(r.begin(),oadd,a.esz(),a.begin());
00216     eenv::oaddress(r.env,oadd,b.env,0,0);
00217     vct::ipadd (r.begin (), oadd,b.esz (), b.begin ());
00218   };
00219   
00220   template < class C > inline
00221   void sub (monomials < C > &r, const monomials < C > &a, const monomials < C > &b)
00222   {
00223     if ( &r == &a  ) {  sub(r,b);  return;  };
00224     if ( &r == &b  ) {  monomials<C> tmp = b; sub(r,a,tmp); return; };
00225     
00226     realloc(r,eenv::common(a.env,b.env));
00227     unsigned *oadd = new unsigned[std::max(a.esz (),b.esz())];
00228     eenv::oaddress (r.env, oadd,a.env, 0, 0);
00229     vct::icopy(r.begin(),oadd,a.esz(),a.begin());
00230     eenv::oaddress(r.env,oadd,b.env,0,0);
00231     vct::ipsub (r.begin (), oadd,b.esz (), b.begin ());
00232   };
00233 
00234   template < class C > inline void
00235   sub (monomials < C > &mpl, const C & c, const monomials < C > &a) {
00236     add(mpl,a,-c);
00237   }
00238   template < class X, class Y >
00239   void wsubm (monomials < X > &mpla, const monomials < Y > &mplb)
00240   {
00241     assert (eenv::subset (mplb.env, mpla.env));
00242     unsigned *oadd = new unsigned[mplb.esz ()];
00243     eenv::oaddress (mpla.env, oadd, mplb.env, 0, 0);
00244     vct::ipsub (mpla.begin (), oadd, mplb.esz (), mplb.begin ());
00245     delete[]oadd;
00246   };
00247 
00248   template < class X, class Y > inline
00249   void sub (monomials < X > &r, const monomials < Y > &a)
00250   {
00251     extend (r, eenv::common (r.env, a.env)), wsubm (r, a);
00252   }
00253 
00254 
00255   template < class X, class C > inline void 
00256   sub (monomials < X > &r, const monomials < X > &a, const C& c )
00257   {
00258     r=a;sub(r,c);
00259   }
00260   template < class C , class X> inline 
00261   void sub (monomials < C > &a, const X & x)
00262   {
00263     a[0] -= (C)x;
00264   }
00265 
00266   template < class C > void mul (monomials < C > &r, const C & c)
00267   {
00268     vct::scmul (r.begin (), c, r.esz (), 1);
00269   };
00270 
00271   template < class C > void div (monomials < C > &r, const C & c)
00272   {
00273     vct::scdiv (r.begin (), c, r.esz (), 1);
00274   };
00275 
00276   template < class C > void mul (monomials < C > &r, const monomials < C > &a)
00277   {
00278     //    monomials<C> s(r);
00279     conv(r,a);
00280   };
00281   
00282   
00283   template < class X, class Y, class Z > inline
00284   void mul (monomials < X > &r, const monomials < Y > &a, const monomials < Z > &b)
00285   {
00286     conv(r,a,b);
00287   };
00288 
00289   template < class C > inline
00290   void mul (monomials < C > &a, const monomials < C > &b, const C & c)
00291   {
00292     mul (a = b, c);
00293   };
00294 
00295   template < class C > inline void
00296   mul (monomials < C > &r, const C &c, const monomials < C > &a) {
00297     mul(r=a,c);
00298   };
00299 
00300   template < class C > inline void
00301   div (monomials < C > &r, const monomials < C > &a, const C &c) {
00302     div(r=a,c);
00303   }
00304 
00305   template<class OSTREAM, class C> OSTREAM& 
00306   print( OSTREAM& os, const monomials<C>& mpl, const variables& Var = monom<C>::var) { 
00307     typedef monom<C>             monom_t;
00308     typedef typename monom<C>::container_t exponent_t;
00309     exponent_t tmp (mpl.env.mxvr()+1);
00310     const int *szs = mpl.szs ();
00311     const int *vrs = mpl.vrs ();
00312     bool notfirst = false;
00313     for (int i = 0; i < mpl.size(); i++)
00314       if (mpl[i] != 0)
00315         {
00316           int a, v;
00317           for (a = i, v = mpl.nvr () - 1; a; a /= szs[v], v--)
00318             tmp[vrs[v]] = a % szs[v];
00319           std::ostringstream sm;
00320           print(sm, monom_t (mpl[i], tmp),Var);
00321           //bool is_pol = is_polynomial(sm);
00322          if ( sm.str()[0]!='-' && sm.str()[0]!='+' && notfirst) { 
00323             os <<'+'; 
00324           }
00325           os<<sm.str();
00326           notfirst=true;
00327         };
00328     if(!notfirst) os << "0";
00329     return os;
00330   }
00331 
00332   template<class SYNTAX, class C> void
00333   print_flatten( SYNTAX& out, const monomials<C>& mpl, const variables& Var = monom<C>::var) { 
00334     typedef monom<C>             monom_t;
00335     typedef typename monom<C>::container_t exponent_t;
00336     exponent_t tmp (mpl.env.mxvr()+1);
00337     const int *szs = mpl.szs ();
00338     const int *vrs = mpl.vrs ();
00339     for (int i = 0; i < mpl.size(); i++)
00340       if (mpl[i] != 0)
00341         {
00342           int a, v;
00343           for (a = i, v = mpl.nvr () - 1; a; a /= szs[v], v--)
00344             tmp[vrs[v]] = a % szs[v];
00345 
00346           SYNTAX m = flatten(mpl[i]);
00347           for(int i=0;i<mpl.env.mxvr()+1;i++)
00348             m = m * pow(SYNTAX(Var[i].data()),flatten(tmp[i]));
00349           out+=m;             
00350         }
00351   }
00352 
00353 
00354   template<class Coeff> inline int
00355   degree(const monomials<Coeff>& p) {
00356     int d=0;
00357     for(int i=0;i<p.nbvar();i++) d+= *(p.env.szs()+i)-1;
00358     return d;
00359   }
00360 
00361   template<class Coeff> inline int
00362   degree(const monomials<Coeff>& p, int v) {
00363     return p.env.sz(v)-1;
00364   }
00365 
00366 
00367   template<class Coeff> inline int
00368   leading_variable(const monomials<Coeff>& p) {
00369     return 0;
00370   }
00371 
00372   template<class Coeff> inline void 
00373   diff( monomials<Coeff>& res, const monomials<Coeff>& src, int v ) {
00374     clear( res, eenv::diff(src.env,v));
00375     //    mdiff( res.begin(), res.env, src.begin(), src.env, v );
00376     mdiff( res.begin(), res.env, src.begin(), src.env,  v );
00377   }
00378 
00379   template < class C > 
00380   template < class X, class O>
00381   monomials < C >::monomials (const sparse::monomial_seq< X, O > &imp)
00382   {
00383     env= eenv(imp);
00384     data= vector_type(env.sz (), (C)0);
00385     //    const int *vr = this->vrs ();
00386     //    const int *st = this->str ();
00387     //    const int  nvr = this->nvr();
00388     //    C *data = this->begin ();
00389     mpolfill(this->begin(),imp,env);
00390   };
00391   
00392   template < class C, class O>
00393   void convert (monomials < C > &mpl, const sparse::monomial_seq< C, O> &imp)
00394   {
00395     mpl. ~ monomials < C > ();
00396     new (&mpl) monomials<C>(imp);
00397   };
00398 
00399   template < class C, class O> void 
00400   convert (sparse::monomial_seq< C, O> &pol, const monomials < C > &mpl) {
00401     typedef typename sparse::monomial_seq< C, O>::monom_t monom_t;
00402     typedef typename monom_t::container_t container_t;
00403     add(pol,C(0));
00404     container_t tmp (mpl.env.mxvr()+1);
00405     const int *szs = mpl.szs ();
00406     const int *vrs = mpl.vrs ();
00407     for (int i = 0; i < mpl.size(); i++)
00408       if (mpl[i] != 0)
00409         {
00410           int a, v;
00411           for (a = i, v = mpl.nvr () - 1; a; a /= szs[v], v--)
00412           tmp[vrs[v]] = a % szs[v];
00413           add(pol, monom_t (mpl[i], tmp));
00414         };
00415   }
00416 
00417 // inline eenv face( const eenv& e, int lv ) 
00418 //  {
00419 //    const int * eszs = e.szs();
00420 //    const int * evrs = e.vrs();
00421 //    const int   envr = e.nvr();
00422 //    int szs[ envr ];
00423 //    int vrs[ envr ];
00424 //    int c = 0;
00425 //    for ( int v = 0; v < envr; v ++ ) if ( v != lv ) { szs[c] = eszs[v]; vrs[c++] = evrs[v]; };//evrs[v]; };
00426 //    return eenv(c,szs,vrs);
00427 //  };
00428 
00429 inline eenv face_env( const eenv& e, int lv ) {
00430   const int * eszs = e.szs();
00431   const int * evrs = e.vrs();
00432   const int   envr = e.nvr();
00433   int szs[ envr ];
00434   int vrs[ envr ];
00435   int c = 0;
00436   for ( int v = 0; v < envr; v ++ ) if ( v != lv ) { szs[c] = eszs[v]; vrs[c++] = evrs[v]; };//evrs[v]; };
00437   return eenv(c,szs,vrs);
00438 }
00439 
00440 template<class C> inline
00441 void lface ( monomials<C>& f, const monomials<C>& src, int v )
00442 {
00443   lface( f.begin(), src.env, src.begin(), v );
00444 };
00445 
00446 template<class C> inline
00447 void rface ( monomials<C>& f, const monomials<C>& src, int v )
00448 {
00449   rface( f.begin(), src.env, src.begin(), v );
00450 };
00451 
00452 
00453 template<class C> inline
00454 void face ( monomials<C>& f, const monomials<C>& src, int v, int n )
00455 {
00456   assert(n==0||n==1);
00457   eenv fenv(face_env(src.env,src.env.localv(v)));
00458   if ( f.env != fenv ) realloc( f, fenv );
00459   if ( n ) rface( f, src, src.env.localv(v)  );
00460   else     lface( f, src, src.env.localv(v)  );
00461 };
00462  
00463 
00464   template<class C> inline
00465   void islice( monomials<C>& f, const monomials<C>& src, int v, int i )
00466   {
00467     slice( f.begin(), src.env, src.begin(), v );
00468   }
00469 
00470   template<class C> inline
00471   void slice( monomials<C>& f, const monomials<C>& src, int v, int n )
00472   {
00473     assert(n==0||n==1);
00474     eenv fenv(slice(src.env,src.env.localv(v)));
00475     if ( f.env != fenv ) realloc( f, fenv );
00476     islice( f, src, src.env.localv(v),n);
00477   }
00478 
00479     template<class C> inline
00480     const C monomials<C>::entry(std::vector<int> deg)
00481     {
00482         int * vvrs = vrs();
00483         int * sstr = str();
00484         int * sszs = szs() ;
00485 
00486         int i,pos=0;
00487         for (i = 0; i < nvr() ; ++i)
00488         {
00489             std::cout<<"entry:" <<deg[i] << std::endl;
00490             if (deg[i] >= sszs[ vvrs[i] ] || deg[i]<0 ) return C(0); 
00491             pos += deg[i]*sstr[ vvrs[i] ];
00492         }
00493         return data[pos];
00494     }
00495 
00497    template<class C> //inline
00498    void shift( monomials<C> & f, const C & t, const int & v )
00499    {
00500        std::vector<int> ind = std::vector<int>( f.nvr() );
00501        int s,k,j, i,pos =0;
00502 
00503         int * vars = f.vrs();
00504         int * sstr = f.str();
00505         int * sszs = f.szs() ;
00506        
00507        for (;;) 
00508        {
00509            for ( s = sszs[v], j = 0; j <= s-2; j++ )
00510                for( k = s-2; k >= j; k-- ) 
00511                    f.data[sstr[v]*k+ pos ] += 
00512                    t*f.data[ sstr[v]*(1+k)+ pos ];
00513 
00514            /* next row */
00515            for (i = 0; i < f.nvr() ; ++i) 
00516            {
00517                if ( vars[i] != v )
00518                {
00519                    ind[i] += 1;
00520                    pos += sstr[i];
00521                } else continue;
00522 
00523                if (ind[i] < sszs[i])
00524                    break;
00525                ind[i] = 0;
00526                pos -= sszs[i]*sstr[i];
00527            }
00528            if (i == f.nvr() )
00529                break;
00530        }
00531    }
00532 
00534     template<class C>
00535     void set_variable(monomials<C> & f, C t, int v )
00536     {
00537        std::vector<int> ind = std::vector<int>( f.nvr() );
00538        int k, i, pos =0;
00539 
00540         int * vars = f.vrs();
00541         int * sstr = f.str();
00542         int * sszs = f.szs() ;
00543         C tmp;
00544        
00545        for (;;) 
00546        {
00547            tmp=0;
00548            for( k = sszs[v]-1; k !=-1; --k )
00549            { 
00550                tmp *= t;
00551                tmp += f.data[sstr[v]*k + pos];
00552                f.data[sstr[v]*k + pos] = 0 ;
00553            }
00554            f.data[pos]=tmp;
00555            
00556            /* next row */
00557            for (i = 0; i < f.nvr() ; ++i) 
00558            {
00559                if ( vars[i] != v )
00560                {
00561                    ind[i] += 1;
00562                    pos += sstr[i];
00563                } else continue;
00564 
00565                if (ind[i] < sszs[i])
00566                    break;
00567                ind[i] = 0;
00568                pos -= sszs[i]*sstr[i];
00569            }
00570            if (i == f.nvr() )
00571                break;
00572        }
00573    }
00574 
00575 
00577     template<class C> //inline
00578     void reciprocal( monomials<C> & f, const int & v)
00579    {
00580        std::vector<int> ind = std::vector<int>( f.nvr() );
00581        int s,i,pos =0;
00582 
00583         int * vars = f.vrs();
00584         int * sstr = f.str();
00585         int * sszs = f.szs();
00586         int l= sszs[v]-1;
00587        
00588        for (;;) 
00589        {
00590            for ( s = 0 ; s <= l/2; s++ )
00591                std::swap(f.data[sstr[v]*s+pos], f.data[sstr[v]*(l-s)+pos] );
00592 
00593            // next row
00594            for (i = 0; i < f.nvr() ; ++i) 
00595            {
00596                if ( vars[i] != v )
00597                {
00598                    ind[i] += 1;
00599                    pos += sstr[i];
00600                } else continue;
00601 
00602                if (ind[i] < sszs[i])
00603                    break;
00604                ind[i] = 0;
00605                pos -= sszs[i]*sstr[i];
00606            }
00607            if (i == f.nvr() )
00608                break;
00609        }
00610    }
00611 
00613     template<class C> //inline
00614     void contraction( monomials<C> & f, const C & t, const int & v )
00615     {
00616         std::vector<int> ind = std::vector<int>( f.nvr() );
00617         int s,i,pos =0;
00618         
00619         int * vars = f.vrs();
00620         int * sstr = f.str();
00621         int * sszs = f.szs();
00622         
00623        for (;;) 
00624        {
00625            for ( s = 0 ; s < sszs[v]; ++s )
00626                f.data[sstr[v]*s+pos] *= pow(t,s) ;
00627 
00628            // next row
00629            for (i = 0; i < f.nvr() ; ++i) 
00630            {
00631                if ( vars[i] != v )
00632                {
00633                    ind[i] += 1;
00634                    pos += sstr[i];
00635                } else continue;
00636 
00637                if (ind[i] < sszs[i])
00638                    break;
00639                ind[i] = 0;
00640                pos -= sszs[i]*sstr[i];
00641            }
00642            if (i == f.nvr() )
00643                break;
00644        }
00645    };
00646 
00647     template<class C>
00648      void mins(  monomials<C> & mm,  monomials<C> & f, int v )
00649      {
00650         int p,k,i,j;
00651         int * sszs = f.szs() ;
00652         int * sstr = f.str() ;
00653 
00654         for ( p = 0, k = 0; k < sszs[v]; k++, p += sstr[v] )
00655         {
00656             mm.data[k] = f.data[p];
00657           for ( i = 0; i < f.size(); i += sstr[v-1] )
00658             for ( j = i; j < i + sstr[v]; j ++ )
00659               if ( f.data[j+p] < mm[k] ) mm[k] = f.data[j+p];
00660         }
00661      }
00662 
00663     template<class C>
00664     void maxs(  monomials<C> & mm,  monomials<C> & f, int v )
00665     {
00666 
00667        int p,k,i,j;
00668        int * sszs = f.szs() ;
00669        int * sstr = f.str() ;
00670 
00671        for ( p = 0, k = 0; k < sszs[v]; k++, p += sstr[v] )
00672         {
00673             mm.data[k] = f.data[p];
00674           for ( i = 0; i < f.size(); i += sstr[v-1] )
00675             for ( j = i; j < i + sstr[v]; j ++ )
00676               if ( f.data[j+p] > mm[k] ) mm[k] = f.data[j+p];
00677         }
00678     }
00679     
00680     //rename variable v to n
00681     template<class C>
00682     void rename_var(monomials<C> & f, const int & v, const int & n )
00683     {
00684         int * vr = f.vrs();
00685         
00686         for (int i=0; i< f.nvr(); ++i)
00687             if (vr[i]==v) { 
00688                 vr[i]=n;
00689                 break; }
00690     }
00691 
00692 };//namespace tensor
00693 } //namespace mmx
00694 #endif  /* realroot_MPOLDSE_MONOMIAL_C */