Возвести многочлен в степень

Пример многочлена: 5x^5+2x^4-6x^3+7x^2+8x+1 , то есть степень икс постепенно уменьшается на единицу. На вход подается строчный массив с коэффициентами многочлена через запятую , степень многочлена и степень, в которую его можно возвести. Исходя из примера: строка 5,2,-6,7,8,1 степень многочлена 5.И степень, в которую его можно возвести = k. Вот мои наброски:

public static string Stepen(string[] coff1, int deg1, int k)
        {
            int count = deg1 * k;
            int c = k;
            int[] tek = new int[deg1 * c + 1];
            int[] tekInt = new int[deg1 * c + 1];
            for(int m = 0; m < deg1+1; m++)
            {
                tek.Add(Convert.ToInt32(coff1[m]));
            }
            for (int m = 0; m < coff1.Length; m++)
            {
                tek[m] = Convert.ToInt32(coff1[m]);
            }
            for(int b = coff1.Length; b < tek.Length; b++)
            {
                tek[b] = 0;
            }
            for (int st = 0; st < k - 1; st++)
            {
                for (int i = 0; i < coff1.Length; ++i)
                {
                    for (int j = 0; j < tek.Length; ++j)
                    {
                        tekInt[i + j] += Convert.ToInt32(coff1[i]) * tek[j];
                    }
                }
                foreach (int b in tekInt)
                {
                    int v = 0;
                    tek[v] = tekInt[b];
                    v++;
                }
        }

Застрял на ошибке выхода элемента из границ массива в строчке tekInt[i + j] += Convert.ToInt32(coff1[i]) * tek[j];


Ответы (1 шт):

Автор решения: Grundy

Операцию возведения в степень можно представить в виде нескольких операций умножения.

Умножении многочлена на многочлен реализуется тривиально:

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

Для удобства использования индекс коэффициента в массиве совпадает со степенью переменной, например, для 3x2+6x+5 массив коэффициентов будет [5,6,3], так как: 5x0 + 6x1 + 3x2.

В этом случае метод умножения может быть следующим:

int[] Mul(int[] coef, int[] coef2) {
    var result = new int[coef.Length+coef2.Length-1];

    for(var i=0;i<coef2.Length;i++){
        var mul = coef.Select(c => c*coef2[i]).ToList();
        for(var j=0;j<mul.Length;j++){
            result[j+i] += mul[j];
        }
    }

    return result;
}

После этого возведение в степень может выглядеть так:

int[] Pow(int[] coef, int exp){
    int[] result = coef;
    for(var i=1; i < exp; i++) {
        result = Mul(result, coef);
    }

    return result;
}
→ Ссылка