Как подняться к матрице n-й степени A (2x2)? - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь подняться на n-ую степень (2x2) матрицы в O (log_2 (n)) операциях. Матрица определяется следующим образом:

A = [y1 = 1 y2 = 2] [y3 = 1 y4 = 0]

Я думаю, у меня есть некоторые ошибки в моем методе сделать это. Любые предложения о том, как я могу выполнить эту операцию?

#include <stdio.h>

int fnct(int n)
{
    int y1 = 1, y2 = 1, y3 = 1, y4 = 0; //entries of the A matrix 
    int z1, z2, z3, z4; //entries of the auxiliary matrix

                        // if n==0 return matrix it-self
    if (n == 0)
    {
        y1 = 1;
        y2 = 0;
        y3 = 1;
        y4 = 1;
        return y1, y2, y3, y4;
    }
    // if n mod 2 == 0 set y1,y2,y3,y4 to the fnct(n/2)
    if ((n % 2) == 0)
    {
        y1, y2, y3, y4 = fnct(n / 2);
        z1 = y1 * y2 + y2 * y3;
        z2 = y1 * y2 + y2 * y4;
        z3 = y3 * y1 + y4 * y3;
        z4 = y3 * y2 + y4 * y4;
        return z1, z2, z3, z4;
    }

    else if ((n % 2) == 1)
    {
        y1, y2, y3, y4 = fnct(n / 2);
        z1 = y1 * y1 + y2 * y3;
        z2 = y1 * y2 + y2 * y1;
        z3 = y3 * y1 + y4 * y3;
        z4 = y3 * y2 + y4 * y4;

        y1 = z1 + z3;
        y2 = z2 + z4;
        y3 = z1;
        y4 = z2;
        return z1, z2, z3, z4;
    }

    //return of the end of the function 
    return y1, y2, y3, y4;
}

int main()
{
    int n;
    printf("Enter n\n");
    scanf("%d", &n);
    printf("%d\n", fnct(n));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...