realroot_doc 0.1.1
|
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 */