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
00033
00034
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
00181
00182 return;
00183 }
00184
00190 inline bool isValid(TNum a ) const { assert(a ==Convert(a) ); return true; }
00191
00193
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
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
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
00328
00329
00330 protected:
00331
00332 TNum* createAdditionTable();
00333 TNum* createMultiplicationTable();
00334
00335 TNum* createSubtractionTable();
00336 TNum* createAdditiveInverseTable();
00337
00338 TNum* createMultiplicativeInverseTable();
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();
00349
00350 sqrtInf_t* createSqrtTable();
00351
00352 };
00353
00354
00355
00358
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381 #include "fast_Ring.cpp"
00382
00383 #endif