polynom.cpp

Go to the documentation of this file.
00001 // polynom.cpp: Implementierung der Klasse polynom.
00002 //
00004 
00005 
00007 // Polynomxy
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); // erstens das, und zweitens kann es theoretisch zum ueberlauf kommen, auch fuer maxDegreePlusOne
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); // erstens das, und zweitens kann es theoretisch zum ueberlauf kommen
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); // erstens das, und zweitens kann es theoretisch zum ueberlauf kommen
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         //os << ";\n  ";
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 // polynomx
00401 
00402 template <class TNum>
00403 polynomx<TNum >::polynomx(const int gr):    maxDegree(gr), size(gr+1)
00404 {
00405         assert(gr>=0); // erstens das, und zweitens kann es theoretisch zum ueberlauf kommen
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                 //assert(maxDegree       == fpx.maxDegree)
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 
Generated on Tue Nov 23 13:10:52 2010 for centerfocus by  doxygen 1.6.3