Возвести многочлен в степень
Пример многочлена: 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 шт):
Операцию возведения в степень можно представить в виде нескольких операций умножения.
Умножении многочлена на многочлен реализуется тривиально:
- в результате количество коэффициентов складывается
- каждый коэффициент одного многочлена умножается на каждый коэффициент второго и результат прибавляется к итоговым коэффициентам со смещением, соответствующим степени коэффициента.
Для удобства использования индекс коэффициента в массиве совпадает со степенью переменной, например, для 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;
}