00001
00002
00004
00005
00007
00009 template <class TNum, class TIndex>
00010 polynomXY<TNum, TIndex>::polynomXY( ) : maxDegree(-1),
00011 maxDegreePlusOne( 0 ),
00012 idefs(-1),
00013 size( idefs.getSize() ),
00014 koeff(NULL)
00015 {
00016
00017 name = std::string("");
00018
00019 }
00020
00021
00022
00024 template <class TNum, class TIndex>
00025 polynomXY<TNum, TIndex>::polynomXY(const short _maxDegree) : maxDegree(_maxDegree),
00026 maxDegreePlusOne( _maxDegree + 1 ),
00027 idefs( TIndex(_maxDegree)),
00028 size(idefs.getSize() )
00029
00030 {
00031 assert(_maxDegree>=0);
00032
00033 name = std::string("");
00034 koeff = new TNum[ idefs.getSize() ] ;
00035
00036 for (short dim=idefs.getSize()-1; dim>=0; dim--)
00037 koeff[dim] = TNum::Zero;
00038 }
00039
00041 template <class TNum, class TIndex>
00042 polynomXY<TNum, TIndex>::polynomXY(string _name, const short _maxDegree) : maxDegree(_maxDegree),
00043 maxDegreePlusOne( _maxDegree+1 ),
00044 idefs( TIndex(_maxDegree) ),
00045 size(idefs.getSize() ),
00046 name( _name)
00047 {
00048 assert(_maxDegree>=0);
00049
00050 koeff = new TNum[ idefs.getSize() ] ;
00051
00052 for (short dim = idefs.getSize()-1; dim >= 0 ; dim--)
00053 koeff[dim] = TNum::Zero;
00054 }
00055
00056
00057 template <class TNum, class TIndex>
00058 polynomXY<TNum, TIndex>::polynomXY(const polynomXY<TNum, TIndex>& pxy) : maxDegree(pxy.maxDegree),
00059 maxDegreePlusOne(pxy.maxDegree+1),
00060 idefs(pxy.idefs),
00061 size( pxy.size ),
00062 name(pxy.name)
00063 {
00064 koeff = new TNum[idefs.getSize() ] ;
00065
00066 for (short dim=idefs.getSize() - 1 ; dim>=0; dim--)
00067 koeff[dim] = pxy.koeff[dim];
00068 }
00069
00070
00071
00072 template <class TNum, class TIndex>
00073 inline int polynomXY<TNum, TIndex>::getIndex(const short x_exp, const short y_exp) const
00074 {
00075 return idefs.getPairIndex( x_exp, y_exp );
00076 }
00077
00078
00079
00080 template <class TNum, class TIndex>
00081 inline TNum const * polynomXY<TNum, TIndex>::getCoeffConstAddr(const short x_exp, const short y_exp) const
00082 {
00083 #ifdef SAFE
00084 testBounds(x_exp, y_exp);
00085 #endif
00086 return &koeff[ getIndex(x_exp, y_exp) ];
00087 }
00088
00089 template <class TNum, class TIndex>
00090 inline TNum * polynomXY<TNum, TIndex>::getCoeffAddr(const short x_exp, const short y_exp)
00091 {
00092 #ifdef SAFE
00093 testBounds(x_exp, y_exp);
00094 #endif
00095 return &koeff[ getIndex(x_exp, y_exp) ];
00096 }
00097
00098
00100 template <class TNum, class TIndex>
00101 void polynomXY<TNum, TIndex>::setDegree(const short _maxDegree)
00102 {
00103 assert(_maxDegree>=0);
00104
00105 #ifdef DEBUG
00106 std::cerr << "polynomXY<TNum>::setDegree" << std::endl;
00107 std::cerr << "setDegree" << std::endl;
00108 std::cerr << "_maxDegree" << _maxDegree << std::endl;
00109 #endif
00110
00111 delete[] koeff;
00112
00113 maxDegree = _maxDegree;
00114 maxDegreePlusOne = _maxDegree+1;
00115 idefs=TIndex(_maxDegree);
00116
00117 size = idefs.getSize() ;
00118
00119 koeff = new TNum[idefs.getSize() ] ;
00120
00121 for (short dim=idefs.getSize() -1; dim>=0; dim--)
00122 koeff[dim]=TNum::Zero;
00123
00124 }
00125
00126
00127 template <class TNum, class TIndex>
00128 short polynomXY<TNum, TIndex>::getMaxDegree() const
00129 {
00130 return maxDegree;
00131 }
00132
00133 template <class TNum, class TIndex>
00134 bool polynomXY<TNum, TIndex>::operator==(const polynomXY<TNum, TIndex>& pxy) const
00135 {
00136
00137 assert(&pxy!=NULL);
00138 for (short currDegree=0; currDegree <= maxDegree; currDegree++)
00139 for(short yexp=0; yexp <= currDegree; yexp++)
00140 if ( getCoeff( currDegree-yexp, yexp) != pxy.getCoeff( currDegree-yexp, yexp) )
00141 return false;
00142 return true;
00143
00144 }
00145
00146 template <class TNum, class TIndex>
00147 polynomXY<TNum, TIndex>& polynomXY<TNum, TIndex>::operator=(const polynomXY<TNum, TIndex>& pxy)
00148 {
00149 if ( this!=&pxy )
00150 {
00151
00152 assert(&pxy!=NULL);
00153
00154 maxDegree = pxy.maxDegree;
00155 maxDegreePlusOne = pxy.maxDegreePlusOne;
00156
00157 idefs=pxy.idefs;
00158 size = pxy.size;
00159
00160 if (koeff!=NULL) delete[] koeff;
00161
00162 koeff = new TNum[idefs.getSize() ] ;
00163
00164 for (short dim = idefs.getSize() - 1; dim >= 0; dim--)
00165 koeff[dim] = pxy.koeff[dim];
00166 }
00167 return *this;
00168 }
00169
00170
00171 template <class TNum, class TIndex>
00172 polynomXY<TNum, TIndex>::~polynomXY()
00173 {
00174 if (koeff!=NULL)
00175 delete[] koeff;
00176 koeff = NULL;
00177 }
00178
00179
00180
00181 template <class TNum, class TIndex>
00182 void polynomXY<TNum, TIndex>::output(std::ostream& os) const
00183 {
00184 int i, j;
00185 TNum z;
00186
00187 for (i=0; i<=maxDegree; i++)
00188 for(j=0; j<=i; j++)
00189 {
00190 z = getCoeff( i-j, j);
00191 if (! z.isZero())
00192 os << "(" << z <<")" << "x^" << i-j << "y^" << j << " + ";
00193 }
00194 }
00195
00196
00197
00199 template <class TNum, class TIndex>
00200 void polynomXY<TNum, TIndex>::print(std::ostream& os) const
00201 {
00202 int i, j;
00203
00204 TNum z;
00205
00206 bool first = true;
00207
00208 for (i=0; i<=maxDegree; i++)
00209 for( j=0; j<=i; j++)
00210 {
00211 z = getCoeff(i-j, j);
00212 if ( z.isNotZero() )
00213 {
00214
00215 if (first)
00216 first=false;
00217 else
00218 {
00219 os << " + ";
00220 }
00221
00222 os << "(" << z << ")*x^" << i-j << "*y^" << j ;
00223 }
00224 }
00225
00226 }
00227
00228
00229 template <class TNum, class TIndex>
00230 void polynomXY<TNum, TIndex>::printInMacaulayStyle(std::ostream& os) const
00231 {
00232 os << name << "=" ;
00233 print(os);
00234 os << ";" ;
00235 }
00236
00237
00239 template <class TNum,class TIndex>
00240 void polynomXY<TNum, TIndex>::outputMatrix() const
00241 {
00242 int i, j;
00243
00244 TNum z;
00245
00246 std::cerr << std::endl <<"Name: " << name << " degree: " << maxDegree << std::endl << "-----------------" << std::endl;
00247 for (i=0; i<=maxDegree; i++)
00248 {
00249 std::cerr << "i" << i << " ";
00250 for(j=0; j<=i; j++)
00251 {
00252 z =getCoeff(i-j, j);
00253 if ( z.isNotZero() )
00254 std::cerr << z << "*x^" << i-j << "*y^" << j << " + " ;
00255 }
00256 std::cerr << std::endl;
00257 }
00258 }
00259
00262 template <class TNum, class TIndex>
00263 void polynomXY<TNum, TIndex>::OutputPureCoefficients(ostream &OStream, int monomDegree, bool mitKomma) const
00264 {
00265 int j;
00266
00267 TNum z;
00268
00269 OStream << "{";
00270 for(j=0; j<=monomDegree; j++)
00271 {
00272 z = getCoeff(monomDegree-j, j);
00273 OStream << z << " ";
00274 if (j<monomDegree)
00275 OStream << ", ";
00276 }
00277
00278 OStream << "} ";
00279 if ( mitKomma==true )
00280 (OStream) << ", ";
00281
00282 OStream << " -- ";
00283
00284 for(j=0; j<=monomDegree; j++)
00285 {
00286 z =getCoeff(monomDegree-j, j);
00287
00288 OStream << "(" << z <<")*x^" << monomDegree-j << "y^" << j;
00289 if (j<monomDegree)
00290 OStream << " + ";
00291 }
00292
00293
00294 OStream << std::endl;
00295 }
00296
00297
00299 template <class TNum, class TIndex>
00300 inline void polynomXY<TNum, TIndex>::testBounds(const short x_exp,const short y_exp) const
00301 {
00302 if ( !( getIndex(x_exp, y_exp)>=0) )
00303 {
00304 std::cerr <<"polynomXY::setCoeff() : Err!" << std::endl;
00305 }
00306 if ( !( (getIndex(x_exp, y_exp)) < ( maxDegreePlusOne*maxDegreePlusOne )) )
00307 {
00308 std::cerr <<"polynomXY::setCoeff() : Err!" << std::endl;
00309 std::cerr << "(x_exp*(maxDegree+1)+y_exp)=" << (x_exp*(maxDegreePlusOne)+y_exp) << std::endl;
00310 std::cerr << "(maxDegree+1)*(maxDegree+1)=" << (maxDegreePlusOne)*(maxDegreePlusOne);
00311 }
00312 assert( (x_exp + y_exp) <=maxDegree);
00313 assert( x_exp>=0 && y_exp>=0);
00314 }
00315
00316
00317 template <class TNum, class TIndex>
00318 inline void polynomXY<TNum, TIndex>::setCoeff(const short x_exp,const short y_exp, const TNum value)
00319 {
00320 #ifdef SAFE
00321 testBounds(x_exp,y_exp);
00322 #endif
00323
00324 koeff[ getIndex(x_exp, y_exp) ] = value;
00325 };
00326
00327
00328 template <class TNum, class TIndex>
00329 inline TNum polynomXY<TNum, TIndex>::getCoeff(const short x_exp, const short y_exp) const
00330 {
00331 #ifdef SAFE
00332 testBounds(x_exp,y_exp);
00333 #endif
00334 return koeff[ getIndex(x_exp, y_exp) ];
00335 }
00336
00337
00338 template <class TNum, class TIndex>
00339 inline TNum const polynomXY<TNum, TIndex>::getCoeffConst(const short x_exp,const short y_exp) const
00340 {
00341 #ifdef SAFE
00342 testBounds(x_exp,y_exp);
00343 #endif
00344 return koeff[ getIndex(x_exp, y_exp) ];
00345 }
00346
00347 template <class TNum, class TIndex>
00348 inline const TNum & polynomXY<TNum, TIndex>::getCoeffConstRef(const int x_exp,const int y_exp) const
00349 {
00350 #ifdef SAFE
00351 testBounds(x_exp,y_exp);
00352 #endif
00353 return koeff[ getIndex(x_exp, y_exp) ];
00354 }
00355
00356
00357 template <class TNum, class TIndex>
00358 inline TNum& polynomXY<TNum, TIndex>::getCoeffRef(const short x_exp, const short y_exp)
00359 {
00360 #ifdef SAFE
00361 testBounds(x_exp,y_exp);
00362 #endif
00363 return koeff[ getIndex(x_exp, y_exp) ];
00364 }
00365
00366
00367 template <class TNum, class TIndex>
00368 inline short polynomXY<TNum, TIndex>::getDegree() const
00369 {
00370 return maxDegree;
00371 };
00372
00373 template <class TNum, class TIndex>
00374 inline void polynomXY<TNum, TIndex>::clear(short _grad)
00375 {
00376 #ifdef SAFE
00377 assert (_grad<=maxDegree);
00378 #endif
00379 for (int i=0; i<= _grad; i++)
00380 for(int j=0; j<=i; j++)
00381 koeff[ getIndex( i-j, j ) ] = TNum::Zero;
00382
00383
00384 }
00385
00386 template <class TNum, class TIndex>
00387 inline void polynomXY<TNum, TIndex>::clear()
00388 {
00389 for (int dim=0; dim<idefs.getSize() ; dim++)
00390 {
00391 koeff[dim] = TNum::Zero;
00392 }
00393 }
00394
00395
00396
00397
00399
00401
00402 template <class TNum>
00403 polynomx<TNum >::polynomx(const int gr): maxDegree(gr), size(gr+1)
00404 {
00405 assert(gr>=0);
00406
00407 koeff = new TNum[size] ;
00408 for (int dim=size-1; dim>=0; dim--)
00409 koeff[dim] = TNum::Zero;
00410 }
00411
00412
00413
00414 template <class TNum>
00415 polynomx< TNum >::polynomx(const polynomx<TNum> & fpx) : maxDegree(fpx.maxDegree), size(fpx.maxDegree + 1 )
00416 {
00417 koeff = new TNum[size] ;
00418 for (int dim=size-1; dim>=0; dim--)
00419 koeff[dim] = fpx.koeff[dim];
00420 }
00421
00422
00423 template <class TNum>
00424 inline polynomx<TNum> & polynomx< TNum >::operator=(const polynomx<TNum> & fpx)
00425 {
00426 if ( this != &fpx )
00427 {
00428 assert(&fpx!=NULL);
00429
00430 maxDegree = fpx.maxDegree;
00431 size = fpx.size;
00432
00433 if (koeff!=NULL)
00434 delete[] koeff;
00435
00436 koeff = new TNum[size] ;
00437
00438 for (short dim=size-1; dim>=0; dim--)
00439 koeff[dim] = fpx.koeff[dim];
00440 }
00441 return *this;
00442
00443 }
00444
00445
00446 template <class TNum>
00447 inline void polynomx<TNum >::testbounds(const int x_exp) const
00448 {
00449 if (x_exp<0 || x_exp>=maxDegree+1)
00450 {
00451 std::cerr <<"polynomx::getCoeff(): Err";
00452 std::cerr << "x_exp =" << x_exp;
00453 std::cerr << "maxDegree+1= " << maxDegree+1;
00454 std::cerr << fflush;
00455 }
00456 assert( x_exp <= maxDegree );
00457 assert( x_exp >= 0 );
00458 }
00459
00460
00461
00462 template <class TNum>
00463 inline TNum polynomx<TNum >::getCoeff(const int x_exp) const
00464 {
00465 #ifdef SAFE
00466 testbounds(x_exp);
00467 #endif
00468
00469 return koeff[x_exp];
00470 }
00471
00472
00473
00474 template <class TNum>
00475 inline const TNum& polynomx<TNum >::getCoeffConstRef(const int x_exp) const
00476 {
00477 #ifdef SAFE
00478 testbounds(x_exp);
00479 #endif
00480
00481 return koeff[x_exp];
00482 }
00483
00484
00485 template <class TNum>
00486 inline TNum& polynomx<TNum >::getCoeffRef(const int x_exp)
00487 {
00488 #ifdef SAFE
00489 testbounds(x_exp);
00490 #endif
00491
00492 return koeff[x_exp];
00493 }
00494
00495
00496 template <class TNum>
00497 inline TNum const polynomx<TNum >::getCoeffConst(const int x_exp) const
00498 {
00499 #ifdef SAFE
00500 testbounds(x_exp);
00501 #endif
00502
00503
00504
00505 return koeff[x_exp];
00506 }
00507
00508
00509 template <class TNum>
00510 inline void polynomx<TNum >::setCoeff(const int x_exp, const TNum& value)
00511 {
00512 #ifdef SAFE
00513 testbounds(x_exp);
00514 #endif
00515
00516 koeff[x_exp] = value;
00517
00518 }
00519
00520
00521
00522 template <class TNum>
00523 inline const int polynomx<TNum >::getDegree() const
00524 {
00525 return(maxDegree);
00526 };
00527
00528
00529
00530
00531
00532
00533 template <class TNum>
00534 polynomx<TNum >::~polynomx()
00535 {
00536 delete[] koeff;
00537 }
00538
00539
00540 template <class TNum>
00541 void polynomx<TNum >::clear(int _grad)
00542 {
00543 for (int dim=0; ( dim<size && dim<=_grad) ; dim++)
00544 koeff[dim] = TNum::Zero;
00545 }
00546
00547
00548
00549 template <class TNum>
00550 void polynomx<TNum >::clear()
00551 {
00552 for (int dim=0; dim<size ; dim++)
00553 koeff[dim] = TNum::Zero;
00554 }
00555
00556
00557