inline TNum fast_Ring< TNum, kdefs>::addInv(const TNum a) const { #ifdef SAFE assert(Convert(a)==a); #endif return additiveInverseTable[ getSingleIndex(a) ]; }
vector<int> Lattice::getCenterSingleIndex() const { vector<int> res; vector< vector<int> > idx_list = getCenterIndex(); for(int i=0; i< idx_list.size(); ++i) res.push_back( getSingleIndex(idx_list[i]) ); return res; }
TNum* fast_Ring<TNum,kdefs>::createMultiplicativeInverseTable() { int i, j, k, l; size_t tableSize = getMaxSingleIndex() + 1; TNum * inverses1 = new TNum[ tableSize ]; for (i=0; i<getCharacteristic(); i++) for (j=0; j<((getCharacteristic()-1)*getEpsPrecision())+1; j++) { TNum z1(i, j); size_t index = getSingleIndex( z1 ); assert(index<tableSize && index>=0); inverses1[ index ] = TNum::Zero; for (k=0; k<getCharacteristic(); k++) for (l=0; l<((getCharacteristic()-1)*getEpsPrecision())+1; l++) { TNum z2(k, l); TNum z; z.setX( ((int)z1.getX() * (int)z2.getX()) % getCharacteristic() ); z.setEps ( ( (int)z1.getX() * (int)z2.getEps() + (int)z2.getX() * (int)z1.getEps() ) % getCharacteristic() ); if ( z == TNum::One ) { size_t index_2 = getSingleIndex( z1); assert( index_2<tableSize && index_2 >=0); inverses1 [index_2 ] = z2; break; } } } return inverses1; }
inline void fast_Ring< TNum, kdefs>::multInvInPlace( TNum & a) const { #ifdef SAFE assert( a==Convert(a) ); #endif TNum const & res = multiplicativeInverseTable[getSingleIndex( a)]; if (res.isNotZero() ) { a = res; } else { std::cerr << "Multiplicative inverse does not exist!" << std::endl; throw "Multiplicative inverse does not exist!" ; } }
TNum* fast_Ring<TNum,kdefs>::createAdditiveInverseTable() { int i, j; size_t tableSize = getMaxSingleIndex() + 1; TNum* tadditiveInverseTable = new TNum[ tableSize ]; for (i=0; i<getCharacteristic(); i++) for (j=0; j<( ( getCharacteristic()-1 )*getEpsPrecision() )+1; j++) { TNum z1(i, j); size_t index = getSingleIndex( z1); assert(index<tableSize && index>=0); TNum z2( ( getCharacteristic() - i) % getCharacteristic(), (getCharacteristic() - j) % getCharacteristic() ); tadditiveInverseTable[ index ] = z2; } return tadditiveInverseTable; }