public BigGF Div(BigGF b) { var res = new BigGF(_pow, _poly); while (res._num >= b._num) { int pow = res.GetMaxPow() - b.GetMaxPow(); var tmp = Mul(b._poly, pow); var newGF = new BigGF(_pow, tmp); var aaa = res + newGF; res = aaa; } return(res); }
public BigGF Mul(BigGF b) { var first = _poly; var second = b._poly; var res = new SortedDictionary <int, int>(); foreach (var pair1 in first) { foreach (var pair2 in second) { int key = pair1.Key + pair2.Key; int value = pair1.Value * pair2.Value; if (value == 1) { if (!res.ContainsKey(key)) { res.Add(key, 1); } else { res.Remove(key); } } } } var result = new BigGF(_pow, res); if (Math.Pow(2, result.GetMaxPow()) < _pow) { return(result); } else { double pow_double = _pow; int m_degree = (int)Math.Log(pow_double, 2); var tmp = new BigGF(_pow, irreducible_polynomials[m_degree - 1]); return(result.Div(tmp)); } }