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;
    }