public bool Equals(Polynomial <T, TField> p) { if ((object)p == null) { return(false); } if (this.Degree != p.Degree) { return(false); } T[] list1 = this.ToCoefficientList(); T[] list2 = p.ToCoefficientList(); for (int i = 0; i < list1.Length; i++) { if (!list1[i].Equals(list2[i])) { return(false); } } return(true); }
public static Polynomial <T, TField> Divide(Polynomial <T, TField> p1, Polynomial <T, TField> p2, out Polynomial <T, TField> rem) { IField <T> field = p1.Field; T leadingCoeff; T[] dividList; T[] divisList; T[] quotList; T[] workList; if (p2.Degree > p1.Degree) { rem = p1; return(Polynomial <T, TField> .Zero); } if (p2.Degree == 0) { rem = new Polynomial <T, TField>(); return(Divide(p1, p2[0].Coeff)); } dividList = p1.ToCoefficientList(); divisList = p2.ToCoefficientListForDivisor(out leadingCoeff); quotList = new T[p1.Degree - p2.Degree + 1]; workList = new T[divisList.Length]; if (!field.IsOne(leadingCoeff)) { // Fix the dividend. for (int i = 0; i < dividList.Length; i++) { dividList[i] = field.Divide(dividList[i], leadingCoeff); } } // Initialize the work list. Array.Copy(dividList, workList, workList.Length); for (int i = 0; i < quotList.Length; i++) { // Save the quotient cofficient. quotList[i] = workList[0]; // Shift left, take in from dividend. Array.Copy(workList, 1, workList, 0, workList.Length - 1); workList[workList.Length - 1] = dividList[i + workList.Length]; // Copy the divisor and multiply with the last quotient // coefficient. Add this to the work list. Note that this // is all done in one step. for (int j = 0; j < workList.Length; j++) { workList[j] = field.Add(workList[j], field.Multiply(divisList[j], quotList[i])); } } if (!field.IsOne(leadingCoeff)) { // Fix the remainder. for (int i = 0; i < workList.Length; i++) { workList[i] = field.Multiply(workList[i], leadingCoeff); } } rem = FromCoefficientList(workList); return(FromCoefficientList(quotList)); }