Класс Polynomial

1 часть задания
mail@pastecode.io avatar
unknown
csharp
7 months ago
5.7 kB
3
Indexable
Never
using System;

namespace WindowsFormsApp1
{
    using System.Text;


    public class Polynomial
    {
        private readonly double[] _coefficients;

        public double[] Coefficients => (double[])_coefficients.Clone();
        public int Degree => _coefficients.Length - 1;

        public Polynomial(double[] c)
        {
            var n = c.Length;
            if (n == 0)
                throw new ArgumentException("Пустой массив коэффициентов полиномов");
            while (n > 1 && c[n - 1] == 0.0)
                --n;

            var ctx = new double[n];
            Array.Copy(c, 0, ctx, 0, n);
            _coefficients = ctx;
        }


        public double Evaluate(double x)
        {
            var n = Degree;
            var result = _coefficients[n];

            for (var j = n - 1; j >= 0; --j)
                result = x * result + _coefficients[j];

            return result;
        }

        public static Polynomial operator +(Polynomial u, Polynomial p)
        {
            var lowLength = Math.Min(u._coefficients.Length, p._coefficients.Length);
            var highLength = Math.Max(u._coefficients.Length, p._coefficients.Length);
            var newCoefficients = new double[highLength];

            for (var i = 0; i < lowLength; ++i)
            {
                newCoefficients[i] = u._coefficients[i] + p._coefficients[i];
            }

            var src = u._coefficients.Length < p._coefficients.Length
                ? p._coefficients
                : u._coefficients;
            Array.Copy(src, lowLength,
                newCoefficients,
                lowLength,
                highLength - lowLength);
            return new Polynomial(newCoefficients);
        }

        public static Polynomial operator -(Polynomial u, Polynomial p)
        {
            var lowLength = Math.Min(u._coefficients.Length, p._coefficients.Length);
            var highLength = Math.Max(u._coefficients.Length, p._coefficients.Length);
            var newCoefficients = new double[highLength];

            int i;
            for (i = 0; i < lowLength; ++i)
                newCoefficients[i] = u._coefficients[i] - p._coefficients[i];
            if (u._coefficients.Length < p._coefficients.Length)
            {
                for (i = lowLength; i < highLength; ++i)
                    newCoefficients[i] = -p._coefficients[i];
            }
            else
            {
                Array.Copy(u._coefficients, lowLength,
                    newCoefficients,
                    lowLength, highLength - lowLength);
            }

            return new Polynomial(newCoefficients);
        }

        public static Polynomial operator --(Polynomial p)
        {
            var n = p.Degree;
            // Проверяем, является ли полином уже многочленом нулевой степени
            if (n == 0)
                return new Polynomial(new[] { 0.0 });
            var newCoefficients = new double[n];
            Array.Copy(p._coefficients, 0,
                newCoefficients, 0, n);
            return new Polynomial(newCoefficients);
        }

        public static Polynomial operator *(Polynomial u, Polynomial p)
        {
            var newCoefficients = new double[u._coefficients.Length + p._coefficients.Length - 1];

            for (var i = 0; i < newCoefficients.Length; ++i)
            {
                newCoefficients[i] = 0.0;

                var n = Math.Min(u._coefficients.Length, i + 1);
                for (var j = Math.Max(0, i + 1 - p._coefficients.Length); j < n; ++j)
                {
                    newCoefficients[i] += u._coefficients[j] * p._coefficients[i - j];
                }
            }

            return new Polynomial(newCoefficients);
        }

        public Polynomial Differentiate()
        {
            var degree = Degree;
            if (degree == 0)
                return new Polynomial(new double[] { 0, 0 });
            var result = new double[degree];
            for (var i = degree; i > 0; --i)
                result[i - 1] = i * _coefficients[i];
            return new Polynomial(result);
        }
        public Polynomial Integrate()
        {
            var degree = Degree;
            if (degree == 0)
                return new Polynomial(new double[] { 0, 0 });
            var result = new double[degree];
            for (var i = degree; i > 0; --i)
                result[i - 1] = _coefficients[i] / (i + 1);
            return new Polynomial(result);
        }

        public override string ToString()
        {
            StringBuilder s = new StringBuilder();
            for (var i = 0; i < _coefficients.Length; ++i)
            {
                if (_coefficients[i] != 0.0)
                {
                    if (s.Length > 0)
                    {
                        s.Append(_coefficients[i] < 0.0 ? " - " : " + ");
                    }
                    else if (_coefficients[i] < 0.0)
                    {
                        s.Append('-');
                    }

                    double absAi = Math.Abs(_coefficients[i]);
                    if (absAi - 1.0 != 0.0)
                    {
                        s.Append(absAi).Append(' ');
                    }

                    s.Append('x');
                    if (i > 1)
                    {
                        s.Append('^').Append(i);
                    }
                }
            }

            return s.ToString();
        }
    }
}
Leave a Comment