fast_Ring.h

Go to the documentation of this file.
00001 
00002 #ifndef FAST_RING_H
00003 #define FAST_RING_H
00004 
00005 
00006 #if _MSC_VER > 1000
00007 #pragma once
00008 #endif // _MSC_VER > 1000
00009 
00010 
00011 #include "fastNumber.h"
00012 
00013 
00014 
00015 
00030 using namespace std;
00031 
00032 // zum Design:
00033 // bei Koerper fehlt istElement(zahl)
00034 // generic_Ring sollte sowas bieten, wie getZahl
00035 
00036 
00091 template <class TNum, class kdefs>
00092 class fast_Ring 
00093 {
00094 public:
00095         typedef         struct sqrtInf 
00096                         {
00097                                 short solutions;
00098                                 TNum    sqrt;
00099                                 sqrtInf(short _sol,TNum _sqrt): solutions(_sol), sqrt(_sqrt)
00100                                 { }
00101                         sqrtInf(): solutions(0), sqrt(TNum::Zero)
00102                                 { }
00103         } sqrtInf_t;
00104 
00105 
00106         
00107 
00108         typedef         TNum                                    ElementType;
00109 
00110         typedef         fast_Ring< TNum,kdefs  >                FieldType;
00111 
00112         typedef         typename FieldType::ElementType         ScalarType;
00113 
00114 
00115 
00116 private:
00117 
00118         const unsigned short characteristic;
00119 
00120         long    moduloTableSize_m;
00121 
00123         const unsigned short epsilon;
00124         
00125 
00126         const TNum      generator;
00127         const TNum*     elementsToExponentsTab;
00128         const TNum*     exponentsToElementTab;
00129 
00130         const TNum*     additiveInverseTable;
00131         const TNum*     multiplicationTable;
00132         const TNum*     additionTable;
00133         const TNum*     multiplicativeInverseTable;
00134         const TNum*     fastAdditionTable;
00135 
00136         const ScalarType * moduloTable;
00137         const sqrtInf_t* sqrtTable;
00138 
00139 
00140 protected:
00141         inline void     init() ;
00142 
00143  public:
00144         
00145 
00146 
00147 
00148         bool            wellDefined();
00149 
00151         inline const FieldType * getField() const
00152         {
00153                 return this;
00154         }
00155 
00156         inline const FieldType & getFieldRef() const
00157         {
00158                 return *this;
00159         }
00160 
00163                 fast_Ring(unsigned short _characteristic, unsigned short epsPrec); 
00164                 
00165                 ~fast_Ring();
00172                 inline unsigned short  getCharacteristic() const        {       return characteristic;  }
00173                 inline const  unsigned short & getCharacteristicRef() const     {       return characteristic;  }
00174         
00175                 inline unsigned short  getEpsPrecision() const          {       return epsilon;         }
00176 
00177                 inline void  setEpsPrecision(int epsPrecision) const            
00178                 {
00179                         assert(epsPrecision<=epsilon);
00180                         //if (epsPrecision<2)
00181                         //return epsilon;               
00182                         return;
00183                 }
00184 
00190                 inline bool      isValid(TNum a ) const         { assert(a ==Convert(a) );      return true;    }
00191         
00193         //-----------Additionsfunktionen
00194         
00195 
00198                 inline          TNum    add             ( const TNum a, const  TNum b)  const;  
00199                 inline          TNum    addRef  ( const TNum &a,const  TNum& b) const;
00204                 inline void     addInPlace              (TNum& a, const TNum  b)        const;
00205                 inline void     addInPlaceRef           (TNum& a, const TNum & b)       const;
00208         //-----------Multiplikationsfunktionen
00209 
00212                 inline  TNum            addInv   ( const TNum   a ) const;
00213                 inline  TNum            addInvRef( const TNum & a ) const;
00214 
00215                 inline  void            addInvInPlace(  TNum & a ) const;
00220                 inline void     accMult( TNum& a ,const TNum b , const TNum c)  const;
00221                 inline void     accMultRef( TNum& a ,const TNum& b , const TNum& c)  const;
00222 
00223                 inline void     accMult( TNum* a ,const TNum b , const TNum c)  const;
00224                 inline void     accMultAddr( TNum* a ,const TNum* b , const TNum* c) const;
00225 
00226                 inline void     accMultSpec( TNum* const a ,const TNum b , const TNum * const c) const;
00227         
00232                 inline TNum             multiply(const TNum a, const TNum b) const;
00233                 inline TNum             multiplyRef(const TNum& a, const TNum& b) const;
00234 
00240                 inline void     multiplyInPlace( TNum& a, const TNum b) const;
00241                 inline void     multiplyInPlaceRef( TNum& a, const TNum& b) const;
00247                 inline TNum             scalarMultiply   (const FieldType::ElementType a, const TNum b) const;
00248                 inline TNum             scalarMultiplyRef(const FieldType::ElementType& a, const TNum& b) const;
00249 
00255                 inline void     scalarMultiplyInPlace   (const FieldType::ElementType a,  TNum & b) const;
00256                 inline void     scalarMultiplyInPlaceRef(const FieldType::ElementType& a,  TNum& b) const;
00261                 inline TNum const       multByExp   (const TNum a, const TNum b) const;
00262                 inline TNum const       multByExpRef(const TNum & a, const TNum & b) const;
00263                 inline void             multByExpInPlace( TNum & a, const TNum  b) const;
00264                 inline void             multByExpInPlaceRef( TNum & a, const TNum & b) const;
00270                 inline  TNum            multInv   (const TNum a) const;
00271                 inline  TNum            multInvRef(const TNum &a) const;
00272                 inline void             multInvInPlace( TNum &a) const;
00278                 inline TNum     pow       ( TNum const a ,unsigned int exp) const;
00279                 inline void     powInPlace( TNum &     a ,unsigned int exp) const;
00284                 inline          sqrtInf         sqrt    ( const TNum a)  const; 
00285                 inline          sqrtInf         sqrtRef ( const TNum &a) const;
00291                 inline  typename FieldType::ElementType  lookupModuloTable(int convertee) const;
00292 
00293                 inline int getLookupModuloTableSize() const;
00294 
00295                 template <class TConvNum >
00296                 inline TNum     Convert(const TConvNum a) const;
00297 
00298                 //template <class TConvNum =double >
00300                 inline TNum     Convert(const double a) const;
00302                 inline TNum     Convert(const int a) const;
00303 
00304                 template <class TConvNum >
00305                 inline void     ConvertInPlace( TConvNum & a) const;
00306                 
00308                 inline int      ConvertScalar(const int a) const;
00309 
00310                 inline int      ConvertScalarSpec(const int  a) const;
00311                 
00312                 inline int      FastConvertScalar(const int  a) const;
00317                 inline  size_t  getMaxSingleIndex() const;
00318                 inline  size_t  getMaxPairIndex() const;
00319                 inline  size_t  getSingleIndex(const TNum z1) const;
00320                 inline  size_t  getSingleIndexByRef(const TNum &z1) const;
00321 
00322                 inline  size_t  getPairIndexByRef(const TNum &z1, const TNum& z2) const;
00323                 inline  size_t  getPairIndex(const TNum z1, const TNum z2) const;
00326 
00327         //inline static void  clear() { }; /* gibt den Index in der Multiplikations- bzw. Additionstabelle zurck */
00328 
00329 
00330  protected:
00331         
00332         TNum*   createAdditionTable(); /* initialisiert Additionstafel */
00333         TNum*   createMultiplicationTable(); /* initialisiert Multiplikationstafel */   
00334 
00335         TNum*   createSubtractionTable(); /* initialisiert SubtraAdditionstafel */
00336         TNum*   createAdditiveInverseTable();
00337         
00338         TNum*   createMultiplicativeInverseTable(); /* initialisiert Tabelle fr multiplikative Inverse */
00339 
00341         TNum    getGenerator();
00342 
00343         TNum*   initElementsToExponentsTab(TNum erzeuger);
00344         TNum*   initExponentsToElementTab(TNum erzeuger);
00345 
00346         TNum*   createFastAdditionTable();
00347 
00348         typename FieldType::ElementType*        createModuloTable(); /* initialisiert Additionstafel */
00349 
00350         sqrtInf_t* createSqrtTable();
00351 
00352 };
00353 
00354 
00355 
00358 
00361 
00362 /*
00363 template <class TNum>
00364 inline int generic_Ring<TNum >::ConvertScalar(const int a) const
00365 {
00366         int res = a;
00367         while (res<0)
00368         {
00369                 res += kdefs::charakteristik;
00370         }
00371         if ( res >= kdefs::charakteristik ) 
00372         {       
00373                 res %= kdefs::charakteristik;
00374         }
00375         return res;
00376 }*/
00377 
00378 
00379 
00380 
00381         #include "fast_Ring.cpp"
00382 
00383 #endif
Generated on Tue Nov 23 13:10:51 2010 for centerfocus by  doxygen 1.6.3