Умножение многочленов

192
15 декабря 2017, 00:23

Добрый день. Необходимо переопределить операцию умножения для класса полином. сам полином задается массивом коэффициентов и может быть произвольной длины. все время проблемы с выходом индекса за границы массива. Такое ощущение, что все должно быть гораздо проще. но проще не выходит. Заранее спасибо

public class Polynom
{
    public int[] coefficients;
    public Polynom(params int[] coefficients)
    {
        this.coefficients = coefficients;
    }
    public static Polynom operator * (Polynom polynom1, Polynom polynom2)
    {
        int size = polynom1.coefficients.Length + polynom2.coefficients.Length;
        int[] multiplyCoefficients = new int[size - 1];
        int a = polynom1.coefficients.Length;
        int b = polynom2.coefficients.Length;
        int c = multiplyCoefficients.Length;
        if (a>= b)
        {
            for (int i=0; i<multiplyCoefficients.Length; i++)
            {
                if ((i >= 0) && (i < b))
                    for (int j = 0; j <= i; j++)
                    {
                        multiplyCoefficients[i] += polynom1.coefficients[j] * polynom2.coefficients[i - j];
                    }
                if ((i >= b) && (i < a))
                    for (int j = b; j <= i; j++)
                    {
                        multiplyCoefficients[i] += polynom1.coefficients[j] * polynom2.coefficients[i - j];
                    }
                if ((i >= a) && (i < c))
                    for (int j = a; j <= i; j++)
                    {
                        multiplyCoefficients[i] += polynom1.coefficients[j] * polynom2.coefficients[i - j];
                    }
            }
         }
            return new Polynom(multiplyCoefficients);
    }
}
Answer 1

При перемножении старших членов получится член степени n1 + n2, где n1 и n2 — степени многочленов-множителей. С учетом наличия свободного члена (со степенью 0) нам потребуется (n1 - 1) + (n2 - 1) + 1 = n1 + n2 - 1 ячеек.

Воспользуемся тем, что при создании массива int[] он будет инициализирован нулями. Теперь нам нужно просто почленно перемножить всё и накопить суммы этих произведений в соответствующих ячейках массива. Тут понятно, что при перемножении членов со степенями i и j получается член степени i + j. Итого получается такой простой лаконичный код:

public static Polynom operator *(Polynom polynom1, Polynom polynom2)
{
    int[] coeffs = new int[polynom1.coefficients.Length + polynom2.coefficients.Length - 1];
    for (int i = 0; i < polynom1.coefficients.Length; ++i)
        for (int j = 0; j < polynom2.coefficients.Length; ++j)
            coeffs[i + j] += polynom1.coefficients[i] * polynom2.coefficients[j];
    return new Polynom(coeffs);
}

Пример использования:

var p1 = new Polynom(1, 2, 3);
var p2 = new Polynom(2, 3, 4);
var p3 = p1 * p2;
Console.WriteLine(p1);
Console.WriteLine(p2);
Console.WriteLine(p3);

Вывод:

3x^2+2x+1
4x^2+3x+2
12x^4+17x^3+16x^2+7x+2
READ ALSO
Selenium chrome driver --headless Как использовать свои куки?

Selenium chrome driver --headless Как использовать свои куки?

Актуально - весь интернет проштудировал в RU сегменте и ничего не нашёл(

188
Вызов js методов из .net приложения

Вызов js методов из .net приложения

Имеется основной веб проект написанный на java иnet приложение на winforms

213
Воспроизвдение HLS потока в с#?

Воспроизвдение HLS потока в с#?

HLS работает в MediaElement, но стоит упомянуть как он работает, а именно с затыками, хотя аудио работает прекрасно, добавление VLC оставляет плохой...

253
Что такое поток?

Что такое поток?

Хочу понять что такое поток, может кто то видел историю которая объясняет как работает поток или может навести пример с жизни

271