void GF::internal_add_to(ring_elem &f, ring_elem &g) const { if (g == _ZERO) return; if (f == _ZERO) f = g; else { int a = f.int_val; int b = g.int_val; int n = a-b; if (n > 0) { if (n == _MINUS_ONE) f = _ZERO; else f = modulus_add(b, _one_table[n], Q1_); } else if (n < 0) { if (-n == _MINUS_ONE) f = _ZERO; else f = modulus_add(a, _one_table[-n], Q1_); } else { if (P == 2) f = _ZERO; else f = modulus_add(a, _one_table[_ONE], Q1_); } } }
void add(elem &result, elem a, elem b) const { if (a == 0) result = b; else if (b == 0) result = a; else { int n=a-b; if (n > 0) { if (n == mGF.minusOne()) result = 0; else result = modulus_add(b, mGF.oneTable(n), mGF.orderMinusOne()); } else if (n < 0) { if (-n == mGF.minusOne()) result = 0; else result = modulus_add(a, mGF.oneTable(-n), mGF.orderMinusOne()); } else { if (mGF.characteristic() == 2) result = 0; else result = modulus_add(a, mGF.oneTable(mGF.one()), mGF.orderMinusOne()); } } }
void GF::internal_subtract_to(ring_elem &f, ring_elem &g) const { if (g == _ZERO) return; if (f.int_val == g.int_val) { f = _ZERO; return; } ring_elem g1 = modulus_add(g, _MINUS_ONE, Q1_); // f = -g internal_add_to(f, g1); }
void mult(elem &result, elem a, elem b) const { if (a == zero || b == zero) result = zero; else result = modulus_add(a,b,p1); }
void mult(elem &result, elem a, elem b) const { if (a == 0 || b == 0) result = 0; else result = modulus_add(a,b,p1); }
void subtract(elem &result, elem a, elem b) const { result = a; if (b == 0) return; elem c = modulus_add(b, mGF.minusOne(), mGF.orderMinusOne()); // c = -b add(result,a,c); }
void negate(elem &result, elem a) const { if (a != 0) result = modulus_add(a, mGF.minusOne(), mGF.orderMinusOne()); else result = 0; }
ring_elem Z_mod::add(const ring_elem f, const ring_elem g) const { if (g == _ZERO) return f; if (f == _ZERO) return g; int n = modulus_add(_exp_table[f.int_val], _exp_table[g.int_val], P); return _log_table[n]; }
void subtract(elem &result, elem a, elem b) const { if (b == zero) result = a; else if (a == zero) result = modulus_add(b, minus_one, p1); else { int n = modulus_sub(exp_table[a], exp_table[b], p); result = log_table[n]; } }
void add(elem &result, elem a, elem b) const { if (a == zero) result = b; else if (b == zero) result = a; else { int n = modulus_add(exp_table[a], exp_table[b], p); result = log_table[n]; } }
void Z_mod::internal_add_to(ring_elem &f, ring_elem &g) const { if (g == _ZERO) return; if (f == _ZERO) f = g; else { int n = modulus_add(_exp_table[f.int_val], _exp_table[g.int_val], P); f = _log_table[n]; } }
void subtract_multiple(elem &result, elem a, elem b) const { // we assume: a, b are NONZERO!! // result -= a*b elem ab = modulus_add(a,b,p1); subtract(result, result, ab); return; // if (result==zero) // result = ab; // else // { // int n = modulus_sub(exp_table[result], exp_table[ab], p); // result = log_table[n]; // } }
ring_elem GF::mult(const ring_elem f, const ring_elem g) const { if (f == _ZERO || g == _ZERO) return _ZERO; return modulus_add(f, g, Q1_); }
void GF::internal_negate_to(ring_elem &f) const { if (f.get_int() != _ZERO) f = modulus_add(f.get_int(), _MINUS_ONE, Q1_); }
ring_elem Z_mod::mult(const ring_elem f, const ring_elem g) const { if (f == _ZERO || g == _ZERO) return _ZERO; return modulus_add(f, g, _P1); }
void Z_mod::internal_negate_to(ring_elem &f) const { if (f != _ZERO) f = modulus_add(f, _minus_one, _P1); }