public virtual Polynomial divideWithRemainder(Polynomial p) { if (Coefficients.Count == 0 || p.Coefficients.Count == 0) return null; //null var answer = new Polynomial[2]; int prime = Coefficients[0].Prime; int m = Degree; int n = p.Degree; if (m < n) return null; var quotient = new Zp[m - n + 1]; var coeffs = new Zp[m + 1]; for (int k = 0; k <= m; k++) coeffs[k] = new Zp(Coefficients[k]); var norm = p.Coefficients[n].MultipInverse; for (int k = m - n; k >= 0; k--) { quotient[k] = new Zp(prime, coeffs[n + k].Value * norm.Value); for (int j = n + k - 1; j >= k; j--) coeffs[j] = new Zp(prime, coeffs[j].Value - quotient[k].Value * p.Coefficients[j - k].Value); } var remainder = new Zp[n]; for (int k = 0; k < n; k++) remainder[k] = new Zp(coeffs[k]); answer[0] = new Polynomial(quotient); answer[1] = new Polynomial(remainder); foreach (Zp zp in answer[1].Coefficients) { if (zp.Value != 0) return null; } return answer[0]; }
public virtual Polynomial multiply(Polynomial p) { Debug.Assert(Degree > p.Degree && Coefficients.Count > 0); int prime = Coefficients[0].Prime; var coeffs = new SortedDictionary<int, Zp>(); for (int deg1 = 0; deg1 <= Degree; deg1++) { for (int deg2 = 0; deg2 <= p.Degree; deg2++) { int deg = deg1 + deg2; var curr = coeffs[deg]; var newValue = new Zp(prime, Coefficients[deg1].Value * p.Coefficients[deg2].Value); if (curr == null) curr = newValue; else curr = new Zp(prime, curr.Value + newValue.Value); coeffs[deg] = curr; } } return new Polynomial(new List<Zp>(coeffs.Values)); }