diff --git a/galois_field.hh b/galois_field.hh index 229178f..8ac3713 100644 --- a/galois_field.hh +++ b/galois_field.hh @@ -392,10 +392,32 @@ template GaloisFieldReference rcp(GaloisFieldReference a) { assert(a.v); +#if 1 + uint32_t r = POLY, newr = a.v; + uint32_t t = 0, newt = 1; + auto degree = [](uint32_t a) { + int d = 0; + while (a >>= 1) + ++d; + return d; + }; + while (newr != 1) { + int j = degree(newr) - degree(r); + if (j < 0) { + j = -j; + std::swap(newr, r); + std::swap(newt, t); + } + newr ^= r << j; + newt ^= t << j; + } + return GaloisFieldReference(newt); +#else GaloisFieldReference t(a *= a); for (int i = 0; i < M - 2; ++i) t *= a *= a; return t; +#endif } template