Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }