Возведение квадратной матрицы в степень

Можете подсказать что не так? Функция должна возводить квадратную матрицу А(размерностью s, для удобства тестирования это 7 ) в степень length , вот как я пробовал сделать, но у меня выходит функция возносит А в квадрат, length раз

static void a_mult(int [,]A,ref int [,] B, int s, int length)
    {
       
        for (int k = 1; k < length; k++)
        { 
        for (int i = 0; i < s; i++)
        {
       
            for (int j = 0; j < s; j++)
            {
                    A[i, j] = B[i, j];
                   
                }
        }
        for (int i = 0; i < s; i++)
        {
            for (int j = 0; j < s; j++)
            {
               
                        B[i, j] = (A[i, 0] * A[0, j]) + (A[i, 1] * A[1, j]) + (A[i, 2] * A[2, j]) + (A[i, 3] * A[3, j]) + (A[i, 4] * A[4, j]) + (A[i, 5] * A[5, j]) + (A[i, 6] * A[6, j]);
                  
            }
        }
        }

            
    }

P.S. Я попробовал переделать функцию так, но считает все равно не верно:

static int[,] Proizvedenie(int[,] a, int[,]b , int f)
    {
        int[,] res = new int[f, f];
        for (int i = 0; i < f; i++)
            for (int j = 0; j < f; j++)
                for (int k = 0; k < f; k++)
                    res[i, j] += a[i, k] * b[k, j];
        return res;
    }

Вот как выглядит вызов функции

for (int k=0; k<length;k++)
            a_multed = Proizvedenie(global_mas, a_multed, size);

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

Автор решения: aepot
private static int[,] PowMatrix(int[,] m, int power)
{
    if (m.GetLength(0) != m.GetLength(1))
        throw new ArgumentException("Матрица не квадратная");
    if (power < 1)
        throw new ArgumentException("Степень должна быть натуральным числом");

    int size = m.GetLength(0);
    int[,] result = m;
    for (int p = 1; p < power; p++)
    {
        int[,] temp = new int[size, size];
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
            {
                int sum = 0;
                for (int k = 0; k < size; k++)
                    sum += result[i, k] * m[k, j];
                temp[i, j] = sum;
            }
        result = temp;
    }
    return result;
}
static void Main(string[] args)
{
    int[,] matrix = new int[,]
    {
        { 1, 2 },
        { 3, 4 }
    };
    int[,] result = PowMatrix(matrix, 2);

    PrintMatrix(result);
    Console.ReadKey();
}

private static void PrintMatrix(int[,] m)
{
    int padding = m.Cast<int>().Select(x => Math.Abs(x)).Max().ToString().Length + 2;
    for (int i = 0; i < m.GetLength(0); i++)
        Console.WriteLine(string.Concat(Enumerable.Range(0, m.GetLength(1)).Select(j => m[i, j].ToString().PadLeft(padding))));
}
   7  10
  15  22
→ Ссылка