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