Listing 1
template<class _T, int _m> class galois { private: int m_val; static g_table<_T, _m> m_table; public: galois(const _T x) { m_val = m_table.m_log[x]; } bool operator==(const galois& n) const { return m_val == n.m_val; } galois& operator+= (const galois& n) { m_val = m_table.m_log[m_table.m_exp[m_val] ^ m_table.m_exp[n.m_val]]; return *this; } galois operator+ (const galois& n) const { galois a(*this); a += n; return a; } galois& operator-= (const galois& n) { return operator+= (n); } galois operator- (const galois& n) const { return operator+(n); } galois& operator*= (const galois& n) { if (m_val == m_table._Q || n.m_val == m_table. _Q) { m_val = m_table. _Q; return *this; } else { m_val = (m_val + n.m_val) % m_table._Q; return *this; } } galois operator* (const galois& n) const { galois a(*this); a *= n; return a; } galois& operator/= (const galois& n) { if (n.m_val == m_table._Q) { throw std::exception("division by zero"); } else if (m_val == m_table._Q) { m_val = m_table._Q; return *this; } else { m_val -= n.m_val; if (m_val < 0) { m_val += m_table._Q; } return *this; } } galois operator/ (const galois& n) const { galois a(*this); a /= n; return a; } void pow(int degree) { degree %= m_table._Q; m_val = m_val*degree % (m_table._Q); } _T convert() const { return m_table.m_exp[m_val]; } static galois alpha() { galois a; a.m_val = 1; // by definition return a; }